forked from mirrors/gecko-dev
172 lines
4.6 KiB
JavaScript
172 lines
4.6 KiB
JavaScript
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
|
/* vim: set sts=2 sw=2 et tw=80: */
|
|
"use strict";
|
|
|
|
const { AddonManager } = ChromeUtils.import(
|
|
"resource://gre/modules/AddonManager.jsm"
|
|
);
|
|
const { Preferences } = ChromeUtils.import(
|
|
"resource://gre/modules/Preferences.jsm"
|
|
);
|
|
|
|
const { TestUtils } = ChromeUtils.import(
|
|
"resource://testing-common/TestUtils.jsm"
|
|
);
|
|
|
|
AddonTestUtils.init(this);
|
|
AddonTestUtils.overrideCertDB();
|
|
|
|
AddonTestUtils.createAppInfo(
|
|
"xpcshell@tests.mozilla.org",
|
|
"XPCShell",
|
|
"42",
|
|
"42"
|
|
);
|
|
|
|
Services.prefs.setBoolPref(
|
|
"extensions.webextensions.background-delayed-startup",
|
|
false
|
|
);
|
|
|
|
const ADDON_ID = "test-startup-cache@xpcshell.mozilla.org";
|
|
|
|
function makeExtension(opts) {
|
|
return {
|
|
useAddonManager: "permanent",
|
|
|
|
manifest: {
|
|
version: opts.version,
|
|
applications: { 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() {
|
|
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,
|
|
applications: {
|
|
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.awaitStartup();
|
|
|
|
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.awaitStartup();
|
|
|
|
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.awaitStartup();
|
|
|
|
equal(extension.version, "1.1", "Expected extension version");
|
|
manifest = await getManifest();
|
|
equal(manifest.name, "en-US 1.1", "Got expected manifest name");
|
|
|
|
info("uninstall locale 'fr'");
|
|
addon = await AddonManager.getAddonByID("@test-langpack");
|
|
await addon.uninstall();
|
|
ok(!Services.locale.availableLocales.includes("fr"), "fr locale is removed");
|
|
|
|
await extension.unload();
|
|
});
|