summaryrefslogtreecommitdiffstats
path: root/toolkit/mozapps/extensions/test/xpcshell/test_sideloads_after_rebuild.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/mozapps/extensions/test/xpcshell/test_sideloads_after_rebuild.js')
-rw-r--r--toolkit/mozapps/extensions/test/xpcshell/test_sideloads_after_rebuild.js149
1 files changed, 149 insertions, 0 deletions
diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_sideloads_after_rebuild.js b/toolkit/mozapps/extensions/test/xpcshell/test_sideloads_after_rebuild.js
new file mode 100644
index 0000000000..24aa8b228a
--- /dev/null
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_sideloads_after_rebuild.js
@@ -0,0 +1,149 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+"use strict";
+
+// This test uses add-on versions that follow the toolkit version but we
+// started to encourage the use of a simpler format in Bug 1793925. We disable
+// the pref below to avoid install errors.
+Services.prefs.setBoolPref(
+ "extensions.webextensions.warnings-as-errors",
+ false
+);
+
+// IDs for scopes that should sideload when sideloading
+// is not disabled.
+let legacyIDs = [
+ getID(`legacy-global`),
+ getID(`legacy-user`),
+ getID(`legacy-app`),
+ getID(`legacy-profile`),
+];
+
+// This tests that, on a rebuild after addonStartup.json and extensions.json
+// are lost, we only sideload from the profile.
+add_task(async function test_sideloads_after_rebuild() {
+ let IDs = [];
+
+ // Create a sideloaded addon for each scope before the restriction is put
+ // in place (by updating the sideloadScopes preference).
+ for (let [name, dir] of Object.entries(scopeDirectories)) {
+ let id = getID(`legacy-${name}`);
+ IDs.push(id);
+ await createWebExtension(id, initialVersion(name), dir);
+ }
+
+ await promiseStartupManager();
+
+ // SCOPE_APPLICATION will never sideload, so we expect 3
+ let sideloaded = await AddonManagerPrivate.getNewSideloads();
+ Assert.equal(sideloaded.length, 4, "four sideloaded addon");
+ let sideloadedIds = sideloaded.map(a => a.id);
+ for (let id of legacyIDs) {
+ Assert.ok(sideloadedIds.includes(id));
+ }
+
+ // After a restart that causes a database rebuild, we should have
+ // the same addons available
+ await promiseShutdownManager();
+ // Reset our scope pref so the scope limitation works.
+ Services.prefs.setIntPref(
+ "extensions.sideloadScopes",
+ AddonManager.SCOPE_PROFILE
+ );
+
+ // Try to sideload from a non-profile directory.
+ await createWebExtension(
+ getID(`sideload-global-1`),
+ initialVersion("sideload-global"),
+ globalDir
+ );
+
+ await promiseStartupManager("2");
+
+ // We should still only have 4 addons.
+ let addons = await AddonManager.getAddonsByTypes(["extension"]);
+ Assert.equal(addons.length, 4, "addons remain installed");
+
+ await promiseShutdownManager();
+
+ // Install a sideload that will not load because it is not in
+ // appStartup.json and is not in a sideloadScope.
+ await createWebExtension(
+ getID(`sideload-global-2`),
+ initialVersion("sideload-global"),
+ globalDir
+ );
+ await createWebExtension(
+ getID(`sideload-app-2`),
+ initialVersion("sideload-global"),
+ globalDir
+ );
+ // Install a sideload that will load. We cannot currently prevent
+ // this situation.
+ await createWebExtension(
+ getID(`sideload-profile`),
+ initialVersion("sideload-profile"),
+ profileDir
+ );
+
+ // Replace the extensions.json with something bogus so we lose our xpidatabase.
+ // On AOM startup, addons are restored with help from XPIState. Existing
+ // sideloads should all remain. One new sideloaded addon should be added from
+ // the profile.
+ await IOUtils.writeJSON(gExtensionsJSON.path, {
+ not: "what we expect to find",
+ });
+ info(`**** restart AOM and rebuild XPI database`);
+ await promiseStartupManager();
+
+ addons = await AddonManager.getAddonsByTypes(["extension"]);
+ Assert.equal(addons.length, 5, "addons installed");
+
+ await promiseShutdownManager();
+
+ // Install a sideload that will not load.
+ await createWebExtension(
+ getID(`sideload-global-3`),
+ initialVersion("sideload-global"),
+ globalDir
+ );
+ // Install a sideload that will load. We cannot currently prevent
+ // this situation.
+ await createWebExtension(
+ getID(`sideload-profile-2`),
+ initialVersion("sideload-profile"),
+ profileDir
+ );
+
+ // Replace the extensions.json with something bogus so we lose our xpidatabase.
+ await IOUtils.writeJSON(gExtensionsJSON.path, {
+ not: "what we expect to find",
+ });
+ // Delete our appStartup/XPIState data. Now we should only be able to
+ // restore extensions in the profile.
+ gAddonStartup.remove(true);
+ info(`**** restart AOM and rebuild XPI database`);
+
+ await promiseStartupManager();
+
+ addons = await AddonManager.getAddonsByTypes(["extension"]);
+ Assert.equal(addons.length, 3, "addons installed");
+
+ let [a1, a2, a3] = await promiseAddonsByIDs([
+ getID(`legacy-profile`),
+ getID(`sideload-profile`),
+ getID(`sideload-profile-2`),
+ ]);
+
+ Assert.notEqual(a1, null);
+ Assert.ok(isExtensionInBootstrappedList(profileDir, a1.id));
+
+ Assert.notEqual(a2, null);
+ Assert.ok(isExtensionInBootstrappedList(profileDir, a2.id));
+
+ Assert.notEqual(a3, null);
+ Assert.ok(isExtensionInBootstrappedList(profileDir, a3.id));
+
+ await promiseShutdownManager();
+});