Index: chrome/common/extensions/docs/examples/api/fontSettings/options.js |
diff --git a/chrome/common/extensions/docs/examples/api/fontSettings/options.js b/chrome/common/extensions/docs/examples/api/fontSettings/options.js |
index 22a17b07412141787f1f60e4b49b51f1212bfaac..e16cab4322065cc1ae714900bbad0c43f6275796 100644 |
--- a/chrome/common/extensions/docs/examples/api/fontSettings/options.js |
+++ b/chrome/common/extensions/docs/examples/api/fontSettings/options.js |
@@ -2,9 +2,34 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-// The scripts supported by the Font Settings Extension API. |
-var scripts = [ |
- { scriptCode: 'Zyyy', scriptName: 'Default'}, |
+'use strict'; |
+ |
+/** |
+ * @fileoverview The Advanced Font Settings Extension implementation. |
+ */ |
+ |
+function $(id) { |
+ return document.getElementById(id); |
+} |
+ |
+/** |
+ * @namespace |
+ */ |
+var advancedFonts = {}; |
+ |
+/** |
+ * The ICU script code for the Common, or global, script, which is used as the |
+ * fallback when the script is undeclared. |
+ * @const |
+ */ |
+advancedFonts.COMMON_SCRIPT = 'Zyyy'; |
+ |
+/** |
+ * The scripts supported by the Font Settings Extension API. |
+ * @const |
+ */ |
+advancedFonts.scripts = [ |
+ { scriptCode: advancedFonts.COMMON_SCRIPT, scriptName: 'Default'}, |
{ scriptCode: 'Afak', scriptName: 'Afaka'}, |
{ scriptCode: 'Arab', scriptName: 'Arabic'}, |
{ scriptCode: 'Armi', scriptName: 'Imperial Aramaic'}, |
@@ -158,105 +183,222 @@ var scripts = [ |
{ scriptCode: 'Zsym', scriptName: 'Symbols'} |
]; |
-// The generic font families supported by the Font Settings Extension API. |
-var families = |
- ["standard", "sansserif", "serif", "fixed", "cursive", "fantasy"]; |
- |
-// Mapping between font list ids and the generic family setting they |
-// represent. |
-var fontPickers = [ |
- { fontList: 'standardFontList', name: 'standard' }, |
- { fontList: 'serifFontList', name: 'serif' }, |
- { fontList: 'sansSerifFontList', name: 'sansserif' }, |
- { fontList: 'fixedFontList', name: 'fixed' } |
-]; |
- |
-// Ids of elements to contain the sample text. |
-var sampleTextDivIds = [ |
- 'standardFontSample', |
- 'serifFontSample', |
- 'sansSerifFontSample', |
- 'fixedFontSample', |
- 'minFontSample' |
-]; |
- |
-// Sample texts. |
-var defaultSampleText = 'The quick brown fox jumps over the lazy dog.'; |
-var scriptSpecificSampleText = { |
+/** |
+ * The generic font families supported by the Font Settings Extension API. |
+ * @const |
+ */ |
+advancedFonts.FAMILIES = |
+ ['standard', 'sansserif', 'serif', 'fixed', 'cursive', 'fantasy']; |
+ |
+/** |
+ * Sample texts. |
+ * @const |
+ */ |
+advancedFonts.SAMPLE_TEXTS = { |
// "Cyrllic script". |
- 'Cyrl': 'Кириллица', |
- 'Hang': '정 참판 양반댁 규수 큰 교자 타고 혼례 치른 날.', |
- 'Hans': '床前明月光,疑是地上霜。举头望明月,低头思故乡。', |
- 'Hant': '床前明月光,疑是地上霜。舉頭望明月,低頭思故鄉。', |
- 'Jpan': '吾輩は猫である。名前はまだ無い。', |
+ Cyrl: 'Кириллица', |
+ Hang: '정 참판 양반댁 규수 큰 교자 타고 혼례 치른 날.', |
+ Hans: '床前明月光,疑是地上霜。举头望明月,低头思故乡。', |
+ Hant: '床前明月光,疑是地上霜。舉頭望明月,低頭思故鄉。', |
+ Jpan: '吾輩は猫である。名前はまだ無い。', |
// "Khmer language". |
- 'Khmr': '\u1797\u17B6\u179F\u17B6\u1781\u17D2\u1798\u17C2\u179A', |
+ Khmr: '\u1797\u17B6\u179F\u17B6\u1781\u17D2\u1798\u17C2\u179A', |
+ Zyyy: 'The quick brown fox jumps over the lazy dog.' |
}; |
-// Definition for ScriptList. |
-cr.define('fontSettings.ui', function() { |
- const List = cr.ui.List; |
- const ListItem = cr.ui.ListItem; |
- const ListSingleSelectionModel = cr.ui.ListSingleSelectionModel; |
- |
- function ScriptListItem(info) { |
- var el = cr.doc.createElement('li'); |
- el.__proto__ = ScriptListItem.prototype; |
- el.info_ = info; |
- el.decorate(); |
- return el; |
- }; |
+/** |
+ * Controller of pending changes. |
+ * @const |
+ */ |
+advancedFonts.pendingChanges = new PendingChanges(); |
+ |
+/** |
+ * Map from |genericFamily| to UI controls and data for its font setting. |
+ */ |
+advancedFonts.fontSettings = null; |
+ |
+/** |
+ * Map from |fontSizeKey| to UI contols and data for its font size setting. |
+ */ |
+advancedFonts.fontSizeSettings = null; |
+ |
+/** |
+ * Gets the font size used for |fontSizeKey|, including pending changes. Calls |
+ * |callback| with the result. |
+ * |
+ * @param {string} fontSizeKey The font size setting key. See |
+ * PendingChanges.getFontSize(). |
+ * @param {function(number, boolean)} callback The callback of form |
+ * function(size, controllable). |size| is the effective setting, |
+ * |controllable| is whether the setting can be set. |
+ */ |
+advancedFonts.getEffectiveFontSize = function(fontSizeKey, callback) { |
+ advancedFonts.fontSizeSettings[fontSizeKey].getter({}, function(details) { |
+ var controllable = advancedFonts.isControllableLevel( |
+ details.levelOfControl); |
+ var size = details.pixelSize; |
+ var pendingFontSize = advancedFonts.pendingChanges.getFontSize(fontSizeKey); |
+ // If the setting is not controllable, we can have no pending change. |
+ if (!controllable) { |
+ if (pendingFontSize != null) { |
+ advancedFonts.pendingChanges.setFontSize(fontSizeKey, null); |
+ $('apply-settings').disabled = advancedFonts.pendingChanges.isEmpty(); |
+ pendingFontSize = null; |
+ } |
+ } |
- ScriptListItem.prototype = { |
- __proto__: ListItem.prototype, |
+ // If we have a pending change, it overrides the current setting. |
+ if (pendingFontSize != null) |
+ size = pendingFontSize; |
+ callback(size, controllable); |
+ }); |
+}; |
- decorate: function() { |
- this.textContent = this.info_.scriptName; |
- if (this.info_.scriptCode == 'Zyyy') { |
- this.style.marginBottom = '1em'; |
+/** |
+ * Gets the font used for |script| and |genericFamily|, including pending |
+ * changes. Calls |callback| with the result. |
+ * |
+ * @param {string} script The script code. |
+ * @param {string} genericFamily The generic family. |
+ * @param {function(string, boolean, string)} callback The callback of form |
+ * function(font, controllable, effectiveFont). |font| is the setting |
+ * (pending or not), |controllable| is whether the setting can be set, |
+ * |effectiveFont| is the font used taking fallback into consideration. |
+ */ |
+advancedFonts.getEffectiveFont = function(script, genericFamily, callback) { |
+ var pendingChanges = advancedFonts.pendingChanges; |
+ var details = { script: script, genericFamily: genericFamily }; |
+ chrome.fontSettings.getFont(details, function(result) { |
+ var setting = {}; |
+ setting.font = result.fontId; |
+ setting.controllable = |
+ advancedFonts.isControllableLevel(result.levelOfControl); |
+ var pendingFont = |
+ pendingChanges.getFont(details.script, details.genericFamily); |
+ // If the setting is not controllable, we can have no pending change. |
+ if (!setting.controllable) { |
+ if (pendingFont != null) { |
+ pendingChanges.setFont(script, genericFamily, null); |
+ $('apply-settings').disabled = advancedFonts.pendingChanges.isEmpty(); |
+ pendingFont = null; |
} |
} |
- }; |
- var ScriptList = cr.ui.define('list'); |
- ScriptList.prototype = { |
- __proto__: List.prototype, |
- |
- decorate: function() { |
- List.prototype.decorate.call(this); |
- var sm = new ListSingleSelectionModel(); |
- this.selectionModel = sm; |
- this.autoExpands = true; |
- this.dataModel = new cr.ui.ArrayDataModel(scripts); |
- this.style.height = '75vh'; |
- }, |
+ // If we have a pending change, it overrides the current setting. |
+ if (pendingFont != null) |
+ setting.font = pendingFont; |
- createItem: function(info) { |
- return new ScriptListItem(info); |
+ // If we have a font, we're done. |
+ if (setting.font) { |
+ callback(setting.font, setting.controllable, setting.font); |
+ return; |
} |
- }; |
- return { |
- ScriptList: ScriptList, |
- ScriptListItem: ScriptListItem |
- }; |
-}); |
+ // If we're still here, we have to fallback to common script, unless this |
+ // already is common script. |
+ if (script == advancedFonts.COMMON_SCRIPT) { |
+ callback('', setting.controllable, ''); |
+ return; |
+ } |
+ advancedFonts.getEffectiveFont( |
+ advancedFonts.COMMON_SCRIPT, |
+ genericFamily, |
+ callback.bind(null, setting.font, setting.controllable)); |
+ }); |
+}; |
-function getSelectedScript() { |
- var scriptList = document.getElementById('scriptList'); |
- return scriptList.selectedItem.scriptCode; |
-} |
+/** |
+ * Refreshes the UI controls related to a font setting. |
+ * |
+ * @param {{fontList: HTMLSelectElement, samples: Array.<HTMLElement>}} |
+ * fontSetting The setting object (see advancedFonts.fontSettings). |
+ * @param {string} font The value of the font setting. |
+ * @param {boolean} controllable Whether the font setting can be controlled |
+ * by this extension. |
+ * @param {string} effectiveFont The font used, including fallback to Common |
+ * script. |
+ */ |
+advancedFonts.refreshFont = function( |
+ fontSetting, font, controllable, effectiveFont) { |
+ for (var i = 0; i < fontSetting.samples.length; ++i) |
+ fontSetting.samples[i].style.fontFamily = effectiveFont; |
+ advancedFonts.setSelectedFont(fontSetting.fontList, font); |
+ fontSetting.fontList.disabled = !controllable; |
+}; |
+ |
+/** |
+ * Refreshes the UI controls related to a font size setting. |
+ * |
+ * @param {{label: HTMLElement, slider: Slider, samples: Array.<HTMLElement>}} |
+ * fontSizeSetting The setting object (see advancedFonts.fontSizeSettings). |
+ * @param size The value of the font size setting. |
+ * @param controllable Whether the setting can be controlled by this extension. |
+ */ |
+advancedFonts.refreshFontSize = function(fontSizeSetting, size, controllable) { |
+ fontSizeSetting.label.textContent = 'Size: ' + size + 'px'; |
+ advancedFonts.setFontSizeSlider(fontSizeSetting.slider, size, controllable); |
+ for (var i = 0; i < fontSizeSetting.samples.length; ++i) |
+ fontSizeSetting.samples[i].style.fontSize = size + 'px'; |
+}; |
+ |
+/** |
+ * Refreshes all UI controls to reflect the current settings, including pending |
+ * changes. |
+ */ |
+advancedFonts.refresh = function() { |
+ var script = advancedFonts.getSelectedScript(); |
+ var sample; |
+ if (advancedFonts.SAMPLE_TEXTS[script]) |
+ sample = advancedFonts.SAMPLE_TEXTS[script]; |
+ else |
+ sample = advancedFonts.SAMPLE_TEXTS[advancedFonts.COMMON_SCRIPT]; |
+ var sampleTexts = document.querySelectorAll('.sample-text-span'); |
+ for (var i = 0; i < sampleTexts.length; i++) |
+ sampleTexts[i].textContent = sample; |
+ |
+ var setting; |
+ var callback; |
+ for (var genericFamily in advancedFonts.fontSettings) { |
+ setting = advancedFonts.fontSettings[genericFamily]; |
+ callback = advancedFonts.refreshFont.bind(null, setting); |
+ advancedFonts.getEffectiveFont(script, genericFamily, callback); |
+ } |
+ |
+ for (var fontSizeKey in advancedFonts.fontSizeSettings) { |
+ setting = advancedFonts.fontSizeSettings[fontSizeKey]; |
+ callback = advancedFonts.refreshFontSize.bind(null, setting); |
+ advancedFonts.getEffectiveFontSize(fontSizeKey, callback); |
+ } |
-function getSelectedFont(fontList) { |
+ $('apply-settings').disabled = advancedFonts.pendingChanges.isEmpty(); |
+}; |
+ |
+/** |
+ * @return {string} The currently selected script code. |
+ */ |
+advancedFonts.getSelectedScript = function() { |
+ var scriptList = $('scriptList'); |
+ return scriptList.options[scriptList.selectedIndex].value; |
+}; |
+ |
+/** |
+ * @param {HTMLSelectElement} fontList The <select> containing a list of fonts. |
+ * @return {string} The currently selected value of |fontList|. |
+ */ |
+advancedFonts.getSelectedFont = function(fontList) { |
return fontList.options[fontList.selectedIndex].value; |
-} |
+}; |
-// Populates the font lists with the list of system fonts from |fonts|. |
-function populateLists(fonts) { |
- for (var i = 0; i < fontPickers.length; i++) { |
- var list = document.getElementById(fontPickers[i].fontList); |
+/** |
+ * Populates the font lists. |
+ * @param {Array.<{fontId: string, displayName: string>} fonts The list of |
+ * fonts on the system. |
+ */ |
+advancedFonts.populateFontLists = function(fonts) { |
+ for (var genericFamily in advancedFonts.fontSettings) { |
+ var list = advancedFonts.fontSettings[genericFamily].fontList; |
- // Add special item to indicate fallback to the non-per-script |
+ // Add a special item to indicate fallback to the non-per-script |
// font setting. The Font Settings API uses the empty string to indicate |
// fallback. |
var defaultItem = document.createElement('option'); |
@@ -264,37 +406,36 @@ function populateLists(fonts) { |
defaultItem.text = '(Use default)'; |
list.add(defaultItem); |
- for (var j = 0; j < fonts.length; j++) { |
+ for (var i = 0; i < fonts.length; ++i) { |
var item = document.createElement('option'); |
- item.value = fonts[j].fontId; |
- item.text = fonts[j].displayName; |
+ item.value = fonts[i].fontId; |
+ item.text = fonts[i].displayName; |
list.add(item); |
} |
} |
+ advancedFonts.refresh(); |
+}; |
- updateFontListsForScript(); |
-} |
- |
-// Returns a function that updates the font setting for |genericFamily| |
-// to match the selected value in |fontList|. It can be used as an event |
-// handler for selection changes in |fontList|. |
-function getFontChangeHandler(fontList, genericFamily) { |
- return function() { |
- var script = getSelectedScript(); |
- var font = getSelectedFont(fontList); |
- |
- var details = {}; |
- details.genericFamily = genericFamily; |
- details.fontId = font; |
- details.script = script; |
- |
- chrome.fontSettings.setFont(details); |
- }; |
-} |
+/** |
+ * Handles change events on a <select> element for a font setting. |
+ * @param {string} genericFamily The generic family for the font setting. |
+ * @param {Event} event The change event. |
+ */ |
+advancedFonts.handleFontListChange = function(genericFamily, event) { |
+ var script = advancedFonts.getSelectedScript(); |
+ var font = advancedFonts.getSelectedFont(event.target); |
+ |
+ advancedFonts.pendingChanges.setFont(script, genericFamily, font); |
+ advancedFonts.refresh(); |
+}; |
-// Sets the selected value of |fontList| to |fontId|. |
-function setSelectedFont(fontList, fontId) { |
- var script = getSelectedScript(); |
+/** |
+ * Sets the selected value of |fontList| to |fontId|. |
+ * @param {HTMLSelectElement} fontList The <select> containing a list of fonts. |
+ * @param {string} fontId The font to set |fontList|'s selection to. |
+ */ |
+advancedFonts.setSelectedFont = function(fontList, fontId) { |
+ var script = advancedFonts.getSelectedScript(); |
var i; |
for (i = 0; i < fontList.length; i++) { |
if (fontId == fontList.options[i].value) { |
@@ -306,122 +447,136 @@ function setSelectedFont(fontList, fontId) { |
console.warn("font '" + fontId + "' for " + fontList.id + ' for ' + |
script + ' is not on the system'); |
} |
-} |
- |
-// Returns a callback function that sets the selected value of |list| to the |
-// font returned from |chrome.fontSettings.getFont|. |
-function getFontHandler(list) { |
- return function(details) { |
- setSelectedFont(list, details.fontId); |
- list.disabled = !isControllableLevel(details.levelOfControl); |
- }; |
-} |
- |
-// Called when the script list selection changes. Sets the selected value of |
-// each font list to the current font setting, and updates the samples' lang |
-// so that they are shown in the current font setting. |
-function updateFontListsForScript() { |
- var script = getSelectedScript(); |
- |
- for (var i = 0; i < fontPickers.length; i++) { |
- var list = document.getElementById(fontPickers[i].fontList); |
- var family = fontPickers[i].name; |
- |
- var details = {}; |
- details.genericFamily = family; |
- details.script = script; |
- chrome.fontSettings.getFont(details, getFontHandler(list)); |
- } |
- |
- if (typeof(scriptSpecificSampleText[script]) != 'undefined') |
- sample = scriptSpecificSampleText[script]; |
- else |
- sample = defaultSampleText; |
- for (var i = 0; i < sampleTextDivIds.length; i++) { |
- var sampleTextDiv = document.getElementById(sampleTextDivIds[i]); |
- // For font selection it's the script code that matters, not language, so |
- // just use en for lang. |
- sampleTextDiv.lang = 'en-' + script; |
- sampleTextDiv.innerText = sample; |
- } |
-} |
+}; |
-// Returns a function to be called when the user changes the font size |
-// input element |elem|. The function calls the Font Settings Extension API |
-// function |setter| to commit the change. |
-function getFontSizeChangedFunc(elem, setter) { |
- return function() { |
- var pixelSize = parseInt(elem.value); |
- if (!isNaN(pixelSize)) { |
- setter({ pixelSize: pixelSize }); |
- } |
+/** |
+ * Handles change events on a font size slider. |
+ * @param {string} fontSizeKey The key for the font size setting whose slider |
+ * changed. See PendingChanges.getFont. |
+ * @param {string} value The new value of the slider. |
+ */ |
+advancedFonts.handleFontSizeSliderChange = function(fontSizeKey, value) { |
+ var pixelSize = parseInt(value); |
+ if (!isNaN(pixelSize)) { |
+ advancedFonts.pendingChanges.setFontSize(fontSizeKey, pixelSize); |
+ advancedFonts.refresh(); |
} |
-} |
+}; |
-function isControllableLevel(levelOfControl) { |
+/** |
+ * @param {string} levelOfControl The level of control string for a setting, |
+ * as returned by the Font Settings Extension API. |
+ * @return {boolean} True if |levelOfControl| signifies that the extension can |
+ * control the setting; otherwise, returns false. |
+ */ |
+advancedFonts.isControllableLevel = function(levelOfControl) { |
return levelOfControl == 'controllable_by_this_extension' || |
levelOfControl == 'controlled_by_this_extension'; |
-} |
+}; |
-// Returns a function to be used as a listener for font size setting changed |
-// events from the Font Settings Extension API. The function updates the input |
-// element |elem| and the elements in |sampleTexts| to reflect the change. |
-function getFontSizeChangedOnBrowserFunc(elem, sampleTexts) { |
- return function(details) { |
- var size = details.pixelSize.toString(); |
- elem.value = size; |
- elem.disabled = !isControllableLevel(details.levelOfControl); |
- for (var i = 0; i < sampleTexts.length; i++) |
- document.getElementById(sampleTexts[i]).style.fontSize = size + 'px'; |
+/* |
+ * Updates the specified font size slider's value and enabled property. |
+ * @param {Slider} slider The slider for a font size setting. |
+ * @param {number} size The value to set the slider to. |
+ * @param {boolean} enabled Whether to enable or disable the slider. |
+ */ |
+advancedFonts.setFontSizeSlider = function(slider, size, enabled) { |
+ if (slider.getValue() != size) |
+ slider.setValue(size); |
+ var inputElement = slider.getInput(); |
+ if (enabled) { |
+ inputElement.parentNode.classList.remove('disabled'); |
+ inputElement.disabled = false; |
+ } else { |
+ inputElement.parentNode.classList.add('disabled'); |
+ inputElement.disabled = true; |
} |
-} |
+}; |
-// Maps the HTML <input> element with |id| to the extension API accessor |
-// functions |getter| and |setter| for a setting and onChange event |apiEvent| |
-// for the setting. Also, maps the element ids in |sampleTexts| to this setting. |
-function initFontSizePref(id, sampleTexts, getter, setter, apiEvent) { |
- var elem = document.getElementById(id); |
- getter({}, function(details) { |
+/** |
+ * Initializes the UI control elements related to the font size setting |
+ * |fontSizeKey| and registers listeners for the user adjusting its slider and |
+ * the setting changing on the browser-side. |
+ * @param {string} fontSizeKey The key for font size setting. See |
+ * PendingChanges.getFont(). |
+ */ |
+advancedFonts.initFontSizeSetting = function(fontSizeKey) { |
+ var fontSizeSettings = advancedFonts.fontSizeSettings; |
+ var setting = fontSizeSettings[fontSizeKey]; |
+ var label = setting.label; |
+ var samples = setting.samples; |
+ |
+ setting.slider = new Slider( |
+ setting.sliderContainer, |
+ 0, |
+ setting.minValue, |
+ setting.maxValue, |
+ advancedFonts.handleFontSizeSliderChange.bind(null, fontSizeKey) |
+ ); |
+ |
+ var slider = setting.slider; |
+ setting.getter({}, function(details) { |
var size = details.pixelSize.toString(); |
- elem.value = size; |
- elem.disabled = !isControllableLevel(details.levelOfControl); |
- for (var i = 0; i < sampleTexts.length; i++) |
- document.getElementById(sampleTexts[i]).style.fontSize = size + 'px'; |
+ var controllable = advancedFonts.isControllableLevel( |
+ details.levelOfControl); |
+ advancedFonts.setFontSizeSlider(slider, size, controllable); |
+ for (var i = 0; i < samples.length; i++) |
+ samples[i].style.fontSize = size + 'px'; |
}); |
- elem.addEventListener('change', getFontSizeChangedFunc(elem, setter)); |
- apiEvent.addListener(getFontSizeChangedOnBrowserFunc(elem, sampleTexts)); |
-} |
+ fontSizeSettings[fontSizeKey].onChanged.addListener(advancedFonts.refresh); |
+}; |
-function clearSettingsForScript(script) { |
- for (var i = 0; i < families.length; i++) { |
+/** |
+ * Clears the font settings for the specified script. |
+ * @param {string} script The script code. |
+ */ |
+advancedFonts.clearSettingsForScript = function(script) { |
+ advancedFonts.pendingChanges.clearOneScript(script); |
+ for (var i = 0; i < advancedFonts.FAMILIES.length; i++) { |
chrome.fontSettings.clearFont({ |
script: script, |
- genericFamily: families[i] |
+ genericFamily: advancedFonts.FAMILIES[i] |
}); |
} |
-} |
- |
-function clearAllSettings() { |
- for (var i = 0; i < scripts.length; i++) |
- clearSettingsForScript(scripts[i].scriptCode); |
+}; |
+/** |
+ * Clears all font and font size settings. |
+ */ |
+advancedFonts.clearAllSettings = function() { |
+ advancedFonts.pendingChanges.clear(); |
+ for (var i = 0; i < advancedFonts.scripts.length; i++) |
+ advancedFonts.clearSettingsForScript(advancedFonts.scripts[i].scriptCode); |
chrome.fontSettings.clearDefaultFixedFontSize(); |
chrome.fontSettings.clearDefaultFontSize(); |
chrome.fontSettings.clearMinimumFontSize(); |
-} |
+}; |
-function closeOverlay() { |
+/** |
+ * Closes the overlay. |
+ */ |
+advancedFonts.closeOverlay = function() { |
$('overlay-container').hidden = true; |
-} |
+}; |
+ |
+/** |
+ * Initializes apply and reset buttons. |
+ */ |
+advancedFonts.initApplyAndResetButtons = function() { |
+ var applyButton = $('apply-settings'); |
+ applyButton.addEventListener('click', function() { |
+ advancedFonts.pendingChanges.apply(); |
+ advancedFonts.refresh(); |
+ }); |
-function initResetButtons() { |
var overlay = $('overlay-container'); |
cr.ui.overlay.globalInitialization(); |
cr.ui.overlay.setupOverlay(overlay); |
- overlay.addEventListener('cancelOverlay', closeOverlay); |
+ overlay.addEventListener('cancelOverlay', advancedFonts.closeOverlay); |
$('reset-this-script-button').onclick = function(event) { |
- var scriptName = $('scriptList').selectedItem.scriptName; |
+ var scriptList = $('scriptList'); |
+ var scriptName = scriptList.options[scriptList.selectedIndex].text; |
$('reset-this-script-overlay-dialog-content').innerText = |
'Are you sure you want to reset settings for ' + scriptName + |
' script?'; |
@@ -429,83 +584,185 @@ function initResetButtons() { |
$('overlay-container').hidden = false; |
$('reset-this-script-overlay-dialog').hidden = false; |
$('reset-all-scripts-overlay-dialog').hidden = true; |
- } |
+ }; |
$('reset-this-script-ok').onclick = function(event) { |
- clearSettingsForScript(getSelectedScript()); |
- closeOverlay(); |
+ advancedFonts.clearSettingsForScript(advancedFonts.getSelectedScript()); |
+ advancedFonts.closeOverlay(); |
+ advancedFonts.refresh(); |
}; |
- $('reset-this-script-cancel').onclick = closeOverlay; |
+ $('reset-this-script-cancel').onclick = advancedFonts.closeOverlay; |
$('reset-all-button').onclick = function(event) { |
$('overlay-container').hidden = false; |
$('reset-all-scripts-overlay-dialog').hidden = false; |
$('reset-this-script-overlay-dialog').hidden = true; |
- } |
+ }; |
$('reset-all-ok').onclick = function(event) { |
- clearAllSettings(); |
- closeOverlay(); |
+ advancedFonts.clearAllSettings(); |
+ advancedFonts.closeOverlay(); |
+ advancedFonts.refresh(); |
+ }; |
+ $('reset-all-cancel').onclick = advancedFonts.closeOverlay; |
+}; |
+ |
+/** |
+ * Best guess for system fonts, taken from the IDS_WEB_FONT_FAMILY strings in |
+ * Chrome. |
+ * TODO: The font should be localized like Chrome does. |
+ * @const |
+ */ |
+advancedFonts.systemFonts = { |
+ cros: 'Noto Sans UI, sans-serif', |
+ linux: 'Ubuntu, sans-serif', |
+ mac: 'Lucida Grande, sans-serif', |
+ win: 'Segoe UI, Tahoma, sans-serif', |
+ unknown: 'sans-serif' |
+}; |
+ |
+/** |
+ * @return {string} The platform this extension is running on. |
+ */ |
+advancedFonts.getPlatform = function() { |
+ var ua = window.navigator.appVersion; |
+ if (ua.indexOf('Win') != -1) return 'win'; |
+ if (ua.indexOf('Mac') != -1) return 'mac'; |
+ if (ua.indexOf('Linux') != -1) return 'linux'; |
+ if (ua.indexOf('CrOS') != -1) return 'cros'; |
+ return 'unknown'; |
+}; |
+ |
+/** |
+ * Chrome settings tries to use the system font. So does this extension. |
+ */ |
+advancedFonts.useSystemFont = function() { |
+ document.body.style.fontFamily = |
+ advancedFonts.systemFonts[advancedFonts.getPlatform()]; |
+}; |
+ |
+/** |
+ * Sorts the list of script codes by scriptName. Someday this extension will |
+ * have localized script names, so the order will depend on locale. |
+ */ |
+advancedFonts.sortScripts = function() { |
+ var i; |
+ var scripts = advancedFonts.scripts; |
+ for (i = 0; i < scripts; ++i) { |
+ if (scripts[i].scriptCode == advancedFonts.COMMON_SCRIPT) |
+ break; |
} |
- $('reset-all-cancel').onclick = closeOverlay; |
-} |
+ var defaultScript = scripts.splice(i, 1)[0]; |
+ |
+ scripts.sort(function(a, b) { |
+ if (a.scriptName > b.scriptName) |
+ return 1; |
+ if (a.scriptName < b.scriptName) |
+ return -1; |
+ return 0; |
+ }); |
+ |
+ scripts.unshift(defaultScript); |
+}; |
+ |
+/** |
+ * Initializes UI controls for font settings. |
+ */ |
+advancedFonts.initFontControls = function() { |
+ advancedFonts.fontSettings = { |
+ standard: { |
+ fontList: $('standardFontList'), |
+ samples: [$('standardFontSample'), $('minFontSample')] |
+ }, |
+ serif: { |
+ fontList: $('serifFontList'), |
+ samples: [$('serifFontSample')] |
+ }, |
+ sansserif: { |
+ fontList: $('sansSerifFontList'), |
+ samples: [$('sansSerifFontSample')] |
+ }, |
+ fixed: { |
+ fontList: $('fixedFontList'), |
+ samples: [$('fixedFontSample')] |
+ } |
+ }; |
+ |
+ for (var genericFamily in advancedFonts.fontSettings) { |
+ var list = advancedFonts.fontSettings[genericFamily].fontList; |
+ list.addEventListener( |
+ 'change', advancedFonts.handleFontListChange.bind(list, genericFamily)); |
+ } |
+ chrome.fontSettings.onFontChanged.addListener(advancedFonts.refresh); |
+ chrome.fontSettings.getFontList(advancedFonts.populateFontLists); |
+}; |
+ |
+/** |
+ * Initializes UI controls for font size settings. |
+ */ |
+advancedFonts.initFontSizeControls = function() { |
+ advancedFonts.fontSizeSettings = { |
+ defaultFontSize: { |
+ sliderContainer: $('defaultFontSizeSliderContainer'), |
+ minValue: 6, |
+ maxValue: 50, |
+ samples: [ |
+ $('standardFontSample'), $('serifFontSample'), $('sansSerifFontSample') |
+ ], |
+ label: $('defaultFontSizeLabel'), |
+ getter: chrome.fontSettings.getDefaultFontSize, |
+ onChanged: chrome.fontSettings.onDefaultFontSizeChanged |
+ }, |
+ defaultFixedFontSize: { |
+ sliderContainer: $('defaultFixedFontSizeSliderContainer'), |
+ minValue: 6, |
+ maxValue: 50, |
+ samples: [$('fixedFontSample')], |
+ label: $('fixedFontSizeLabel'), |
+ getter: chrome.fontSettings.getDefaultFixedFontSize, |
+ onChanged: chrome.fontSettings.onDefaultFixedFontSizeChanged |
+ }, |
+ minFontSize: { |
+ sliderContainer: $('minFontSizeSliderContainer'), |
+ minValue: 6, |
+ maxValue: 24, |
+ samples: [$('minFontSample')], |
+ label: $('minFontSizeLabel'), |
+ getter: chrome.fontSettings.getMinimumFontSize, |
+ onChanged: chrome.fontSettings.onMinimumFontSizeChanged |
+ } |
+ }; |
-function init() { |
- var scriptList = document.getElementById('scriptList'); |
- fontSettings.ui.ScriptList.decorate(scriptList); |
- scriptList.selectionModel.selectedIndex = 0; |
- scriptList.selectionModel.addEventListener('change', |
- updateFontListsForScript); |
- |
- // Populate the font lists. |
- chrome.fontSettings.getFontList(populateLists); |
- |
- // Add change handlers to the font lists. |
- for (var i = 0; i < fontPickers.length; i++) { |
- var list = document.getElementById(fontPickers[i].fontList); |
- var handler = getFontChangeHandler(list, fontPickers[i].name); |
- list.addEventListener('change', handler); |
+ for (var fontSizeKey in advancedFonts.fontSizeSettings) |
+ advancedFonts.initFontSizeSetting(fontSizeKey); |
+}; |
+ |
+/** |
+ * Initializes the list of scripts. |
+ */ |
+advancedFonts.initScriptList = function() { |
+ var scriptList = $('scriptList'); |
+ advancedFonts.sortScripts(); |
+ var scripts = advancedFonts.scripts; |
+ for (var i = 0; i < scripts.length; i++) { |
+ var script = document.createElement('option'); |
+ script.value = scripts[i].scriptCode; |
+ script.text = scripts[i].scriptName; |
+ scriptList.add(script); |
} |
+ scriptList.selectedIndex = 0; |
+ scriptList.addEventListener('change', advancedFonts.refresh); |
+}; |
- chrome.fontSettings.onFontChanged.addListener( |
- updateFontListsForScript); |
- |
- initFontSizePref( |
- 'defaultFontSizeRocker', |
- ['standardFontSample', 'serifFontSample', 'sansSerifFontSample'], |
- chrome.fontSettings.getDefaultFontSize, |
- chrome.fontSettings.setDefaultFontSize, |
- chrome.fontSettings.onDefaultFontSizeChanged); |
- initFontSizePref( |
- 'defaultFontSizeRange', |
- ['standardFontSample', 'serifFontSample', 'sansSerifFontSample'], |
- chrome.fontSettings.getDefaultFontSize, |
- chrome.fontSettings.setDefaultFontSize, |
- chrome.fontSettings.onDefaultFontSizeChanged); |
- initFontSizePref( |
- 'defaultFixedFontSizeRocker', |
- ['fixedFontSample'], |
- chrome.fontSettings.getDefaultFixedFontSize, |
- chrome.fontSettings.setDefaultFixedFontSize, |
- chrome.fontSettings.onDefaultFixedFontSizeChanged); |
- initFontSizePref( |
- 'defaultFixedFontSizeRange', |
- ['fixedFontSample'], |
- chrome.fontSettings.getDefaultFixedFontSize, |
- chrome.fontSettings.setDefaultFixedFontSize, |
- chrome.fontSettings.onDefaultFixedFontSizeChanged); |
- initFontSizePref( |
- 'minFontSizeRocker', |
- ['minFontSample'], |
- chrome.fontSettings.getMinimumFontSize, |
- chrome.fontSettings.setMinimumFontSize, |
- chrome.fontSettings.onMinimumFontSizeChanged); |
- initFontSizePref( |
- 'minFontSizeRange', |
- ['minFontSample'], |
- chrome.fontSettings.getMinimumFontSize, |
- chrome.fontSettings.setMinimumFontSize, |
- chrome.fontSettings.onMinimumFontSizeChanged); |
- |
- initResetButtons(); |
-} |
+/** |
+ * Initializes the extension. |
+ */ |
+advancedFonts.init = function() { |
+ advancedFonts.useSystemFont(); |
+ |
+ advancedFonts.initFontControls(); |
+ advancedFonts.initFontSizeControls(); |
+ advancedFonts.initScriptList(); |
+ |
+ advancedFonts.initApplyAndResetButtons(); |
+}; |
-document.addEventListener('DOMContentLoaded', init); |
+document.addEventListener('DOMContentLoaded', advancedFonts.init); |