/* 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(); });