188 lines
4.9 KiB
JavaScript
188 lines
4.9 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
* http://creativecommons.org/publicdomain/zero/1.0/
|
|
*/
|
|
|
|
createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "42");
|
|
|
|
const ID = "webextension1@tests.mozilla.org";
|
|
|
|
const ADDONS = {
|
|
webextension_1: {
|
|
"manifest.json": {
|
|
name: "Web Extension Name",
|
|
version: "1.0",
|
|
manifest_version: 2,
|
|
browser_specific_settings: {
|
|
gecko: {
|
|
id: ID,
|
|
},
|
|
},
|
|
icons: {
|
|
48: "icon48.png",
|
|
64: "icon64.png",
|
|
},
|
|
},
|
|
"chrome.manifest": "content webex ./\n",
|
|
},
|
|
};
|
|
|
|
async function tearDownAddon(addon) {
|
|
await addon.uninstall();
|
|
await promiseShutdownManager();
|
|
}
|
|
|
|
add_task(async function test_reloading_a_temp_addon() {
|
|
await promiseRestartManager();
|
|
let xpi = AddonTestUtils.createTempXPIFile(ADDONS.webextension_1);
|
|
const addon = await AddonManager.installTemporaryAddon(xpi);
|
|
|
|
var receivedOnUninstalled = false;
|
|
var receivedOnUninstalling = false;
|
|
var receivedOnInstalled = false;
|
|
var receivedOnInstalling = false;
|
|
|
|
const onReload = new Promise(resolve => {
|
|
const listener = {
|
|
onUninstalling: addonObj => {
|
|
if (addonObj.id === ID) {
|
|
receivedOnUninstalling = true;
|
|
}
|
|
},
|
|
onUninstalled: addonObj => {
|
|
if (addonObj.id === ID) {
|
|
receivedOnUninstalled = true;
|
|
}
|
|
},
|
|
onInstalling: addonObj => {
|
|
receivedOnInstalling = true;
|
|
equal(addonObj.id, ID);
|
|
},
|
|
onInstalled: addonObj => {
|
|
receivedOnInstalled = true;
|
|
equal(addonObj.id, ID);
|
|
// This should be the last event called.
|
|
AddonManager.removeAddonListener(listener);
|
|
resolve();
|
|
},
|
|
};
|
|
AddonManager.addAddonListener(listener);
|
|
});
|
|
|
|
await addon.reload();
|
|
await onReload;
|
|
|
|
// Make sure reload() doesn't trigger uninstall events.
|
|
equal(
|
|
receivedOnUninstalled,
|
|
false,
|
|
"reload should not trigger onUninstalled"
|
|
);
|
|
equal(
|
|
receivedOnUninstalling,
|
|
false,
|
|
"reload should not trigger onUninstalling"
|
|
);
|
|
|
|
// Make sure reload() triggers install events, like an upgrade.
|
|
equal(receivedOnInstalling, true, "reload should trigger onInstalling");
|
|
equal(receivedOnInstalled, true, "reload should trigger onInstalled");
|
|
|
|
await tearDownAddon(addon);
|
|
});
|
|
|
|
add_task(async function test_can_reload_permanent_addon() {
|
|
await promiseRestartManager();
|
|
const { addon } = await AddonTestUtils.promiseInstallXPI(
|
|
ADDONS.webextension_1
|
|
);
|
|
|
|
let disabledCalled = false;
|
|
let enabledCalled = false;
|
|
AddonManager.addAddonListener({
|
|
onDisabled: () => {
|
|
Assert.ok(!enabledCalled);
|
|
disabledCalled = true;
|
|
},
|
|
onEnabled: () => {
|
|
Assert.ok(disabledCalled);
|
|
enabledCalled = true;
|
|
},
|
|
});
|
|
|
|
await addon.reload();
|
|
|
|
Assert.ok(disabledCalled);
|
|
Assert.ok(enabledCalled);
|
|
|
|
notEqual(addon, null);
|
|
equal(addon.appDisabled, false);
|
|
equal(addon.userDisabled, false);
|
|
|
|
await tearDownAddon(addon);
|
|
});
|
|
|
|
add_task(async function test_reload_to_invalid_version_fails() {
|
|
await promiseRestartManager();
|
|
let tempdir = gTmpD.clone();
|
|
|
|
// The initial version of the add-on will be compatible, and will therefore load
|
|
const addonId = "invalid_version_cannot_be_reloaded@tests.mozilla.org";
|
|
let manifest = {
|
|
name: "invalid_version_cannot_be_reloaded",
|
|
description: "test invalid_version_cannot_be_reloaded",
|
|
manifest_version: 2,
|
|
version: "1.0",
|
|
browser_specific_settings: {
|
|
gecko: {
|
|
id: addonId,
|
|
},
|
|
},
|
|
};
|
|
|
|
let addonDir = await promiseWriteWebManifestForExtension(
|
|
manifest,
|
|
tempdir,
|
|
"invalid_version"
|
|
);
|
|
await AddonManager.installTemporaryAddon(addonDir);
|
|
|
|
let addon = await promiseAddonByID(addonId);
|
|
notEqual(addon, null);
|
|
equal(addon.id, addonId);
|
|
equal(addon.version, "1.0");
|
|
equal(addon.appDisabled, false);
|
|
equal(addon.userDisabled, false);
|
|
addonDir.remove(true);
|
|
|
|
// update the manifest to make the add-on version incompatible, so the reload will reject
|
|
manifest.browser_specific_settings.gecko.strict_min_version = "1";
|
|
manifest.browser_specific_settings.gecko.strict_max_version = "1";
|
|
manifest.version = "2.0";
|
|
|
|
addonDir = await promiseWriteWebManifestForExtension(
|
|
manifest,
|
|
tempdir,
|
|
"invalid_version",
|
|
false
|
|
);
|
|
let expectedMsg = new RegExp(
|
|
"Add-on invalid_version_cannot_be_reloaded@tests.mozilla.org is not compatible with application version. " +
|
|
"add-on minVersion: 1. add-on maxVersion: 1."
|
|
);
|
|
|
|
await Assert.rejects(
|
|
addon.reload(),
|
|
expectedMsg,
|
|
"Reload rejects when application version does not fall between minVersion and maxVersion"
|
|
);
|
|
|
|
let reloadedAddon = await promiseAddonByID(addonId);
|
|
notEqual(reloadedAddon, null);
|
|
equal(reloadedAddon.id, addonId);
|
|
equal(reloadedAddon.version, "1.0");
|
|
equal(reloadedAddon.appDisabled, false);
|
|
equal(reloadedAddon.userDisabled, false);
|
|
|
|
await tearDownAddon(reloadedAddon);
|
|
addonDir.remove(true);
|
|
});
|