tor-browser

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

browser_preXULSkeletonUIRegistry.js (4580B)


      1 ChromeUtils.defineESModuleGetters(this, {
      2  WindowsRegistry: "resource://gre/modules/WindowsRegistry.sys.mjs",
      3 });
      4 
      5 function getFirefoxExecutableFile() {
      6  let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
      7  file = Services.dirsvc.get("GreBinD", Ci.nsIFile);
      8 
      9  file.append(AppConstants.MOZ_APP_NAME + ".exe");
     10  return file;
     11 }
     12 
     13 // This is copied from WindowsRegistry.sys.mjs, but extended to support
     14 // TYPE_BINARY, as that is how we represent doubles in the registry for
     15 // the skeleton UI. However, we didn't extend WindowsRegistry.sys.mjs itself,
     16 // because TYPE_BINARY is kind of a footgun for javascript callers - our
     17 // use case is just trivial (checking that the value is non-zero).
     18 function readRegKeyExtended(aRoot, aPath, aKey, aRegistryNode = 0) {
     19  const kRegMultiSz = 7;
     20  const kMode = Ci.nsIWindowsRegKey.ACCESS_READ | aRegistryNode;
     21  let registry = Cc["@mozilla.org/windows-registry-key;1"].createInstance(
     22    Ci.nsIWindowsRegKey
     23  );
     24  try {
     25    registry.open(aRoot, aPath, kMode);
     26    if (registry.hasValue(aKey)) {
     27      let type = registry.getValueType(aKey);
     28      switch (type) {
     29        case kRegMultiSz: {
     30          // nsIWindowsRegKey doesn't support REG_MULTI_SZ type out of the box.
     31          let str = registry.readStringValue(aKey);
     32          return str.split("\0").filter(v => v);
     33        }
     34        case Ci.nsIWindowsRegKey.TYPE_STRING:
     35          return registry.readStringValue(aKey);
     36        case Ci.nsIWindowsRegKey.TYPE_INT:
     37          return registry.readIntValue(aKey);
     38        case Ci.nsIWindowsRegKey.TYPE_BINARY:
     39          return registry.readBinaryValue(aKey);
     40        default:
     41          throw new Error("Unsupported registry value.");
     42      }
     43    }
     44  } catch (ex) {
     45  } finally {
     46    registry.close();
     47  }
     48  return undefined;
     49 }
     50 
     51 add_task(async function testWritesEnabledOnPrefChange() {
     52  Services.prefs.setBoolPref("browser.startup.preXulSkeletonUI", true);
     53 
     54  const win = await BrowserTestUtils.openNewBrowserWindow();
     55 
     56  const firefoxPath = getFirefoxExecutableFile().path;
     57  let enabled = WindowsRegistry.readRegKey(
     58    Ci.nsIWindowsRegKey.ROOT_KEY_CURRENT_USER,
     59    "Software\\Mozilla\\Firefox\\PreXULSkeletonUISettings",
     60    `${firefoxPath}|Enabled`
     61  );
     62  is(enabled, 1, "Pre-XUL skeleton UI is enabled in the Windows registry");
     63 
     64  Services.prefs.setBoolPref("browser.startup.preXulSkeletonUI", false);
     65  enabled = WindowsRegistry.readRegKey(
     66    Ci.nsIWindowsRegKey.ROOT_KEY_CURRENT_USER,
     67    "Software\\Mozilla\\Firefox\\PreXULSkeletonUISettings",
     68    `${firefoxPath}|Enabled`
     69  );
     70  is(enabled, 0, "Pre-XUL skeleton UI is disabled in the Windows registry");
     71 
     72  Services.prefs.setBoolPref("browser.startup.preXulSkeletonUI", true);
     73  Services.prefs.setIntPref("browser.tabs.inTitlebar", 0);
     74  enabled = WindowsRegistry.readRegKey(
     75    Ci.nsIWindowsRegKey.ROOT_KEY_CURRENT_USER,
     76    "Software\\Mozilla\\Firefox\\PreXULSkeletonUISettings",
     77    `${firefoxPath}|Enabled`
     78  );
     79  is(enabled, 0, "Pre-XUL skeleton UI is disabled in the Windows registry");
     80 
     81  await BrowserTestUtils.closeWindow(win);
     82 });
     83 
     84 add_task(async function testPersistsNecessaryValuesOnChange() {
     85  // Enable the skeleton UI, since if it's disabled we won't persist the size values
     86  await SpecialPowers.pushPrefEnv({
     87    set: [["browser.startup.preXulSkeletonUI", true]],
     88  });
     89 
     90  const regKeys = [
     91    "Width",
     92    "Height",
     93    "ScreenX",
     94    "ScreenY",
     95    "UrlbarCSSSpan",
     96    "CssToDevPixelScaling",
     97    "SpringsCSSSpan",
     98    "SearchbarCSSSpan",
     99    "Theme",
    100    "Flags",
    101    "Progress",
    102  ];
    103 
    104  // Remove all of the registry values to ensure old tests aren't giving us false
    105  // positives
    106  for (let key of regKeys) {
    107    WindowsRegistry.removeRegKey(
    108      Ci.nsIWindowsRegKey.ROOT_KEY_CURRENT_USER,
    109      "Software\\Mozilla\\Firefox\\PreXULSkeletonUISettings",
    110      key
    111    );
    112  }
    113 
    114  const win = await BrowserTestUtils.openNewBrowserWindow();
    115  const firefoxPath = getFirefoxExecutableFile().path;
    116  for (let key of regKeys) {
    117    let value = readRegKeyExtended(
    118      Ci.nsIWindowsRegKey.ROOT_KEY_CURRENT_USER,
    119      "Software\\Mozilla\\Firefox\\PreXULSkeletonUISettings",
    120      `${firefoxPath}|${key}`
    121    );
    122    isnot(
    123      typeof value,
    124      "undefined",
    125      `Skeleton UI registry values should have a defined value for ${key}`
    126    );
    127    if (value.length) {
    128      let hasNonZero = false;
    129      for (var i = 0; i < value.length; i++) {
    130        hasNonZero = hasNonZero || value[i];
    131      }
    132      ok(hasNonZero, `Value should have non-zero components for ${key}`);
    133    }
    134  }
    135 
    136  await BrowserTestUtils.closeWindow(win);
    137 });