From 8fbeb75129bcb90fe65b3bc57216247aa5535033 Mon Sep 17 00:00:00 2001 From: Andrew Swan Date: Fri, 16 Sep 2016 15:00:18 -0700 Subject: [PATCH] Bug 1303418 Don't allow upgrades that change the addon ID r=mossop MozReview-Commit-ID: JHINo8ShmeI --HG-- extra : source : 9a74c400ed6c62d5fc6abe0cd42d27be70f18f02 extra : amend_source : 8776cfb584840bccc817ce1fda00d04b236875eb extra : intermediate-source : 8490362e38cdaa930985a5adafc581d7bb76fe45 --- toolkit/mozapps/extensions/AddonManager.jsm | 2 + .../extensions/internal/XPIProvider.jsm | 29 +- .../addons/test_update_multi1/bootstrap.js | 5 + .../addons/test_update_multi1/install.rdf | 16 + .../test/addons/test_update_multi2/addon.xpi | Bin 0 -> 693 bytes .../addons/test_update_multi2/install.rdf | 9 + .../test/addons/test_updateid1/bootstrap.js | 5 + .../test/addons/test_updateid1/install.rdf | 16 + .../test/addons/test_updateid2/bootstrap.js | 5 + .../test/addons/test_updateid2/install.rdf | 16 + .../test/addons/test_updateid2_2/install.rdf | 24 - .../test/addons/test_updateid2_5/install.rdf | 24 - .../test/addons/test_updateid3_3/bootstrap.js | 21 - .../test/addons/test_updateid3_3/install.rdf | 25 - .../test/addons/test_updateid4_4/bootstrap.js | 21 - .../test/addons/test_updateid4_4/install.rdf | 25 - .../test/xpcshell/data/test_update_multi.rdf | 26 + .../test/xpcshell/data/test_updateid.rdf | 62 +-- .../extensions/test/xpcshell/test_updateid.js | 450 +++--------------- 19 files changed, 180 insertions(+), 601 deletions(-) create mode 100644 toolkit/mozapps/extensions/test/addons/test_update_multi1/bootstrap.js create mode 100644 toolkit/mozapps/extensions/test/addons/test_update_multi1/install.rdf create mode 100644 toolkit/mozapps/extensions/test/addons/test_update_multi2/addon.xpi create mode 100644 toolkit/mozapps/extensions/test/addons/test_update_multi2/install.rdf create mode 100644 toolkit/mozapps/extensions/test/addons/test_updateid1/bootstrap.js create mode 100644 toolkit/mozapps/extensions/test/addons/test_updateid1/install.rdf create mode 100644 toolkit/mozapps/extensions/test/addons/test_updateid2/bootstrap.js create mode 100644 toolkit/mozapps/extensions/test/addons/test_updateid2/install.rdf delete mode 100644 toolkit/mozapps/extensions/test/addons/test_updateid2_2/install.rdf delete mode 100644 toolkit/mozapps/extensions/test/addons/test_updateid2_5/install.rdf delete mode 100644 toolkit/mozapps/extensions/test/addons/test_updateid3_3/bootstrap.js delete mode 100644 toolkit/mozapps/extensions/test/addons/test_updateid3_3/install.rdf delete mode 100644 toolkit/mozapps/extensions/test/addons/test_updateid4_4/bootstrap.js delete mode 100644 toolkit/mozapps/extensions/test/addons/test_updateid4_4/install.rdf create mode 100644 toolkit/mozapps/extensions/test/xpcshell/data/test_update_multi.rdf diff --git a/toolkit/mozapps/extensions/AddonManager.jsm b/toolkit/mozapps/extensions/AddonManager.jsm index 0072d0d89e2b..2db241ade39c 100644 --- a/toolkit/mozapps/extensions/AddonManager.jsm +++ b/toolkit/mozapps/extensions/AddonManager.jsm @@ -3211,6 +3211,8 @@ this.AddonManager = { ["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. diff --git a/toolkit/mozapps/extensions/internal/XPIProvider.jsm b/toolkit/mozapps/extensions/internal/XPIProvider.jsm index 6034751e7943..5a170459cedc 100644 --- a/toolkit/mozapps/extensions/internal/XPIProvider.jsm +++ b/toolkit/mozapps/extensions/internal/XPIProvider.jsm @@ -5818,6 +5818,27 @@ AddonInstall.prototype = { return Promise.reject([AddonManager.ERROR_CORRUPT_FILE, err]); } + 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 upated 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 @@ -5855,13 +5876,6 @@ AddonInstall.prototype = { } } - 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); @@ -6137,6 +6151,7 @@ AddonInstall.prototype = { }, AddonManager.UPDATE_WHEN_ADDON_INSTALLED); } }, ([error, message]) => { + this.removeTemporaryFile(); this.downloadFailed(error, message); }); } 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 index 000000000000..24c778c096a3 --- /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 index 000000000000..9f955562ca6f --- /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/addon.xpi b/toolkit/mozapps/extensions/test/addons/test_update_multi2/addon.xpi new file mode 100644 index 0000000000000000000000000000000000000000..febff06fa276ce3d66bf091c2e5a4f9a357287a2 GIT binary patch literal 693 zcmWIWW@Zs#U|`^2IF@Pb`H;7l(Ug&aA(x4Pftx{wAv3SIBrzvPuP7xgG=!6ZS;YN8 zI0%-}$ZE-YoKBa^&%?x0amV0f4Q?bmZW8y8MllN~4sxMZ|Fwp2uYMm)_wfoBQw==VK%pbTr zd|6_BW69jm&?zA?mJ6IxCTZ2B@$F$*IO}BB_9e!;tZLSbeNXd@e4fI?`*fB=B2%eXB|TTJmfb6L;m%Yd4Fwy@z4##Jiw4o%Fiz; zE-6YZ(90?Y2mMF42jQQ97%k`@dugBb);oFTeDH}g+IpU6PG0oz)bYF$sNvj>jt`jkx7mjSL{mwUBbWsjADj{Mi2`n sEwDn;0-9rx4aD>mvVm1Vb5XqrG!f)Q3=>(|K$bHB;bI{D2jm_G05nSS)c^nh literal 0 HcmV?d00001 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 index 000000000000..44bdb05ba2b3 --- /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 index 000000000000..24c778c096a3 --- /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 index 000000000000..803b64e5f736 --- /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 index 000000000000..24c778c096a3 --- /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 index 000000000000..041af57f0582 --- /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 index 5982b98689dd..000000000000 --- 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 index e923a528947c..000000000000 --- 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 index c28d75925f62..000000000000 --- 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 index ffed064cfc90..000000000000 --- 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 index 6b1753cb2556..000000000000 --- 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 index b354ac5c1394..000000000000 --- 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 index 000000000000..f28a3f26dc5f --- /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 index d59df973600c..c13928520d73 100644 --- a/toolkit/mozapps/extensions/test/xpcshell/data/test_updateid.rdf +++ b/toolkit/mozapps/extensions/test/xpcshell/data/test_updateid.rdf @@ -14,67 +14,7 @@ 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 index e8aea0301697..f7e3e21e56b2 100644 --- a/toolkit/mozapps/extensions/test/xpcshell/test_updateid.js +++ b/toolkit/mozapps/extensions/test/xpcshell/test_updateid.js @@ -7,416 +7,80 @@ // 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 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, + }); + + install.install(); + }); } -function getActiveVersion() { - return Services.prefs.getIntPref("bootstraptest.active_version"); -} - -function getInstalledVersion() { - return Services.prefs.getIntPref("bootstraptest.installed_version"); -} +// Create and configure the HTTP server. +let testserver = createHttpServer(4444); +testserver.registerDirectory("/data/", do_get_file("data")); +testserver.registerDirectory("/addons/", do_get_file("addons")); 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"); - - 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); - }); + run_next_test(); } -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); +// Verify that an update to an add-on with a new ID fails +add_task(function* test_update_new_id() { + yield promiseInstallFile(do_get_addon("test_updateid1")); - let a1SyncGUID = a1.syncGUID; + let addon = yield promiseAddonByID("addon1@tests.mozilla.org"); + do_check_neq(addon, null); + do_check_eq(addon.version, "1.0"); - restartManager(); + 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); - 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); + yield Assert.rejects(promiseInstallUpdate(install), + function(err) { return err.code == AddonManager.ERROR_INCORRECT_ID }, + "Upgrade to a different ID fails"); - // The Sync GUID should change when the ID changes - do_check_neq(a1SyncGUID, a2.syncGUID); + addon.uninstall(); +}); - a2.uninstall(); +// Verify that an update to a multi-package xpi fails +add_task(function* test_update_new_id() { + yield promiseInstallFile(do_get_addon("test_update_multi1")); - do_execute_soon(run_test_2); - }); - })); -} + let addon = yield promiseAddonByID("updatemulti@tests.mozilla.org"); + do_check_neq(addon, null); + do_check_eq(addon.version, "1.0"); -// Test that when the new add-on already exists we just upgrade that -function run_test_2() { - restartManager(); - shutdownManager(); + 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); - 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); + yield Assert.rejects(promiseInstallUpdate(install), + function(err) { return err.code == AddonManager.ERROR_UNEXPECTED_ADDON_TYPE }, + "Upgrade to a multipackage xpi fails"); - 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); - }); -} - -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(); - - 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); - }); - })); - })); -} - -// 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"); - - 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(); - }); - })); -} - -// 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); - }); -} - -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); - - restartManager(); - - 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); - - do_check_eq(getInstalledVersion(), 0); - do_check_eq(getActiveVersion(), 0); - - end_test(); - }); - })); -} + addon.uninstall(); +});