1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
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()
);
});
|