Copied from but with one hunk omitted: the git binary patch for toolkit/mozapps/extensions/test/addons/test_update_multi2/addon.xpi which is not present in the IceCat sources. # HG changeset patch # User Andrew Swan # Date 1474063218 25200 # Node ID 00c2b7baaa0b4bfb7d5f1aac31c094ea6b255e1f # Parent 46b07bdbf8b20cf3fdc28104add57ff58a55832b Bug 1303418 - Don't allow upgrades that change the addon ID. r=mossop, a=lizzard MozReview-Commit-ID: JHINo8ShmeI diff --git a/toolkit/mozapps/extensions/AddonManager.jsm b/toolkit/mozapps/extensions/AddonManager.jsm --- a/toolkit/mozapps/extensions/AddonManager.jsm +++ b/toolkit/mozapps/extensions/AddonManager.jsm @@ -2956,16 +2956,18 @@ this.AddonManager = { // The downloaded file seems to be corrupted in some way. ERROR_CORRUPT_FILE: -3, // An error occured trying to write to the filesystem. ERROR_FILE_ACCESS: -4, // The add-on must be signed and isn't. ERROR_SIGNEDSTATE_REQUIRED: -5, // The downloaded add-on had a different type than expected. ERROR_UNEXPECTED_ADDON_TYPE: -6, + // The addon did not have the expected ID + ERROR_INCORRECT_ID: -7, // These must be kept in sync with AddonUpdateChecker. // No error was encountered. UPDATE_STATUS_NO_ERROR: 0, // The update check timed out UPDATE_STATUS_TIMEOUT: -1, // There was an error while downloading the update information. UPDATE_STATUS_DOWNLOAD_ERROR: -2, diff --git a/toolkit/mozapps/extensions/internal/XPIProvider.jsm b/toolkit/mozapps/extensions/internal/XPIProvider.jsm --- a/toolkit/mozapps/extensions/internal/XPIProvider.jsm +++ b/toolkit/mozapps/extensions/internal/XPIProvider.jsm @@ -5473,16 +5473,37 @@ AddonInstall.prototype = { // loadManifestFromZipReader performs the certificate verification for us this.addon = yield loadManifestFromZipReader(zipreader, this.installLocation); } catch (e) { zipreader.close(); return Promise.reject([AddonManager.ERROR_CORRUPT_FILE, e]); } + if (this.existingAddon) { + // Check various conditions related to upgrades + if (this.addon.id != this.existingAddon.id) { + zipreader.close(); + return Promise.reject([AddonManager.ERROR_INCORRECT_ID, + `Refusing to upgrade addon ${this.existingAddon.id} to different ID ${this.addon.id}`]); + } + + if (this.addon.type == "multipackage") { + zipreader.close(); + return Promise.reject([AddonManager.ERROR_UNEXPECTED_ADDON_TYPE, + `Refusing to upgrade addon ${this.existingAddon.id} to a multi-package xpi`]); + } + + if (this.existingAddon.type == "webextension" && this.addon.type != "webextension") { + zipreader.close(); + return Promise.reject([AddonManager.ERROR_UNEXPECTED_ADDON_TYPE, + "Webextensions may not be updated to other extension types"]); + } + } + if (mustSign(this.addon.type)) { if (this.addon.signedState <= AddonManager.SIGNEDSTATE_MISSING) { // This add-on isn't properly signed by a signature that chains to the // trusted root. let state = this.addon.signedState; this.addon = null; zipreader.close(); @@ -5510,23 +5531,16 @@ AddonInstall.prototype = { } else { zipreader.close(); return Promise.reject([AddonManager.ERROR_CORRUPT_FILE, "XPI is incorrectly signed"]); } } } - if (this.existingAddon && this.existingAddon.type == "webextension" && - this.addon.type != "webextension") { - zipreader.close(); - return Promise.reject([AddonManager.ERROR_UNEXPECTED_ADDON_TYPE, - "WebExtensions may not be upated to other extension types"]); - } - if (this.addon.type == "multipackage") return this._loadMultipackageManifests(zipreader); zipreader.close(); this.updateAddonURIs(); this.addon._install = this; @@ -5791,16 +5805,17 @@ AddonInstall.prototype = { else { // TODO Should we send some event here (bug 557716)? this.state = AddonManager.STATE_CHECKING; new UpdateChecker(this.addon, { onUpdateFinished: aAddon => this.downloadCompleted(), }, AddonManager.UPDATE_WHEN_ADDON_INSTALLED); } }, ([error, message]) => { + this.removeTemporaryFile(); this.downloadFailed(error, message); }); } else { if (aRequest instanceof Ci.nsIHttpChannel) this.downloadFailed(AddonManager.ERROR_NETWORK_FAILURE, aRequest.responseStatus + " " + aRequest.responseStatusText); diff --git a/toolkit/mozapps/extensions/test/addons/test_update_multi1/bootstrap.js b/toolkit/mozapps/extensions/test/addons/test_update_multi1/bootstrap.js new file mode 100644 --- /dev/null +++ b/toolkit/mozapps/extensions/test/addons/test_update_multi1/bootstrap.js @@ -0,0 +1,5 @@ + +function install(data, reason) {} +function startup(data, reason) {} +function shutdown(data, reason) {} +function uninstall(data, reason) {} diff --git a/toolkit/mozapps/extensions/test/addons/test_update_multi1/install.rdf b/toolkit/mozapps/extensions/test/addons/test_update_multi1/install.rdf new file mode 100644 --- /dev/null +++ b/toolkit/mozapps/extensions/test/addons/test_update_multi1/install.rdf @@ -0,0 +1,16 @@ + + + + updatemulti@tests.mozilla.org + 1.0 + http://localhost:4444/data/test_update_multi.rdf + true + Test Addon 1 + + xpcshell@tests.mozilla.org + 1 + 1 + + + diff --git a/toolkit/mozapps/extensions/test/addons/test_update_multi2/install.rdf b/toolkit/mozapps/extensions/test/addons/test_update_multi2/install.rdf new file mode 100644 --- /dev/null +++ b/toolkit/mozapps/extensions/test/addons/test_update_multi2/install.rdf @@ -0,0 +1,9 @@ + + + + updatemulti@tests.mozilla.org + 32 + 2.0 + + diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid1/bootstrap.js b/toolkit/mozapps/extensions/test/addons/test_updateid1/bootstrap.js new file mode 100644 --- /dev/null +++ b/toolkit/mozapps/extensions/test/addons/test_updateid1/bootstrap.js @@ -0,0 +1,5 @@ + +function install(data, reason) {} +function startup(data, reason) {} +function shutdown(data, reason) {} +function uninstall(data, reason) {} diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid1/install.rdf b/toolkit/mozapps/extensions/test/addons/test_updateid1/install.rdf new file mode 100644 --- /dev/null +++ b/toolkit/mozapps/extensions/test/addons/test_updateid1/install.rdf @@ -0,0 +1,16 @@ + + + + addon1@tests.mozilla.org + 1.0 + http://localhost:4444/data/test_updateid.rdf + true + Test Addon 1 + + xpcshell@tests.mozilla.org + 1 + 1 + + + diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid2/bootstrap.js b/toolkit/mozapps/extensions/test/addons/test_updateid2/bootstrap.js new file mode 100644 --- /dev/null +++ b/toolkit/mozapps/extensions/test/addons/test_updateid2/bootstrap.js @@ -0,0 +1,5 @@ + +function install(data, reason) {} +function startup(data, reason) {} +function shutdown(data, reason) {} +function uninstall(data, reason) {} diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid2/install.rdf b/toolkit/mozapps/extensions/test/addons/test_updateid2/install.rdf new file mode 100644 --- /dev/null +++ b/toolkit/mozapps/extensions/test/addons/test_updateid2/install.rdf @@ -0,0 +1,16 @@ + + + + addon1.changed@tests.mozilla.org + 2.0 + http://localhost:4444/data/test_updateid.rdf + true + Test Addon 1 + + xpcshell@tests.mozilla.org + 1 + 1 + + + diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid2_2/install.rdf b/toolkit/mozapps/extensions/test/addons/test_updateid2_2/install.rdf deleted file mode 100644 --- a/toolkit/mozapps/extensions/test/addons/test_updateid2_2/install.rdf +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - addon2@tests.mozilla.org - 2.0 - http://localhost:4444/data/test_updateid.rdf - - - Test 2 - Test Description - - - - xpcshell@tests.mozilla.org - 1 - 1 - - - - - diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid2_5/install.rdf b/toolkit/mozapps/extensions/test/addons/test_updateid2_5/install.rdf deleted file mode 100644 --- a/toolkit/mozapps/extensions/test/addons/test_updateid2_5/install.rdf +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - addon2@tests.mozilla.org - 5.0 - http://localhost:4444/data/test_updateid.rdf - - - Test 2 - Test Description - - - - xpcshell@tests.mozilla.org - 1 - 1 - - - - - diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid3_3/bootstrap.js b/toolkit/mozapps/extensions/test/addons/test_updateid3_3/bootstrap.js deleted file mode 100644 --- a/toolkit/mozapps/extensions/test/addons/test_updateid3_3/bootstrap.js +++ /dev/null @@ -1,21 +0,0 @@ -Components.utils.import("resource://gre/modules/Services.jsm"); - -function install(data, reason) { - Services.prefs.setIntPref("bootstraptest.installed_version", 3); - Services.prefs.setIntPref("bootstraptest.install_reason", reason); -} - -function startup(data, reason) { - Services.prefs.setIntPref("bootstraptest.active_version", 3); - Services.prefs.setIntPref("bootstraptest.startup_reason", reason); -} - -function shutdown(data, reason) { - Services.prefs.setIntPref("bootstraptest.active_version", 0); - Services.prefs.setIntPref("bootstraptest.shutdown_reason", reason); -} - -function uninstall(data, reason) { - Services.prefs.setIntPref("bootstraptest.installed_version", 0); - Services.prefs.setIntPref("bootstraptest.uninstall_reason", reason); -} diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid3_3/install.rdf b/toolkit/mozapps/extensions/test/addons/test_updateid3_3/install.rdf deleted file mode 100644 --- a/toolkit/mozapps/extensions/test/addons/test_updateid3_3/install.rdf +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - addon3@tests.mozilla.org - 3.0 - http://localhost:4444/data/test_updateid.rdf - true - - - Test 3 - Test Description - - - - xpcshell@tests.mozilla.org - 1 - 1 - - - - - diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid4_4/bootstrap.js b/toolkit/mozapps/extensions/test/addons/test_updateid4_4/bootstrap.js deleted file mode 100644 --- a/toolkit/mozapps/extensions/test/addons/test_updateid4_4/bootstrap.js +++ /dev/null @@ -1,21 +0,0 @@ -Components.utils.import("resource://gre/modules/Services.jsm"); - -function install(data, reason) { - Services.prefs.setIntPref("bootstraptest.installed_version", 4); - Services.prefs.setIntPref("bootstraptest.install_reason", reason); -} - -function startup(data, reason) { - Services.prefs.setIntPref("bootstraptest.active_version", 4); - Services.prefs.setIntPref("bootstraptest.startup_reason", reason); -} - -function shutdown(data, reason) { - Services.prefs.setIntPref("bootstraptest.active_version", 0); - Services.prefs.setIntPref("bootstraptest.shutdown_reason", reason); -} - -function uninstall(data, reason) { - Services.prefs.setIntPref("bootstraptest.installed_version", 0); - Services.prefs.setIntPref("bootstraptest.uninstall_reason", reason); -} diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid4_4/install.rdf b/toolkit/mozapps/extensions/test/addons/test_updateid4_4/install.rdf deleted file mode 100644 --- a/toolkit/mozapps/extensions/test/addons/test_updateid4_4/install.rdf +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - addon4@tests.mozilla.org - 4.0 - http://localhost:4444/data/test_updateid.rdf - true - - - Test 4 - Test Description - - - - xpcshell@tests.mozilla.org - 1 - 1 - - - - - diff --git a/toolkit/mozapps/extensions/test/xpcshell/data/test_update_multi.rdf b/toolkit/mozapps/extensions/test/xpcshell/data/test_update_multi.rdf new file mode 100644 --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/data/test_update_multi.rdf @@ -0,0 +1,26 @@ + + + + + + + +
  • + + 2.0 + + + xpcshell@tests.mozilla.org + 1 + 1 + http://localhost:4444/addons/test_update_multi2.xpi + + + +
  • +
    +
    +
    + +
    diff --git a/toolkit/mozapps/extensions/test/xpcshell/data/test_updateid.rdf b/toolkit/mozapps/extensions/test/xpcshell/data/test_updateid.rdf --- a/toolkit/mozapps/extensions/test/xpcshell/data/test_updateid.rdf +++ b/toolkit/mozapps/extensions/test/xpcshell/data/test_updateid.rdf @@ -9,77 +9,17 @@
  • 2.0 xpcshell@tests.mozilla.org 1 1 - http://localhost:4444/addons/test_updateid2_2.xpi - - - -
  • - - - - - - - -
  • - - 3.0 - - - xpcshell@tests.mozilla.org - 1 - 1 - http://localhost:4444/addons/test_updateid3_3.xpi - - - -
  • -
    -
    -
    - - - - -
  • - - 4.0 - - - xpcshell@tests.mozilla.org - 1 - 1 - http://localhost:4444/addons/test_updateid4_4.xpi - - - -
  • -
    -
    -
    - - - - -
  • - - 5.0 - - - xpcshell@tests.mozilla.org - 1 - 1 - http://localhost:4444/addons/test_updateid2_5.xpi + http://localhost:4444/addons/test_updateid2.xpi
  • diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_updateid.js b/toolkit/mozapps/extensions/test/xpcshell/test_updateid.js --- a/toolkit/mozapps/extensions/test/xpcshell/test_updateid.js +++ b/toolkit/mozapps/extensions/test/xpcshell/test_updateid.js @@ -2,421 +2,85 @@ * http://creativecommons.org/publicdomain/zero/1.0/ */ // This verifies that updating an add-on to a new ID works // The test extension uses an insecure update url. Services.prefs.setBoolPref("extensions.checkUpdateSecurity", false); -Components.utils.import("resource://testing-common/httpd.js"); -var testserver; const profileDir = gProfD.clone(); profileDir.append("extensions"); -function resetPrefs() { - Services.prefs.setIntPref("bootstraptest.active_version", -1); - Services.prefs.setIntPref("bootstraptest.installed_version", -1); - Services.prefs.setIntPref("bootstraptest.startup_reason", -1); - Services.prefs.setIntPref("bootstraptest.shutdown_reason", -1); - Services.prefs.setIntPref("bootstraptest.install_reason", -1); - Services.prefs.setIntPref("bootstraptest.uninstall_reason", -1); -} - -function getActiveVersion() { - return Services.prefs.getIntPref("bootstraptest.active_version"); -} - -function getInstalledVersion() { - return Services.prefs.getIntPref("bootstraptest.installed_version"); -} - -function run_test() { - createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); - - // Create and configure the HTTP server. - testserver = new HttpServer(); - testserver.registerDirectory("/data/", do_get_file("data")); - testserver.registerDirectory("/addons/", do_get_file("addons")); - testserver.start(4444); - - do_test_pending(); - run_test_1(); -} - -function end_test() { - testserver.stop(do_test_finished); -} - -function installUpdate(aInstall, aCallback) { - aInstall.addListener({ - onInstallEnded: function(aInstall) { - // give the startup time to run - do_execute_soon(function() { - aCallback(aInstall); - }); - } - }); - - aInstall.install(); -} - -// Verify that an update to an add-on with a new ID uninstalls the old add-on -function run_test_1() { - writeInstallRDFForExtension({ - id: "addon1@tests.mozilla.org", - version: "1.0", - updateURL: "http://localhost:4444/data/test_updateid.rdf", - targetApplications: [{ - id: "xpcshell@tests.mozilla.org", - minVersion: "1", - maxVersion: "1" - }], - name: "Test Addon 1", - }, profileDir); - - startupManager(); - - AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) { - do_check_neq(a1, null); - do_check_eq(a1.version, "1.0"); +function promiseInstallUpdate(install) { + return new Promise((resolve, reject) => { + install.addListener({ + onDownloadFailed: () => { + let err = new Error("download error"); + err.code = install.error; + reject(err); + }, + onInstallFailed: () => { + let err = new Error("install error"); + err.code = install.error; + reject(err); + }, + onInstallEnded: resolve, + }); - a1.findUpdates({ - onUpdateAvailable: function(addon, install) { - do_check_eq(install.name, addon.name); - do_check_eq(install.version, "2.0"); - do_check_eq(install.state, AddonManager.STATE_AVAILABLE); - do_check_eq(install.existingAddon, a1); - - installUpdate(install, check_test_1); - } - }, AddonManager.UPDATE_WHEN_USER_REQUESTED); - }); -} - -function check_test_1(install) { - AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) { - // Existing add-on should have a pending upgrade - do_check_neq(a1.pendingUpgrade, null); - do_check_eq(a1.pendingUpgrade.id, "addon2@tests.mozilla.org"); - do_check_eq(a1.pendingUpgrade.install.existingAddon, a1); - do_check_neq(a1.syncGUID); - - let a1SyncGUID = a1.syncGUID; - - restartManager(); - - AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org", - "addon2@tests.mozilla.org"], function([a1, a2]) { - // Should have uninstalled the old and installed the new - do_check_eq(a1, null); - do_check_neq(a2, null); - do_check_neq(a2.syncGUID, null); - - // The Sync GUID should change when the ID changes - do_check_neq(a1SyncGUID, a2.syncGUID); - - a2.uninstall(); - - do_execute_soon(run_test_2); - }); - })); -} - -// Test that when the new add-on already exists we just upgrade that -function run_test_2() { - restartManager(); - shutdownManager(); - - writeInstallRDFForExtension({ - id: "addon1@tests.mozilla.org", - version: "1.0", - updateURL: "http://localhost:4444/data/test_updateid.rdf", - targetApplications: [{ - id: "xpcshell@tests.mozilla.org", - minVersion: "1", - maxVersion: "1" - }], - name: "Test Addon 1", - }, profileDir); - writeInstallRDFForExtension({ - id: "addon2@tests.mozilla.org", - version: "1.0", - targetApplications: [{ - id: "xpcshell@tests.mozilla.org", - minVersion: "1", - maxVersion: "1" - }], - name: "Test Addon 2", - }, profileDir); - - startupManager(); - - AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) { - do_check_neq(a1, null); - do_check_eq(a1.version, "1.0"); - - a1.findUpdates({ - onUpdateAvailable: function(addon, install) { - installUpdate(install, check_test_2); - } - }, AddonManager.UPDATE_WHEN_USER_REQUESTED); + install.install(); }); } -function check_test_2(install) { - AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org", - "addon2@tests.mozilla.org"], - callback_soon(function([a1, a2]) { - do_check_eq(a1.pendingUpgrade, null); - // Existing add-on should have a pending upgrade - do_check_neq(a2.pendingUpgrade, null); - do_check_eq(a2.pendingUpgrade.id, "addon2@tests.mozilla.org"); - do_check_eq(a2.pendingUpgrade.install.existingAddon, a2); - - restartManager(); - - AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org", - "addon2@tests.mozilla.org"], function([a1, a2]) { - // Should have uninstalled the old and installed the new - do_check_neq(a1, null); - do_check_neq(a2, null); - - a1.uninstall(); - a2.uninstall(); - - do_execute_soon(run_test_3); - }); - })); -} - -// Test that we rollback correctly when removing the old add-on fails -function run_test_3() { - restartManager(); - shutdownManager(); - - // This test only works on Windows - if (!("nsIWindowsRegKey" in AM_Ci)) { - run_test_4(); - return; - } - - writeInstallRDFForExtension({ - id: "addon1@tests.mozilla.org", - version: "1.0", - updateURL: "http://localhost:4444/data/test_updateid.rdf", - targetApplications: [{ - id: "xpcshell@tests.mozilla.org", - minVersion: "1", - maxVersion: "1" - }], - name: "Test Addon 1", - }, profileDir); - - startupManager(); +// Create and configure the HTTP server. +let testserver = createHttpServer(4444); +testserver.registerDirectory("/data/", do_get_file("data")); +testserver.registerDirectory("/addons/", do_get_file("addons")); - AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) { - do_check_neq(a1, null); - do_check_eq(a1.version, "1.0"); - - a1.findUpdates({ - onUpdateAvailable: function(addon, install) { - installUpdate(install, check_test_3); - } - }, AddonManager.UPDATE_WHEN_USER_REQUESTED); - }); -} - -function check_test_3(install) { - AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) { - // Existing add-on should have a pending upgrade - do_check_neq(a1.pendingUpgrade, null); - do_check_eq(a1.pendingUpgrade.id, "addon2@tests.mozilla.org"); - do_check_eq(a1.pendingUpgrade.install.existingAddon, a1); - - // Lock the old add-on open so it can't be uninstalled - var file = profileDir.clone(); - file.append("addon1@tests.mozilla.org"); - if (!file.exists()) - file.leafName += ".xpi"; - else - file.append("install.rdf"); - - var fstream = AM_Cc["@mozilla.org/network/file-output-stream;1"]. - createInstance(AM_Ci.nsIFileOutputStream); - fstream.init(file, FileUtils.MODE_APPEND | FileUtils.MODE_WRONLY, FileUtils.PERMS_FILE, 0); - - restartManager(); - - fstream.close(); - - AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org", - "addon2@tests.mozilla.org"], - callback_soon(function([a1, a2]) { - // Should not have installed the new add-on but it should still be - // pending install - do_check_neq(a1, null); - do_check_eq(a2, null); - - restartManager(); - - AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org", - "addon2@tests.mozilla.org"], function([a1, a2]) { - // Should have installed the new add-on - do_check_eq(a1, null); - do_check_neq(a2, null); - - a2.uninstall(); - - do_execute_soon(run_test_4); - }); - })); - })); +function run_test() { + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); + startupManager(); + run_next_test(); } -// Tests that upgrading to a bootstrapped add-on works but requires a restart -function run_test_4() { - restartManager(); - shutdownManager(); - - writeInstallRDFForExtension({ - id: "addon2@tests.mozilla.org", - version: "2.0", - updateURL: "http://localhost:4444/data/test_updateid.rdf", - targetApplications: [{ - id: "xpcshell@tests.mozilla.org", - minVersion: "1", - maxVersion: "1" - }], - name: "Test Addon 2", - }, profileDir); - - startupManager(); - - resetPrefs(); - - AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { - do_check_neq(a2, null); - do_check_neq(a2.syncGUID, null); - do_check_eq(a2.version, "2.0"); - - a2.findUpdates({ - onUpdateAvailable: function(addon, install) { - installUpdate(install, check_test_4); - } - }, AddonManager.UPDATE_WHEN_USER_REQUESTED); - }); -} - -function check_test_4() { - AddonManager.getAddonsByIDs(["addon2@tests.mozilla.org", - "addon3@tests.mozilla.org"], - callback_soon(function([a2, a3]) { - // Should still be pending install even though the new add-on is restartless - do_check_neq(a2, null); - do_check_eq(a3, null); - - do_check_neq(a2.pendingUpgrade, null); - do_check_eq(a2.pendingUpgrade.id, "addon3@tests.mozilla.org"); - - do_check_eq(getInstalledVersion(), -1); - do_check_eq(getActiveVersion(), -1); - - restartManager(); - - AddonManager.getAddonsByIDs(["addon2@tests.mozilla.org", - "addon3@tests.mozilla.org"], function([a2, a3]) { - // Should have updated - do_check_eq(a2, null); - do_check_neq(a3, null); - - do_check_eq(getInstalledVersion(), 3); - do_check_eq(getActiveVersion(), 3); - - do_execute_soon(run_test_5); - }); - })); -} - -// Tests that upgrading to another bootstrapped add-on works without a restart -function run_test_5() { - AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) { - do_check_neq(a3, null); - do_check_eq(a3.version, "3.0"); +// Verify that an update to an add-on with a new ID fails +add_task(function* test_update_new_id() { + yield promiseInstallAllFiles([do_get_addon("test_updateid1")]); - a3.findUpdates({ - onUpdateAvailable: function(addon, install) { - installUpdate(install, check_test_5); - } - }, AddonManager.UPDATE_WHEN_USER_REQUESTED); - }); -} - -function check_test_5() { - AddonManager.getAddonsByIDs(["addon3@tests.mozilla.org", - "addon4@tests.mozilla.org"], - callback_soon(function([a3, a4]) { - // Should have updated - do_check_eq(a3, null); - do_check_neq(a4, null); - - do_check_eq(getInstalledVersion(), 4); - do_check_eq(getActiveVersion(), 4); - - restartManager(); - - AddonManager.getAddonsByIDs(["addon3@tests.mozilla.org", - "addon4@tests.mozilla.org"], function([a3, a4]) { - // Should still be gone - do_check_eq(a3, null); - do_check_neq(a4, null); - - do_check_eq(getInstalledVersion(), 4); - do_check_eq(getActiveVersion(), 4); - - run_test_6(); - }); - })); -} + let addon = yield promiseAddonByID("addon1@tests.mozilla.org"); + do_check_neq(addon, null); + do_check_eq(addon.version, "1.0"); -// Tests that upgrading to a non-bootstrapped add-on works but requires a restart -function run_test_6() { - AddonManager.getAddonByID("addon4@tests.mozilla.org", function(a4) { - do_check_neq(a4, null); - do_check_eq(a4.version, "4.0"); - - a4.findUpdates({ - onUpdateAvailable: function(addon, install) { - installUpdate(install, check_test_6); - } - }, AddonManager.UPDATE_WHEN_USER_REQUESTED); - }); -} + let update = yield promiseFindAddonUpdates(addon, AddonManager.UPDATE_WHEN_USER_REQUESTED); + let install = update.updateAvailable; + do_check_eq(install.name, addon.name); + do_check_eq(install.version, "2.0"); + do_check_eq(install.state, AddonManager.STATE_AVAILABLE); + do_check_eq(install.existingAddon, addon); -function check_test_6() { - AddonManager.getAddonsByIDs(["addon4@tests.mozilla.org", - "addon2@tests.mozilla.org"], - callback_soon(function([a4, a2]) { - // Should still be pending install even though the old add-on is restartless - do_check_neq(a4, null); - do_check_eq(a2, null); - - do_check_neq(a4.pendingUpgrade, null); - do_check_eq(a4.pendingUpgrade.id, "addon2@tests.mozilla.org"); - - do_check_eq(getInstalledVersion(), 4); - do_check_eq(getActiveVersion(), 4); + yield Assert.rejects(promiseInstallUpdate(install), + function(err) { return err.code == AddonManager.ERROR_INCORRECT_ID }, + "Upgrade to a different ID fails"); - restartManager(); + addon.uninstall(); +}); - AddonManager.getAddonsByIDs(["addon4@tests.mozilla.org", - "addon2@tests.mozilla.org"], function([a4, a2]) { - // Should have updated - do_check_eq(a4, null); - do_check_neq(a2, null); +// Verify that an update to a multi-package xpi fails +add_task(function* test_update_new_id() { + yield promiseInstallAllFiles([do_get_addon("test_update_multi1")]); - do_check_eq(getInstalledVersion(), 0); - do_check_eq(getActiveVersion(), 0); + let addon = yield promiseAddonByID("updatemulti@tests.mozilla.org"); + do_check_neq(addon, null); + do_check_eq(addon.version, "1.0"); - end_test(); - }); - })); -} + let update = yield promiseFindAddonUpdates(addon, AddonManager.UPDATE_WHEN_USER_REQUESTED); + let install = update.updateAvailable; + do_check_eq(install.name, addon.name); + do_check_eq(install.version, "2.0"); + do_check_eq(install.state, AddonManager.STATE_AVAILABLE); + do_check_eq(install.existingAddon, addon); + + yield Assert.rejects(promiseInstallUpdate(install), + function(err) { return err.code == AddonManager.ERROR_UNEXPECTED_ADDON_TYPE }, + "Upgrade to a multipackage xpi fails"); + + addon.uninstall(); +});