fonts.js (5616B)
1 /* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 /* import-globals-from /browser/base/content/utilityOverlay.js */ 7 /* import-globals-from /toolkit/mozapps/preferences/fontbuilder.js */ 8 9 // browser.display.languageList LOCK ALL when LOCKED 10 11 const kDefaultFontType = "font.default.%LANG%"; 12 const kFontNameFmtSerif = "font.name.serif.%LANG%"; 13 const kFontNameFmtSansSerif = "font.name.sans-serif.%LANG%"; 14 const kFontNameFmtMonospace = "font.name.monospace.%LANG%"; 15 const kFontNameListFmtSerif = "font.name-list.serif.%LANG%"; 16 const kFontNameListFmtSansSerif = "font.name-list.sans-serif.%LANG%"; 17 const kFontNameListFmtMonospace = "font.name-list.monospace.%LANG%"; 18 const kFontSizeFmtVariable = "font.size.variable.%LANG%"; 19 const kFontSizeFmtFixed = "font.size.monospace.%LANG%"; 20 const kFontMinSizeFmt = "font.minimum-size.%LANG%"; 21 22 window.addEventListener("load", () => gFontsDialog.onLoad()); 23 24 Preferences.addAll([ 25 { id: "font.language.group", type: "string" }, 26 { id: "browser.display.use_document_fonts", type: "int" }, 27 ]); 28 29 var gFontsDialog = { 30 _selectLanguageGroupPromise: Promise.resolve(), 31 32 onLoad() { 33 document 34 .getElementById("key_close") 35 .addEventListener("command", event => Preferences.close(event)); 36 37 Preferences.addSyncFromPrefListener( 38 document.getElementById("selectLangs"), 39 () => this.readFontLanguageGroup() 40 ); 41 Preferences.addSyncFromPrefListener( 42 document.getElementById("useDocumentFonts"), 43 () => this.readUseDocumentFonts() 44 ); 45 Preferences.addSyncToPrefListener( 46 document.getElementById("useDocumentFonts"), 47 () => this.writeUseDocumentFonts() 48 ); 49 for (let id of ["serif", "sans-serif", "monospace"]) { 50 let el = document.getElementById(id); 51 Preferences.addSyncFromPrefListener(el, () => 52 FontBuilder.readFontSelection(el) 53 ); 54 } 55 }, 56 57 _selectLanguageGroup(aLanguageGroup) { 58 this._selectLanguageGroupPromise = (async () => { 59 // Avoid overlapping language group selections by awaiting the resolution 60 // of the previous one. We do this because this function is re-entrant, 61 // as inserting <preference> elements into the DOM sometimes triggers a call 62 // back into this function. And since this function is also asynchronous, 63 // that call can enter this function before the previous run has completed, 64 // which would corrupt the font menulists. Awaiting the previous call's 65 // resolution avoids that fate. 66 await this._selectLanguageGroupPromise; 67 68 var prefs = [ 69 { 70 format: kDefaultFontType, 71 type: "string", 72 element: "defaultFontType", 73 fonttype: null, 74 }, 75 { 76 format: kFontNameFmtSerif, 77 type: "fontname", 78 element: "serif", 79 fonttype: "serif", 80 }, 81 { 82 format: kFontNameFmtSansSerif, 83 type: "fontname", 84 element: "sans-serif", 85 fonttype: "sans-serif", 86 }, 87 { 88 format: kFontNameFmtMonospace, 89 type: "fontname", 90 element: "monospace", 91 fonttype: "monospace", 92 }, 93 { 94 format: kFontNameListFmtSerif, 95 type: "unichar", 96 element: null, 97 fonttype: "serif", 98 }, 99 { 100 format: kFontNameListFmtSansSerif, 101 type: "unichar", 102 element: null, 103 fonttype: "sans-serif", 104 }, 105 { 106 format: kFontNameListFmtMonospace, 107 type: "unichar", 108 element: null, 109 fonttype: "monospace", 110 }, 111 { 112 format: kFontSizeFmtVariable, 113 type: "int", 114 element: "sizeVar", 115 fonttype: null, 116 }, 117 { 118 format: kFontSizeFmtFixed, 119 type: "int", 120 element: "sizeMono", 121 fonttype: null, 122 }, 123 { 124 format: kFontMinSizeFmt, 125 type: "int", 126 element: "minSize", 127 fonttype: null, 128 }, 129 ]; 130 for (var i = 0; i < prefs.length; ++i) { 131 var name = prefs[i].format.replace(/%LANG%/, aLanguageGroup); 132 var preference = Preferences.get(name); 133 if (!preference) { 134 preference = Preferences.add({ id: name, type: prefs[i].type }); 135 } 136 137 if (!prefs[i].element) { 138 continue; 139 } 140 141 var element = document.getElementById(prefs[i].element); 142 if (element) { 143 element.setAttribute("preference", preference.id); 144 145 if (prefs[i].fonttype) { 146 await FontBuilder.buildFontList( 147 aLanguageGroup, 148 prefs[i].fonttype, 149 element 150 ); 151 } 152 153 preference.setElementValue(element); 154 } 155 } 156 })().catch(console.error); 157 }, 158 159 readFontLanguageGroup() { 160 let languageGroup = Preferences.get("font.language.group").value; 161 let rv = undefined; 162 if (!languageGroup) { 163 languageGroup = Services.locale.fontLanguageGroup; 164 rv = languageGroup; 165 } 166 this._selectLanguageGroup(languageGroup); 167 return rv; 168 }, 169 170 readUseDocumentFonts() { 171 var preference = Preferences.get("browser.display.use_document_fonts"); 172 return preference.value == 1; 173 }, 174 175 writeUseDocumentFonts() { 176 var useDocumentFonts = document.getElementById("useDocumentFonts"); 177 return useDocumentFonts.checked ? 1 : 0; 178 }, 179 };