From 07a55ea47d6caaa8fb197e2723fcdde464a7fdec Mon Sep 17 00:00:00 2001 From: Blair McBride Date: Mon, 1 Apr 2013 21:58:16 +1300 Subject: [PATCH] Bug 847867 - Ensure extensions.bootstrappedAddons is updated to reflect live changes. r=Mossop --- toolkit/mozapps/extensions/XPIProvider.jsm | 13 +- .../test/xpcshell/test_bootstrap.js | 163 +++++++++++------- 2 files changed, 115 insertions(+), 61 deletions(-) diff --git a/toolkit/mozapps/extensions/XPIProvider.jsm b/toolkit/mozapps/extensions/XPIProvider.jsm index c69d173b0f8d..9fb97b28d3ef 100644 --- a/toolkit/mozapps/extensions/XPIProvider.jsm +++ b/toolkit/mozapps/extensions/XPIProvider.jsm @@ -1681,8 +1681,6 @@ var XPIProvider = { // of XPCOM Services.obs.addObserver({ observe: function shutdownObserver(aSubject, aTopic, aData) { - Services.prefs.setCharPref(PREF_BOOTSTRAP_ADDONS, - JSON.stringify(XPIProvider.bootstrappedAddons)); for (let id in XPIProvider.bootstrappedAddons) { let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); file.persistentDescriptor = XPIProvider.bootstrappedAddons[id].descriptor; @@ -1789,6 +1787,14 @@ var XPIProvider = { Services.prefs.setBoolPref(PREF_PENDING_OPERATIONS, false); }, + /** + * Persists changes to XPIProvider.bootstrappedAddons to it's store (a pref). + */ + persistBootstrappedAddons: function XPI_persistBootstrappedAddons() { + Services.prefs.setCharPref(PREF_BOOTSTRAP_ADDONS, + JSON.stringify(this.bootstrappedAddons)); + }, + /** * Adds a list of currently active add-ons to the next crash report. */ @@ -2939,6 +2945,7 @@ var XPIProvider = { // Cache the new install location states let cache = JSON.stringify(this.getInstallLocationStates()); Services.prefs.setCharPref(PREF_INSTALL_CACHE, cache); + this.persistBootstrappedAddons(); // Clear out any cached migration data. XPIDatabase.migrateData = null; @@ -3680,6 +3687,7 @@ var XPIProvider = { type: aType, descriptor: aFile.persistentDescriptor }; + this.persistBootstrappedAddons(); this.addAddonsToCrashReporter(); // Locales only contain chrome and can't have bootstrap scripts @@ -3747,6 +3755,7 @@ var XPIProvider = { unloadBootstrapScope: function XPI_unloadBootstrapScope(aId) { delete this.bootstrapScopes[aId]; delete this.bootstrappedAddons[aId]; + this.persistBootstrappedAddons(); this.addAddonsToCrashReporter(); }, diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_bootstrap.js b/toolkit/mozapps/extensions/test/xpcshell/test_bootstrap.js index a6af243db572..3e890839df05 100644 --- a/toolkit/mozapps/extensions/test/xpcshell/test_bootstrap.js +++ b/toolkit/mozapps/extensions/test/xpcshell/test_bootstrap.js @@ -101,6 +101,39 @@ function getUninstallNewVersion() { return Services.prefs.getIntPref("bootstraptest.uninstall_newversion"); } +function do_check_bootstrappedPref(aCallback) { + let data = "{}"; + try { + // This is ok to fail, as the pref won't exist on a fresh profile. + data = Services.prefs.getCharPref("extensions.bootstrappedAddons"); + } catch (e) {} + data = JSON.parse(data); + + AddonManager.getAddonsByTypes(["extension"], function(aAddons) { + for (let addon of aAddons) { + if (!addon.id.endsWith("@tests.mozilla.org")) + continue; + if (!addon.isActive) + continue; + if (addon.operationsRequiringRestart != AddonManager.OP_NEEDS_RESTART_NONE) + continue; + + do_check_true(addon.id in data); + let addonData = data[addon.id]; + delete data[addon.id]; + + do_check_eq(addonData.version, addon.version); + do_check_eq(addonData.type, addon.type); + let file = addon.getResourceURI().QueryInterface(Components.interfaces.nsIFileURL).file; + do_check_eq(addonData.descriptor, file.persistentDescriptor); + } + do_check_eq(Object.keys(data).length, 0); + + aCallback(); + }); +} + + function run_test() { do_test_pending(); @@ -120,7 +153,7 @@ function run_test() { file.leafName = "extensions.ini"; do_check_false(file.exists()); - run_test_1(); + do_check_bootstrappedPref(run_test_1); } // Tests that installing doesn't require a restart @@ -161,8 +194,11 @@ function run_test_1() { do_check_eq(getActiveVersion(), -1); waitForPref("bootstraptest.active_version", function() { - check_test_1(addon.syncGUID); + do_check_bootstrappedPref(function() { + check_test_1(addon.syncGUID); + }); }); + }); install.install(); }); @@ -243,7 +279,7 @@ function run_test_2() { do_check_true(newb1.userDisabled); do_check_false(newb1.isActive); - run_test_3(); + do_check_bootstrappedPref(run_test_3); }); }); } @@ -273,7 +309,7 @@ function run_test_3() { do_check_true(b1.userDisabled); do_check_false(b1.isActive); - run_test_4(); + do_check_bootstrappedPref(run_test_4); }); } @@ -310,7 +346,7 @@ function run_test_4() { do_check_false(newb1.userDisabled); do_check_true(newb1.isActive); - run_test_5(); + do_check_bootstrappedPref(run_test_5); }); }); } @@ -338,7 +374,7 @@ function run_test_5() { do_check_true(b1.isActive); do_check_false(isExtensionInAddonsList(profileDir, b1.id)); - run_test_6(); + do_check_bootstrappedPref(run_test_6); }); } @@ -390,7 +426,7 @@ function check_test_6() { do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "2.0"); - run_test_7(); + do_check_bootstrappedPref(run_test_7); }); } @@ -408,7 +444,7 @@ function run_test_7() { AddonManager.OP_NEEDS_RESTART_UNINSTALL, 0); b1.uninstall(); - check_test_7(); + do_check_bootstrappedPref(check_test_7); }); } @@ -428,7 +464,7 @@ function check_test_7() { AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(newb1) { do_check_eq(newb1, null); - run_test_8(); + do_check_bootstrappedPref(run_test_8); }); }); } @@ -455,7 +491,7 @@ function run_test_8() { do_check_eq(getStartupOldVersion(), 0); do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); - run_test_9(); + do_check_bootstrappedPref(run_test_9); }); } @@ -471,7 +507,7 @@ function run_test_9() { do_check_eq(b1, null); do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); - run_test_10(); + do_check_bootstrappedPref(run_test_10); }); } @@ -573,7 +609,7 @@ function check_test_10_pt2() { do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "2.0"); - run_test_11(); + do_check_bootstrappedPref(run_test_11); }); } @@ -609,7 +645,7 @@ function check_test_11() { do_check_eq(getActiveVersion(), 0); do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); - run_test_12(); + do_check_bootstrappedPref(run_test_12); } // Tests that bootstrapped extensions are correctly loaded even if the app is @@ -637,7 +673,7 @@ function run_test_12() { b1.uninstall(); restartManager(); - run_test_13(); + do_check_bootstrappedPref(run_test_13); }); } @@ -700,10 +736,12 @@ function check_test_13() { do_check_eq(getActiveVersion(), 0); // Should not have called startup though do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "3.0"); - b1.uninstall(); - restartManager(); + do_check_bootstrappedPref(function() { + b1.uninstall(); + restartManager(); - run_test_14(); + run_test_14(); + }); }); }); }); @@ -729,9 +767,11 @@ function run_test_14() { do_check_eq(getActiveVersion(), 0); // Should not have called startup though do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "3.0"); - b1.uninstall(); + do_check_bootstrappedPref(function() { + b1.uninstall(); - run_test_15(); + run_test_15(); + }); }); } @@ -788,20 +828,22 @@ function check_test_15() { do_check_eq(getInstalledVersion(), 2); do_check_eq(getActiveVersion(), 0); - restartManager(); + do_check_bootstrappedPref(function() { + restartManager(); - AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { - do_check_neq(b1, null); - do_check_eq(b1.version, "2.0"); - do_check_false(b1.appDisabled); - do_check_true(b1.userDisabled); - do_check_false(b1.isActive); - do_check_eq(getInstalledVersion(), 2); - do_check_eq(getActiveVersion(), 0); + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { + do_check_neq(b1, null); + do_check_eq(b1.version, "2.0"); + do_check_false(b1.appDisabled); + do_check_true(b1.userDisabled); + do_check_false(b1.isActive); + do_check_eq(getInstalledVersion(), 2); + do_check_eq(getActiveVersion(), 0); - b1.uninstall(); + b1.uninstall(); - run_test_16(); + run_test_16(); + }); }); }); } @@ -872,7 +914,7 @@ function run_test_17() { do_check_eq(b1.version, "1.0"); do_check_true(b1.isActive); - run_test_18(); + do_check_bootstrappedPref(run_test_18); }); } @@ -899,7 +941,7 @@ function run_test_18() { do_check_eq(getInstallOldVersion(), 1); do_check_eq(getStartupOldVersion(), 1); - run_test_19(); + do_check_bootstrappedPref(run_test_19); }); }); } @@ -942,7 +984,7 @@ function check_test_19() { do_check_eq(getInstallOldVersion(), 0); do_check_eq(getStartupOldVersion(), 0); - run_test_20(); + do_check_bootstrappedPref(run_test_20); }); } @@ -1011,11 +1053,12 @@ function run_test_21() { do_check_eq(getStartupReason(), APP_STARTUP); do_check_eq(getStartupOldVersion(), 0); - manuallyUninstall(userExtDir, "bootstrap1@tests.mozilla.org"); + do_check_bootstrappedPref(function() { + manuallyUninstall(userExtDir, "bootstrap1@tests.mozilla.org"); - restartManager(); - - run_test_22(); + restartManager(); + run_test_22(); + }); }); } @@ -1069,9 +1112,11 @@ function run_test_22() { do_check_eq(getStartupReason(), APP_STARTUP); do_check_eq(getStartupOldVersion(), 0); - b1.uninstall(); + do_check_bootstrappedPref(function() { + b1.uninstall(); - run_test_23(); + run_test_23(); + }); }); }); } @@ -1115,7 +1160,7 @@ function run_test_23() { "onInstallEnded", ], function() { do_check_true(addon.hasResource("install.rdf")); - check_test_23(); + do_check_bootstrappedPref(check_test_23); }); }); install.install(); @@ -1171,35 +1216,35 @@ function run_test_24() { do_check_eq(getActiveVersion(), 1); do_check_eq(getInstalledVersion2(), 1); do_check_eq(getActiveVersion2(), 1); - + resetPrefs(); - + restartManager(); - + do_check_eq(getInstalledVersion(), -1); do_check_eq(getActiveVersion(), 1); do_check_eq(getInstalledVersion2(), -1); do_check_eq(getActiveVersion2(), 1); - + shutdownManager(); - + do_check_eq(getInstalledVersion(), -1); do_check_eq(getActiveVersion(), 0); do_check_eq(getInstalledVersion2(), -1); do_check_eq(getActiveVersion2(), 0); - + // Break the preferece let bootstrappedAddons = JSON.parse(Services.prefs.getCharPref("extensions.bootstrappedAddons")); bootstrappedAddons["bootstrap1@tests.mozilla.org"].descriptor += "foo"; Services.prefs.setCharPref("extensions.bootstrappedAddons", JSON.stringify(bootstrappedAddons)); - + startupManager(false); - + do_check_eq(getInstalledVersion(), -1); do_check_eq(getActiveVersion(), 1); do_check_eq(getInstalledVersion2(), -1); do_check_eq(getActiveVersion2(), 1); - + run_test_25(); }); }); @@ -1212,32 +1257,32 @@ function run_test_25() { waitForPref("bootstraptest.active_version", function() { do_check_eq(getInstalledVersion(), 1); do_check_eq(getActiveVersion(), 1); - + installAllFiles([do_get_addon("test_bootstrap1_4")], function() { // Needs a restart to complete this so the old version stays running do_check_eq(getInstalledVersion(), 1); do_check_eq(getActiveVersion(), 1); - + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { do_check_neq(b1, null); do_check_eq(b1.version, "1.0"); do_check_true(b1.isActive); do_check_true(hasFlag(b1.pendingOperations, AddonManager.PENDING_UPGRADE)); - + restartManager(); - + do_check_eq(getInstalledVersion(), 0); do_check_eq(getUninstallReason(), ADDON_UPGRADE); do_check_eq(getUninstallNewVersion(), 4); do_check_eq(getActiveVersion(), 0); - + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { do_check_neq(b1, null); do_check_eq(b1.version, "4.0"); do_check_true(b1.isActive); do_check_eq(b1.pendingOperations, AddonManager.PENDING_NONE); - - run_test_26(); + + do_check_bootstrappedPref(run_test_26); }); }); }); @@ -1272,7 +1317,7 @@ function run_test_26() { do_check_true(b1.isActive); do_check_eq(b1.pendingOperations, AddonManager.PENDING_NONE); - run_test_27(); + do_check_bootstrappedPref(run_test_27); }); }); }); @@ -1314,7 +1359,7 @@ function run_test_27() { do_check_false(b1.isActive); do_check_eq(b1.pendingOperations, AddonManager.PENDING_NONE); - run_test_28(); + do_check_bootstrappedPref(run_test_28); }); }); }); @@ -1351,7 +1396,7 @@ function run_test_28() { do_check_eq(getInstalledVersion(), 1); do_check_eq(getActiveVersion(), 1); - do_test_finished(); + do_check_bootstrappedPref(do_test_finished); }); }); });