1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 cr.define('options', function() { 6 7 var OptionsPage = options.OptionsPage; 8 9 /** 10 * FontSettings class 11 * Encapsulated handling of the 'Fonts and Encoding' page. 12 * @class 13 */ 14 function FontSettings() { 15 OptionsPage.call(this, 16 'fonts', 17 loadTimeData.getString('fontSettingsPageTabTitle'), 18 'font-settings'); 19 } 20 21 cr.addSingletonGetter(FontSettings); 22 23 FontSettings.prototype = { 24 __proto__: OptionsPage.prototype, 25 26 /** 27 * Initialize the page. 28 */ 29 initializePage: function() { 30 OptionsPage.prototype.initializePage.call(this); 31 32 var standardFontRange = $('standard-font-size'); 33 standardFontRange.valueMap = [9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 34 22, 24, 26, 28, 30, 32, 34, 36, 40, 44, 48, 56, 64, 72]; 35 standardFontRange.addEventListener( 36 'change', this.standardRangeChanged_.bind(this, standardFontRange)); 37 standardFontRange.addEventListener( 38 'input', this.standardRangeChanged_.bind(this, standardFontRange)); 39 standardFontRange.customChangeHandler = 40 this.standardFontSizeChanged_.bind(standardFontRange); 41 42 var minimumFontRange = $('minimum-font-size'); 43 minimumFontRange.valueMap = [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 44 18, 20, 22, 24]; 45 minimumFontRange.addEventListener( 46 'change', this.minimumRangeChanged_.bind(this, minimumFontRange)); 47 minimumFontRange.addEventListener( 48 'input', this.minimumRangeChanged_.bind(this, minimumFontRange)); 49 minimumFontRange.customChangeHandler = 50 this.minimumFontSizeChanged_.bind(minimumFontRange); 51 52 var placeholder = loadTimeData.getString('fontSettingsPlaceholder'); 53 var elements = [$('standard-font-family'), $('serif-font-family'), 54 $('sans-serif-font-family'), $('fixed-font-family'), 55 $('font-encoding')]; 56 elements.forEach(function(el) { 57 el.appendChild(new Option(placeholder)); 58 el.setDisabled('noFontsAvailable', true); 59 }); 60 61 $('font-settings-confirm').onclick = function() { 62 OptionsPage.closeOverlay(); 63 }; 64 65 $('advanced-font-settings-options').onclick = function() { 66 chrome.send('openAdvancedFontSettingsOptions'); 67 }; 68 }, 69 70 /** 71 * Called by the options page when this page has been shown. 72 */ 73 didShowPage: function() { 74 // The fonts list may be large so we only load it when this page is 75 // loaded for the first time. This makes opening the options window 76 // faster and consume less memory if the user never opens the fonts 77 // dialog. 78 if (!this.hasShown) { 79 chrome.send('fetchFontsData'); 80 this.hasShown = true; 81 } 82 }, 83 84 /** 85 * Handler that is called when the user changes the position of the standard 86 * font size slider. This allows the UI to show a preview of the change 87 * before the slider has been released and the associated prefs updated. 88 * @param {Element} el The slider input element. 89 * @param {Event} event Change event. 90 * @private 91 */ 92 standardRangeChanged_: function(el, event) { 93 var size = el.mapPositionToPref(el.value); 94 var fontSampleEl = $('standard-font-sample'); 95 this.setUpFontSample_(fontSampleEl, size, fontSampleEl.style.fontFamily, 96 true); 97 98 fontSampleEl = $('serif-font-sample'); 99 this.setUpFontSample_(fontSampleEl, size, fontSampleEl.style.fontFamily, 100 true); 101 102 fontSampleEl = $('sans-serif-font-sample'); 103 this.setUpFontSample_(fontSampleEl, size, fontSampleEl.style.fontFamily, 104 true); 105 106 fontSampleEl = $('fixed-font-sample'); 107 this.setUpFontSample_(fontSampleEl, 108 size - OptionsPage.SIZE_DIFFERENCE_FIXED_STANDARD, 109 fontSampleEl.style.fontFamily, false); 110 }, 111 112 /** 113 * Sets the 'default_fixed_font_size' preference when the user changes the 114 * standard font size. 115 * @param {Event} event Change event. 116 * @private 117 */ 118 standardFontSizeChanged_: function(event) { 119 var size = this.mapPositionToPref(this.value); 120 Preferences.setIntegerPref( 121 'webkit.webprefs.default_fixed_font_size', 122 size - OptionsPage.SIZE_DIFFERENCE_FIXED_STANDARD, true); 123 return false; 124 }, 125 126 /** 127 * Handler that is called when the user changes the position of the minimum 128 * font size slider. This allows the UI to show a preview of the change 129 * before the slider has been released and the associated prefs updated. 130 * @param {Element} el The slider input element. 131 * @param {Event} event Change event. 132 * @private 133 */ 134 minimumRangeChanged_: function(el, event) { 135 var size = el.mapPositionToPref(el.value); 136 var fontSampleEl = $('minimum-font-sample'); 137 this.setUpFontSample_(fontSampleEl, size, fontSampleEl.style.fontFamily, 138 true); 139 }, 140 141 /** 142 * Sets the 'minimum_logical_font_size' preference when the user changes the 143 * minimum font size. 144 * @param {Event} event Change event. 145 * @private 146 */ 147 minimumFontSizeChanged_: function(event) { 148 var size = this.mapPositionToPref(this.value); 149 Preferences.setIntegerPref( 150 'webkit.webprefs.minimum_logical_font_size', size, true); 151 return false; 152 }, 153 154 /** 155 * Sets the text, font size and font family of the sample text. 156 * @param {Element} el The div containing the sample text. 157 * @param {number} size The font size of the sample text. 158 * @param {string} font The font family of the sample text. 159 * @param {bool} showSize True if the font size should appear in the sample. 160 * @private 161 */ 162 setUpFontSample_: function(el, size, font, showSize) { 163 var prefix = showSize ? (size + ': ') : ''; 164 el.textContent = prefix + 165 loadTimeData.getString('fontSettingsLoremIpsum'); 166 el.style.fontSize = size + 'px'; 167 if (font) 168 el.style.fontFamily = font; 169 }, 170 171 /** 172 * Populates a select list and selects the specified item. 173 * @param {Element} element The select element to populate. 174 * @param {Array} items The array of items from which to populate. 175 * @param {string} selectedValue The selected item. 176 * @private 177 */ 178 populateSelect_: function(element, items, selectedValue) { 179 // Remove any existing content. 180 element.textContent = ''; 181 182 // Insert new child nodes into select element. 183 var value, text, selected, option; 184 for (var i = 0; i < items.length; i++) { 185 value = items[i][0]; 186 text = items[i][1]; 187 dir = items[i][2]; 188 if (text) { 189 selected = value == selectedValue; 190 var option = new Option(text, value, false, selected); 191 option.dir = dir; 192 element.appendChild(option); 193 } else { 194 element.appendChild(document.createElement('hr')); 195 } 196 } 197 198 element.setDisabled('noFontsAvailable', false); 199 } 200 }; 201 202 // Chrome callbacks 203 FontSettings.setFontsData = function(fonts, encodings, selectedValues) { 204 FontSettings.getInstance().populateSelect_($('standard-font-family'), fonts, 205 selectedValues[0]); 206 FontSettings.getInstance().populateSelect_($('serif-font-family'), fonts, 207 selectedValues[1]); 208 FontSettings.getInstance().populateSelect_($('sans-serif-font-family'), 209 fonts, selectedValues[2]); 210 FontSettings.getInstance().populateSelect_($('fixed-font-family'), fonts, 211 selectedValues[3]); 212 FontSettings.getInstance().populateSelect_($('font-encoding'), encodings, 213 selectedValues[4]); 214 }; 215 216 FontSettings.setUpStandardFontSample = function(font, size) { 217 FontSettings.getInstance().setUpFontSample_($('standard-font-sample'), size, 218 font, true); 219 }; 220 221 FontSettings.setUpSerifFontSample = function(font, size) { 222 FontSettings.getInstance().setUpFontSample_($('serif-font-sample'), size, 223 font, true); 224 }; 225 226 FontSettings.setUpSansSerifFontSample = function(font, size) { 227 FontSettings.getInstance().setUpFontSample_($('sans-serif-font-sample'), 228 size, font, true); 229 }; 230 231 FontSettings.setUpFixedFontSample = function(font, size) { 232 FontSettings.getInstance().setUpFontSample_($('fixed-font-sample'), 233 size, font, false); 234 }; 235 236 FontSettings.setUpMinimumFontSample = function(size) { 237 // If size is less than 6, represent it as six in the sample to account 238 // for the minimum logical font size. 239 if (size < 6) 240 size = 6; 241 FontSettings.getInstance().setUpFontSample_($('minimum-font-sample'), size, 242 null, true); 243 }; 244 245 /** 246 * @param {boolean} available Whether the Advanced Font Settings Extension 247 * is installed and enabled. 248 */ 249 FontSettings.notifyAdvancedFontSettingsAvailability = function(available) { 250 $('advanced-font-settings-install').hidden = available; 251 $('advanced-font-settings-options').hidden = !available; 252 }; 253 254 // Export 255 return { 256 FontSettings: FontSettings 257 }; 258 }); 259 260