Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test gets skipped with pattern: os == 'win' OR os == 'android'
- Manifest: toolkit/mozapps/extensions/test/xpcshell/xpcshell.toml
/* Any copyright is dedicated to the Public Domain.
*/
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);
});