Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "42");
add_task(async function () {
let triggered = {};
const { Management } = ChromeUtils.importESModule(
"resource://gre/modules/Extension.sys.mjs"
);
for (let event of ["install", "uninstall", "update"]) {
triggered[event] = false;
Management.on(event, () => (triggered[event] = true));
}
async function expectEvents(expected, fn) {
let events = Object.keys(expected);
for (let event of events) {
triggered[event] = false;
}
await fn();
await new Promise(executeSoon);
for (let event of events) {
equal(
triggered[event],
expected[event],
`Event ${event} was${expected[event] ? "" : " not"} triggered`
);
}
}
await promiseStartupManager();
const id = "webextension@tests.mozilla.org";
// Install version 1.0, shouldn't see any events
await expectEvents({ update: false, uninstall: false }, async () => {
await promiseInstallWebExtension({
manifest: {
version: "1.0",
browser_specific_settings: { gecko: { id } },
},
});
});
// Install version 2.0, we should get an update event but not an uninstall
await expectEvents({ update: true, uninstall: false }, async () => {
await promiseInstallWebExtension({
manifest: {
version: "2.0",
browser_specific_settings: { gecko: { id } },
},
});
});
// Install version 3.0 as a temporary addon, we should again get
// update but not uninstall
let v3 = createTempWebExtensionFile({
manifest: {
version: "3.0",
browser_specific_settings: { gecko: { id } },
},
});
await expectEvents({ update: true, uninstall: false }, () =>
AddonManager.installTemporaryAddon(v3)
);
// Uninstall the temporary addon, this causes version 2.0 still installed
// in the profile to be revealed. Again, this results in an update event.
let addon = await promiseAddonByID(id);
await expectEvents({ update: true, uninstall: false }, () =>
addon.uninstall()
);
// Re-install version 3.0 as a temporary addon
await AddonManager.installTemporaryAddon(v3);
// Now shut down the addons manager, this should cause the temporary
// addon to be uninstalled which reveals 2.0 from the profile.
await expectEvents({ update: true, uninstall: false }, () =>
promiseShutdownManager()
);
// When we start up again we should not see any events
await expectEvents({ install: false }, () => promiseStartupManager());
addon = await promiseAddonByID(id);
// When we uninstall from the profile, the addon is now gone, we should
// get an uninstall events.
await expectEvents({ update: false, uninstall: true }, () =>
addon.uninstall()
);
});