This is an automated email from the git hooks/post-receive script.
pierov pushed a commit to branch tor-browser-102.0.1-12.0-1 in repository tor-browser.
commit f4f249d12f1a8eaed756c75c73e2bf76e066cdbe Author: Pier Angelo Vendrame pierov@torproject.org AuthorDate: Mon Jul 4 18:29:55 2022 +0200
Bug 41004: Bundled fonts are not picked up on macOS
Fixes Bug 1774413: https://bugzilla.mozilla.org/show_bug.cgi?id=1774413 Drop this once patch is accepted upstream --- gfx/thebes/gfxMacPlatformFontList.h | 12 ++++++ gfx/thebes/gfxMacPlatformFontList.mm | 66 ++++++++++++++++++++++++++++++++ gfx/thebes/gfxPlatformFontList.cpp | 4 +- gfx/thebes/gfxPlatformMac.cpp | 73 ++---------------------------------- gfx/thebes/gfxPlatformMac.h | 2 + 5 files changed, 86 insertions(+), 71 deletions(-)
diff --git a/gfx/thebes/gfxMacPlatformFontList.h b/gfx/thebes/gfxMacPlatformFontList.h index fc7dbd0728947..2b7136938dd57 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 300f0cbfdb98c..114b2653bcb35 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 diff --git a/gfx/thebes/gfxPlatformFontList.cpp b/gfx/thebes/gfxPlatformFontList.cpp index e32e85940879a..099aafe356b70 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 6dfe23211aa3d..9cb57f5930e31 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*) { 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 4e1165c102fd2..71ed5524e1f60 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;