[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