[tbb-commits] [tor-browser] 02/70: Bug 41004: Bundled fonts are not picked up on macOS

gitolite role git at cupani.torproject.org
Tue Aug 9 10:52:36 UTC 2022


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 at 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(
     nsTArray<fontlist::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;

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the tbb-commits mailing list