tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 };