Bug 1372448 Remove broken "new profile" check when determining if an addon is sideloaded
MozReview-Commit-ID: FA7JSMLrHmT
--- a/toolkit/mozapps/extensions/internal/XPIProviderUtils.js
+++ b/toolkit/mozapps/extensions/internal/XPIProviderUtils.js
@@ -52,17 +52,16 @@ const FILE_JSON_DB =
const LAST_SQLITE_DB_SCHEMA = 14;
const PREF_DB_SCHEMA = "extensions.databaseSchema";
const PREF_PENDING_OPERATIONS = "extensions.pendingOperations";
const PREF_EM_AUTO_DISABLED_SCOPES = "extensions.autoDisableScopes";
const PREF_E10S_BLOCKED_BY_ADDONS = "extensions.e10sBlockedByAddons";
const PREF_E10S_MULTI_BLOCKED_BY_ADDONS = "extensions.e10sMultiBlockedByAddons";
const PREF_E10S_HAS_NONEXEMPT_ADDON = "extensions.e10s.rollout.hasAddon";
-const KEY_APP_PROFILE = "app-profile";
const KEY_APP_SYSTEM_ADDONS = "app-system-addons";
const KEY_APP_SYSTEM_DEFAULTS = "app-system-defaults";
const KEY_APP_GLOBAL = "app-global";
const KEY_APP_TEMPORARY = "app-temporary";
// Properties to save in JSON file
const PROP_JSON_FIELDS = ["id", "syncGUID", "location", "version", "type",
"internalName", "updateURL", "updateKey", "optionsURL",
@@ -1273,21 +1272,17 @@ this.XPIDatabaseReconcile = {
if (isDetectedInstall && aNewAddon.foreignInstall) {
// If the add-on is a foreign install and is in a scope where add-ons
// that were dropped in should default to disabled then disable it
let disablingScopes = Services.prefs.getIntPref(PREF_EM_AUTO_DISABLED_SCOPES, 0);
if (aInstallLocation.scope & disablingScopes) {
logger.warn("Disabling foreign installed add-on " + aNewAddon.id + " in "
+ aInstallLocation.name);
aNewAddon.userDisabled = true;
-
- // If we don't have an old app version then this is a new profile in
- // which case just mark any sideloaded add-ons as already seen.
- aNewAddon.seen = (aInstallLocation.name != KEY_APP_PROFILE &&
- !aOldAppVersion);
+ aNewAddon.seen = false;
}
}
return XPIDatabase.addAddonMetadata(aNewAddon, aAddonState.path);
},
/**
* Called when an add-on has been removed.
--- a/toolkit/mozapps/extensions/test/xpcshell/test_seen.js
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_seen.js
@@ -2,24 +2,27 @@
* http://creativecommons.org/publicdomain/zero/1.0/
*/
const ID = "bootstrap1@tests.mozilla.org";
let profileDir = gProfD.clone();
profileDir.append("extensions");
-createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2");
-startupManager();
+// By default disable add-ons from the profile and the system-wide scope
+const SCOPES = AddonManager.SCOPE_PROFILE | AddonManager.SCOPE_SYSTEM;
+Services.prefs.setIntPref("extensions.enabledScopes", SCOPES);
+Services.prefs.setIntPref("extensions.autoDisableScopes", SCOPES);
-// By default disable add-ons from the profile
-Services.prefs.setIntPref("extensions.autoDisableScopes", AddonManager.SCOPE_PROFILE);
+createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2");
// Installing an add-on through the API should mark it as seen
add_task(async function() {
+ await promiseStartupManager();
+
let install = await promiseInstallFile(do_get_addon("test_bootstrap1_1"));
do_check_eq(install.state, AddonManager.STATE_INSTALLED);
do_check_false(hasFlag(install.addon.pendingOperations, AddonManager.PENDING_INSTALL));
let addon = install.addon;
do_check_eq(addon.version, "1.0");
do_check_false(addon.foreignInstall);
do_check_true(addon.seen);
@@ -42,26 +45,68 @@ add_task(async function() {
await promiseRestartManager();
addon = await promiseAddonByID(ID);
do_check_false(addon.foreignInstall);
do_check_true(addon.seen);
addon.uninstall();
+
await promiseShutdownManager();
});
-// Sideloading an add-on should mark it as unseen
+// Sideloading an add-on in the systemwide location should mark it as unseen
+add_task(async function() {
+ let savedStartupScanScopes = Services.prefs.getIntPref("extensions.startupScanScopes");
+ Services.prefs.setIntPref("extensions.startupScanScopes", 0);
+
+ let systemParentDir = gTmpD.clone();
+ systemParentDir.append("systemwide-extensions");
+ registerDirectory("XRESysSExtPD", systemParentDir.clone());
+ do_register_cleanup(() => {
+ systemParentDir.remove(true);
+ });
+
+ let systemDir = systemParentDir.clone();
+ systemDir.append(Services.appinfo.ID);
+
+ let path = manuallyInstall(do_get_addon("test_bootstrap1_1"), systemDir, ID);
+ // Make sure the startup code will detect sideloaded updates
+ setExtensionModifiedTime(path, Date.now() - 10000);
+
+ await promiseStartupManager();
+ await AddonManagerPrivate.getNewSideloads();
+
+ let addon = await promiseAddonByID(ID);
+ do_check_eq(addon.version, "1.0");
+ do_check_true(addon.foreignInstall);
+ do_check_false(addon.seen);
+
+ await promiseRestartManager();
+
+ addon = await promiseAddonByID(ID);
+ do_check_true(addon.foreignInstall);
+ do_check_false(addon.seen);
+
+ await promiseShutdownManager();
+ Services.obs.notifyObservers(path, "flush-cache-entry");
+ path.remove(true);
+
+ Services.prefs.setIntPref("extensions.startupScanScopes", savedStartupScanScopes);
+});
+
+// Sideloading an add-on in the profile should mark it as unseen and it should
+// remain unseen after an update is sideloaded.
add_task(async function() {
let path = manuallyInstall(do_get_addon("test_bootstrap1_1"), profileDir, ID);
// Make sure the startup code will detect sideloaded updates
setExtensionModifiedTime(path, Date.now() - 10000);
- startupManager();
+ await promiseStartupManager();
let addon = await promiseAddonByID(ID);
do_check_eq(addon.version, "1.0");
do_check_true(addon.foreignInstall);
do_check_false(addon.seen);
await promiseRestartManager();
@@ -71,34 +116,35 @@ add_task(async function() {
await promiseShutdownManager();
// Sideloading an update shouldn't change the state
manuallyUninstall(profileDir, ID);
manuallyInstall(do_get_addon("test_bootstrap1_2"), profileDir, ID);
setExtensionModifiedTime(path, Date.now());
- startupManager();
+ await promiseStartupManager();
addon = await promiseAddonByID(ID);
do_check_eq(addon.version, "2.0");
do_check_true(addon.foreignInstall);
do_check_false(addon.seen);
addon.uninstall();
await promiseShutdownManager();
});
-// Sideloading an add-on should mark it as unseen
+// Sideloading an add-on in the profile should mark it as unseen and it should
+// remain unseen after a regular update.
add_task(async function() {
let path = manuallyInstall(do_get_addon("test_bootstrap1_1"), profileDir, ID);
// Make sure the startup code will detect sideloaded updates
setExtensionModifiedTime(path, Date.now() - 10000);
- startupManager();
+ await promiseStartupManager();
let addon = await promiseAddonByID(ID);
do_check_eq(addon.version, "1.0");
do_check_true(addon.foreignInstall);
do_check_false(addon.seen);
await promiseRestartManager();
@@ -121,23 +167,24 @@ add_task(async function() {
do_check_eq(addon.version, "2.0");
do_check_true(addon.foreignInstall);
do_check_false(addon.seen);
addon.uninstall();
await promiseShutdownManager();
});
-// Sideloading an add-on should mark it as unseen
+// After a sideloaded addon has been seen, sideloading an update should
+// not reset it to unseen.
add_task(async function() {
let path = manuallyInstall(do_get_addon("test_bootstrap1_1"), profileDir, ID);
// Make sure the startup code will detect sideloaded updates
setExtensionModifiedTime(path, Date.now() - 10000);
- startupManager();
+ await promiseStartupManager();
let addon = await promiseAddonByID(ID);
do_check_eq(addon.version, "1.0");
do_check_true(addon.foreignInstall);
do_check_false(addon.seen);
addon.markAsSeen();
do_check_true(addon.seen);
@@ -149,34 +196,35 @@ add_task(async function() {
await promiseShutdownManager();
// Sideloading an update shouldn't change the state
manuallyUninstall(profileDir, ID);
manuallyInstall(do_get_addon("test_bootstrap1_2"), profileDir, ID);
setExtensionModifiedTime(path, Date.now());
- startupManager();
+ await promiseStartupManager();
addon = await promiseAddonByID(ID);
do_check_eq(addon.version, "2.0");
do_check_true(addon.foreignInstall);
do_check_true(addon.seen);
addon.uninstall();
await promiseShutdownManager();
});
-// Sideloading an add-on should mark it as unseen
+// After a sideloaded addon has been seen, manually applying an update should
+// not reset it to unseen.
add_task(async function() {
let path = manuallyInstall(do_get_addon("test_bootstrap1_1"), profileDir, ID);
// Make sure the startup code will detect sideloaded updates
setExtensionModifiedTime(path, Date.now() - 10000);
- startupManager();
+ await promiseStartupManager();
let addon = await promiseAddonByID(ID);
do_check_eq(addon.version, "1.0");
do_check_true(addon.foreignInstall);
do_check_false(addon.seen);
addon.markAsSeen();
do_check_true(addon.seen);
deleted file mode 100644
--- a/toolkit/mozapps/extensions/test/xpcshell/test_seen_newprofile.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/
- */
-
-const ID = "bootstrap1@tests.mozilla.org";
-
-Services.prefs.setIntPref("extensions.enabledScopes",
- AddonManager.SCOPE_PROFILE + AddonManager.SCOPE_SYSTEM);
-
-createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2");
-
-BootstrapMonitor.init();
-
-const globalDir = gProfD.clone();
-globalDir.append("extensions2");
-globalDir.append(gAppInfo.ID);
-registerDirectory("XRESysSExtPD", globalDir.parent);
-const profileDir = gProfD.clone();
-profileDir.append("extensions");
-
-// By default disable add-ons from the system
-Services.prefs.setIntPref("extensions.autoDisableScopes", AddonManager.SCOPE_SYSTEM);
-
-// When new add-ons already exist in a system location when starting with a new
-// profile they should be marked as already seen.
-add_task(async function() {
- manuallyInstall(do_get_addon("test_bootstrap1_1"), globalDir, ID);
-
- startupManager();
-
- let addon = await promiseAddonByID(ID);
- do_check_true(addon.foreignInstall);
- do_check_true(addon.seen);
- do_check_true(addon.userDisabled);
- do_check_false(addon.isActive);
-
- BootstrapMonitor.checkAddonInstalled(ID);
- BootstrapMonitor.checkAddonNotStarted(ID);
-
- await promiseShutdownManager();
-});
--- a/toolkit/mozapps/extensions/test/xpcshell/xpcshell-shared.ini
+++ b/toolkit/mozapps/extensions/test/xpcshell/xpcshell-shared.ini
@@ -307,17 +307,16 @@ skip-if = os == "android"
skip-if = os == "android"
[test_updatecheck.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
run-sequentially = Uses hardcoded ports in xpi files.
[test_json_updatecheck.js]
[test_migrate_state_prefs.js]
[test_seen.js]
-[test_seen_newprofile.js]
[test_updateid.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
run-sequentially = Uses hardcoded ports in xpi files.
[test_update_compatmode.js]
[test_upgrade.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"