Bug 1372448 Remove broken "new profile" check when determining if an addon is sideloaded draft
authorAndrew Swan <aswan@mozilla.com>
Sat, 12 Aug 2017 12:26:56 -0700
changeset 645641 e38f73a35bedbb2c4b056e6a4593a8aad07f3b1c
parent 645074 80ff3f300e05f38f96c385b03d1973a966a2bd35
child 725947 8eff4cb4d5ff6cd4112952fd5de957dd0c022ba3
push id73807
push useraswan@mozilla.com
push dateSun, 13 Aug 2017 18:09:06 +0000
bugs1372448
milestone57.0a1
Bug 1372448 Remove broken "new profile" check when determining if an addon is sideloaded MozReview-Commit-ID: FA7JSMLrHmT
toolkit/mozapps/extensions/internal/XPIProviderUtils.js
toolkit/mozapps/extensions/test/xpcshell/test_seen.js
toolkit/mozapps/extensions/test/xpcshell/test_seen_newprofile.js
toolkit/mozapps/extensions/test/xpcshell/xpcshell-shared.ini
--- 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"