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

erinn at torproject.org erinn at torproject.org
Tue Feb 19 17:57:53 UTC 2013


commit 11c13307994168e97e95ac3a5d92cbd768cd12c6
Author: Mike Perry <mikeperry-git at 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 at 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-linkability
 ---
@@ -21,8 +26,8 @@ https://www.torproject.org/projects/torbrowser/design/#fingerprinting-linkabilit
  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)
  }





More information about the tor-commits mailing list