/* 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();
});