tor-browser

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

test_ext_settings_validate.js (6058B)


      1 /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
      2 /* vim: set sts=2 sw=2 et tw=80: */
      3 "use strict";
      4 
      5 const { AddonTestUtils } = ChromeUtils.importESModule(
      6  "resource://testing-common/AddonTestUtils.sys.mjs"
      7 );
      8 
      9 const { AddonManager } = ChromeUtils.importESModule(
     10  "resource://gre/modules/AddonManager.sys.mjs"
     11 );
     12 
     13 const { AboutNewTab } = ChromeUtils.importESModule(
     14  "resource:///modules/AboutNewTab.sys.mjs"
     15 );
     16 
     17 // Lazy load to avoid having Services.appinfo cached first.
     18 ChromeUtils.defineESModuleGetters(this, {
     19  ExtensionParent: "resource://gre/modules/ExtensionParent.sys.mjs",
     20 });
     21 
     22 const { HomePage } = ChromeUtils.importESModule(
     23  "resource:///modules/HomePage.sys.mjs"
     24 );
     25 
     26 AddonTestUtils.init(this);
     27 
     28 // Allow for unsigned addons.
     29 AddonTestUtils.overrideCertDB();
     30 
     31 AddonTestUtils.createAppInfo(
     32  "xpcshell@tests.mozilla.org",
     33  "XPCShell",
     34  "42",
     35  "42"
     36 );
     37 
     38 add_task(async function test_settings_modules_not_loaded() {
     39  await ExtensionParent.apiManager.lazyInit();
     40  // Test that no settings modules are loaded.
     41  let modules = Array.from(ExtensionParent.apiManager.settingsModules);
     42  ok(modules.length, "we have settings modules");
     43  for (let name of modules) {
     44    ok(
     45      !ExtensionParent.apiManager.getModule(name).loaded,
     46      `${name} is not loaded`
     47    );
     48  }
     49 });
     50 
     51 add_task(async function test_settings_validated() {
     52  let defaultNewTab = AboutNewTab.newTabURL;
     53  equal(defaultNewTab, "about:newtab", "Newtab url is default.");
     54  let defaultHomepageURL = HomePage.get();
     55  equal(defaultHomepageURL, "about:home", "Home page url is default.");
     56 
     57  let xpi = await AddonTestUtils.createTempWebExtensionFile({
     58    manifest: {
     59      version: "1.0",
     60      browser_specific_settings: { gecko: { id: "test@mochi" } },
     61      chrome_url_overrides: {
     62        newtab: "/newtab",
     63      },
     64      chrome_settings_overrides: {
     65        homepage: "https://example.com/",
     66      },
     67    },
     68  });
     69  let extension = ExtensionTestUtils.expectExtension("test@mochi");
     70  let file = await AddonTestUtils.manuallyInstall(xpi);
     71  await AddonTestUtils.promiseStartupManager();
     72  await extension.awaitStartup();
     73 
     74  equal(
     75    HomePage.get(),
     76    "https://example.com/",
     77    "Home page url is extension controlled."
     78  );
     79  ok(
     80    AboutNewTab.newTabURL.endsWith("/newtab"),
     81    "newTabURL is extension controlled."
     82  );
     83 
     84  await AddonTestUtils.promiseShutdownManager();
     85  // After shutdown, delete the xpi file.
     86  Services.obs.notifyObservers(xpi, "flush-cache-entry");
     87  try {
     88    file.remove(true);
     89  } catch (e) {
     90    ok(false, e);
     91  }
     92  await AddonTestUtils.cleanupTempXPIs();
     93 
     94  // Restart everything, the ExtensionAddonObserver should handle updating state.
     95  let prefChanged = TestUtils.waitForPrefChange("browser.startup.homepage");
     96  await AddonTestUtils.promiseStartupManager();
     97  await prefChanged;
     98 
     99  equal(HomePage.get(), defaultHomepageURL, "Home page url is default.");
    100  equal(AboutNewTab.newTabURL, defaultNewTab, "newTabURL is reset to default.");
    101  await AddonTestUtils.promiseShutdownManager();
    102 });
    103 
    104 add_task(async function test_settings_validated_safemode() {
    105  let defaultNewTab = AboutNewTab.newTabURL;
    106  equal(defaultNewTab, "about:newtab", "Newtab url is default.");
    107  let defaultHomepageURL = HomePage.get();
    108  equal(defaultHomepageURL, "about:home", "Home page url is default.");
    109 
    110  function isDefaultSettings(postfix) {
    111    equal(
    112      HomePage.get(),
    113      defaultHomepageURL,
    114      `Home page url is default ${postfix}.`
    115    );
    116    equal(
    117      AboutNewTab.newTabURL,
    118      defaultNewTab,
    119      `newTabURL is default ${postfix}.`
    120    );
    121  }
    122 
    123  function isExtensionSettings(postfix) {
    124    equal(
    125      HomePage.get(),
    126      "https://example.com/",
    127      `Home page url is extension controlled ${postfix}.`
    128    );
    129    ok(
    130      AboutNewTab.newTabURL.endsWith("/newtab"),
    131      `newTabURL is extension controlled ${postfix}.`
    132    );
    133  }
    134 
    135  async function switchSafeMode(inSafeMode) {
    136    await AddonTestUtils.promiseShutdownManager();
    137    AddonTestUtils.appInfo.inSafeMode = inSafeMode;
    138    await AddonTestUtils.promiseStartupManager();
    139    return AddonManager.getAddonByID("test@mochi");
    140  }
    141 
    142  let xpi = await AddonTestUtils.createTempWebExtensionFile({
    143    manifest: {
    144      version: "1.0",
    145      browser_specific_settings: { gecko: { id: "test@mochi" } },
    146      chrome_url_overrides: {
    147        newtab: "/newtab",
    148      },
    149      chrome_settings_overrides: {
    150        homepage: "https://example.com/",
    151      },
    152    },
    153  });
    154  let extension = ExtensionTestUtils.expectExtension("test@mochi");
    155  await AddonTestUtils.manuallyInstall(xpi);
    156  await AddonTestUtils.promiseStartupManager();
    157  await extension.awaitStartup();
    158 
    159  isExtensionSettings("on extension startup");
    160 
    161  // Disable in safemode and verify settings are removed in normal mode.
    162  let addon = await switchSafeMode(true);
    163  await addon.disable();
    164  addon = await switchSafeMode(false);
    165  isDefaultSettings("after disabling addon during safemode");
    166 
    167  // Enable in safemode and verify settings are back in normal mode.
    168  addon = await switchSafeMode(true);
    169  await addon.enable();
    170  addon = await switchSafeMode(false);
    171  isExtensionSettings("after enabling addon during safemode");
    172 
    173  // Uninstall in safemode and verify settings are removed in normal mode.
    174  addon = await switchSafeMode(true);
    175  await addon.uninstall();
    176  addon = await switchSafeMode(false);
    177  isDefaultSettings("after uninstalling addon during safemode");
    178 
    179  await AddonTestUtils.promiseShutdownManager();
    180  await AddonTestUtils.cleanupTempXPIs();
    181 });
    182 
    183 // There are more settings modules than used in this test file, they should have been
    184 // loaded during the test extensions uninstall.  Ensure that all settings modules have
    185 // been loaded.
    186 add_task(async function test_settings_modules_loaded() {
    187  // Test that all settings modules are loaded.
    188  let modules = Array.from(ExtensionParent.apiManager.settingsModules);
    189  ok(modules.length, "we have settings modules");
    190  for (let name of modules) {
    191    ok(ExtensionParent.apiManager.getModule(name).loaded, `${name} was loaded`);
    192  }
    193 });