diff options
Diffstat (limited to 'toolkit/mozapps/extensions/test/xpcshell/test_startup.js')
-rw-r--r-- | toolkit/mozapps/extensions/test/xpcshell/test_startup.js | 648 |
1 files changed, 648 insertions, 0 deletions
diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_startup.js b/toolkit/mozapps/extensions/test/xpcshell/test_startup.js new file mode 100644 index 0000000000..ba9e04c7bf --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/test_startup.js @@ -0,0 +1,648 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// This verifies startup detection of added/removed/changed items and install +// location priorities + +Services.prefs.setIntPref("extensions.autoDisableScopes", 0); + +const ID1 = getID(1); +const ID2 = getID(2); +const ID3 = getID(3); +const ID4 = getID(4); + +function createWebExtensionXPI(id, version) { + return createTempWebExtensionFile({ + manifest: { + version, + browser_specific_settings: { gecko: { id } }, + }, + }); +} + +// Bug 1554703: Verify that the extensions.lastAppBuildId pref is updated properly +// to avoid a full scan on second startup in XPIStates.scanForChanges. +add_task(async function test_scan_app_build_id_updated() { + const PREF_EM_LAST_APP_BUILD_ID = "extensions.lastAppBuildId"; + Assert.equal( + Services.prefs.getCharPref(PREF_EM_LAST_APP_BUILD_ID, ""), + "", + "fresh version with no saved build ID" + ); + Assert.ok(Services.appinfo.appBuildID, "build ID is set before a startup"); + + await promiseStartupManager(); + Assert.equal( + Services.prefs.getCharPref(PREF_EM_LAST_APP_BUILD_ID, ""), + Services.appinfo.appBuildID, + "build ID is correct after a startup" + ); + + await promiseShutdownManager(); +}); + +// Try to install all the items into the profile +add_task(async function test_scan_profile() { + await promiseStartupManager(); + + let ids = []; + for (let n of [1, 2, 3]) { + let id = getID(n); + ids.push(id); + await createWebExtension(id, initialVersion(n), profileDir); + } + + await promiseRestartManager(); + let addons = await AddonManager.getAddonsByTypes(["extension"]); + Assert.equal(addons.length, 3, "addons installed"); + + check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, ids); + check_startup_changes(AddonManager.STARTUP_CHANGE_CHANGED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_UNINSTALLED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_DISABLED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_ENABLED, []); + + info("Checking for " + gAddonStartup.path); + Assert.ok(gAddonStartup.exists()); + + for (let n of [1, 2, 3]) { + let id = getID(n); + let addon = await promiseAddonByID(id); + Assert.notEqual(addon, null); + Assert.equal(addon.id, id); + Assert.notEqual(addon.syncGUID, null); + Assert.ok(addon.syncGUID.length >= 9); + Assert.equal(addon.version, initialVersion(n)); + Assert.ok(isExtensionInBootstrappedList(profileDir, id)); + Assert.ok(hasFlag(addon.permissions, AddonManager.PERM_CAN_UNINSTALL)); + Assert.ok(hasFlag(addon.permissions, AddonManager.PERM_CAN_UPGRADE)); + do_check_in_crash_annotation(id, initialVersion(n)); + Assert.equal(addon.scope, AddonManager.SCOPE_PROFILE); + Assert.equal(addon.sourceURI, null); + Assert.ok(addon.foreignInstall); + Assert.ok(!addon.userDisabled); + Assert.ok(addon.seen); + } + + let extensionAddons = await AddonManager.getAddonsByTypes(["extension"]); + Assert.equal(extensionAddons.length, 3); + + await promiseShutdownManager(); +}); + +// Test that modified items are detected and items in other install locations +// are ignored +add_task(async function test_modify() { + await createWebExtension(ID1, "1.1", userDir); + await createWebExtension(ID2, "2.1", profileDir); + await createWebExtension(ID2, "2.2", globalDir); + await createWebExtension(ID2, "2.3", userDir); + + await IOUtils.remove(PathUtils.join(profileDir.path, `${ID3}.xpi`)); + + await promiseStartupManager(); + let addons = await AddonManager.getAddonsByTypes(["extension"]); + Assert.equal(addons.length, 2, "addons installed"); + + check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_CHANGED, [ID2]); + check_startup_changes(AddonManager.STARTUP_CHANGE_UNINSTALLED, [ID3]); + check_startup_changes(AddonManager.STARTUP_CHANGE_DISABLED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_ENABLED, []); + + Assert.ok(gAddonStartup.exists()); + + let [a1, a2, a3] = await AddonManager.getAddonsByIDs([ID1, ID2, ID3]); + + Assert.notEqual(a1, null); + Assert.equal(a1.id, ID1); + Assert.equal(a1.version, "1.0"); + Assert.ok(isExtensionInBootstrappedList(profileDir, ID1)); + Assert.ok(!isExtensionInBootstrappedList(userDir, ID1)); + Assert.ok(hasFlag(a1.permissions, AddonManager.PERM_CAN_UNINSTALL)); + Assert.ok(hasFlag(a1.permissions, AddonManager.PERM_CAN_UPGRADE)); + do_check_in_crash_annotation(ID1, "1.0"); + Assert.equal(a1.scope, AddonManager.SCOPE_PROFILE); + Assert.ok(a1.foreignInstall); + + // The version in the profile should take precedence. + const VERSION2 = "2.1"; + Assert.notEqual(a2, null); + Assert.equal(a2.id, ID2); + Assert.equal(a2.version, VERSION2); + Assert.ok(isExtensionInBootstrappedList(profileDir, ID2)); + Assert.ok(!isExtensionInBootstrappedList(userDir, ID2)); + Assert.ok(!isExtensionInBootstrappedList(globalDir, ID2)); + Assert.ok(hasFlag(a2.permissions, AddonManager.PERM_CAN_UNINSTALL)); + Assert.ok(hasFlag(a2.permissions, AddonManager.PERM_CAN_UPGRADE)); + do_check_in_crash_annotation(ID2, VERSION2); + Assert.equal(a2.scope, AddonManager.SCOPE_PROFILE); + Assert.ok(a2.foreignInstall); + + Assert.equal(a3, null); + Assert.ok(!isExtensionInBootstrappedList(profileDir, ID3)); + do_check_not_in_crash_annotation(ID3, "3.0"); + + await promiseShutdownManager(); +}); + +// Check that removing items from the profile reveals their hidden versions. +add_task(async function test_reveal() { + await IOUtils.remove(PathUtils.join(profileDir.path, `${ID1}.xpi`)); + await IOUtils.remove(PathUtils.join(profileDir.path, `${ID2}.xpi`)); + + // XPI with wrong name (basename doesn't match the id) + let xpi = await createWebExtensionXPI(ID3, "3.0"); + xpi.copyTo(profileDir, `${ID4}.xpi`); + + await promiseStartupManager(); + let addons = await AddonManager.getAddonsByTypes(["extension"]); + Assert.equal(addons.length, 2, "addons installed"); + + check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_CHANGED, [ID1, ID2]); + check_startup_changes(AddonManager.STARTUP_CHANGE_UNINSTALLED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_DISABLED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_ENABLED, []); + + let [a1, a2, a3, a4] = await AddonManager.getAddonsByIDs([ + ID1, + ID2, + ID3, + ID4, + ]); + + // Copy of addon1 in the per-user directory is now revealed. + const VERSION1 = "1.1"; + Assert.notEqual(a1, null); + Assert.equal(a1.id, ID1); + Assert.equal(a1.version, VERSION1); + Assert.ok(!isExtensionInBootstrappedList(profileDir, ID1)); + Assert.ok(isExtensionInBootstrappedList(userDir, ID1)); + Assert.ok(!hasFlag(a1.permissions, AddonManager.PERM_CAN_UNINSTALL)); + Assert.ok(!hasFlag(a1.permissions, AddonManager.PERM_CAN_UPGRADE)); + do_check_in_crash_annotation(ID1, VERSION1); + Assert.equal(a1.scope, AddonManager.SCOPE_USER); + + // Likewise with addon2 + const VERSION2 = "2.3"; + Assert.notEqual(a2, null); + Assert.equal(a2.id, ID2); + Assert.equal(a2.version, VERSION2); + Assert.ok(!isExtensionInBootstrappedList(profileDir, ID2)); + Assert.ok(isExtensionInBootstrappedList(userDir, ID2)); + Assert.ok(!isExtensionInBootstrappedList(globalDir, ID2)); + Assert.ok(!hasFlag(a2.permissions, AddonManager.PERM_CAN_UNINSTALL)); + Assert.ok(!hasFlag(a2.permissions, AddonManager.PERM_CAN_UPGRADE)); + do_check_in_crash_annotation(ID2, VERSION2); + Assert.equal(a2.scope, AddonManager.SCOPE_USER); + + Assert.equal(a3, null); + Assert.ok(!isExtensionInBootstrappedList(profileDir, ID3)); + + Assert.equal(a4, null); + Assert.ok(!isExtensionInBootstrappedList(profileDir, ID4)); + + let addon4Exists = await IOUtils.exists( + PathUtils.join(profileDir.path, `${ID4}.xpi`) + ); + Assert.ok(!addon4Exists, "Misnamed xpi should be removed from profile"); + + await promiseShutdownManager(); +}); + +// Test that disabling an install location works +add_task(async function test_disable_location() { + Services.prefs.setIntPref( + "extensions.enabledScopes", + AddonManager.SCOPE_SYSTEM + ); + + await promiseStartupManager(); + let addons = await AddonManager.getAddonsByTypes(["extension"]); + Assert.equal(addons.length, 1, "addons installed"); + + check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_CHANGED, [ID2]); + check_startup_changes(AddonManager.STARTUP_CHANGE_UNINSTALLED, [ID1]); + check_startup_changes(AddonManager.STARTUP_CHANGE_DISABLED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_ENABLED, []); + + let [a1, a2] = await AddonManager.getAddonsByIDs([ID1, ID2]); + Assert.equal(a1, null); + Assert.ok(!isExtensionInBootstrappedList(profileDir, ID1)); + Assert.ok(!isExtensionInBootstrappedList(userDir, ID1)); + + // System-wide copy of addon2 is now revealed + const VERSION2 = "2.2"; + Assert.notEqual(a2, null); + Assert.equal(a2.id, ID2); + Assert.equal(a2.version, VERSION2); + Assert.ok(!isExtensionInBootstrappedList(profileDir, ID2)); + Assert.ok(!isExtensionInBootstrappedList(userDir, ID2)); + Assert.ok(isExtensionInBootstrappedList(globalDir, ID2)); + Assert.ok(!hasFlag(a2.permissions, AddonManager.PERM_CAN_UNINSTALL)); + Assert.ok(!hasFlag(a2.permissions, AddonManager.PERM_CAN_UPGRADE)); + do_check_in_crash_annotation(ID2, VERSION2); + Assert.equal(a2.scope, AddonManager.SCOPE_SYSTEM); + + await promiseShutdownManager(); +}); + +// Switching disabled locations works +add_task(async function test_disable_location2() { + Services.prefs.setIntPref( + "extensions.enabledScopes", + AddonManager.SCOPE_USER + ); + + await promiseStartupManager(); + + check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, [ID1]); + check_startup_changes(AddonManager.STARTUP_CHANGE_CHANGED, [ID2]); + check_startup_changes(AddonManager.STARTUP_CHANGE_UNINSTALLED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_DISABLED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_ENABLED, []); + + let [a1, a2] = await AddonManager.getAddonsByIDs([ID1, ID2]); + + const VERSION1 = "1.1"; + Assert.notEqual(a1, null); + Assert.equal(a1.id, ID1); + Assert.equal(a1.version, VERSION1); + Assert.ok(!isExtensionInBootstrappedList(profileDir, ID1)); + Assert.ok(isExtensionInBootstrappedList(userDir, ID1)); + Assert.ok(!hasFlag(a1.permissions, AddonManager.PERM_CAN_UNINSTALL)); + Assert.ok(!hasFlag(a1.permissions, AddonManager.PERM_CAN_UPGRADE)); + do_check_in_crash_annotation(ID1, VERSION1); + Assert.equal(a1.scope, AddonManager.SCOPE_USER); + + const VERSION2 = "2.3"; + Assert.notEqual(a2, null); + Assert.equal(a2.id, ID2); + Assert.equal(a2.version, VERSION2); + Assert.ok(!isExtensionInBootstrappedList(profileDir, ID2)); + Assert.ok(isExtensionInBootstrappedList(userDir, ID2)); + Assert.ok(!isExtensionInBootstrappedList(globalDir, ID2)); + Assert.ok(!hasFlag(a2.permissions, AddonManager.PERM_CAN_UNINSTALL)); + Assert.ok(!hasFlag(a2.permissions, AddonManager.PERM_CAN_UPGRADE)); + do_check_in_crash_annotation(ID2, VERSION2); + Assert.equal(a2.scope, AddonManager.SCOPE_USER); + + await promiseShutdownManager(); +}); + +// Resetting the pref makes everything visible again +add_task(async function test_enable_location() { + Services.prefs.clearUserPref("extensions.enabledScopes"); + + await promiseStartupManager(); + + check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_CHANGED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_UNINSTALLED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_DISABLED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_ENABLED, []); + + let [a1, a2] = await AddonManager.getAddonsByIDs([ID1, ID2]); + + const VERSION1 = "1.1"; + Assert.notEqual(a1, null); + Assert.equal(a1.id, ID1); + Assert.equal(a1.version, VERSION1); + Assert.ok(!isExtensionInBootstrappedList(profileDir, ID1)); + Assert.ok(isExtensionInBootstrappedList(userDir, ID1)); + Assert.ok(!hasFlag(a1.permissions, AddonManager.PERM_CAN_UNINSTALL)); + Assert.ok(!hasFlag(a1.permissions, AddonManager.PERM_CAN_UPGRADE)); + do_check_in_crash_annotation(ID1, VERSION1); + Assert.equal(a1.scope, AddonManager.SCOPE_USER); + + const VERSION2 = "2.3"; + Assert.notEqual(a2, null); + Assert.equal(a2.id, ID2); + Assert.equal(a2.version, VERSION2); + Assert.ok(!isExtensionInBootstrappedList(profileDir, ID2)); + Assert.ok(isExtensionInBootstrappedList(userDir, ID2)); + Assert.ok(!isExtensionInBootstrappedList(globalDir, ID2)); + Assert.ok(!hasFlag(a2.permissions, AddonManager.PERM_CAN_UNINSTALL)); + Assert.ok(!hasFlag(a2.permissions, AddonManager.PERM_CAN_UPGRADE)); + do_check_in_crash_annotation(ID2, VERSION2); + Assert.equal(a2.scope, AddonManager.SCOPE_USER); + + await promiseShutdownManager(); +}); + +// Check that items in the profile hide the others again. +add_task(async function test_profile_hiding() { + const VERSION1 = "1.2"; + await createWebExtension(ID1, VERSION1, profileDir); + + await IOUtils.remove(PathUtils.join(userDir.path, `${ID2}.xpi`)); + + await promiseStartupManager(); + + check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_CHANGED, [ID1, ID2]); + check_startup_changes(AddonManager.STARTUP_CHANGE_UNINSTALLED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_DISABLED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_ENABLED, []); + + let [a1, a2, a3] = await AddonManager.getAddonsByIDs([ID1, ID2, ID3]); + + Assert.notEqual(a1, null); + Assert.equal(a1.id, ID1); + Assert.equal(a1.version, VERSION1); + Assert.ok(isExtensionInBootstrappedList(profileDir, ID1)); + Assert.ok(!isExtensionInBootstrappedList(userDir, ID1)); + Assert.ok(hasFlag(a1.permissions, AddonManager.PERM_CAN_UNINSTALL)); + Assert.ok(hasFlag(a1.permissions, AddonManager.PERM_CAN_UPGRADE)); + do_check_in_crash_annotation(ID1, VERSION1); + Assert.equal(a1.scope, AddonManager.SCOPE_PROFILE); + + const VERSION2 = "2.2"; + Assert.notEqual(a2, null); + Assert.equal(a2.id, ID2); + Assert.equal(a2.version, VERSION2); + Assert.ok(!isExtensionInBootstrappedList(profileDir, ID2)); + Assert.ok(!isExtensionInBootstrappedList(userDir, ID2)); + Assert.ok(isExtensionInBootstrappedList(globalDir, ID2)); + Assert.ok(!hasFlag(a2.permissions, AddonManager.PERM_CAN_UNINSTALL)); + Assert.ok(!hasFlag(a2.permissions, AddonManager.PERM_CAN_UPGRADE)); + do_check_in_crash_annotation(ID2, VERSION2); + Assert.equal(a2.scope, AddonManager.SCOPE_SYSTEM); + + Assert.equal(a3, null); + Assert.ok(!isExtensionInBootstrappedList(profileDir, ID3)); + + await promiseShutdownManager(); +}); + +// Disabling all locations still leaves the profile working +add_task(async function test_disable3() { + Services.prefs.setIntPref("extensions.enabledScopes", 0); + + await promiseStartupManager(); + + check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_CHANGED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_UNINSTALLED, [ + "2@tests.mozilla.org", + ]); + check_startup_changes(AddonManager.STARTUP_CHANGE_DISABLED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_ENABLED, []); + + let [a1, a2] = await AddonManager.getAddonsByIDs([ID1, ID2]); + + const VERSION1 = "1.2"; + Assert.notEqual(a1, null); + Assert.equal(a1.id, ID1); + Assert.equal(a1.version, VERSION1); + Assert.ok(isExtensionInBootstrappedList(profileDir, ID1)); + Assert.ok(!isExtensionInBootstrappedList(userDir, ID1)); + Assert.ok(hasFlag(a1.permissions, AddonManager.PERM_CAN_UNINSTALL)); + Assert.ok(hasFlag(a1.permissions, AddonManager.PERM_CAN_UPGRADE)); + do_check_in_crash_annotation(ID1, VERSION1); + Assert.equal(a1.scope, AddonManager.SCOPE_PROFILE); + + Assert.equal(a2, null); + Assert.ok(!isExtensionInBootstrappedList(profileDir, ID2)); + Assert.ok(!isExtensionInBootstrappedList(userDir, ID2)); + Assert.ok(!isExtensionInBootstrappedList(globalDir, ID2)); + + await promiseShutdownManager(); +}); + +// More hiding and revealing +add_task(async function test_reval() { + Services.prefs.clearUserPref("extensions.enabledScopes"); + + await IOUtils.remove(PathUtils.join(userDir.path, `${ID1}.xpi`)); + await IOUtils.remove(PathUtils.join(globalDir.path, `${ID2}.xpi`)); + + const VERSION2 = "2.4"; + await createWebExtension(ID2, VERSION2, profileDir); + + await promiseStartupManager(); + + check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, [ + "2@tests.mozilla.org", + ]); + check_startup_changes(AddonManager.STARTUP_CHANGE_CHANGED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_UNINSTALLED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_DISABLED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_ENABLED, []); + + let [a1, a2, a3] = await AddonManager.getAddonsByIDs([ID1, ID2, ID3]); + + Assert.notEqual(a1, null); + Assert.equal(a1.id, ID1); + Assert.equal(a1.version, "1.2"); + Assert.ok(isExtensionInBootstrappedList(profileDir, ID1)); + Assert.ok(!isExtensionInBootstrappedList(userDir, ID1)); + Assert.ok(hasFlag(a1.permissions, AddonManager.PERM_CAN_UNINSTALL)); + Assert.ok(hasFlag(a1.permissions, AddonManager.PERM_CAN_UPGRADE)); + Assert.equal(a1.scope, AddonManager.SCOPE_PROFILE); + + Assert.notEqual(a2, null); + Assert.equal(a2.id, ID2); + Assert.equal(a2.version, VERSION2); + Assert.ok(isExtensionInBootstrappedList(profileDir, ID2)); + Assert.ok(!isExtensionInBootstrappedList(userDir, ID2)); + Assert.ok(!isExtensionInBootstrappedList(globalDir, ID2)); + Assert.ok(hasFlag(a2.permissions, AddonManager.PERM_CAN_UNINSTALL)); + Assert.ok(hasFlag(a2.permissions, AddonManager.PERM_CAN_UPGRADE)); + Assert.equal(a2.scope, AddonManager.SCOPE_PROFILE); + + Assert.equal(a3, null); + Assert.ok(!isExtensionInBootstrappedList(profileDir, ID3)); + + await promiseShutdownManager(); +}); + +// Checks that a removal from one location and an addition in another location +// for the same item is handled +add_task(async function test_move() { + await IOUtils.remove(PathUtils.join(profileDir.path, `${ID1}.xpi`)); + const VERSION1 = "1.3"; + await createWebExtension(ID1, VERSION1, userDir); + + await promiseStartupManager(); + + check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_CHANGED, [ID1]); + check_startup_changes(AddonManager.STARTUP_CHANGE_UNINSTALLED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_DISABLED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_ENABLED, []); + + let [a1, a2] = await AddonManager.getAddonsByIDs([ID1, ID2]); + + Assert.notEqual(a1, null); + Assert.equal(a1.id, ID1); + Assert.equal(a1.version, VERSION1); + Assert.ok(!isExtensionInBootstrappedList(profileDir, ID1)); + Assert.ok(isExtensionInBootstrappedList(userDir, ID1)); + Assert.ok(!hasFlag(a1.permissions, AddonManager.PERM_CAN_UNINSTALL)); + Assert.ok(!hasFlag(a1.permissions, AddonManager.PERM_CAN_UPGRADE)); + Assert.equal(a1.scope, AddonManager.SCOPE_USER); + + const VERSION2 = "2.4"; + Assert.notEqual(a2, null); + Assert.equal(a2.id, ID2); + Assert.equal(a2.version, VERSION2); + Assert.ok(isExtensionInBootstrappedList(profileDir, ID2)); + Assert.ok(!isExtensionInBootstrappedList(userDir, ID2)); + Assert.ok(!isExtensionInBootstrappedList(globalDir, ID2)); + Assert.ok(hasFlag(a2.permissions, AddonManager.PERM_CAN_UNINSTALL)); + Assert.ok(hasFlag(a2.permissions, AddonManager.PERM_CAN_UPGRADE)); + Assert.equal(a2.scope, AddonManager.SCOPE_PROFILE); + + await promiseShutdownManager(); +}); + +// This should remove any remaining items +add_task(async function test_remove() { + await IOUtils.remove(PathUtils.join(userDir.path, `${ID1}.xpi`)); + await IOUtils.remove(PathUtils.join(profileDir.path, `${ID2}.xpi`)); + + await promiseStartupManager(); + + check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_CHANGED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_UNINSTALLED, [ID1, ID2]); + check_startup_changes(AddonManager.STARTUP_CHANGE_DISABLED, []); + check_startup_changes(AddonManager.STARTUP_CHANGE_ENABLED, []); + + let [a1, a2, a3] = await AddonManager.getAddonsByIDs([ID1, ID2, ID3]); + Assert.equal(a1, null); + Assert.equal(a2, null); + Assert.equal(a3, null); + + Assert.ok(!isExtensionInBootstrappedList(profileDir, ID1)); + Assert.ok(!isExtensionInBootstrappedList(profileDir, ID2)); + Assert.ok(!isExtensionInBootstrappedList(profileDir, ID3)); + Assert.ok(!isExtensionInBootstrappedList(profileDir, ID4)); + Assert.ok(!isExtensionInBootstrappedList(profileDir, ID4)); + Assert.ok(!isExtensionInBootstrappedList(userDir, ID1)); + Assert.ok(!isExtensionInBootstrappedList(userDir, ID2)); + Assert.ok(!isExtensionInBootstrappedList(userDir, ID3)); + Assert.ok(!isExtensionInBootstrappedList(userDir, ID4)); + Assert.ok(!isExtensionInBootstrappedList(userDir, ID4)); + Assert.ok(!isExtensionInBootstrappedList(globalDir, ID1)); + Assert.ok(!isExtensionInBootstrappedList(globalDir, ID2)); + Assert.ok(!isExtensionInBootstrappedList(globalDir, ID3)); + Assert.ok(!isExtensionInBootstrappedList(globalDir, ID4)); + Assert.ok(!isExtensionInBootstrappedList(globalDir, ID4)); + + await promiseShutdownManager(); +}); + +// Test that auto-disabling for specific scopes works +add_task(async function test_autoDisable() { + Services.prefs.setIntPref( + "extensions.autoDisableScopes", + AddonManager.SCOPE_USER + ); + + async function writeAll() { + return Promise.all([ + createWebExtension(ID1, "1.0", profileDir), + createWebExtension(ID2, "2.0", userDir), + createWebExtension(ID3, "3.0", globalDir), + ]); + } + + async function removeAll() { + return Promise.all([ + IOUtils.remove(PathUtils.join(profileDir.path, `${ID1}.xpi`)), + IOUtils.remove(PathUtils.join(userDir.path, `${ID2}.xpi`)), + IOUtils.remove(PathUtils.join(globalDir.path, `${ID3}.xpi`)), + ]); + } + + await writeAll(); + + await promiseStartupManager(); + + let [a1, a2, a3] = await AddonManager.getAddonsByIDs([ID1, ID2, ID3]); + Assert.notEqual(a1, null); + Assert.ok(!a1.userDisabled); + Assert.ok(a1.seen); + Assert.ok(a1.isActive); + + Assert.notEqual(a2, null); + Assert.ok(a2.userDisabled); + Assert.ok(!a2.seen); + Assert.ok(!a2.isActive); + + Assert.notEqual(a3, null); + Assert.ok(!a3.userDisabled); + Assert.ok(a3.seen); + Assert.ok(a3.isActive); + + await promiseShutdownManager(); + + await removeAll(); + + await promiseStartupManager(); + await promiseShutdownManager(); + + Services.prefs.setIntPref( + "extensions.autoDisableScopes", + AddonManager.SCOPE_SYSTEM + ); + + await writeAll(); + + await promiseStartupManager(); + + [a1, a2, a3] = await AddonManager.getAddonsByIDs([ID1, ID2, ID3]); + Assert.notEqual(a1, null); + Assert.ok(!a1.userDisabled); + Assert.ok(a1.seen); + Assert.ok(a1.isActive); + + Assert.notEqual(a2, null); + Assert.ok(!a2.userDisabled); + Assert.ok(a2.seen); + Assert.ok(a2.isActive); + + Assert.notEqual(a3, null); + Assert.ok(a3.userDisabled); + Assert.ok(!a3.seen); + Assert.ok(!a3.isActive); + + await promiseShutdownManager(); + + await removeAll(); + + await promiseStartupManager(); + await promiseShutdownManager(); + + Services.prefs.setIntPref( + "extensions.autoDisableScopes", + AddonManager.SCOPE_USER + AddonManager.SCOPE_SYSTEM + ); + + await writeAll(); + + await promiseStartupManager(); + + [a1, a2, a3] = await AddonManager.getAddonsByIDs([ID1, ID2, ID3]); + Assert.notEqual(a1, null); + Assert.ok(!a1.userDisabled); + Assert.ok(a1.seen); + Assert.ok(a1.isActive); + + Assert.notEqual(a2, null); + Assert.ok(a2.userDisabled); + Assert.ok(!a2.seen); + Assert.ok(!a2.isActive); + + Assert.notEqual(a3, null); + Assert.ok(a3.userDisabled); + Assert.ok(!a3.seen); + Assert.ok(!a3.isActive); + + await promiseShutdownManager(); +}); |