Browse Source

Patch for bug 1437393

Ian Neal 5 months ago
parent
commit
72b9aef5b1
2 changed files with 571 additions and 0 deletions
  1. 570 0
      comm-release/patches/1437393-fontsasync-25319.patch
  2. 1 0
      comm-release/patches/series

+ 570 - 0
comm-release/patches/1437393-fontsasync-25319.patch

@@ -0,0 +1,570 @@
+# HG changeset patch
+# User Ian Neal <iann_cvs@blueyonder.co.uk>
+# Date 1714847653 -3600
+# Parent  d81d9d5ef36a2bec69fd38ffaab7723dd6109710
+Bug 1437393 - Font lists in preferences are no longer grouped by font type, port asynchronous handling like Bug 1399206. r=frg a=frg
+
+diff --git a/suite/components/pref/content/pref-fonts.js b/suite/components/pref/content/pref-fonts.js
+--- a/suite/components/pref/content/pref-fonts.js
++++ b/suite/components/pref/content/pref-fonts.js
+@@ -1,220 +1,193 @@
+ /* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+ /* This Source Code Form is subject to the terms of the Mozilla Public
+  * License, v. 2.0. If a copy of the MPL was not distributed with this
+  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+ 
+-var gAllFonts = null;
+-var gFontEnumerator = null;
+-var gDisabled = false;
+-
+-function GetFontEnumerator()
+-{
+-  if (!gFontEnumerator)
+-  {
+-    gFontEnumerator = Cc["@mozilla.org/gfx/fontenumerator;1"]
+-                        .createInstance(Ci.nsIFontEnumerator);
+-  }
+-  return gFontEnumerator;
+-}
++var gFontsDialog = {
++  _disabled: false,
++  _enumerator: null,
++  get enumerator() {
++    if (!this._enumerator) {
++      this._enumerator = Cc["@mozilla.org/gfx/fontenumerator;1"]
++                           .createInstance(Ci.nsIFontEnumerator);
++    }
++    return this._enumerator;
++  },
+ 
+-function BuildFontList(aLanguage, aFontType, aMenuList, aPreference)
+-{
+-  var defaultFont = null;
+-  // Load Font Lists
+-  var fonts = GetFontEnumerator().EnumerateFonts(aLanguage, aFontType, {});
+-  if (fonts.length)
+-  {
+-    defaultFont = GetFontEnumerator().getDefaultFont(aLanguage, aFontType);
+-  }
+-  else
+-  {
+-    fonts = GetFontEnumerator().EnumerateFonts(aLanguage, "", {});
+-    if (fonts.length)
+-      defaultFont = GetFontEnumerator().getDefaultFont(aLanguage, "");
+-  }
+-
+-  if (!gAllFonts)
+-    gAllFonts = GetFontEnumerator().EnumerateAllFonts({});
++  _allFonts: null,
++  async buildFontList(aLanguage, aFontType, aMenuList) {
++    // Reset the list
++    while (aMenuList.hasChildNodes())
++      aMenuList.firstChild.remove();
+ 
+-  // Reset the list
+-  while (aMenuList.hasChildNodes())
+-    aMenuList.lastChild.remove();
++    let defaultFont = null;
++    // Load Font Lists
++    let fonts = await this.enumerator.EnumerateFontsAsync(aLanguage, aFontType);
++    if (fonts.length > 0) {
++      defaultFont = this.enumerator.getDefaultFont(aLanguage, aFontType);
++    } else {
++      fonts = await this.enumerator.EnumerateFontsAsync(aLanguage, "");
++      if (fonts.length > 0)
++        defaultFont = this.enumerator.getDefaultFont(aLanguage, "");
++    }
+ 
+-  // Build the UI for the Default Font and Fonts for this CSS type.
+-  var popup = document.createElement("menupopup");
+-  var separator;
+-  if (fonts.length > 0)
+-  {
+-    const prefutilitiesBundle = document.getElementById("bundle_prefutilities");
+-    let label = defaultFont ?
+-      prefutilitiesBundle.getFormattedString("labelDefaultFont2", [defaultFont]) :
+-      prefutilitiesBundle.getString("labelDefaultFontUnnamed");
+-    let menuitem = document.createElement("menuitem");
+-    menuitem.setAttribute("label", label);
+-    menuitem.setAttribute("value", ""); // Default Font has a blank value
+-    popup.appendChild(menuitem);
++    if (!this._allFonts)
++      this._allFonts = await this.enumerator.EnumerateAllFontsAsync({});
+ 
+-    separator = document.createElement("menuseparator");
+-    popup.appendChild(separator);
+-
+-    for (let font of fonts)
+-    {
++    // Build the UI for the Default Font and Fonts for this CSS type.
++    const popup = document.createElement("menupopup");
++    let separator;
++    let menuitem;
++    if (fonts.length > 0) {
++      const bundlePrefs = document.getElementById("bundle_prefutilities");
++      let defaultLabel = defaultFont ?
++        bundlePrefs.getFormattedString("labelDefaultFont2", [defaultFont]) :
++        bundlePrefs.getString("labelDefaultFontUnnamed");
+       menuitem = document.createElement("menuitem");
+-      menuitem.setAttribute("value", font);
+-      menuitem.setAttribute("label", font);
++      menuitem.setAttribute("label", defaultLabel);
++      menuitem.setAttribute("value", ""); // Default Font has a blank value
+       popup.appendChild(menuitem);
+-    }
+-  }
+ 
+-  // Build the UI for the remaining fonts.
+-  if (gAllFonts.length > fonts.length)
+-  {
+-    // Both lists are sorted, and the Fonts-By-Type list is a subset of the
+-    // All-Fonts list, so walk both lists side-by-side, skipping values we've
+-    // already created menu items for.
+-
+-    if (fonts.length)
+-    {
+       separator = document.createElement("menuseparator");
+       popup.appendChild(separator);
+-    }
+ 
+-    for (i = 0; i < gAllFonts.length; ++i)
+-    {
+-      if (fonts.lastIndexOf(gAllFonts[i], 0) == 0)
+-      {
+-        fonts.shift(); //Remove matched font from array
+-      }
+-      else
+-      {
++      for (let font of fonts) {
+         menuitem = document.createElement("menuitem");
+-        menuitem.setAttribute("value", gAllFonts[i]);
+-        menuitem.setAttribute("label", gAllFonts[i]);
++        menuitem.setAttribute("value", font);
++        menuitem.setAttribute("label", font);
+         popup.appendChild(menuitem);
+       }
+     }
+-  }
+-  aMenuList.appendChild(popup);
+ 
+-  // Fully populated so re-enable menulist before setting preference,
+-  // unless panel is locked.
+-  if (!gDisabled)
+-    aMenuList.disabled = false;
+-  aMenuList.setAttribute("preference", aPreference.id);
+-  aPreference.setElementValue(aMenuList);
+-}
++    // Build the UI for the remaining fonts.
++    if (this._allFonts.length > fonts.length) {
++      // Both lists are sorted, and the Fonts-By-Type list is a subset of the
++      // All-Fonts list, so walk both lists side-by-side, skipping values we've
++      // already created menu items for.
++
++      if (fonts.length > 0) {
++        separator = document.createElement("menuseparator");
++        popup.appendChild(separator);
++      }
+ 
+-function ReadFontLanguageGroup()
+-{
+-  var prefs = [{format: "default",       type: "string",  element: "defaultFontType", fonttype: ""          },
+-               {format: "name.",         type: "unichar", element: "serif",           fonttype: "serif"     },
+-               {format: "name.",         type: "unichar", element: "sans-serif",      fonttype: "sans-serif"},
+-               {format: "name.",         type: "unichar", element: "monospace",       fonttype: "monospace" },
+-               {format: "name.",         type: "unichar", element: "cursive",         fonttype: "cursive"   },
+-               {format: "name.",         type: "unichar", element: "fantasy",         fonttype: "fantasy"   },
+-               {format: "name-list.",    type: "unichar", element: null,              fonttype: "serif"     },
+-               {format: "name-list.",    type: "unichar", element: null,              fonttype: "sans-serif"},
+-               {format: "name-list.",    type: "unichar", element: null,              fonttype: "monospace" },
+-               {format: "name-list.",    type: "unichar", element: null,              fonttype: "cursive"   },
+-               {format: "name-list.",    type: "unichar", element: null,              fonttype: "fantasy"   },
+-               {format: "size.variable", type: "int",     element: "sizeVar",         fonttype: ""          },
+-               {format: "size.fixed",    type: "int",     element: "sizeMono",        fonttype: ""          },
+-               {format: "minimum-size",  type: "int",     element: "minSize",         fonttype: ""          }];
+-  gDisabled = document.getElementById("browser.display.languageList").locked;
+-  var fontLanguage = document.getElementById("font.language.group");
+-  if (gDisabled)
+-    fontLanguage.disabled = true;
+-  var languageGroup = fontLanguage.value;
+-  var preferences = document.getElementById("fonts_preferences");
+-  for (var i = 0; i < prefs.length; ++i)
+-  {
+-    var name = "font."+ prefs[i].format + prefs[i].fonttype + "." + languageGroup;
+-    var preference = document.getElementById(name);
+-    if (!preference)
+-    {
+-      preference = document.createElement("preference");
+-      preference.id = name;
+-      preference.setAttribute("name", name);
+-      preference.setAttribute("type", prefs[i].type);
+-      preferences.appendChild(preference);
++      for (let font of this._allFonts) {
++        if (fonts.lastIndexOf(font, 0) == 0) {
++          fonts.shift(); //Remove matched font from array
++        } else {
++          menuitem = document.createElement("menuitem");
++          menuitem.setAttribute("value", font);
++          menuitem.setAttribute("label", font);
++          popup.appendChild(menuitem);
++        }
++      }
++    }
++    aMenuList.appendChild(popup);
++  },
++
++  readFontSelection(aElement) {
++    // Determine the appropriate value to select, for the following cases:
++    // - there is no setting
++    // - the font selected by the user is no longer present (e.g. deleted from
++    //   fonts folder)
++    const preference = document.getElementById(aElement.getAttribute("preference"));
++    if (preference.value) {
++      let fontItems = aElement.getElementsByAttribute("value", preference.value);
++
++      // There is a setting that actually is in the list. Respect it.
++      if (fontItems.length)
++        return undefined;
+     }
+ 
+-    if (!prefs[i].element)
+-      continue;
++    // Otherwise, use "default" font of current system which is computed
++    // with "font.name-list.*".  If "font.name.*" is empty string, it means
++    // "default".  So, return empty string in this case.
++    return "";
++  },
++
++  _selectLanguageGroupPromise: Promise.resolve(),
++
++
++  _selectLanguageGroup(aLanguageGroup) {
++    this._selectLanguageGroupPromise = (async () => {
++      // Avoid overlapping language group selections by awaiting the resolution
++      // of the previous one. We do this because this function is re-entrant,
++      // as inserting <preference> elements into the DOM sometimes triggers a
++      // call back into this function. And since this function is also
++      // asynchronous, that call can enter this function before the previous
++      // run has completed, which would corrupt the font menulists. Awaiting
++      // the previous call's resolution avoids that fate.
++      await this._selectLanguageGroupPromise;
+ 
+-    var element = document.getElementById(prefs[i].element);
+-    if (element)
+-    {
+-      if (prefs[i].fonttype)
+-      {
+-        // Set an empty label so it does not jump when items are added.
+-        element.setAttribute("label", "");
+-        // Disable menulist for the moment.
+-        element.disabled = true;
+-        // Lazily populate font lists, each gets re-enabled at the end.
+-        window.setTimeout(BuildFontList, 0, languageGroup,
+-                          prefs[i].fonttype, element, preference);
+-      }
+-      else
+-      {
+-        // Unless the panel is locked, make sure these elements are not
+-        // disabled just in case they were in the last language group.
+-        element.disabled = gDisabled;
+-        element.setAttribute("preference", preference.id);
+-        preference.setElementValue(element);
+-      }
+-    }
+-  }
+-}
+-
+-function ReadFontSelection(aElement)
+-{
+-  // Determine the appropriate value to select, for the following cases:
+-  // - there is no setting
+-  // - the font selected by the user is no longer present (e.g. deleted from
+-  //   fonts folder)
+-  var preference = document.getElementById(aElement.getAttribute("preference"));
+-  if (preference.value)
+-  {
+-    var fontItems = aElement.getElementsByAttribute("value", preference.value);
++      var prefs = [{format: "default",       type: "string",   element: "defaultFontType", fonttype: ""          },
++                   {format: "name.",         type: "fontname", element: "serif",           fonttype: "serif"     },
++                   {format: "name.",         type: "fontname", element: "sans-serif",      fonttype: "sans-serif"},
++                   {format: "name.",         type: "fontname", element: "monospace",       fonttype: "monospace" },
++                   {format: "name.",         type: "fontname", element: "cursive",         fonttype: "cursive"   },
++                   {format: "name.",         type: "fontname", element: "fantasy",         fonttype: "fantasy"   },
++                   {format: "name-list.",    type: "unichar",  element: null,              fonttype: "serif"     },
++                   {format: "name-list.",    type: "unichar",  element: null,              fonttype: "sans-serif"},
++                   {format: "name-list.",    type: "unichar",  element: null,              fonttype: "monospace" },
++                   {format: "name-list.",    type: "unichar",  element: null,              fonttype: "cursive"   },
++                   {format: "name-list.",    type: "unichar",  element: null,              fonttype: "fantasy"   },
++                   {format: "size.variable", type: "int",      element: "sizeVar",         fonttype: ""          },
++                   {format: "size.fixed",    type: "int",      element: "sizeMono",        fonttype: ""          },
++                   {format: "minimum-size",  type: "int",      element: "minSize",         fonttype: ""          }];
++      var preferences = document.getElementById("fonts_preferences");
++      for (var i = 0; i < prefs.length; ++i) {
++        var name = "font."+ prefs[i].format + prefs[i].fonttype + "." + aLanguageGroup;
++        var preference = document.getElementById(name);
++        if (!preference) {
++          preference = document.createElement("preference");
++          preference.id = name;
++          preference.setAttribute("name", name);
++          preference.setAttribute("type", prefs[i].type);
++          preferences.appendChild(preference);
++        }
+ 
+-    // There is a setting that actually is in the list. Respect it.
+-    if (fontItems.length)
+-      return undefined;
+-  }
++        if (!prefs[i].element)
++          continue;
++
++        var element = document.getElementById(prefs[i].element);
++        if (element) {
++          element.setAttribute("preference", preference.id);
+ 
+-  var defaultValue = aElement.firstChild.firstChild.getAttribute("value");
+-  var languagePref = document.getElementById("font.language.group");
+-  preference = document.getElementById("font.name-list." + aElement.id + "." + languagePref.value);
+-  if (!preference || !preference.hasUserValue)
+-    return defaultValue;
++          if (prefs[i].fonttype) {
++            // Set an empty label so it does not jump when items are added.
++            element.setAttribute("label", "");
++            await this.buildFontList(aLanguageGroup, prefs[i].fonttype, element);
++          }
+ 
+-  var fontNames = preference.value.split(",");
++          // Unless the panel is locked, make sure these elements are not
++          // disabled just in case they were in the last language group.
++          element.disabled = this._disabled;
++          preference.setElementValue(element);
++        }
++      }
++    })().catch(Cu.reportError);
++  },
+ 
+-  for (var i = 0; i < fontNames.length; ++i)
+-  {
+-    fontItems = aElement.getElementsByAttribute("value", fontNames[i].trim());
+-    if (fontItems.length)
+-      return fontItems[0].getAttribute("value");
+-  }
+-  return defaultValue;
+-}
++  readFontLanguageGroup() {
++    this._disabled = document.getElementById("browser.display.languageList").locked;
++    var languagePref = document.getElementById("font.language.group");
++    if (this._disabled)
++      languagePref.disabled = true;
++    this._selectLanguageGroup(languagePref.value);
++    return undefined;
++  },
+ 
+-function ReadFontPref(aElement, aDefaultValue)
+-{
+-  // Check to see if preference value exists,
+-  // if not return given default value.
+-  var preference = document.getElementById(aElement.getAttribute("preference"));
+-  return preference.value || aDefaultValue;
+-}
++  readFontPref(aElement, aDefaultValue) {
++    // Check to see if preference value exists,
++    // if not return given default value.
++    var preference = document.getElementById(aElement.getAttribute("preference"));
++    return preference.value || aDefaultValue;
++  },
+ 
+-function ReadUseDocumentFonts()
+-{
+-  var preference = document.getElementById("browser.display.use_document_fonts");
+-  return preference.value == 1;
+-}
++  readUseDocumentFonts() {
++    var preference = document.getElementById("browser.display.use_document_fonts");
++    return preference.value == 1;
++  },
+ 
+-function WriteUseDocumentFonts(aUseDocumentFonts)
+-{
+-  return aUseDocumentFonts.checked ? 1 : 0;
+-}
++  writeUseDocumentFonts(aUseDocumentFonts) {
++    return aUseDocumentFonts.checked ? 1 : 0;
++  },
++};
+diff --git a/suite/components/pref/content/pref-fonts.xul b/suite/components/pref/content/pref-fonts.xul
+--- a/suite/components/pref/content/pref-fonts.xul
++++ b/suite/components/pref/content/pref-fonts.xul
+@@ -1,37 +1,38 @@
+ <?xml version="1.0"?>
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+    - License, v. 2.0. If a copy of the MPL was not distributed with this
+    - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+ <!DOCTYPE overlay SYSTEM "chrome://communicator/locale/pref/pref-fonts.dtd">
+ 
+ <overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+   <prefpane id="fonts_pane"
+-            label="&pref.fonts.title;"
+-            script="chrome://communicator/content/pref/pref-fonts.js">
++            label="&pref.fonts.title;">
+     <preferences id="fonts_preferences">
+       <preference id="font.language.group"
+                   name="font.language.group"
+                   type="wstring"/>
+       <preference id="browser.display.use_document_fonts"
+                   name="browser.display.use_document_fonts"
+                   type="int"/>
+       <preference id="browser.display.languageList"
+                   name="browser.display.languageList"
+                   type="wstring"/>
+     </preferences>
+ 
++    <script src="chrome://communicator/content/pref/pref-fonts.js"/>
++
+     <groupbox>
+       <caption align="center">
+         <label value="&language.label;"
+                accesskey="&language.accesskey;"
+                control="selectLangs"/>
+         <menulist id="selectLangs" preference="font.language.group"
+-                  onsyncfrompreference="document.getElementById('fonts_pane').ReadFontLanguageGroup();">
++                  onsyncfrompreference="return gFontsDialog.readFontLanguageGroup();">
+           <menupopup>
+             <menuitem value="ar" label="&font.langGroup.arabic;"/>
+             <menuitem value="x-armn" label="&font.langGroup.armenian;"/>
+             <menuitem value="x-beng" label="&font.langGroup.bengali;"/>
+             <menuitem value="zh-CN" label="&font.langGroup.simpl-chinese;"/>
+             <menuitem value="zh-TW" label="&font.langGroup.trad-chinese;"/>
+             <menuitem value="zh-HK" label="&font.langGroup.trad-chinese-hk;"/>
+             <menuitem value="x-cyrillic" label="&font.langGroup.cyrillic;"/>
+@@ -81,26 +82,26 @@
+           </row>
+           <row align="center">
+             <hbox align="center" pack="end">
+               <label value="&proportional.label;"
+                      accesskey="&proportional.accesskey;"
+                      control="defaultFontType"/>
+             </hbox>
+             <menulist id="defaultFontType" flex="1" style="width: 0px;"
+-                      onsyncfrompreference="return document.getElementById('fonts_pane').ReadFontSelection(this);">
++                      onsyncfrompreference="return gFontsDialog.readFontSelection(this);">
+               <menupopup>
+                 <menuitem value="serif"
+                           label="&useDefaultFontSerif.label;"/>
+                 <menuitem value="sans-serif"
+                           label="&useDefaultFontSansSerif.label;"/>
+               </menupopup>
+             </menulist>
+             <menulist id="sizeVar" class="small-margin"
+-                      onsyncfrompreference="return document.getElementById('fonts_pane').ReadFontPref(this, 16);">
++                      onsyncfrompreference="return gFontsDialog.readFontPref(this, 16);">
+               <menupopup>
+                 <menuitem value="8" label="8"/>
+                 <menuitem value="9" label="9"/>
+                 <menuitem value="10" label="10"/>
+                 <menuitem value="11" label="11"/>
+                 <menuitem value="12" label="12"/>
+                 <menuitem value="13" label="13"/>
+                 <menuitem value="14" label="14"/>
+@@ -131,62 +132,62 @@
+           </row>
+           <row align="center">
+             <hbox align="center" pack="end">
+               <label value="&serif.label;"
+                      accesskey="&serif.accesskey;"
+                      control="serif"/>
+             </hbox>
+             <menulist id="serif" class="prefpanel-font-list"
+-                      onsyncfrompreference="return document.getElementById('fonts_pane').ReadFontSelection(this);"/>
++                      onsyncfrompreference="return gFontsDialog.readFontSelection(this);"/>
+             <spacer/>
+           </row>
+           <row align="center">
+             <hbox align="center" pack="end">
+               <label value="&sans-serif.label;"
+                      accesskey="&sans-serif.accesskey;"
+                      control="sans-serif"/>
+             </hbox>
+             <menulist id="sans-serif" class="prefpanel-font-list"
+-                      onsyncfrompreference="return document.getElementById('fonts_pane').ReadFontSelection(this);"/>
++                      onsyncfrompreference="return gFontsDialog.readFontSelection(this);"/>
+             <spacer/>
+           </row>
+           <row align="center">
+             <hbox align="center" pack="end">
+               <label value="&cursive.label;"
+                      accesskey="&cursive.accesskey;"
+                      control="cursive"/>
+             </hbox>
+             <menulist id="cursive" class="prefpanel-font-list"
+-                      onsyncfrompreference="return document.getElementById('fonts_pane').ReadFontSelection(this);"/>
++                      onsyncfrompreference="return gFontsDialog.readFontSelection(this);"/>
+             <spacer/>
+           </row>
+           <row align="center">
+             <hbox align="center" pack="end">
+               <label value="&fantasy.label;"
+                      accesskey="&fantasy.accesskey;"
+                      control="fantasy"/>
+             </hbox>
+             <menulist id="fantasy" class="prefpanel-font-list"
+-                      onsyncfrompreference="return document.getElementById('fonts_pane').ReadFontSelection(this);"/>
++                      onsyncfrompreference="return gFontsDialog.readFontSelection(this);"/>
+             <spacer/>
+           </row>
+           <row>
+             <separator class="thin"/>
+           </row>
+           <row align="center">
+             <hbox align="center" pack="end">
+               <label value="&monospace.label;"
+                      accesskey="&monospace.accesskey;"
+                      control="monospace"/>
+             </hbox>
+             <menulist id="monospace" class="prefpanel-font-list"
+-                      onsyncfrompreference="return document.getElementById('fonts_pane').ReadFontSelection(this);"/>
++                      onsyncfrompreference="return gFontsDialog.readFontSelection(this);"/>
+             <menulist id="sizeMono"
+-                      onsyncfrompreference="return document.getElementById('fonts_pane').ReadFontPref(this, 12);">
++                      onsyncfrompreference="return gFontsDialog.readFontPref(this, 12);">
+               <menupopup>
+                 <menuitem value="8" label="8"/>
+                 <menuitem value="9" label="9"/>
+                 <menuitem value="10" label="10"/>
+                 <menuitem value="11" label="11"/>
+                 <menuitem value="12" label="12"/>
+                 <menuitem value="13" label="13"/>
+                 <menuitem value="14" label="14"/>
+@@ -218,17 +219,17 @@
+           <row>
+             <spacer/>
+             <hbox align="center" pack="end">
+               <label value="&minSize.label;"
+                      accesskey="&minSize.accesskey;"
+                      control="minSize"/>
+             </hbox>
+             <menulist id="minSize"
+-                      onsyncfrompreference="return document.getElementById('fonts_pane').ReadFontPref(this, 0);">
++                      onsyncfrompreference="return gFontsDialog.readFontPref(this, 0);">
+               <menupopup>
+                 <menuitem value="0" label="&minSize.none;"/>
+                 <menuitem value="9" label="9"/>
+                 <menuitem value="10" label="10"/>
+                 <menuitem value="11" label="11"/>
+                 <menuitem value="12" label="12"/>
+                 <menuitem value="13" label="13"/>
+                 <menuitem value="14" label="14"/>
+@@ -248,13 +249,13 @@
+ 
+     <separator class="thin"/>
+ 
+     <!-- Unchecking this removes the ability to select dynamic fonts -->
+     <checkbox id="browserUseDocumentFonts"
+               label="&useDocumentFonts.label;"
+               accesskey="&useDocumentFonts.accesskey;"
+               preference="browser.display.use_document_fonts"
+-              onsyncfrompreference="return document.getElementById('fonts_pane').ReadUseDocumentFonts();"
+-              onsynctopreference="return document.getElementById('fonts_pane').WriteUseDocumentFonts(this);"/>
++              onsyncfrompreference="return gFontsDialog.readUseDocumentFonts();"
++              onsynctopreference="return gFontsDialog.writeUseDocumentFonts(this);"/>
+ 
+   </prefpane>
+ </overlay>

+ 1 - 0
comm-release/patches/series

@@ -2152,3 +2152,4 @@ TOP-1872623-cancelbookmark-25319.patch
 1885748-brokentab-25319.patch
 1446050-2-61a1.patch
 WIP-NOBUG-implement-about-seamonkey-comm.patch
+1437393-fontsasync-25319.patch