Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

/* Any copyright is dedicated to the Public Domain.
*/
// Test that we only check manifest age for disabled extensions
createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2");
const profileDir = gProfD.clone();
profileDir.append("extensions");
add_task(async function setup() {
await promiseStartupManager();
registerCleanupFunction(promiseShutdownManager);
await promiseInstallWebExtension({
manifest: {
browser_specific_settings: { gecko: { id: "enabled@tests.mozilla.org" } },
},
});
await promiseInstallWebExtension({
manifest: {
browser_specific_settings: {
gecko: { id: "disabled@tests.mozilla.org" },
},
},
});
let addon = await promiseAddonByID("disabled@tests.mozilla.org");
notEqual(addon, null);
await addon.disable();
});
// Keep track of the last time stamp we've used, so that we can keep moving
// it forward (if we touch two different files in the same add-on with the same
// timestamp we may not consider the change significant)
var lastTimestamp = Date.now();
/*
* Helper function to touch a file and then test whether we detect the change.
* @param XS The XPIState object.
* @param aPath File path to touch.
* @param aChange True if we should notice the change, False if we shouldn't.
*/
function checkChange(XS, aPath, aChange) {
Assert.ok(aPath.exists());
lastTimestamp += 10000;
info("Touching file " + aPath.path + " with " + lastTimestamp);
aPath.lastModifiedTime = lastTimestamp;
Assert.equal(XS.scanForChanges(), aChange);
// Save the pref so we don't detect this change again
XS.save();
}
// Get a reference to the XPIState (loaded by startupManager) so we can unit test it.
function getXS() {
const { XPIExports } = ChromeUtils.importESModule(
"resource://gre/modules/addons/XPIExports.sys.mjs"
);
return XPIExports.XPIInternal.XPIStates;
}
async function getXSJSON() {
await AddonTestUtils.loadAddonsList(true);
return aomStartup.readStartupData();
}
add_task(async function detect_touches() {
let XS = getXS();
// Should be no changes detected here, because everything should start out up-to-date.
Assert.ok(!XS.scanForChanges());
let states = XS.getLocation("app-profile");
// State should correctly reflect enabled/disabled
let state = states.get("enabled@tests.mozilla.org");
Assert.notEqual(state, null, "Found xpi state for enabled extension");
Assert.ok(state.enabled, "enabled extension has correct xpi state");
state = states.get("disabled@tests.mozilla.org");
Assert.notEqual(state, null, "Found xpi state for disabled extension");
Assert.ok(!state.enabled, "disabled extension has correct xpi state");
// Touch various files and make sure the change is detected.
// We notice that a packed XPI is touched for an enabled add-on.
let peFile = profileDir.clone();
peFile.append("enabled@tests.mozilla.org.xpi");
checkChange(XS, peFile, true);
// We should notice the packed XPI change for a disabled add-on too.
let pdFile = profileDir.clone();
pdFile.append("disabled@tests.mozilla.org.xpi");
checkChange(XS, pdFile, true);
});
/*
* Uninstalling extensions should immediately remove them from XPIStates.
*/
add_task(async function uninstall_bootstrap() {
let pe = await promiseAddonByID("enabled@tests.mozilla.org");
await pe.uninstall();
let xpiState = await getXSJSON();
Assert.equal(
false,
"enabled@tests.mozilla.org" in xpiState["app-profile"].addons
);
});
/*
* Installing an extension should immediately add it to XPIState
*/
add_task(async function install_bootstrap() {
const ID = "addon@tests.mozilla.org";
let XS = getXS();
await promiseInstallWebExtension({
manifest: {
browser_specific_settings: { gecko: { id: ID } },
},
});
let addon = await promiseAddonByID(ID);
let xState = XS.getAddon("app-profile", ID);
Assert.ok(!!xState);
Assert.ok(xState.enabled);
Assert.equal(xState.mtime, addon.updateDate.getTime());
await addon.uninstall();
});