diff --git a/toolkit/mozapps/extensions/XPIProvider.jsm b/toolkit/mozapps/extensions/XPIProvider.jsm index 649c76688545..8230013ca256 100644 --- a/toolkit/mozapps/extensions/XPIProvider.jsm +++ b/toolkit/mozapps/extensions/XPIProvider.jsm @@ -3314,6 +3314,7 @@ AddonInstall.prototype = { uri = buildJarURI(this.file, FILE_INSTALL_MANIFEST); this.addon = loadManifestFromRDF(uri, bis); this.addon._sourceBundle = this.file; + this.addon._install = this; } finally { bis.close(); @@ -3597,11 +3598,16 @@ AddonInstall.prototype = { 0); converter.init(stream, "UTF-8", 0, 0x0000); - // A little hacky but we can't (and shouldn't) cache the source bundle. - let bundle = this.addon._sourceBundle; + // A little hacky but we can't cache certain objects. + let objs = { + sourceBundle: this.addon._sourceBundle, + install: this.addon._install + }; delete this.addon._sourceBundle; + delete this.addon._install; converter.writeString(json.encode(this.addon)); - this.addon._sourceBundle = bundle; + this.addon._sourceBundle = objs.sourceBundle; + this.addon._install = objs.install; } finally { converter.close(); @@ -4072,6 +4078,12 @@ function AddonWrapper(addon) { addon.updateAutomatically = val; }); + this.__defineGetter__("install", function() { + if (!("_install" in addon) || !addon._install) + return null; + return addon._install.wrapper; + }); + this.__defineGetter__("pendingUpgrade", function() { return createWrapper(addon.pendingUpgrade); }); diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_install.js b/toolkit/mozapps/extensions/test/xpcshell/test_install.js index 75d0f3b4ed2b..90e6d4e5dd5d 100644 --- a/toolkit/mozapps/extensions/test/xpcshell/test_install.js +++ b/toolkit/mozapps/extensions/test/xpcshell/test_install.js @@ -55,6 +55,7 @@ function run_test_1() { do_check_eq(install.name, "Test 1"); do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); do_check_true(install.addon.hasResource("install.rdf")); + do_check_eq(install.addon.install, install); let file = do_get_addon("test_install1"); let uri = Services.io.newFileURI(file).spec; @@ -172,6 +173,7 @@ function check_test_2(install) { do_check_eq(install.version, "2.0"); do_check_eq(install.name, "Real Test 2"); do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); + do_check_eq(install.addon.install, install); // Pause the install here and start it again in run_test_3 do_execute_soon(function() { run_test_3(install); }); @@ -261,6 +263,7 @@ function check_test_4(install) { do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); do_check_neq(install.existingAddon); do_check_eq(install.existingAddon.id, "addon2@tests.mozilla.org"); + do_check_eq(install.addon.install, install); run_test_5(); // Installation will continue when there is nothing returned. @@ -278,8 +281,11 @@ function run_test_5() { ], check_test_5); } -function check_test_5() { +function check_test_5(install) { ensure_test_completed(); + + do_check_eq(install.existingAddon.pendingUpgrade.install, install); + AddonManager.getAddon("addon2@tests.mozilla.org", function(olda2) { do_check_neq(olda2, null); do_check_true(hasFlag(olda2.pendingOperations, AddonManager.PENDING_UPGRADE)); diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_update.js b/toolkit/mozapps/extensions/test/xpcshell/test_update.js index a71d9b6939f1..03b8113be530 100644 --- a/toolkit/mozapps/extensions/test/xpcshell/test_update.js +++ b/toolkit/mozapps/extensions/test/xpcshell/test_update.js @@ -210,6 +210,7 @@ function run_test_4() { function continue_test_4(install) { do_check_neq(install.existingAddon, null); do_check_eq(install.existingAddon.id, "addon1@tests.mozilla.org"); + prepare_test({ "addon1@tests.mozilla.org": [ "onInstalling" @@ -220,7 +221,9 @@ function continue_test_4(install) { ], check_test_4); } -function check_test_4() { +function check_test_4(install) { + do_check_eq(install.existingAddon.pendingUpgrade.install, install); + restartManager(1); AddonManager.getAddon("addon1@tests.mozilla.org", function(a1) { do_check_neq(a1, null);