forked from mirrors/gecko-dev
		
	We want to encourage extension developers to use `browser_specific_settings` instead of `applications`, which will be unsupported in Manifest Version 3+. This patch prepares the introduction of a new warning (that is usually converted into an error in the test environment). Differential Revision: https://phabricator.services.mozilla.com/D160059
		
			
				
	
	
		
			193 lines
		
	
	
	
		
			5.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			193 lines
		
	
	
	
		
			5.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
 | 
						|
/* vim: set sts=2 sw=2 et tw=80: */
 | 
						|
"use strict";
 | 
						|
 | 
						|
const { AddonTestUtils } = ChromeUtils.import(
 | 
						|
  "resource://testing-common/AddonTestUtils.jsm"
 | 
						|
);
 | 
						|
 | 
						|
const { AddonManager } = ChromeUtils.import(
 | 
						|
  "resource://gre/modules/AddonManager.jsm"
 | 
						|
);
 | 
						|
 | 
						|
const { AboutNewTab } = ChromeUtils.import(
 | 
						|
  "resource:///modules/AboutNewTab.jsm"
 | 
						|
);
 | 
						|
 | 
						|
// Lazy load to avoid having Services.appinfo cached first.
 | 
						|
ChromeUtils.defineModuleGetter(
 | 
						|
  this,
 | 
						|
  "ExtensionParent",
 | 
						|
  "resource://gre/modules/ExtensionParent.jsm"
 | 
						|
);
 | 
						|
 | 
						|
const { HomePage } = ChromeUtils.import("resource:///modules/HomePage.jsm");
 | 
						|
 | 
						|
AddonTestUtils.init(this);
 | 
						|
 | 
						|
// Allow for unsigned addons.
 | 
						|
AddonTestUtils.overrideCertDB();
 | 
						|
 | 
						|
AddonTestUtils.createAppInfo(
 | 
						|
  "xpcshell@tests.mozilla.org",
 | 
						|
  "XPCShell",
 | 
						|
  "42",
 | 
						|
  "42"
 | 
						|
);
 | 
						|
 | 
						|
add_task(async function test_settings_modules_not_loaded() {
 | 
						|
  await ExtensionParent.apiManager.lazyInit();
 | 
						|
  // Test that no settings modules are loaded.
 | 
						|
  let modules = Array.from(ExtensionParent.apiManager.settingsModules);
 | 
						|
  ok(modules.length, "we have settings modules");
 | 
						|
  for (let name of modules) {
 | 
						|
    ok(
 | 
						|
      !ExtensionParent.apiManager.getModule(name).loaded,
 | 
						|
      `${name} is not loaded`
 | 
						|
    );
 | 
						|
  }
 | 
						|
});
 | 
						|
 | 
						|
add_task(async function test_settings_validated() {
 | 
						|
  let defaultNewTab = AboutNewTab.newTabURL;
 | 
						|
  equal(defaultNewTab, "about:newtab", "Newtab url is default.");
 | 
						|
  let defaultHomepageURL = HomePage.get();
 | 
						|
  equal(defaultHomepageURL, "about:home", "Home page url is default.");
 | 
						|
 | 
						|
  let xpi = await AddonTestUtils.createTempWebExtensionFile({
 | 
						|
    manifest: {
 | 
						|
      version: "1.0",
 | 
						|
      browser_specific_settings: { gecko: { id: "test@mochi" } },
 | 
						|
      chrome_url_overrides: {
 | 
						|
        newtab: "/newtab",
 | 
						|
      },
 | 
						|
      chrome_settings_overrides: {
 | 
						|
        homepage: "https://example.com/",
 | 
						|
      },
 | 
						|
    },
 | 
						|
  });
 | 
						|
  let extension = ExtensionTestUtils.expectExtension("test@mochi");
 | 
						|
  let file = await AddonTestUtils.manuallyInstall(xpi);
 | 
						|
  await AddonTestUtils.promiseStartupManager();
 | 
						|
  await extension.awaitStartup();
 | 
						|
 | 
						|
  equal(
 | 
						|
    HomePage.get(),
 | 
						|
    "https://example.com/",
 | 
						|
    "Home page url is extension controlled."
 | 
						|
  );
 | 
						|
  ok(
 | 
						|
    AboutNewTab.newTabURL.endsWith("/newtab"),
 | 
						|
    "newTabURL is extension controlled."
 | 
						|
  );
 | 
						|
 | 
						|
  await AddonTestUtils.promiseShutdownManager();
 | 
						|
  // After shutdown, delete the xpi file.
 | 
						|
  Services.obs.notifyObservers(xpi, "flush-cache-entry");
 | 
						|
  try {
 | 
						|
    file.remove(true);
 | 
						|
  } catch (e) {
 | 
						|
    ok(false, e);
 | 
						|
  }
 | 
						|
  await AddonTestUtils.cleanupTempXPIs();
 | 
						|
 | 
						|
  // Restart everything, the ExtensionAddonObserver should handle updating state.
 | 
						|
  let prefChanged = TestUtils.waitForPrefChange("browser.startup.homepage");
 | 
						|
  await AddonTestUtils.promiseStartupManager();
 | 
						|
  await prefChanged;
 | 
						|
 | 
						|
  equal(HomePage.get(), defaultHomepageURL, "Home page url is default.");
 | 
						|
  equal(AboutNewTab.newTabURL, defaultNewTab, "newTabURL is reset to default.");
 | 
						|
  await AddonTestUtils.promiseShutdownManager();
 | 
						|
});
 | 
						|
 | 
						|
