This is an automated email from the git hooks/post-receive script.
richard pushed a commit to branch tor-browser-102.5.0esr-12.0-1 in repository tor-browser.
commit 3ef81d9b3b603be0e4d1ac2b3ad4bbf278e3e209 Author: Pier Angelo Vendrame pierov@torproject.org AuthorDate: Tue Aug 2 10:30:35 2022 +0000
Bug 1774413: Bundled fonts are not picked up on macOS r=jfkthame
Bundled fonts were not picked up because also child processes need to register them. Also, they were assigned User visibility, instead of Base, which was not coherent with other platforms.
Differential Revision: https://phabricator.services.mozilla.com/D150400 --- gfx/thebes/gfxMacPlatformFontList.h | 12 ++++++ gfx/thebes/gfxMacPlatformFontList.mm | 83 ++++++++++++++++++++++++++++++++++++ gfx/thebes/gfxPlatformFontList.cpp | 4 +- gfx/thebes/gfxPlatformMac.cpp | 73 ++----------------------------- gfx/thebes/gfxPlatformMac.h | 2 + 5 files changed, 103 insertions(+), 71 deletions(-)
diff --git a/gfx/thebes/gfxMacPlatformFontList.h b/gfx/thebes/gfxMacPlatformFontList.h index fc7dbd072894..2b7136938dd5 100644 --- a/gfx/thebes/gfxMacPlatformFontList.h +++ b/gfx/thebes/gfxMacPlatformFontList.h @@ -221,6 +221,10 @@ class gfxMacPlatformFontList final : public gfxPlatformFontList { void AddFamily(const nsACString& aFamilyName, FontVisibility aVisibility) REQUIRES(mLock);
+ static void ActivateFontsFromDir( + const nsACString& aDir, + nsTHashSet<nsCStringHashKey>* aLoadedFamilies = nullptr); + gfxFontEntry* CreateFontEntry( mozilla::fontlist::Face* aFace, const mozilla::fontlist::Family* aFamily) override; @@ -234,6 +238,10 @@ class gfxMacPlatformFontList final : public gfxPlatformFontList { bool aNeedFullnamePostscriptNames) REQUIRES(mLock) override;
+#ifdef MOZ_BUNDLED_FONTS + void ActivateBundledFonts(); +#endif + enum { kATSGenerationInitial = -1 };
// default font for use with system-wide font fallback @@ -249,6 +257,10 @@ class gfxMacPlatformFontList final : public gfxPlatformFontList {
nsTArray<nsCString> mSingleFaceFonts; nsTArray<nsCString> mPreloadFonts; + +#ifdef MOZ_BUNDLED_FONTS + nsTHashSet<nsCStringHashKey> mBundledFamilies; +#endif };
#endif /* gfxMacPlatformFontList_H_ */ diff --git a/gfx/thebes/gfxMacPlatformFontList.mm b/gfx/thebes/gfxMacPlatformFontList.mm index 12b780b8b8cb..b10948623854 100644 --- a/gfx/thebes/gfxMacPlatformFontList.mm +++ b/gfx/thebes/gfxMacPlatformFontList.mm @@ -995,6 +995,18 @@ gfxMacPlatformFontList::gfxMacPlatformFontList() : gfxPlatformFontList(false), mDefaultFont(nullptr), mUseSizeSensitiveSystemFont(false) { CheckFamilyList(kBaseFonts);
+#ifdef MOZ_BUNDLED_FONTS + // We activate bundled fonts if the pref is > 0 (on) or < 0 (auto), only an + // explicit value of 0 (off) will disable them. + if (StaticPrefs::gfx_bundled_fonts_activate_AtStartup() != 0) { + TimeStamp start = TimeStamp::Now(); + ActivateBundledFonts(); + TimeStamp end = TimeStamp::Now(); + Telemetry::Accumulate(Telemetry::FONTLIST_BUNDLEDFONTS_ACTIVATE, + (end - start).ToMilliseconds()); + } +#endif + // cache this in a static variable so that MacOSFontFamily objects // don't have to repeatedly look it up sFontManager = [NSFontManager sharedFontManager]; @@ -1044,6 +1056,11 @@ FontVisibility gfxMacPlatformFontList::GetVisibilityForFamily(const nsACString& if (FamilyInList(aName, kBaseFonts)) { return FontVisibility::Base; } +#ifdef MOZ_BUNDLED_FONTS + if (mBundledFamilies.Contains(aName)) { + return FontVisibility::Base; + } +#endif return FontVisibility::User; }
@@ -1064,6 +1081,55 @@ void gfxMacPlatformFontList::AddFamily(CFStringRef aFamily) { AddFamily(nameUtf8, GetVisibilityForFamily(nameUtf8)); }
+/* static */ +void gfxMacPlatformFontList::ActivateFontsFromDir(const nsACString& aDir, + nsTHashSet<nsCStringHashKey>* aLoadedFamilies) { + AutoCFRelease<CFURLRef> directory = CFURLCreateFromFileSystemRepresentation( + kCFAllocatorDefault, (const UInt8*)nsPromiseFlatCString(aDir).get(), aDir.Length(), true); + if (!directory) { + return; + } + AutoCFRelease<CFURLEnumeratorRef> enumerator = CFURLEnumeratorCreateForDirectoryURL( + kCFAllocatorDefault, directory, kCFURLEnumeratorDefaultBehavior, nullptr); + if (!enumerator) { + return; + } + AutoCFRelease<CFMutableArrayRef> urls = + ::CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks); + if (!urls) { + return; + } + + CFURLRef url; + CFURLEnumeratorResult result; + do { + result = CFURLEnumeratorGetNextURL(enumerator, &url, nullptr); + if (result != kCFURLEnumeratorSuccess) { + continue; + } + CFArrayAppendValue(urls, url); + + if (!aLoadedFamilies) { + continue; + } + AutoCFRelease<CFArrayRef> descriptors = CTFontManagerCreateFontDescriptorsFromURL(url); + if (!descriptors || !CFArrayGetCount(descriptors)) { + continue; + } + CTFontDescriptorRef desc = (CTFontDescriptorRef)CFArrayGetValueAtIndex(descriptors, 0); + AutoCFRelease<CFStringRef> name = + (CFStringRef)CTFontDescriptorCopyAttribute(desc, kCTFontFamilyNameAttribute); + nsAutoCString key; + key.SetLength((CFStringGetLength(name) + 1) * 3); + if (CFStringGetCString(name, key.BeginWriting(), key.Length(), kCFStringEncodingUTF8)) { + key.SetLength(strlen(key.get())); + aLoadedFamilies->Insert(key); + } + } while (result != kCFURLEnumeratorEnd); + + CTFontManagerRegisterFontsForURLs(urls, kCTFontManagerScopeProcess, nullptr); +} + void gfxMacPlatformFontList::ReadSystemFontList(dom::SystemFontList* aList) NO_THREAD_SAFETY_ANALYSIS { // Note: We rely on the records for mSystemTextFontFamilyName and @@ -2094,3 +2160,20 @@ void gfxMacPlatformFontList::ReadFaceNamesForFamily(fontlist::Family* aFamily, } } } + +#ifdef MOZ_BUNDLED_FONTS +void gfxMacPlatformFontList::ActivateBundledFonts() { + nsCOMPtr<nsIFile> localDir; + if (NS_FAILED(NS_GetSpecialDirectory(NS_GRE_DIR, getter_AddRefs(localDir)))) { + return; + } + if (NS_FAILED(localDir->Append(u"fonts"_ns))) { + return; + } + nsAutoCString path; + if (NS_FAILED(localDir->GetNativePath(path))) { + return; + } + ActivateFontsFromDir(path, &mBundledFamilies); +} +#endif diff --git a/gfx/thebes/gfxPlatformFontList.cpp b/gfx/thebes/gfxPlatformFontList.cpp index 730781a6e4aa..37a095868031 100644 --- a/gfx/thebes/gfxPlatformFontList.cpp +++ b/gfx/thebes/gfxPlatformFontList.cpp @@ -279,6 +279,7 @@ gfxPlatformFontList::gfxPlatformFontList(bool aNeedFullnamePostscriptNames) mFontPrefs = MakeUnique<FontPrefs>();
gfxFontUtils::GetPrefsFontList(kFontSystemWhitelistPref, mEnabledFontsList); + mFontFamilyWhitelistActive = !mEnabledFontsList.IsEmpty();
// pref changes notification setup NS_ASSERTION(!gFontListPrefObserver, @@ -340,7 +341,6 @@ void gfxPlatformFontList::FontWhitelistPrefChanged(const char* aPref,
void gfxPlatformFontList::ApplyWhitelist() { uint32_t numFonts = mEnabledFontsList.Length(); - mFontFamilyWhitelistActive = (numFonts > 0); if (!mFontFamilyWhitelistActive) { return; } @@ -382,7 +382,6 @@ void gfxPlatformFontList::ApplyWhitelist() { void gfxPlatformFontList::ApplyWhitelist( nsTArrayfontlist::Family::InitData& aFamilies) { mLock.AssertCurrentThreadIn(); - mFontFamilyWhitelistActive = !mEnabledFontsList.IsEmpty(); if (!mFontFamilyWhitelistActive) { return; } @@ -534,6 +533,7 @@ bool gfxPlatformFontList::InitFontList() { }
gfxFontUtils::GetPrefsFontList(kFontSystemWhitelistPref, mEnabledFontsList); + mFontFamilyWhitelistActive = !mEnabledFontsList.IsEmpty(); }
// From here, gfxPlatformFontList::IsInitialized will return true, diff --git a/gfx/thebes/gfxPlatformMac.cpp b/gfx/thebes/gfxPlatformMac.cpp index 6dfe23211aa3..ee5bb1ca7cd4 100644 --- a/gfx/thebes/gfxPlatformMac.cpp +++ b/gfx/thebes/gfxPlatformMac.cpp @@ -82,56 +82,6 @@ static void DisableFontActivation() { } }
-// Helpers for gfxPlatformMac::RegisterSupplementalFonts below. -static void ActivateFontsFromDir(const nsACString& aDir) { - AutoCFRelease<CFURLRef> directory = CFURLCreateFromFileSystemRepresentation( - kCFAllocatorDefault, (const UInt8*)nsPromiseFlatCString(aDir).get(), - aDir.Length(), true); - if (!directory) { - return; - } - AutoCFRelease<CFURLEnumeratorRef> enumerator = - CFURLEnumeratorCreateForDirectoryURL(kCFAllocatorDefault, directory, - kCFURLEnumeratorDefaultBehavior, - nullptr); - if (!enumerator) { - return; - } - AutoCFRelease<CFMutableArrayRef> urls = - ::CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks); - if (!urls) { - return; - } - - CFURLRef url; - CFURLEnumeratorResult result; - do { - result = CFURLEnumeratorGetNextURL(enumerator, &url, nullptr); - if (result == kCFURLEnumeratorSuccess) { - CFArrayAppendValue(urls, url); - } - } while (result != kCFURLEnumeratorEnd); - - CTFontManagerRegisterFontsForURLs(urls, kCTFontManagerScopeProcess, nullptr); -} - -#ifdef MOZ_BUNDLED_FONTS -static void ActivateBundledFonts() { - nsCOMPtr<nsIFile> localDir; - if (NS_FAILED(NS_GetSpecialDirectory(NS_GRE_DIR, getter_AddRefs(localDir)))) { - return; - } - if (NS_FAILED(localDir->Append(u"fonts"_ns))) { - return; - } - nsAutoCString path; - if (NS_FAILED(localDir->GetNativePath(path))) { - return; - } - ActivateFontsFromDir(path); -} -#endif - // A bunch of fonts for "additional language support" are shipped in a // "Language Support" directory, and don't show up in the standard font // list returned by CTFontManagerCopyAvailableFontFamilyNames unless @@ -150,12 +100,13 @@ static const nsLiteralCString kLangFontsDirs[] = { "/System/Library/Fonts/Supplemental"_ns}; #endif
-static void FontRegistrationCallback(void* aUnused) { +/* static */ +void gfxPlatformMac::FontRegistrationCallback(void* aUnused) { AUTO_PROFILER_REGISTER_THREAD("RegisterFonts"); PR_SetCurrentThreadName("RegisterFonts");
for (const auto& dir : kLangFontsDirs) { - ActivateFontsFromDir(dir); + gfxMacPlatformFontList::ActivateFontsFromDir(dir); } }
@@ -182,7 +133,7 @@ void gfxPlatformMac::RegisterSupplementalFonts() { // CTFontManager.h header claiming that it's thread-safe. So we just do it // immediately on the main thread, and accept the startup-time hit (sigh). for (const auto& dir : kLangFontsDirs) { - ActivateFontsFromDir(dir); + gfxMacPlatformFontList::ActivateFontsFromDir(dir); } } } @@ -192,22 +143,6 @@ void gfxPlatformMac::WaitForFontRegistration() { if (sFontRegistrationThread) { PR_JoinThread(sFontRegistrationThread); sFontRegistrationThread = nullptr; - -#ifdef MOZ_BUNDLED_FONTS - // This is not done by the font registration thread because it uses the - // XPCOM directory service, which is not yet available at the time we start - // the registration thread. - // - // We activate bundled fonts if the pref is > 0 (on) or < 0 (auto), only an - // explicit value of 0 (off) will disable them. - if (StaticPrefs::gfx_bundled_fonts_activate_AtStartup() != 0) { - TimeStamp start = TimeStamp::Now(); - ActivateBundledFonts(); - TimeStamp end = TimeStamp::Now(); - Telemetry::Accumulate(Telemetry::FONTLIST_BUNDLEDFONTS_ACTIVATE, - (end - start).ToMilliseconds()); - } -#endif } }
diff --git a/gfx/thebes/gfxPlatformMac.h b/gfx/thebes/gfxPlatformMac.h index 4e1165c102fd..71ed5524e1f6 100644 --- a/gfx/thebes/gfxPlatformMac.h +++ b/gfx/thebes/gfxPlatformMac.h @@ -91,6 +91,8 @@ class gfxPlatformMac : public gfxPlatform { // read in the pref value for the lower threshold on font anti-aliasing static uint32_t ReadAntiAliasingThreshold();
+ static void FontRegistrationCallback(void* aUnused); + uint32_t mFontAntiAliasingThreshold;
static PRThread* sFontRegistrationThread;