277 lines
7.7 KiB
JavaScript
277 lines
7.7 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
* http://creativecommons.org/publicdomain/zero/1.0/
|
|
*/
|
|
|
|
const ID = "addon@tests.mozilla.org";
|
|
|
|
let profileDir = gProfD.clone();
|
|
profileDir.append("extensions");
|
|
|
|
// By default disable add-ons from the profile and the system-wide scope
|
|
const SCOPES = AddonManager.SCOPE_PROFILE | AddonManager.SCOPE_SYSTEM;
|
|
Services.prefs.setIntPref("extensions.enabledScopes", SCOPES);
|
|
Services.prefs.setIntPref("extensions.autoDisableScopes", SCOPES);
|
|
|
|
createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2");
|
|
|
|
const XPIS = {};
|
|
|
|
// Installing an add-on through the API should mark it as seen
|
|
add_task(async function () {
|
|
await promiseStartupManager();
|
|
|
|
for (let n of [1, 2]) {
|
|
XPIS[n] = await createTempWebExtensionFile({
|
|
manifest: {
|
|
name: "Test",
|
|
version: `${n}.0`,
|
|
browser_specific_settings: { gecko: { id: ID } },
|
|
},
|
|
});
|
|
}
|
|
|
|
await promiseInstallFile(XPIS[1]);
|
|
|
|
let addon = await promiseAddonByID(ID);
|
|
Assert.equal(addon.version, "1.0");
|
|
Assert.ok(!addon.foreignInstall);
|
|
Assert.ok(addon.seen);
|
|
|
|
await promiseRestartManager();
|
|
|
|
addon = await promiseAddonByID(ID);
|
|
Assert.ok(!addon.foreignInstall);
|
|
Assert.ok(addon.seen);
|
|
|
|
// Installing an update should retain that
|
|
await promiseInstallFile(XPIS[2]);
|
|
|
|
addon = await promiseAddonByID(ID);
|
|
Assert.equal(addon.version, "2.0");
|
|
Assert.ok(!addon.foreignInstall);
|
|
Assert.ok(addon.seen);
|
|
|
|
await promiseRestartManager();
|
|
|
|
addon = await promiseAddonByID(ID);
|
|
Assert.ok(!addon.foreignInstall);
|
|
Assert.ok(addon.seen);
|
|
|
|
await addon.uninstall();
|
|
|
|
await promiseShutdownManager();
|
|
});
|
|
|
|
// Sideloading an add-on in the systemwide location should mark it as unseen
|
|
add_task(async function () {
|
|
let savedStartupScanScopes = Services.prefs.getIntPref(
|
|
"extensions.startupScanScopes"
|
|
);
|
|
Services.prefs.setIntPref("extensions.startupScanScopes", 0);
|
|
Services.prefs.setIntPref(
|
|
"extensions.sideloadScopes",
|
|
AddonManager.SCOPE_ALL
|
|
);
|
|
|
|
let systemParentDir = gTmpD.clone();
|
|
systemParentDir.append("systemwide-extensions");
|
|
registerDirectory("XRESysSExtPD", systemParentDir.clone());
|
|
registerCleanupFunction(() => {
|
|
systemParentDir.remove(true);
|
|
});
|
|
|
|
let systemDir = systemParentDir.clone();
|
|
systemDir.append(Services.appinfo.ID);
|
|
|
|
let path = await manuallyInstall(XPIS[1], systemDir, ID);
|
|
// Make sure the startup code will detect sideloaded updates
|
|
setExtensionModifiedTime(path, Date.now() - 10000);
|
|
|
|
await promiseStartupManager();
|
|
await AddonManagerPrivate.getNewSideloads();
|
|
|
|
let addon = await promiseAddonByID(ID);
|
|
Assert.equal(addon.version, "1.0");
|
|
Assert.ok(addon.foreignInstall);
|
|
Assert.ok(!addon.seen);
|
|
|
|
await promiseRestartManager();
|
|
|
|
addon = await promiseAddonByID(ID);
|
|
Assert.ok(addon.foreignInstall);
|
|
Assert.ok(!addon.seen);
|
|
|
|
await promiseShutdownManager();
|
|
Services.obs.notifyObservers(path, "flush-cache-entry");
|
|
path.remove(true);
|
|
|
|
Services.prefs.setIntPref(
|
|
"extensions.startupScanScopes",
|
|
savedStartupScanScopes
|
|
);
|
|
Services.prefs.clearUserPref("extensions.sideloadScopes");
|
|
});
|
|
|
|
// Sideloading an add-on in the profile should mark it as unseen and it should
|
|
// remain unseen after an update is sideloaded.
|
|
add_task(async function () {
|
|
let path = await manuallyInstall(XPIS[1], profileDir, ID);
|
|
// Make sure the startup code will detect sideloaded updates
|
|
setExtensionModifiedTime(path, Date.now() - 10000);
|
|
|
|
await promiseStartupManager();
|
|
|
|
let addon = await promiseAddonByID(ID);
|
|
Assert.equal(addon.version, "1.0");
|
|
Assert.ok(addon.foreignInstall);
|
|
Assert.ok(!addon.seen);
|
|
|
|
await promiseRestartManager();
|
|
|
|
addon = await promiseAddonByID(ID);
|
|
Assert.ok(addon.foreignInstall);
|
|
Assert.ok(!addon.seen);
|
|
|
|
await promiseShutdownManager();
|
|
|
|
// Sideloading an update shouldn't change the state
|
|
manuallyUninstall(profileDir, ID);
|
|
await manuallyInstall(XPIS[2], profileDir, ID);
|
|
setExtensionModifiedTime(path, Date.now());
|
|
|
|
await promiseStartupManager();
|
|
|
|
addon = await promiseAddonByID(ID);
|
|
Assert.equal(addon.version, "2.0");
|
|
Assert.ok(addon.foreignInstall);
|
|
Assert.ok(!addon.seen);
|
|
|
|
await addon.uninstall();
|
|
await promiseShutdownManager();
|
|
});
|
|
|
|
// Sideloading an add-on in the profile should mark it as unseen and it should
|
|
// remain unseen after a regular update.
|
|
add_task(async function () {
|
|
let path = await manuallyInstall(XPIS[1], profileDir, ID);
|
|
// Make sure the startup code will detect sideloaded updates
|
|
setExtensionModifiedTime(path, Date.now() - 10000);
|
|
|
|
await promiseStartupManager();
|
|
|
|
let addon = await promiseAddonByID(ID);
|
|
Assert.equal(addon.version, "1.0");
|
|
Assert.ok(addon.foreignInstall);
|
|
Assert.ok(!addon.seen);
|
|
|
|
await promiseRestartManager();
|
|
|
|
addon = await promiseAddonByID(ID);
|
|
Assert.ok(addon.foreignInstall);
|
|
Assert.ok(!addon.seen);
|
|
|
|
// Updating through the API shouldn't change the state
|
|
let install = await promiseInstallFile(XPIS[2]);
|
|
Assert.equal(install.state, AddonManager.STATE_INSTALLED);
|
|
Assert.ok(
|
|
!hasFlag(install.addon.pendingOperations, AddonManager.PENDING_INSTALL)
|
|
);
|
|
|
|
addon = install.addon;
|
|
Assert.ok(addon.foreignInstall);
|
|
Assert.ok(!addon.seen);
|
|
|
|
await promiseRestartManager();
|
|
|
|
addon = await promiseAddonByID(ID);
|
|
Assert.equal(addon.version, "2.0");
|
|
Assert.ok(addon.foreignInstall);
|
|
Assert.ok(!addon.seen);
|
|
|
|
await addon.uninstall();
|
|
await promiseShutdownManager();
|
|
});
|
|
|
|
// After a sideloaded addon has been seen, sideloading an update should
|
|
// not reset it to unseen.
|
|
add_task(async function () {
|
|
let path = await manuallyInstall(XPIS[1], profileDir, ID);
|
|
// Make sure the startup code will detect sideloaded updates
|
|
setExtensionModifiedTime(path, Date.now() - 10000);
|
|
|
|
await promiseStartupManager();
|
|
|
|
let addon = await promiseAddonByID(ID);
|
|
Assert.equal(addon.version, "1.0");
|
|
Assert.ok(addon.foreignInstall);
|
|
Assert.ok(!addon.seen);
|
|
addon.markAsSeen();
|
|
Assert.ok(addon.seen);
|
|
|
|
await promiseRestartManager();
|
|
|
|
addon = await promiseAddonByID(ID);
|
|
Assert.ok(addon.foreignInstall);
|
|
Assert.ok(addon.seen);
|
|
|
|
await promiseShutdownManager();
|
|
|
|
// Sideloading an update shouldn't change the state
|
|
manuallyUninstall(profileDir, ID);
|
|
await manuallyInstall(XPIS[2], profileDir, ID);
|
|
setExtensionModifiedTime(path, Date.now());
|
|
|
|
await promiseStartupManager();
|
|
|
|
addon = await promiseAddonByID(ID);
|
|
Assert.equal(addon.version, "2.0");
|
|
Assert.ok(addon.foreignInstall);
|
|
Assert.ok(addon.seen);
|
|
|
|
await addon.uninstall();
|
|
await promiseShutdownManager();
|
|
});
|
|
|
|
// After a sideloaded addon has been seen, manually applying an update should
|
|
// not reset it to unseen.
|
|
add_task(async function () {
|
|
let path = await manuallyInstall(XPIS[1], profileDir, ID);
|
|
// Make sure the startup code will detect sideloaded updates
|
|
setExtensionModifiedTime(path, Date.now() - 10000);
|
|
|
|
await promiseStartupManager();
|
|
|
|
let addon = await promiseAddonByID(ID);
|
|
Assert.equal(addon.version, "1.0");
|
|
Assert.ok(addon.foreignInstall);
|
|
Assert.ok(!addon.seen);
|
|
addon.markAsSeen();
|
|
Assert.ok(addon.seen);
|
|
|
|
await promiseRestartManager();
|
|
|
|
addon = await promiseAddonByID(ID);
|
|
Assert.ok(addon.foreignInstall);
|
|
Assert.ok(addon.seen);
|
|
|
|
// Updating through the API shouldn't change the state
|
|
let install = await promiseInstallFile(XPIS[2]);
|
|
Assert.equal(install.state, AddonManager.STATE_INSTALLED);
|
|
Assert.ok(
|
|
!hasFlag(install.addon.pendingOperations, AddonManager.PENDING_INSTALL)
|
|
);
|
|
|
|
addon = install.addon;
|
|
Assert.ok(addon.foreignInstall);
|
|
Assert.ok(addon.seen);
|
|
|
|
await promiseRestartManager();
|
|
|
|
addon = await promiseAddonByID(ID);
|
|
Assert.equal(addon.version, "2.0");
|
|
Assert.ok(addon.foreignInstall);
|
|
Assert.ok(addon.seen);
|
|
|
|
await addon.uninstall();
|
|
await promiseShutdownManager();
|
|
});
|