summaryrefslogtreecommitdiffstats
path: root/toolkit/mozapps/extensions/test/xpcshell/test_system_profile_location.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/mozapps/extensions/test/xpcshell/test_system_profile_location.js')
-rw-r--r--toolkit/mozapps/extensions/test/xpcshell/test_system_profile_location.js204
1 files changed, 204 insertions, 0 deletions
diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_system_profile_location.js b/toolkit/mozapps/extensions/test/xpcshell/test_system_profile_location.js
new file mode 100644
index 0000000000..9dbf8f7070
--- /dev/null
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_system_profile_location.js
@@ -0,0 +1,204 @@
+"use strict";
+
+/* globals browser */
+let scopes = AddonManager.SCOPE_PROFILE | AddonManager.SCOPE_APPLICATION;
+Services.prefs.setIntPref("extensions.enabledScopes", scopes);
+
+AddonTestUtils.createAppInfo(
+ "xpcshell@tests.mozilla.org",
+ "XPCShell",
+ "1",
+ "1"
+);
+
+AddonTestUtils.usePrivilegedSignatures = id => id.startsWith("system");
+
+async function promiseInstallSystemProfileExtension(id, hidden) {
+ let xpi = await AddonTestUtils.createTempWebExtensionFile({
+ manifest: {
+ browser_specific_settings: { gecko: { id } },
+ hidden,
+ },
+ background() {
+ browser.test.sendMessage("started");
+ },
+ });
+ let wrapper = ExtensionTestUtils.expectExtension(id);
+
+ const install = await AddonManager.getInstallForURL(`file://${xpi.path}`, {
+ useSystemLocation: true, // KEY_APP_SYSTEM_PROFILE
+ });
+
+ install.install();
+
+ await wrapper.awaitStartup();
+ await wrapper.awaitMessage("started");
+ return wrapper;
+}
+
+async function promiseUninstall(id) {
+ await AddonManager.uninstallSystemProfileAddon(id);
+
+ let addon = await promiseAddonByID(id);
+ equal(addon, null, "Addon is gone after uninstall");
+}
+
+// Tests installing an extension into the app-system-profile location.
+add_task(async function test_system_profile_location() {
+ let id = "system@tests.mozilla.org";
+ await AddonTestUtils.promiseStartupManager();
+ let wrapper = await promiseInstallSystemProfileExtension(id);
+
+ let addon = await promiseAddonByID(id);
+ notEqual(addon, null, "Addon is installed");
+ ok(addon.isActive, "Addon is active");
+ ok(addon.isPrivileged, "Addon is privileged");
+ ok(wrapper.extension.isAppProvided, "Addon is app provided");
+ ok(!addon.hidden, "Addon is not hidden");
+ equal(
+ addon.signedState,
+ AddonManager.SIGNEDSTATE_PRIVILEGED,
+ "Addon is system signed"
+ );
+
+ // After a restart, the extension should start up normally.
+ await promiseRestartManager();
+ await wrapper.awaitStartup();
+ await wrapper.awaitMessage("started");
+ ok(true, "Extension in app-system-profile location ran after restart");
+
+ addon = await promiseAddonByID(id);
+ notEqual(addon, null, "Addon is installed");
+ ok(addon.isActive, "Addon is active");
+
+ // After a restart that causes a database rebuild, it should still work
+ await promiseRestartManager("2");
+ await wrapper.awaitStartup();
+ await wrapper.awaitMessage("started");
+ ok(true, "Extension in app-system-profile location ran after restart");
+
+ addon = await promiseAddonByID(id);
+ notEqual(addon, null, "Addon is installed");
+ ok(addon.isActive, "Addon is active");
+
+ // After a restart that changes the schema version, it should still work
+ await promiseShutdownManager();
+ Services.prefs.setIntPref("extensions.databaseSchema", 0);
+ await promiseStartupManager();
+
+ await wrapper.awaitStartup();
+ await wrapper.awaitMessage("started");
+ ok(true, "Extension in app-system-profile location ran after restart");
+
+ addon = await promiseAddonByID(id);
+ notEqual(addon, null, "Addon is installed");
+ ok(addon.isActive, "Addon is active");
+
+ await promiseUninstall(id);
+
+ await AddonTestUtils.promiseShutdownManager();
+});
+
+// Tests installing a hidden extension in the app-system-profile location.
+add_task(async function test_system_profile_location_hidden() {
+ let id = "system-hidden@tests.mozilla.org";
+ await AddonTestUtils.promiseStartupManager();
+ await promiseInstallSystemProfileExtension(id, true);
+
+ let addon = await promiseAddonByID(id);
+ notEqual(addon, null, "Addon is installed");
+ ok(addon.isActive, "Addon is active");
+ ok(addon.isPrivileged, "Addon is privileged");
+ ok(addon.hidden, "Addon is hidden");
+
+ await promiseUninstall(id);
+
+ await AddonTestUtils.promiseShutdownManager();
+});
+
+add_task(async function test_system_profile_location_installFile() {
+ await AddonTestUtils.promiseStartupManager();
+ let id = "system-fileinstall@test";
+ let xpi = await AddonTestUtils.createTempWebExtensionFile({
+ manifest: {
+ browser_specific_settings: { gecko: { id } },
+ },
+ background() {
+ browser.test.sendMessage("started");
+ },
+ });
+ let wrapper = ExtensionTestUtils.expectExtension(id);
+
+ const install = await AddonManager.getInstallForFile(xpi, null, null, true);
+ install.install();
+
+ await wrapper.awaitStartup();
+ await wrapper.awaitMessage("started");
+
+ await promiseUninstall(id);
+
+ await AddonTestUtils.promiseShutdownManager();
+});
+
+add_task(async function test_system_profile_location_overridden() {
+ await AddonTestUtils.promiseStartupManager();
+ let id = "system-fileinstall@test";
+ let xpi = await AddonTestUtils.createTempWebExtensionFile({
+ manifest: {
+ version: "1.0",
+ browser_specific_settings: { gecko: { id } },
+ },
+ });
+
+ let install = await AddonManager.getInstallForFile(xpi, null, null, true);
+ await install.install();
+
+ let addon = await promiseAddonByID(id);
+ equal(addon.version, "1.0", "Addon is installed");
+
+ // Install a user profile version on top of the system profile location.
+ xpi = await AddonTestUtils.createTempWebExtensionFile({
+ manifest: {
+ version: "2.0",
+ browser_specific_settings: { gecko: { id } },
+ },
+ });
+
+ install = await AddonManager.getInstallForFile(xpi);
+ await install.install();
+
+ addon = await promiseAddonByID(id);
+ equal(addon.version, "2.0", "Addon is upgraded");
+
+ // Uninstall the system profile addon.
+ await AddonManager.uninstallSystemProfileAddon(id);
+
+ addon = await promiseAddonByID(id);
+ equal(addon.version, "2.0", "Addon is still active");
+
+ await addon.uninstall();
+ await AddonTestUtils.promiseShutdownManager();
+});
+
+add_task(async function test_system_profile_location_require_system_cert() {
+ await AddonTestUtils.promiseStartupManager();
+ let id = "fail@test";
+ let xpi = await AddonTestUtils.createTempWebExtensionFile({
+ manifest: {
+ browser_specific_settings: { gecko: { id } },
+ },
+ });
+ const install = await AddonManager.getInstallForURL(`file://${xpi.path}`, {
+ useSystemLocation: true, // KEY_APP_SYSTEM_PROFILE
+ });
+
+ await install.install();
+
+ let addon = await promiseAddonByID(id);
+ ok(!addon.isPrivileged, "Addon is not privileged");
+ ok(!addon.isActive, "Addon is not active");
+ equal(addon.signedState, AddonManager.SIGNEDSTATE_SIGNED, "Addon is signed");
+
+ await addon.uninstall();
+ await AddonTestUtils.promiseShutdownManager();
+});