Bug 1347971 - pass oldVersion to install and startup methods for temporary add-on reloads r?aswan
MozReview-Commit-ID: GjEmTt86JaG
--- 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();
});