Bug 1412090 - patch 4 - Also adopt the ContentParent::NotifyUpdatedFonts method on macOS, so that only the parent process needs to register with CFNotificationCenter for font-changed notifications. r=lsalzman
--- a/gfx/thebes/gfxMacPlatformFontList.mm
+++ b/gfx/thebes/gfxMacPlatformFontList.mm
@@ -59,16 +59,17 @@
#include "nsAppDirectoryServiceDefs.h"
#include "nsISimpleEnumerator.h"
#include "nsCharTraits.h"
#include "nsCocoaFeatures.h"
#include "nsCocoaUtils.h"
#include "gfxFontConstants.h"
#include "mozilla/dom/ContentChild.h"
+#include "mozilla/dom/ContentParent.h"
#include "mozilla/MemoryReporting.h"
#include "mozilla/Preferences.h"
#include "mozilla/Sprintf.h"
#include "mozilla/Telemetry.h"
#include "mozilla/gfx/2D.h"
#include <unistd.h>
#include <time.h>
@@ -983,34 +984,42 @@ gfxMacPlatformFontList::gfxMacPlatformFo
nsCOMPtr<nsIFile> langFonts(do_CreateInstance(NS_LOCAL_FILE_CONTRACTID, &rv));
if (NS_SUCCEEDED(rv)) {
rv = langFonts->InitWithNativePath(NS_LITERAL_CSTRING(LANG_FONTS_DIR));
if (NS_SUCCEEDED(rv)) {
ActivateFontsFromDir(langFonts);
}
}
- ::CFNotificationCenterAddObserver(::CFNotificationCenterGetLocalCenter(),
- this,
- RegisteredFontsChangedNotificationCallback,
- kCTFontManagerRegisteredFontsChangedNotification,
- 0,
- CFNotificationSuspensionBehaviorDeliverImmediately);
+ // Only the parent process listens for OS font-changed notifications;
+ // after rebuilding its list, it will update the content processes.
+ if (XRE_IsParentProcess()) {
+ ::CFNotificationCenterAddObserver(
+ ::CFNotificationCenterGetLocalCenter(),
+ this,
+ RegisteredFontsChangedNotificationCallback,
+ kCTFontManagerRegisteredFontsChangedNotification,
+ 0,
+ CFNotificationSuspensionBehaviorDeliverImmediately);
+ }
// cache this in a static variable so that MacOSFontFamily objects
// don't have to repeatedly look it up
sFontManager = [NSFontManager sharedFontManager];
}
gfxMacPlatformFontList::~gfxMacPlatformFontList()
{
- ::CFNotificationCenterRemoveObserver(::CFNotificationCenterGetLocalCenter(),
- this,
- kCTFontManagerRegisteredFontsChangedNotification,
- 0);
+ if (XRE_IsParentProcess()) {
+ ::CFNotificationCenterRemoveObserver(
+ ::CFNotificationCenterGetLocalCenter(),
+ this,
+ kCTFontManagerRegisteredFontsChangedNotification,
+ 0);
+ }
if (mDefaultFont) {
::CFRelease(mDefaultFont);
}
}
void
gfxMacPlatformFontList::AddFamily(const nsAString& aFamilyName,
@@ -1095,19 +1104,18 @@ gfxMacPlatformFontList::InitFontListForP
// reset system font list
mSystemFontFamilies.Clear();
if (XRE_IsContentProcess()) {
// Content process: use font list passed from the chrome process via
// the GetXPCOMProcessAttributes message, because it's much faster than
// querying Core Text again in the child.
- mozilla::dom::ContentChild* cc =
- mozilla::dom::ContentChild::GetSingleton();
- for (SystemFontListEntry& fle : cc->SystemFontList()) {
+ auto& fontList = dom::ContentChild::GetSingleton()->SystemFontList();
+ for (SystemFontListEntry& fle : fontList) {
MOZ_ASSERT(fle.type() ==
SystemFontListEntry::Type::TFontFamilyListEntry);
FontFamilyListEntry& ffe(fle);
switch (ffe.entryType()) {
case kStandardFontFamily:
AddFamily(ffe.familyName(), false);
break;
case kHiddenSystemFontFamily:
@@ -1117,23 +1125,20 @@ gfxMacPlatformFontList::InitFontListForP
mSystemTextFontFamilyName = ffe.familyName();
break;
case kDisplaySizeSystemFontFamily:
mSystemDisplayFontFamilyName = ffe.familyName();
mUseSizeSensitiveSystemFont = true;
break;
}
}
- // The ContentChild doesn't need the font list any longer.
- cc->SystemFontList().Clear();
- }
-
- // If this is the chrome process, or if for some reason we failed to get
- // a usable list above, get the available fonts from Core Text.
- if (!mFontFamilies.Count()) {
+ fontList.Clear();
+ } else {
+ // We're not a content process, so get the available fonts directly
+ // from Core Text.
InitSystemFontNames();
CFArrayRef familyNames = CTFontManagerCopyAvailableFontFamilyNames();
for (NSString* familyName in (NSArray*)familyNames) {
AddFamily((CFStringRef)familyName);
}
CFRelease(familyNames);
}
@@ -1342,16 +1347,18 @@ gfxMacPlatformFontList::RegisteredFontsC
gfxMacPlatformFontList* fl = static_cast<gfxMacPlatformFontList*>(observer);
// xxx - should be carefully pruning the list of fonts, not rebuilding it from scratch
fl->UpdateFontList();
// modify a preference that will trigger reflow everywhere
fl->ForceGlobalReflow();
+
+ mozilla::dom::ContentParent::NotifyUpdatedFonts();
}
gfxFontEntry*
gfxMacPlatformFontList::PlatformGlobalFontFallback(const uint32_t aCh,
Script aRunScript,
const gfxFontStyle* aMatchStyle,
gfxFontFamily** aMatchedFamily)
{