add_task(async function test_settings_validated_safemode() {
 | 
						|
  let defaultNewTab = AboutNewTab.newTabURL;
 | 
						|
  equal(defaultNewTab, "about:newtab", "Newtab url is default.");
 | 
						|
  let defaultHomepageURL = HomePage.get();
 | 
						|
  equal(defaultHomepageURL, "about:home", "Home page url is default.");
 | 
						|
 | 
						|
  function isDefaultSettings(postfix) {
 | 
						|
    equal(
 | 
						|
      HomePage.get(),
 | 
						|
      defaultHomepageURL,
 | 
						|
      `Home page url is default ${postfix}.`
 | 
						|
    );
 | 
						|
    equal(
 | 
						|
      AboutNewTab.newTabURL,
 | 
						|
      defaultNewTab,
 | 
						|
      `newTabURL is default ${postfix}.`
 | 
						|
    );
 | 
						|
  }
 | 
						|
 | 
						|
  function isExtensionSettings(postfix) {
 | 
						|
    equal(
 | 
						|
      HomePage.get(),
 | 
						|
      "https://example.com/",
 | 
						|
      `Home page url is extension controlled ${postfix}.`
 | 
						|
    );
 | 
						|
    ok(
 | 
						|
      AboutNewTab.newTabURL.endsWith("/newtab"),
 | 
						|
      `newTabURL is extension controlled ${postfix}.`
 | 
						|
    );
 | 
						|
  }
 | 
						|
 | 
						|
  async function switchSafeMode(inSafeMode) {
 | 
						|
    await AddonTestUtils.promiseShutdownManager();
 | 
						|
    AddonTestUtils.appInfo.inSafeMode = inSafeMode;
 | 
						|
    await AddonTestUtils.promiseStartupManager();
 | 
						|
    return AddonManager.getAddonByID("test@mochi");
 | 
						|
  }
 | 
						|
 | 
						|
  let xpi = await AddonTestUtils.createTempWebExtensionFile({
 | 
						|
    manifest: {
 | 
						|
      version: "1.0",
 | 
						|
      browser_specific_settings: { gecko: { id: "test@mochi" } },
 | 
						|
      chrome_url_overrides: {
 | 
						|
        newtab: "/newtab",
 | 
						|
      },
 | 
						|
      chrome_settings_overrides: {
 | 
						|
        homepage: "https://example.com/",
 | 
						|
      },
 | 
						|
    },
 | 
						|
  });
 | 
						|
  let extension = ExtensionTestUtils.expectExtension("test@mochi");
 | 
						|
  await AddonTestUtils.manuallyInstall(xpi);
 | 
						|
  await AddonTestUtils.promiseStartupManager();
 | 
						|
  await extension.awaitStartup();
 | 
						|
 | 
						|
  isExtensionSettings("on extension startup");
 | 
						|
 | 
						|
  // Disable in safemode and verify settings are removed in normal mode.
 | 
						|
  let addon = await switchSafeMode(true);
 | 
						|
  await addon.disable();
 | 
						|
  addon = await switchSafeMode(false);
 | 
						|
  isDefaultSettings("after disabling addon during safemode");
 | 
						|
 | 
						|
  // Enable in safemode and verify settings are back in normal mode.
 | 
						|
  addon = await switchSafeMode(true);
 | 
						|
  await addon.enable();
 | 
						|
  addon = await switchSafeMode(false);
 | 
						|
  isExtensionSettings("after enabling addon during safemode");
 | 
						|
 | 
						|
  // Uninstall in safemode and verify settings are removed in normal mode.
 | 
						|
  addon = await switchSafeMode(true);
 | 
						|
  await addon.uninstall();
 | 
						|
  addon = await switchSafeMode(false);
 | 
						|
  isDefaultSettings("after uninstalling addon during safemode");
 | 
						|
 | 
						|
  await AddonTestUtils.promiseShutdownManager();
 | 
						|
  await AddonTestUtils.cleanupTempXPIs();
 | 
						|
});
 | 
						|
 | 
						|
// There are more settings modules than used in this test file, they should have been
 | 
						|
// loaded during the test extensions uninstall.  Ensure that all settings modules have
 | 
						|
// been loaded.
 | 
						|
add_task(async function test_settings_modules_loaded() {
 | 
						|
  // Test that all settings modules are loaded.
 | 
						|
  let modules = Array.from(ExtensionParent.apiManager.settingsModules);
 | 
						|
  ok(modules.length, "we have settings modules");
 | 
						|
  for (let name of modules) {
 | 
						|
    ok(ExtensionParent.apiManager.getModule(name).loaded, `${name} was loaded`);
 | 
						|
  }
 | 
						|
});
 |