summaryrefslogtreecommitdiffstats
path: root/toolkit/components/extensions/test/xpcshell/test_ext_startup_cache.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/extensions/test/xpcshell/test_ext_startup_cache.js')
-rw-r--r--toolkit/components/extensions/test/xpcshell/test_ext_startup_cache.js178
1 files changed, 178 insertions, 0 deletions
diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_startup_cache.js b/toolkit/components/extensions/test/xpcshell/test_ext_startup_cache.js
new file mode 100644
index 0000000000..ac815d6010
--- /dev/null
+++ b/toolkit/components/extensions/test/xpcshell/test_ext_startup_cache.js
@@ -0,0 +1,178 @@
+/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set sts=2 sw=2 et tw=80: */
+"use strict";
+
+const { AddonManager } = ChromeUtils.importESModule(
+ "resource://gre/modules/AddonManager.sys.mjs"
+);
+const { Preferences } = ChromeUtils.importESModule(
+ "resource://gre/modules/Preferences.sys.mjs"
+);
+
+const { TestUtils } = ChromeUtils.importESModule(
+ "resource://testing-common/TestUtils.sys.mjs"
+);
+
+AddonTestUtils.init(this);
+AddonTestUtils.overrideCertDB();
+
+AddonTestUtils.createAppInfo(
+ "xpcshell@tests.mozilla.org",
+ "XPCShell",
+ "42",
+ "42"
+);
+
+const ADDON_ID = "test-startup-cache@xpcshell.mozilla.org";
+
+function makeExtension(opts) {
+ return {
+ useAddonManager: "permanent",
+
+ manifest: {
+ version: opts.version,
+ browser_specific_settings: { gecko: { id: ADDON_ID } },
+
+ name: "__MSG_name__",
+
+ default_locale: "en_US",
+ },
+
+ files: {
+ "_locales/en_US/messages.json": {
+ name: {
+ message: `en-US ${opts.version}`,
+ description: "Name.",
+ },
+ },
+ "_locales/fr/messages.json": {
+ name: {
+ message: `fr ${opts.version}`,
+ description: "Name.",
+ },
+ },
+ },
+
+ background() {
+ browser.test.onMessage.addListener(msg => {
+ if (msg === "get-manifest") {
+ browser.test.sendMessage("manifest", browser.runtime.getManifest());
+ }
+ });
+ },
+ };
+}
+
+add_task(async function test_langpack_startup_cache() {
+ Preferences.set("extensions.logging.enabled", false);
+ await AddonTestUtils.promiseStartupManager();
+
+ // Install langpacks to get proper locale startup.
+ let langpack = {
+ "manifest.json": {
+ name: "test Language Pack",
+ version: "1.0",
+ manifest_version: 2,
+ browser_specific_settings: {
+ gecko: {
+ id: "@test-langpack",
+ strict_min_version: "42.0",
+ strict_max_version: "42.0",
+ },
+ },
+ langpack_id: "fr",
+ languages: {
+ fr: {
+ chrome_resources: {
+ global: "chrome/fr/locale/fr/global/",
+ },
+ version: "20171001190118",
+ },
+ },
+ sources: {
+ browser: {
+ base_path: "browser/",
+ },
+ },
+ },
+ };
+
+ let [, { addon }] = await Promise.all([
+ TestUtils.topicObserved("webextension-langpack-startup"),
+ AddonTestUtils.promiseInstallXPI(langpack),
+ ]);
+
+ let extension = ExtensionTestUtils.loadExtension(
+ makeExtension({ version: "1.0" })
+ );
+
+ function getManifest() {
+ extension.sendMessage("get-manifest");
+ return extension.awaitMessage("manifest");
+ }
+
+ // At the moment extension language negotiation is tied to Firefox language
+ // negotiation result. That means that to test an extension in `fr`, we need
+ // to mock `fr` being available in Firefox and then request it.
+ //
+ // In the future, we should provide some way for tests to decouple their
+ // language selection from that of Firefox.
+ ok(Services.locale.availableLocales.includes("fr"), "fr locale is avialable");
+
+ await extension.startup();
+
+ equal(extension.version, "1.0", "Expected extension version");
+ let manifest = await getManifest();
+ equal(manifest.name, "en-US 1.0", "Got expected manifest name");
+
+ info("Restart and re-check");
+ await AddonTestUtils.promiseRestartManager();
+ await extension.awaitBackgroundStarted();
+
+ equal(extension.version, "1.0", "Expected extension version");
+ manifest = await getManifest();
+ equal(manifest.name, "en-US 1.0", "Got expected manifest name");
+
+ info("Change locale to 'fr' and restart");
+ Services.locale.requestedLocales = ["fr"];
+ await AddonTestUtils.promiseRestartManager();
+ await extension.awaitBackgroundStarted();
+
+ equal(extension.version, "1.0", "Expected extension version");
+ manifest = await getManifest();
+ equal(manifest.name, "fr 1.0", "Got expected manifest name");
+
+ info("Update to version 1.1");
+ await extension.upgrade(makeExtension({ version: "1.1" }));
+
+ equal(extension.version, "1.1", "Expected extension version");
+ manifest = await getManifest();
+ equal(manifest.name, "fr 1.1", "Got expected manifest name");
+
+ info("Change locale to 'en-US' and restart");
+ Services.locale.requestedLocales = ["en-US"];
+ await AddonTestUtils.promiseRestartManager();
+ await extension.awaitBackgroundStarted();
+
+ equal(extension.version, "1.1", "Expected extension version");
+ manifest = await getManifest();
+ equal(manifest.name, "en-US 1.1", "Got expected manifest name");
+
+ info("Disable locale 'fr'");
+ addon = await AddonManager.getAddonByID("@test-langpack");
+
+ // We disable the installed langpack instead of uninstalling it
+ // because the xpi file may technically be still in use by the
+ // time the XPIProvider will try to remove the file and will
+ // make this test to fail intermittently on windows.
+ //
+ // Disabling the addon is equivalent from the perspective of this
+ // test case, and the langpack xpi will be uninstalled automatically
+ // at the end of this test case by AddonTestUtils (from its
+ // cleanupTempXPIs method, which will also force a GC if the
+ // file fails to be removed after we flushed the jar cache).
+ await addon.disable();
+ ok(!Services.locale.availableLocales.includes("fr"), "fr locale is removed");
+
+ await extension.unload();
+});