[torbrowser/master] Update font limiting patch to exempt @font-face.

commit 11c13307994168e97e95ac3a5d92cbd768cd12c6 Author: Mike Perry <mikeperry-git@fscked.org> Date: Tue Feb 12 22:44:08 2013 -0800 Update font limiting patch to exempt @font-face. This provides substantial rendering improvements, and probably will also make non-latin script users much happier. --- ...11-Limit-the-number-of-fonts-per-document.patch | 81 +++++++++++++++++--- 1 files changed, 71 insertions(+), 10 deletions(-) diff --git a/src/current-patches/firefox/0011-Limit-the-number-of-fonts-per-document.patch b/src/current-patches/firefox/0011-Limit-the-number-of-fonts-per-document.patch index 80660db..dbf34a9 100644 --- a/src/current-patches/firefox/0011-Limit-the-number-of-fonts-per-document.patch +++ b/src/current-patches/firefox/0011-Limit-the-number-of-fonts-per-document.patch @@ -1,4 +1,4 @@ -From 2786933e3a395e1058da8850a3710f01ca416463 Mon Sep 17 00:00:00 2001 +From 6b7306a50a304bcf12b04784115f21f34b71864a Mon Sep 17 00:00:00 2001 From: Mike Perry <mikeperry-git@torproject.org> Date: Wed, 5 Dec 2012 12:25:21 -0800 Subject: [PATCH 11/26] Limit the number of fonts per document. @@ -14,6 +14,11 @@ browser.display.use_document_fonts was set to 0 for subsequent font queries. If a pref is not set or is negative, that limit does not apply. +The use of "User Fonts" (aka WebFonts, aka @font-face fonts) are exempt from +both of these limits. The patch also makes such fonts take precedence over +local fonts. This vastly improves typography on many sites that would +otherwise hit these limits. + This is done to address: https://www.torproject.org/projects/torbrowser/design/#fingerprinting-linkab... --- @@ -21,8 +26,8 @@ https://www.torproject.org/projects/torbrowser/design/#fingerprinting-linkab... layout/base/nsPresContext.cpp | 100 +++++++++++++++++++++++++++++++++++++++++ layout/base/nsPresContext.h | 9 ++++ layout/style/nsCSSParser.cpp | 1 + - layout/style/nsRuleNode.cpp | 14 +++++- - 5 files changed, 122 insertions(+), 3 deletions(-) + layout/style/nsRuleNode.cpp | 56 ++++++++++++++++++++++- + 5 files changed, 164 insertions(+), 3 deletions(-) diff --git a/gfx/thebes/gfxPangoFonts.cpp b/gfx/thebes/gfxPangoFonts.cpp index c94a299..88c8b8e 100644 @@ -201,10 +206,18 @@ index 37a19c4..30fd021 100644 // because it's only being used to call EnumerateFamilies nsFont font(family, 0, 0, 0, 0, 0, 0); diff --git a/layout/style/nsRuleNode.cpp b/layout/style/nsRuleNode.cpp -index 64504fb..33ce21e 100644 +index 64504fb..86eff1f 100644 --- a/layout/style/nsRuleNode.cpp +++ b/layout/style/nsRuleNode.cpp -@@ -2954,6 +2954,7 @@ nsRuleNode::SetFont(nsPresContext* aPresContext, nsStyleContext* aContext, +@@ -42,6 +42,7 @@ + #include "mozilla/dom/Element.h" + #include "mozilla/LookAndFeel.h" + #include "mozilla/Util.h" ++#include "gfxUserFontSet.h" + + #if defined(_MSC_VER) || defined(__MINGW32__) + #include <malloc.h> +@@ -2954,6 +2955,7 @@ nsRuleNode::SetFont(nsPresContext* aPresContext, nsStyleContext* aContext, aPresContext->GetDefaultFont(kPresContext_DefaultVariableFont_ID, aFont->mLanguage); @@ -212,11 +225,44 @@ index 64504fb..33ce21e 100644 // -moz-system-font: enum (never inherit!) MOZ_STATIC_ASSERT( NS_STYLE_FONT_CAPTION == LookAndFeel::eFont_Caption && -@@ -3439,14 +3440,15 @@ nsRuleNode::ComputeFontData(void* aStartStruct, +@@ -3416,6 +3418,31 @@ static bool ExtractGeneric(const nsString& aFamily, bool aGeneric, + return true; + } + ++struct smugglerStruct { ++ nsStyleFont *font; ++ gfxUserFontSet *userFonts; ++}; ++ ++/* This function forces the use of the first @font-face font we find */ ++static bool ForceFirstWebFont(const nsString& aFamily, bool aGeneric, ++ void *smuggled) ++{ ++ smugglerStruct *sm = static_cast<smugglerStruct*>(smuggled); ++ ++ if (aGeneric) { ++ return true; ++ } ++ ++ if (sm->userFonts->HasFamily(aFamily)) { ++ // Force use of this exact @font-face font since we have it. ++ sm->font->mFont.name = aFamily; ++ ++ return false; // Stop enumeration. ++ } ++ ++ return true; ++} ++ + const void* + nsRuleNode::ComputeFontData(void* aStartStruct, + const nsRuleData* aRuleData, +@@ -3439,14 +3466,16 @@ nsRuleNode::ComputeFontData(void* aStartStruct, bool useDocumentFonts = mPresContext->GetCachedBoolPref(kPresContext_UseDocumentFonts); + bool isXUL = PR_FALSE; ++ bool forcedWebFont = false; // See if we are in the chrome // We only need to know this to determine if we have to use the @@ -230,11 +276,26 @@ index 64504fb..33ce21e 100644 } // Figure out if we are a generic font -@@ -3460,9 +3462,13 @@ nsRuleNode::ComputeFontData(void* aStartStruct, +@@ -3460,9 +3489,28 @@ nsRuleNode::ComputeFontData(void* aStartStruct, // generic? nsFont::GetGenericID(font->mFont.name, &generic); -+ mPresContext->AddFontAttempt(font->mFont); ++ if (!isXUL) { ++ gfxUserFontSet *userFonts = mPresContext->GetUserFontSet(); ++ if (userFonts) { ++ smugglerStruct sm; ++ sm.userFonts = userFonts; ++ sm.font = font; ++ ++ if (!sm.font->mFont.EnumerateFamilies(ForceFirstWebFont, &sm)) { ++ isXUL = true; // Always allow WebFont use. ++ forcedWebFont = true; ++ } ++ } ++ } ++ ++ if (!forcedWebFont && generic == kGenericFont_NONE) ++ mPresContext->AddFontAttempt(font->mFont); + // If we aren't allowed to use document fonts, then we are only entitled // to use the user's default variable-width font and fixed-width font @@ -245,11 +306,11 @@ index 64504fb..33ce21e 100644 // Extract the generic from the specified font family... nsAutoString genericName; if (!font->mFont.EnumerateFamilies(ExtractGeneric, &genericName)) { -@@ -3498,6 +3504,8 @@ nsRuleNode::ComputeFontData(void* aStartStruct, +@@ -3498,6 +3546,8 @@ nsRuleNode::ComputeFontData(void* aStartStruct, font); } -+ if (font->mGenericID == kGenericFont_NONE) ++ if (!forcedWebFont && font->mGenericID == kGenericFont_NONE) + mPresContext->AddFontUse(font->mFont); COMPUTE_END_INHERITED(Font, font) }
participants (1)
-
erinn@torproject.org