Bug 1347971 - pass oldVersion to install and startup methods for temporary add-on reloads r?aswan draft
authorRobert Helmer <rhelmer@mozilla.com>
Thu, 16 Mar 2017 13:23:33 -0700
changeset 500180 4dba0da99e3734f7f9d9cd0cef3fb9a15a5403e6
parent 500108 3945f2297b997d59662bdb8ac20e092363eea532
child 549568 f54cd1526cc2e45620644e15fb2ebc5f91cfd90c
push id49647
push userrhelmer@mozilla.com
push dateThu, 16 Mar 2017 20:29:58 +0000
reviewersaswan
bugs1347971
milestone55.0a1
Bug 1347971 - pass oldVersion to install and startup methods for temporary add-on reloads r?aswan MozReview-Commit-ID: GjEmTt86JaG
toolkit/mozapps/extensions/internal/XPIProvider.jsm
toolkit/mozapps/extensions/test/xpcshell/test_temporary.js
--- a/toolkit/mozapps/extensions/internal/XPIProvider.jsm
+++ b/toolkit/mozapps/extensions/internal/XPIProvider.jsm
@@ -4067,72 +4067,78 @@ this.XPIProvider = {
 
     if (!addon.bootstrap) {
       throw new Error("Only restartless (bootstrap) add-ons"
                     + " can be installed from sources:", addon.id);
     }
     let installReason = BOOTSTRAP_REASONS.ADDON_INSTALL;
     let oldAddon = yield new Promise(
                    resolve => XPIDatabase.getVisibleAddonForID(addon.id, resolve));
+
+    let extraParams = {};
     if (oldAddon) {
       if (!oldAddon.bootstrap) {
         logger.warn("Non-restartless Add-on is already installed", addon.id);
         throw new Error("Non-restartless add-on with ID "
                         + oldAddon.id + " is already installed");
       } else {
         logger.warn("Addon with ID " + oldAddon.id + " already installed,"
                     + " older version will be disabled");
 
         let existingAddonID = oldAddon.id;
         let existingAddon = oldAddon._sourceBundle;
 
         // We'll be replacing a currently active bootstrapped add-on so
         // call its uninstall method
         let newVersion = addon.version;
         let oldVersion = oldAddon.version;
+
         if (Services.vc.compare(newVersion, oldVersion) >= 0) {
           installReason = BOOTSTRAP_REASONS.ADDON_UPGRADE;
         } else {
           installReason = BOOTSTRAP_REASONS.ADDON_DOWNGRADE;
         }
         let uninstallReason = installReason;
 
+        extraParams.newVersion = newVersion;
+        extraParams.oldVersion = oldVersion;
+
         if (oldAddon.active) {
           XPIProvider.callBootstrapMethod(oldAddon, existingAddon,
                                           "shutdown", uninstallReason,
-                                          { newVersion });
+                                          extraParams);
         }
         this.callBootstrapMethod(oldAddon, existingAddon,
-                                 "uninstall", uninstallReason, { newVersion });
+                                 "uninstall", uninstallReason, extraParams);
         this.unloadBootstrapScope(existingAddonID);
         flushChromeCaches();
       }
     } else {
       addon.installDate = Date.now();
     }
 
     let file = addon._sourceBundle;
 
     XPIProvider._addURIMapping(addon.id, file);
-    XPIProvider.callBootstrapMethod(addon, file, "install", installReason);
+    XPIProvider.callBootstrapMethod(addon, file, "install", installReason, extraParams);
     addon.state = AddonManager.STATE_INSTALLED;
     logger.debug("Install of temporary addon in " + aFile.path + " completed.");
     addon.visible = true;
     addon.enabled = true;
     addon.active = true;
 
     addon = XPIDatabase.addAddonMetadata(addon, file.persistentDescriptor);
 
     XPIStates.addAddon(addon);
     XPIDatabase.saveChanges();
     XPIStates.save();
 
     AddonManagerPrivate.callAddonListeners("onInstalling", addon.wrapper,
                                            false);
-    XPIProvider.callBootstrapMethod(addon, file, "startup", installReason);
+    XPIProvider.callBootstrapMethod(addon, file, "startup", installReason, extraParams);
     AddonManagerPrivate.callInstallListeners("onExternalInstall",
                                              null, addon.wrapper,
                                              oldAddon ? oldAddon.wrapper : null,
                                              false);
     AddonManagerPrivate.callAddonListeners("onInstalled", addon.wrapper);
 
     // Notify providers that a new theme has been enabled.
     if (isTheme(addon.type))
--- a/toolkit/mozapps/extensions/test/xpcshell/test_temporary.js
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_temporary.js
@@ -502,20 +502,22 @@ add_task(function*() {
 
   const uninstall = yield onUninstall;
   equal(uninstall.data.version, "1.0");
   equal(uninstall.reason, BOOTSTRAP_REASONS.ADDON_UPGRADE);
 
   const install = yield onInstall;
   equal(install.data.version, "2.0");
   equal(install.reason, BOOTSTRAP_REASONS.ADDON_UPGRADE);
+  equal(install.data.oldVersion, "1.0");
 
   const startup = yield onStartup;
   equal(startup.data.version, "2.0");
   equal(startup.reason, BOOTSTRAP_REASONS.ADDON_UPGRADE);
+  equal(startup.data.oldVersion, "1.0");
 
   const addon = yield promiseAddonByID(ID);
   addon.uninstall();
 
   unpackedAddon.remove(true);
   yield promiseRestartManager();
 });