mirror of
https://github.com/roytam1/basilisk55.git
synced 2026-05-26 15:02:46 +00:00
236 lines
7.1 KiB
JavaScript
236 lines
7.1 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 sampleAddon = {
|
|
id: "webextension1@tests.mozilla.org",
|
|
name: "webextension_1",
|
|
}
|
|
|
|
const manifestSample = {
|
|
id: "bootstrap1@tests.mozilla.org",
|
|
version: "1.0",
|
|
bootstrap: true,
|
|
targetApplications: [{
|
|
id: "xpcshell@tests.mozilla.org",
|
|
minVersion: "1",
|
|
maxVersion: "1"
|
|
}],
|
|
};
|
|
|
|
const { Management } = Components.utils.import("resource://gre/modules/Extension.jsm", {});
|
|
|
|
function promiseAddonStartup() {
|
|
return new Promise(resolve => {
|
|
let listener = (extension) => {
|
|
Management.off("startup", listener);
|
|
resolve(extension);
|
|
};
|
|
|
|
Management.on("startup", listener);
|
|
});
|
|
}
|
|
|
|
function* installAddon(fixtureName, addonID) {
|
|
yield promiseInstallAllFiles([do_get_addon(fixtureName)]);
|
|
return promiseAddonByID(addonID);
|
|
}
|
|
|
|
function* tearDownAddon(addon) {
|
|
addon.uninstall();
|
|
yield promiseShutdownManager();
|
|
}
|
|
|
|
add_task(function* test_reloading_a_temp_addon() {
|
|
yield promiseRestartManager();
|
|
yield AddonManager.installTemporaryAddon(do_get_addon(sampleAddon.name));
|
|
const addon = yield promiseAddonByID(sampleAddon.id)
|
|
|
|
var receivedOnUninstalled = false;
|
|
var receivedOnUninstalling = false;
|
|
var receivedOnInstalled = false;
|
|
var receivedOnInstalling = false;
|
|
|
|
const onReload = new Promise(resolve => {
|
|
const listener = {
|
|
onUninstalling: (addonObj) => {
|
|
if (addonObj.id === sampleAddon.id) {
|
|
receivedOnUninstalling = true;
|
|
}
|
|
},
|
|
onUninstalled: (addonObj) => {
|
|
if (addonObj.id === sampleAddon.id) {
|
|
receivedOnUninstalled = true;
|
|
}
|
|
},
|
|
onInstalling: (addonObj) => {
|
|
receivedOnInstalling = true;
|
|
equal(addonObj.id, sampleAddon.id);
|
|
},
|
|
onInstalled: (addonObj) => {
|
|
receivedOnInstalled = true;
|
|
equal(addonObj.id, sampleAddon.id);
|
|
// This should be the last event called.
|
|
AddonManager.removeAddonListener(listener);
|
|
resolve();
|
|
},
|
|
}
|
|
AddonManager.addAddonListener(listener);
|
|
});
|
|
|
|
yield addon.reload();
|
|
yield 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");
|
|
|
|
yield tearDownAddon(addon);
|
|
});
|
|
|
|
add_task(function* test_can_reload_permanent_addon() {
|
|
yield promiseRestartManager();
|
|
const addon = yield installAddon(sampleAddon.name, sampleAddon.id);
|
|
|
|
let disabledCalled = false;
|
|
let enabledCalled = false;
|
|
AddonManager.addAddonListener({
|
|
onDisabled: (aAddon) => {
|
|
do_check_false(enabledCalled);
|
|
disabledCalled = true
|
|
},
|
|
onEnabled: (aAddon) => {
|
|
do_check_true(disabledCalled);
|
|
enabledCalled = true
|
|
}
|
|
})
|
|
|
|
yield addon.reload();
|
|
|
|
do_check_true(disabledCalled);
|
|
do_check_true(enabledCalled);
|
|
|
|
notEqual(addon, null);
|
|
equal(addon.appDisabled, false);
|
|
equal(addon.userDisabled, false);
|
|
|
|
yield tearDownAddon(addon);
|
|
});
|
|
|
|
add_task(function* test_reload_to_invalid_version_fails() {
|
|
yield 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",
|
|
applications: {
|
|
gecko: {
|
|
id: addonId,
|
|
}
|
|
},
|
|
};
|
|
|
|
let addonDir = yield promiseWriteWebManifestForExtension(manifest, tempdir, "invalid_version");
|
|
yield AddonManager.installTemporaryAddon(addonDir);
|
|
yield promiseAddonStartup();
|
|
|
|
let addon = yield 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.applications.gecko.strict_min_version = "1";
|
|
manifest.applications.gecko.strict_max_version = "1";
|
|
manifest.version = "2.0";
|
|
|
|
addonDir = yield 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.");
|
|
|
|
yield Assert.rejects(addon.reload(),
|
|
expectedMsg,
|
|
"Reload rejects when application version does not fall between minVersion and maxVersion");
|
|
|
|
let reloadedAddon = yield promiseAddonByID(addonId);
|
|
notEqual(reloadedAddon, null);
|
|
equal(reloadedAddon.id, addonId);
|
|
equal(reloadedAddon.version, "1.0");
|
|
equal(reloadedAddon.appDisabled, false);
|
|
equal(reloadedAddon.userDisabled, false);
|
|
|
|
yield tearDownAddon(reloadedAddon);
|
|
addonDir.remove(true);
|
|
});
|
|
|
|
add_task(function* test_manifest_changes_are_refreshed() {
|
|
yield promiseRestartManager();
|
|
let tempdir = gTmpD.clone();
|
|
|
|
const unpackedAddon = writeInstallRDFToDir(
|
|
Object.assign({}, manifestSample, {
|
|
name: "Test Bootstrap 1",
|
|
}), tempdir, manifestSample.id, "bootstrap.js");
|
|
|
|
yield AddonManager.installTemporaryAddon(unpackedAddon);
|
|
const addon = yield promiseAddonByID(manifestSample.id);
|
|
notEqual(addon, null);
|
|
equal(addon.name, "Test Bootstrap 1");
|
|
|
|
writeInstallRDFToDir(Object.assign({}, manifestSample, {
|
|
name: "Test Bootstrap 1 (reloaded)",
|
|
}), tempdir, manifestSample.id);
|
|
|
|
yield addon.reload();
|
|
|
|
const reloadedAddon = yield promiseAddonByID(manifestSample.id);
|
|
notEqual(reloadedAddon, null);
|
|
equal(reloadedAddon.name, "Test Bootstrap 1 (reloaded)");
|
|
|
|
yield tearDownAddon(reloadedAddon);
|
|
unpackedAddon.remove(true);
|
|
});
|
|
|
|
add_task(function* test_reload_fails_on_installation_errors() {
|
|
yield promiseRestartManager();
|
|
let tempdir = gTmpD.clone();
|
|
|
|
const unpackedAddon = writeInstallRDFToDir(
|
|
Object.assign({}, manifestSample, {
|
|
name: "Test Bootstrap 1",
|
|
}), tempdir, manifestSample.id, "bootstrap.js");
|
|
|
|
yield AddonManager.installTemporaryAddon(unpackedAddon);
|
|
const addon = yield promiseAddonByID(manifestSample.id);
|
|
notEqual(addon, null);
|
|
|
|
// Trigger an installation error with an empty manifest.
|
|
writeInstallRDFToDir({}, tempdir, manifestSample.id);
|
|
|
|
yield Assert.rejects(addon.reload(), /No ID in install manifest/);
|
|
|
|
// The old add-on should be active. I.E. the broken reload will not
|
|
// disturb it.
|
|
const oldAddon = yield promiseAddonByID(manifestSample.id);
|
|
notEqual(oldAddon, null);
|
|
equal(oldAddon.isActive, true);
|
|
equal(oldAddon.name, "Test Bootstrap 1");
|
|
|
|
yield tearDownAddon(addon);
|
|
unpackedAddon.remove(true);
|
|
});
|