richard pushed to branch base-browser-115.9.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
-
621f7857
by Pier Angelo Vendrame at 2024-04-08T20:10:21+00:00
4 changed files:
- gfx/thebes/StandardFonts-win10.inc
- gfx/thebes/gfxDWriteFontList.cpp
- gfx/thebes/gfxDWriteFontList.h
- gfx/thebes/gfxGDIFontList.cpp
Changes:
... | ... | @@ -199,3 +199,68 @@ static const char* kLangPackFonts[] = { |
199 | 199 | // "Rockwell Nova", // Pan-European Supplemental Fonts - EXCLUDED
|
200 | 200 | // "Verdana Pro", // Pan-European Supplemental Fonts - EXCLUDED
|
201 | 201 | };
|
202 | + |
|
203 | +struct FontSubstitute {
|
|
204 | + const char *substituteName;
|
|
205 | + const char *actualFontName;
|
|
206 | +};
|
|
207 | + |
|
208 | +static const FontSubstitute kFontSubstitutes[] = {
|
|
209 | + // Common substitutions
|
|
210 | + {"Arabic Transparent", "Arial"},
|
|
211 | + {"Arabic Transparent Bold", "Arial Bold"},
|
|
212 | + {"Arial Baltic", "Arial"},
|
|
213 | + {"Arial CE", "Arial"},
|
|
214 | + {"Arial CYR", "Arial"},
|
|
215 | + {"Arial Greek", "Arial"},
|
|
216 | + {"Arial TUR", "Arial"},
|
|
217 | + {"Courier New Baltic", "Courier New"},
|
|
218 | + {"Courier New CE", "Courier New"},
|
|
219 | + {"Courier New CYR", "Courier New"},
|
|
220 | + {"Courier New Greek", "Courier New"},
|
|
221 | + {"Courier New TUR", "Courier New"},
|
|
222 | + {"Helv", "MS Sans Serif"},
|
|
223 | + {"Helvetica", "Arial"},
|
|
224 | + {"MS Shell Dlg 2", "Tahoma"},
|
|
225 | + {"Tahoma Armenian", "Tahoma"},
|
|
226 | + {"Times", "Times New Roman"},
|
|
227 | + {"Times New Roman Baltic", "Times New Roman"},
|
|
228 | + {"Times New Roman CE", "Times New Roman"},
|
|
229 | + {"Times New Roman CYR", "Times New Roman"},
|
|
230 | + {"Times New Roman Greek", "Times New Roman"},
|
|
231 | + {"Times New Roman TUR", "Times New Roman"},
|
|
232 | + {"Tms Rmn", "MS Serif"},
|
|
233 | + // Common, except Japanese (which uses MS UI Gothic, instead)
|
|
234 | + {"MS Shell Dlg", "Microsoft Sans Serif"},
|
|
235 | + // Arabic
|
|
236 | + {"Arial (Arabic)", "Arial"},
|
|
237 | + {"Courier New (Arabic)", "Courier New"},
|
|
238 | + {"Times New Roman (Arabic)", "Times New Roman"},
|
|
239 | + // Cyrillic + Greek
|
|
240 | + {"Courier", "Courier New"},
|
|
241 | + // Greek
|
|
242 | + {"Fixedsys Greek", "Fixedsys"},
|
|
243 | + {"MS Serif Greek", "MS Serif"},
|
|
244 | + {"MS Sans Serif Greek", "MS Sans Serif"},
|
|
245 | + {"Small Fonts Greek", "Small Fonts"},
|
|
246 | + {"System Greek", "System"},
|
|
247 | + // Hebrew
|
|
248 | + {"Arial (Hebrew)", "Arial"},
|
|
249 | + {"Courier New (Hebrew)", "Courier New"},
|
|
250 | + {"David Transparent", "David"},
|
|
251 | + {"Fixed Miriam Transparent", "Miriam Fixed"},
|
|
252 | + {"Miriam Transparent", "Miriam"},
|
|
253 | + {"Rod Transparent", "Rod"},
|
|
254 | + {"Times New Roman (Hebrew)", "Times New Roman"},
|
|
255 | + // Japanese
|
|
256 | + {"標準明朝", "MS 明朝"},
|
|
257 | + {"標準ゴシック", "MS ゴシック"},
|
|
258 | + {"ゴシック", "MS ゴシック"},
|
|
259 | + {"ゴシック", "MS ゴシック"},
|
|
260 | + {"クーリエ", "Courier"},
|
|
261 | + {"タイムズロマン", "Times New Roman"},
|
|
262 | + {"ヘルベチカ", "Arial"},
|
|
263 | + // Simplified Chinese
|
|
264 | + {"FangSong_GB2312", "FangSong"},
|
|
265 | + {"KaiTi_GB2312", "KaiTi"},
|
|
266 | +}; |
... | ... | @@ -1923,6 +1923,20 @@ static void RemoveCharsetFromFontSubstitute(nsACString& aName) { |
1923 | 1923 | #define MAX_VALUE_DATA 512
|
1924 | 1924 | |
1925 | 1925 | nsresult gfxDWriteFontList::GetFontSubstitutes() {
|
1926 | + if (nsContentUtils::ShouldResistFingerprinting(
|
|
1927 | + "Ignore any fingerprintable user font customization and normalize "
|
|
1928 | + "font substitutes across different Windows SKUs.",
|
|
1929 | + RFPTarget::Unknown)) {
|
|
1930 | + for (const FontSubstitute& fs : kFontSubstitutes) {
|
|
1931 | + nsAutoCString substituteName(fs.substituteName);
|
|
1932 | + nsAutoCString actualFontName(fs.actualFontName);
|
|
1933 | + BuildKeyNameFromFontName(substituteName);
|
|
1934 | + BuildKeyNameFromFontName(actualFontName);
|
|
1935 | + AddSubstitute(substituteName, actualFontName);
|
|
1936 | + }
|
|
1937 | + return NS_OK;
|
|
1938 | + }
|
|
1939 | + |
|
1926 | 1940 | HKEY hKey;
|
1927 | 1941 | DWORD i, rv, lenAlias, lenActual, valueType;
|
1928 | 1942 | WCHAR aliasName[MAX_VALUE_NAME];
|
... | ... | @@ -1957,39 +1971,46 @@ nsresult gfxDWriteFontList::GetFontSubstitutes() { |
1957 | 1971 | BuildKeyNameFromFontName(substituteName);
|
1958 | 1972 | RemoveCharsetFromFontSubstitute(actualFontName);
|
1959 | 1973 | BuildKeyNameFromFontName(actualFontName);
|
1960 | - if (SharedFontList()) {
|
|
1961 | - // Skip substitution if the original font is available, unless the option
|
|
1962 | - // to apply substitutions unconditionally is enabled.
|
|
1963 | - if (!StaticPrefs::gfx_windows_font_substitutes_always_AtStartup()) {
|
|
1964 | - // Font substitutions are recorded for the canonical family names; we
|
|
1965 | - // don't need FindFamily to consider localized aliases when searching.
|
|
1966 | - if (SharedFontList()->FindFamily(substituteName,
|
|
1967 | - /*aPrimaryNameOnly*/ true)) {
|
|
1968 | - continue;
|
|
1969 | - }
|
|
1970 | - }
|
|
1971 | - if (SharedFontList()->FindFamily(actualFontName,
|
|
1974 | + AddSubstitute(substituteName, actualFontName);
|
|
1975 | + }
|
|
1976 | + |
|
1977 | + return NS_OK;
|
|
1978 | +}
|
|
1979 | + |
|
1980 | +void gfxDWriteFontList::AddSubstitute(const nsCString& substituteName,
|
|
1981 | + const nsCString& actualFontName) {
|
|
1982 | + if (SharedFontList()) {
|
|
1983 | + // Skip substitution if the original font is available, unless the
|
|
1984 | + // option to apply substitutions unconditionally is enabled.
|
|
1985 | + if (!StaticPrefs::gfx_windows_font_substitutes_always_AtStartup()) {
|
|
1986 | + // Font substitutions are recorded for the canonical family names;
|
|
1987 | + // we don't need FindFamily to consider localized aliases when
|
|
1988 | + // searching.
|
|
1989 | + if (SharedFontList()->FindFamily(substituteName,
|
|
1972 | 1990 | /*aPrimaryNameOnly*/ true)) {
|
1973 | - mSubstitutions.InsertOrUpdate(substituteName,
|
|
1974 | - MakeUnique<nsCString>(actualFontName));
|
|
1975 | - } else if (mSubstitutions.Get(actualFontName)) {
|
|
1976 | - mSubstitutions.InsertOrUpdate(
|
|
1977 | - substituteName,
|
|
1978 | - MakeUnique<nsCString>(*mSubstitutions.Get(actualFontName)));
|
|
1979 | - } else {
|
|
1980 | - mNonExistingFonts.AppendElement(substituteName);
|
|
1991 | + return;
|
|
1981 | 1992 | }
|
1993 | + }
|
|
1994 | + if (SharedFontList()->FindFamily(actualFontName,
|
|
1995 | + /*aPrimaryNameOnly*/ true)) {
|
|
1996 | + mSubstitutions.InsertOrUpdate(substituteName,
|
|
1997 | + MakeUnique<nsCString>(actualFontName));
|
|
1998 | + } else if (mSubstitutions.Get(actualFontName)) {
|
|
1999 | + mSubstitutions.InsertOrUpdate(
|
|
2000 | + substituteName,
|
|
2001 | + MakeUnique<nsCString>(*mSubstitutions.Get(actualFontName)));
|
|
1982 | 2002 | } else {
|
1983 | - gfxFontFamily* ff;
|
|
1984 | - if (!actualFontName.IsEmpty() &&
|
|
1985 | - (ff = mFontFamilies.GetWeak(actualFontName))) {
|
|
1986 | - mFontSubstitutes.InsertOrUpdate(substituteName, RefPtr{ff});
|
|
1987 | - } else {
|
|
1988 | - mNonExistingFonts.AppendElement(substituteName);
|
|
1989 | - }
|
|
2003 | + mNonExistingFonts.AppendElement(substituteName);
|
|
2004 | + }
|
|
2005 | + } else {
|
|
2006 | + gfxFontFamily* ff;
|
|
2007 | + if (!actualFontName.IsEmpty() &&
|
|
2008 | + (ff = mFontFamilies.GetWeak(actualFontName))) {
|
|
2009 | + mFontSubstitutes.InsertOrUpdate(substituteName, RefPtr{ff});
|
|
2010 | + } else {
|
|
2011 | + mNonExistingFonts.AppendElement(substituteName);
|
|
1990 | 2012 | }
|
1991 | 2013 | }
|
1992 | - return NS_OK;
|
|
1993 | 2014 | }
|
1994 | 2015 | |
1995 | 2016 | struct FontSubstitution {
|
... | ... | @@ -466,6 +466,9 @@ class gfxDWriteFontList final : public gfxPlatformFontList { |
466 | 466 | const nsTArray<nsCString>* aForceClassicFams = nullptr)
|
467 | 467 | MOZ_REQUIRES(mLock);
|
468 | 468 | |
469 | + void AddSubstitute(const nsCString& substituteName,
|
|
470 | + const nsCString& actualFontName);
|
|
471 | + |
|
469 | 472 | #ifdef MOZ_BUNDLED_FONTS
|
470 | 473 | already_AddRefed<IDWriteFontCollection> CreateBundledFontsCollection(
|
471 | 474 | IDWriteFactory* aFactory);
|
... | ... | @@ -31,6 +31,10 @@ |
31 | 31 | #include "mozilla/StaticPrefs_gfx.h"
|
32 | 32 | #include "mozilla/Telemetry.h"
|
33 | 33 | |
34 | +#include "nsContentUtils.h"
|
|
35 | + |
|
36 | +#include "StandardFonts-win10.inc"
|
|
37 | + |
|
34 | 38 | #include <usp10.h>
|
35 | 39 | |
36 | 40 | using namespace mozilla;
|
... | ... | @@ -50,6 +54,10 @@ static __inline void BuildKeyNameFromFontName(nsAString& aName) { |
50 | 54 | if (aName.Length() >= LF_FACESIZE) aName.Truncate(LF_FACESIZE - 1);
|
51 | 55 | ToLowerCase(aName);
|
52 | 56 | }
|
57 | +static __inline void BuildKeyNameFromFontName(nsACString& aName) {
|
|
58 | + if (aName.Length() >= LF_FACESIZE) aName.Truncate(LF_FACESIZE - 1);
|
|
59 | + ToLowerCase(aName);
|
|
60 | +}
|
|
53 | 61 | |
54 | 62 | // Implementation of gfxPlatformFontList for Win32 GDI,
|
55 | 63 | // using GDI font enumeration APIs to get the list of fonts
|
... | ... | @@ -529,6 +537,26 @@ static void RemoveCharsetFromFontSubstitute(nsAString& aName) { |
529 | 537 | #define MAX_VALUE_DATA 512
|
530 | 538 | |
531 | 539 | nsresult gfxGDIFontList::GetFontSubstitutes() {
|
540 | + if (nsContentUtils::ShouldResistFingerprinting(
|
|
541 | + "Ignore any fingerprintable user font customization and normalize "
|
|
542 | + "font substitutes across different Windows SKUs.",
|
|
543 | + RFPTarget::Unknown)) {
|
|
544 | + for (const FontSubstitute& fs : kFontSubstitutes) {
|
|
545 | + nsAutoCString substituteName(fs.substituteName);
|
|
546 | + nsAutoCString actualFontName(fs.actualFontName);
|
|
547 | + BuildKeyNameFromFontName(substituteName);
|
|
548 | + BuildKeyNameFromFontName(actualFontName);
|
|
549 | + gfxFontFamily* ff;
|
|
550 | + if (!actualFontName.IsEmpty() &&
|
|
551 | + (ff = mFontFamilies.GetWeak(actualFontName))) {
|
|
552 | + mFontSubstitutes.InsertOrUpdate(substituteName, RefPtr{ff});
|
|
553 | + } else {
|
|
554 | + mNonExistingFonts.AppendElement(substituteName);
|
|
555 | + }
|
|
556 | + }
|
|
557 | + return NS_OK;
|
|
558 | + }
|
|
559 | + |
|
532 | 560 | HKEY hKey;
|
533 | 561 | DWORD i, rv, lenAlias, lenActual, valueType;
|
534 | 562 | WCHAR aliasName[MAX_VALUE_NAME];
|