Files
tubestation/toolkit/mozapps/preferences/fontbuilder.js
Masayuki Nakano 2aa2ad7d38 Bug 1344990 part.4 FontBuilder.readFontSelection() should return empty string when saved font isn't available r=jaws
FontBuilder adjusted font settings if reading font isn't available in the system.  Now, we support empty string value of "font.name.*" which means default font in the system.  If it's empty string, gfx checks default font from "font.name-list.*" at runtime.  Therefore, resetting "font.name.*" to empty string is the best approach if specified font becomes not available (e.g., uninstalled from the system).

Therefore, this patch replaces the code in FontBuilder.readFontSelection() with just returning empty string.

MozReview-Commit-ID: HgR88Qw8Xwe
2017-03-29 23:55:37 +09:00

109 lines
4.0 KiB
JavaScript

// -*- indent-tabs-mode: nil; js-indent-level: 2 -*-
/* 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 FontBuilder = {
_enumerator: null,
get enumerator() {
if (!this._enumerator) {
this._enumerator = Components.classes["@mozilla.org/gfx/fontenumerator;1"]
.createInstance(Components.interfaces.nsIFontEnumerator);
}
return this._enumerator;
},
_allFonts: null,
_langGroupSupported: false,
buildFontList(aLanguage, aFontType, aMenuList) {
// Reset the list
while (aMenuList.hasChildNodes())
aMenuList.firstChild.remove();
var defaultFont = null;
// Load Font Lists
var fonts = this.enumerator.EnumerateFonts(aLanguage, aFontType, { } );
if (fonts.length > 0)
defaultFont = this.enumerator.getDefaultFont(aLanguage, aFontType);
else {
fonts = this.enumerator.EnumerateFonts(aLanguage, "", { });
if (fonts.length > 0)
defaultFont = this.enumerator.getDefaultFont(aLanguage, "");
}
if (!this._allFonts)
this._allFonts = this.enumerator.EnumerateAllFonts({});
// Build the UI for the Default Font and Fonts for this CSS type.
var popup = document.createElement("menupopup");
var separator;
if (fonts.length > 0) {
if (defaultFont) {
var bundlePreferences = document.getElementById("bundlePreferences");
var label = bundlePreferences.getFormattedString("labelDefaultFont", [defaultFont]);
var menuitem = document.createElement("menuitem");
menuitem.setAttribute("label", label);
menuitem.setAttribute("value", ""); // Default Font has a blank value
popup.appendChild(menuitem);
separator = document.createElement("menuseparator");
popup.appendChild(separator);
}
for (var i = 0; i < fonts.length; ++i) {
menuitem = document.createElement("menuitem");
menuitem.setAttribute("value", fonts[i]);
menuitem.setAttribute("label", fonts[i]);
popup.appendChild(menuitem);
}
}
// Build the UI for the remaining fonts.
if (this._allFonts.length > fonts.length) {
this._langGroupSupported = true;
// 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.
var builtItem = separator ? separator.nextSibling : popup.firstChild;
var builtItemValue = builtItem ? builtItem.getAttribute("value") : null;
separator = document.createElement("menuseparator");
popup.appendChild(separator);
for (i = 0; i < this._allFonts.length; ++i) {
if (this._allFonts[i] != builtItemValue) {
menuitem = document.createElement("menuitem");
menuitem.setAttribute("value", this._allFonts[i]);
menuitem.setAttribute("label", this._allFonts[i]);
popup.appendChild(menuitem);
} else {
builtItem = builtItem.nextSibling;
builtItemValue = builtItem ? builtItem.getAttribute("value") : null;
}
}
}
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)
let 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;
}
// 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 "";
}
};