michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: * http://creativecommons.org/publicdomain/zero/1.0/ michael@0: */ michael@0: michael@0: const APP_STARTUP = 1; michael@0: const APP_SHUTDOWN = 2; michael@0: const ADDON_ENABLE = 3; michael@0: const ADDON_DISABLE = 4; michael@0: const ADDON_INSTALL = 5; michael@0: const ADDON_UNINSTALL = 6; michael@0: const ADDON_UPGRADE = 7; michael@0: const ADDON_DOWNGRADE = 8; michael@0: michael@0: // This verifies that bootstrappable add-ons can be used without restarts. michael@0: Components.utils.import("resource://gre/modules/Services.jsm"); michael@0: Components.utils.import("resource://gre/modules/Promise.jsm"); michael@0: michael@0: // Enable loading extensions from the user scopes michael@0: Services.prefs.setIntPref("extensions.enabledScopes", michael@0: AddonManager.SCOPE_PROFILE + AddonManager.SCOPE_USER); michael@0: michael@0: createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); michael@0: michael@0: const profileDir = gProfD.clone(); michael@0: profileDir.append("extensions"); michael@0: const userExtDir = gProfD.clone(); michael@0: userExtDir.append("extensions2"); michael@0: userExtDir.append(gAppInfo.ID); michael@0: registerDirectory("XREUSysExt", userExtDir.parent); michael@0: michael@0: Components.utils.import("resource://testing-common/httpd.js"); michael@0: var testserver = new HttpServer(); michael@0: testserver.start(-1); michael@0: gPort = testserver.identity.primaryPort; michael@0: michael@0: testserver.registerDirectory("/addons/", do_get_file("addons")); michael@0: michael@0: function resetPrefs() { michael@0: Services.prefs.setIntPref("bootstraptest.active_version", -1); michael@0: Services.prefs.setIntPref("bootstraptest.installed_version", -1); michael@0: Services.prefs.setIntPref("bootstraptest2.active_version", -1); michael@0: Services.prefs.setIntPref("bootstraptest2.installed_version", -1); michael@0: Services.prefs.setIntPref("bootstraptest.startup_reason", -1); michael@0: Services.prefs.setIntPref("bootstraptest.shutdown_reason", -1); michael@0: Services.prefs.setIntPref("bootstraptest.install_reason", -1); michael@0: Services.prefs.setIntPref("bootstraptest.uninstall_reason", -1); michael@0: Services.prefs.setIntPref("bootstraptest.startup_oldversion", -1); michael@0: Services.prefs.setIntPref("bootstraptest.shutdown_newversion", -1); michael@0: Services.prefs.setIntPref("bootstraptest.install_oldversion", -1); michael@0: Services.prefs.setIntPref("bootstraptest.uninstall_newversion", -1); michael@0: } michael@0: michael@0: function waitForPref(aPref, aCallback) { michael@0: function prefChanged() { michael@0: Services.prefs.removeObserver(aPref, prefChanged); michael@0: // Always let whoever set the preference keep running michael@0: do_execute_soon(aCallback); michael@0: } michael@0: Services.prefs.addObserver(aPref, prefChanged, false); michael@0: } michael@0: michael@0: function promisePref(aPref) { michael@0: let deferred = Promise.defer(); michael@0: michael@0: waitForPref(aPref, deferred.resolve.bind(deferred)); michael@0: michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function promiseInstall(aFiles) { michael@0: let deferred = Promise.defer(); michael@0: michael@0: installAllFiles(aFiles, function() { michael@0: deferred.resolve(); michael@0: }); michael@0: michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function getActiveVersion() { michael@0: return Services.prefs.getIntPref("bootstraptest.active_version"); michael@0: } michael@0: michael@0: function getInstalledVersion() { michael@0: return Services.prefs.getIntPref("bootstraptest.installed_version"); michael@0: } michael@0: michael@0: function getActiveVersion2() { michael@0: return Services.prefs.getIntPref("bootstraptest2.active_version"); michael@0: } michael@0: michael@0: function getInstalledVersion2() { michael@0: return Services.prefs.getIntPref("bootstraptest2.installed_version"); michael@0: } michael@0: michael@0: function getStartupReason() { michael@0: return Services.prefs.getIntPref("bootstraptest.startup_reason"); michael@0: } michael@0: michael@0: function getShutdownReason() { michael@0: return Services.prefs.getIntPref("bootstraptest.shutdown_reason"); michael@0: } michael@0: michael@0: function getInstallReason() { michael@0: return Services.prefs.getIntPref("bootstraptest.install_reason"); michael@0: } michael@0: michael@0: function getUninstallReason() { michael@0: return Services.prefs.getIntPref("bootstraptest.uninstall_reason"); michael@0: } michael@0: michael@0: function getStartupOldVersion() { michael@0: return Services.prefs.getIntPref("bootstraptest.startup_oldversion"); michael@0: } michael@0: michael@0: function getShutdownNewVersion() { michael@0: return Services.prefs.getIntPref("bootstraptest.shutdown_newversion"); michael@0: } michael@0: michael@0: function getInstallOldVersion() { michael@0: return Services.prefs.getIntPref("bootstraptest.install_oldversion"); michael@0: } michael@0: michael@0: function getUninstallNewVersion() { michael@0: return Services.prefs.getIntPref("bootstraptest.uninstall_newversion"); michael@0: } michael@0: michael@0: function do_check_bootstrappedPref(aCallback) { michael@0: let data = "{}"; michael@0: try { michael@0: // This is ok to fail, as the pref won't exist on a fresh profile. michael@0: data = Services.prefs.getCharPref("extensions.bootstrappedAddons"); michael@0: } catch (e) {} michael@0: data = JSON.parse(data); michael@0: michael@0: AddonManager.getAddonsByTypes(["extension"], function(aAddons) { michael@0: for (let addon of aAddons) { michael@0: if (!addon.id.endsWith("@tests.mozilla.org")) michael@0: continue; michael@0: if (!addon.isActive) michael@0: continue; michael@0: if (addon.operationsRequiringRestart != AddonManager.OP_NEEDS_RESTART_NONE) michael@0: continue; michael@0: michael@0: do_check_true(addon.id in data); michael@0: let addonData = data[addon.id]; michael@0: delete data[addon.id]; michael@0: michael@0: do_check_eq(addonData.version, addon.version); michael@0: do_check_eq(addonData.type, addon.type); michael@0: let file = addon.getResourceURI().QueryInterface(Components.interfaces.nsIFileURL).file; michael@0: do_check_eq(addonData.descriptor, file.persistentDescriptor); michael@0: } michael@0: do_check_eq(Object.keys(data).length, 0); michael@0: michael@0: aCallback(); michael@0: }); michael@0: } michael@0: michael@0: michael@0: function run_test() { michael@0: do_test_pending(); michael@0: michael@0: resetPrefs(); michael@0: michael@0: startupManager(); michael@0: michael@0: do_check_false(gExtensionsJSON.exists()); michael@0: michael@0: do_check_false(gExtensionsINI.exists()); michael@0: michael@0: do_check_bootstrappedPref(run_test_1); michael@0: } michael@0: michael@0: // Tests that installing doesn't require a restart michael@0: function run_test_1() { michael@0: prepare_test({ }, [ michael@0: "onNewInstall" michael@0: ]); michael@0: michael@0: AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_1"), function(install) { michael@0: ensure_test_completed(); michael@0: michael@0: do_check_neq(install, null); michael@0: do_check_eq(install.type, "extension"); michael@0: do_check_eq(install.version, "1.0"); michael@0: do_check_eq(install.name, "Test Bootstrap 1"); michael@0: do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); michael@0: do_check_neq(install.addon.syncGUID, null); michael@0: do_check_true(install.addon.hasResource("install.rdf")); michael@0: do_check_true(install.addon.hasResource("bootstrap.js")); michael@0: do_check_false(install.addon.hasResource("foo.bar")); michael@0: do_check_eq(install.addon.operationsRequiringRestart & michael@0: AddonManager.OP_NEEDS_RESTART_INSTALL, 0); michael@0: do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); michael@0: michael@0: let addon = install.addon; michael@0: michael@0: waitForPref("bootstraptest.startup_reason", function() { michael@0: do_check_bootstrappedPref(function() { michael@0: check_test_1(addon.syncGUID); michael@0: }); michael@0: }); michael@0: michael@0: prepare_test({ michael@0: "bootstrap1@tests.mozilla.org": [ michael@0: ["onInstalling", false], michael@0: "onInstalled" michael@0: ] michael@0: }, [ michael@0: "onInstallStarted", michael@0: "onInstallEnded", michael@0: ], function() { michael@0: do_check_true(addon.hasResource("install.rdf")); michael@0: michael@0: // startup should not have been called yet. michael@0: do_check_eq(getActiveVersion(), -1); michael@0: }); michael@0: install.install(); michael@0: }); michael@0: } michael@0: michael@0: function check_test_1(installSyncGUID) { michael@0: do_check_false(gExtensionsINI.exists()); michael@0: michael@0: AddonManager.getAllInstalls(function(installs) { michael@0: // There should be no active installs now since the install completed and michael@0: // doesn't require a restart. michael@0: do_check_eq(installs.length, 0); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "1.0"); michael@0: do_check_neq(b1.syncGUID, null); michael@0: do_check_eq(b1.syncGUID, installSyncGUID); michael@0: do_check_false(b1.appDisabled); michael@0: do_check_false(b1.userDisabled); michael@0: do_check_true(b1.isActive); michael@0: do_check_eq(getInstalledVersion(), 1); michael@0: do_check_eq(getActiveVersion(), 1); michael@0: do_check_eq(getStartupReason(), ADDON_INSTALL); michael@0: do_check_eq(getStartupOldVersion(), 0); michael@0: do_check_true(b1.hasResource("install.rdf")); michael@0: do_check_true(b1.hasResource("bootstrap.js")); michael@0: do_check_false(b1.hasResource("foo.bar")); michael@0: do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); michael@0: michael@0: let dir = do_get_addon_root_uri(profileDir, "bootstrap1@tests.mozilla.org"); michael@0: do_check_eq(b1.getResourceURI("bootstrap.js").spec, dir + "bootstrap.js"); michael@0: michael@0: AddonManager.getAddonsWithOperationsByTypes(null, function(list) { michael@0: do_check_eq(list.length, 0); michael@0: michael@0: do_execute_soon(run_test_2); michael@0: }); michael@0: }); michael@0: }); michael@0: } michael@0: michael@0: // Tests that disabling doesn't require a restart michael@0: function run_test_2() { michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: prepare_test({ michael@0: "bootstrap1@tests.mozilla.org": [ michael@0: ["onDisabling", false], michael@0: "onDisabled" michael@0: ] michael@0: }); michael@0: michael@0: do_check_eq(b1.operationsRequiringRestart & michael@0: AddonManager.OP_NEEDS_RESTART_DISABLE, 0); michael@0: b1.userDisabled = true; michael@0: ensure_test_completed(); michael@0: michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "1.0"); michael@0: do_check_false(b1.appDisabled); michael@0: do_check_true(b1.userDisabled); michael@0: do_check_false(b1.isActive); michael@0: do_check_eq(getInstalledVersion(), 1); michael@0: do_check_eq(getActiveVersion(), 0); michael@0: do_check_eq(getShutdownReason(), ADDON_DISABLE); michael@0: do_check_eq(getShutdownNewVersion(), 0); michael@0: do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(newb1) { michael@0: do_check_neq(newb1, null); michael@0: do_check_eq(newb1.version, "1.0"); michael@0: do_check_false(newb1.appDisabled); michael@0: do_check_true(newb1.userDisabled); michael@0: do_check_false(newb1.isActive); michael@0: michael@0: do_check_bootstrappedPref(run_test_3); michael@0: }); michael@0: }); michael@0: } michael@0: michael@0: // Test that restarting doesn't accidentally re-enable michael@0: function run_test_3() { michael@0: shutdownManager(); michael@0: do_check_eq(getInstalledVersion(), 1); michael@0: do_check_eq(getActiveVersion(), 0); michael@0: do_check_eq(getShutdownReason(), ADDON_DISABLE); michael@0: do_check_eq(getShutdownNewVersion(), 0); michael@0: startupManager(false); michael@0: do_check_eq(getInstalledVersion(), 1); michael@0: do_check_eq(getActiveVersion(), 0); michael@0: do_check_eq(getShutdownReason(), ADDON_DISABLE); michael@0: do_check_eq(getShutdownNewVersion(), 0); michael@0: do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); michael@0: michael@0: do_check_false(gExtensionsINI.exists()); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "1.0"); michael@0: do_check_false(b1.appDisabled); michael@0: do_check_true(b1.userDisabled); michael@0: do_check_false(b1.isActive); michael@0: michael@0: do_check_bootstrappedPref(run_test_4); michael@0: }); michael@0: } michael@0: michael@0: // Tests that enabling doesn't require a restart michael@0: function run_test_4() { michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: prepare_test({ michael@0: "bootstrap1@tests.mozilla.org": [ michael@0: ["onEnabling", false], michael@0: "onEnabled" michael@0: ] michael@0: }); michael@0: michael@0: do_check_eq(b1.operationsRequiringRestart & michael@0: AddonManager.OP_NEEDS_RESTART_ENABLE, 0); michael@0: b1.userDisabled = false; michael@0: ensure_test_completed(); michael@0: michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "1.0"); michael@0: do_check_false(b1.appDisabled); michael@0: do_check_false(b1.userDisabled); michael@0: do_check_true(b1.isActive); michael@0: do_check_eq(getInstalledVersion(), 1); michael@0: do_check_eq(getActiveVersion(), 1); michael@0: do_check_eq(getStartupReason(), ADDON_ENABLE); michael@0: do_check_eq(getStartupOldVersion(), 0); michael@0: do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(newb1) { michael@0: do_check_neq(newb1, null); michael@0: do_check_eq(newb1.version, "1.0"); michael@0: do_check_false(newb1.appDisabled); michael@0: do_check_false(newb1.userDisabled); michael@0: do_check_true(newb1.isActive); michael@0: michael@0: do_check_bootstrappedPref(run_test_5); michael@0: }); michael@0: }); michael@0: } michael@0: michael@0: // Tests that a restart shuts down and restarts the add-on michael@0: function run_test_5() { michael@0: shutdownManager(); michael@0: // By the time we've shut down, the database must have been written michael@0: do_check_true(gExtensionsJSON.exists()); michael@0: michael@0: do_check_eq(getInstalledVersion(), 1); michael@0: do_check_eq(getActiveVersion(), 0); michael@0: do_check_eq(getShutdownReason(), APP_SHUTDOWN); michael@0: do_check_eq(getShutdownNewVersion(), 0); michael@0: do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); michael@0: startupManager(false); michael@0: do_check_eq(getInstalledVersion(), 1); michael@0: do_check_eq(getActiveVersion(), 1); michael@0: do_check_eq(getStartupReason(), APP_STARTUP); michael@0: do_check_eq(getStartupOldVersion(), 0); michael@0: do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "1.0"); michael@0: do_check_false(b1.appDisabled); michael@0: do_check_false(b1.userDisabled); michael@0: do_check_true(b1.isActive); michael@0: do_check_false(isExtensionInAddonsList(profileDir, b1.id)); michael@0: michael@0: do_check_bootstrappedPref(run_test_6); michael@0: }); michael@0: } michael@0: michael@0: // Tests that installing an upgrade doesn't require a restart michael@0: function run_test_6() { michael@0: prepare_test({ }, [ michael@0: "onNewInstall" michael@0: ]); michael@0: michael@0: AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_2"), function(install) { michael@0: ensure_test_completed(); michael@0: michael@0: do_check_neq(install, null); michael@0: do_check_eq(install.type, "extension"); michael@0: do_check_eq(install.version, "2.0"); michael@0: do_check_eq(install.name, "Test Bootstrap 1"); michael@0: do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); michael@0: michael@0: waitForPref("bootstraptest.startup_reason", check_test_6); michael@0: prepare_test({ michael@0: "bootstrap1@tests.mozilla.org": [ michael@0: ["onInstalling", false], michael@0: "onInstalled" michael@0: ] michael@0: }, [ michael@0: "onInstallStarted", michael@0: "onInstallEnded", michael@0: ], function() { michael@0: }); michael@0: install.install(); michael@0: }); michael@0: } michael@0: michael@0: function check_test_6() { michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "2.0"); michael@0: do_check_false(b1.appDisabled); michael@0: do_check_false(b1.userDisabled); michael@0: do_check_true(b1.isActive); michael@0: do_check_eq(getInstalledVersion(), 2); michael@0: do_check_eq(getActiveVersion(), 2); michael@0: do_check_eq(getStartupReason(), ADDON_UPGRADE); michael@0: do_check_eq(getInstallOldVersion(), 1); michael@0: do_check_eq(getStartupOldVersion(), 1); michael@0: do_check_eq(getShutdownReason(), ADDON_UPGRADE); michael@0: do_check_eq(getShutdownNewVersion(), 2); michael@0: do_check_eq(getUninstallNewVersion(), 2); michael@0: do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); michael@0: do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "2.0"); michael@0: michael@0: do_check_bootstrappedPref(run_test_7); michael@0: }); michael@0: } michael@0: michael@0: // Tests that uninstalling doesn't require a restart michael@0: function run_test_7() { michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: prepare_test({ michael@0: "bootstrap1@tests.mozilla.org": [ michael@0: ["onUninstalling", false], michael@0: "onUninstalled" michael@0: ] michael@0: }); michael@0: michael@0: do_check_eq(b1.operationsRequiringRestart & michael@0: AddonManager.OP_NEEDS_RESTART_UNINSTALL, 0); michael@0: b1.uninstall(); michael@0: michael@0: do_check_bootstrappedPref(check_test_7); michael@0: }); michael@0: } michael@0: michael@0: function check_test_7() { michael@0: ensure_test_completed(); michael@0: do_check_eq(getInstalledVersion(), 0); michael@0: do_check_eq(getActiveVersion(), 0); michael@0: do_check_eq(getShutdownReason(), ADDON_UNINSTALL); michael@0: do_check_eq(getShutdownNewVersion(), 0); michael@0: do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "2.0"); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) { michael@0: do_check_eq(b1, null); michael@0: michael@0: restartManager(); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(newb1) { michael@0: do_check_eq(newb1, null); michael@0: michael@0: do_check_bootstrappedPref(run_test_8); michael@0: }); michael@0: })); michael@0: } michael@0: michael@0: // Test that a bootstrapped extension dropped into the profile loads properly michael@0: // on startup and doesn't cause an EM restart michael@0: function run_test_8() { michael@0: shutdownManager(); michael@0: michael@0: manuallyInstall(do_get_addon("test_bootstrap1_1"), profileDir, michael@0: "bootstrap1@tests.mozilla.org"); michael@0: michael@0: startupManager(false); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "1.0"); michael@0: do_check_false(b1.appDisabled); michael@0: do_check_false(b1.userDisabled); michael@0: do_check_true(b1.isActive); michael@0: do_check_eq(getInstalledVersion(), 1); michael@0: do_check_eq(getActiveVersion(), 1); michael@0: do_check_eq(getStartupReason(), ADDON_INSTALL); michael@0: do_check_eq(getStartupOldVersion(), 0); michael@0: do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); michael@0: michael@0: do_check_bootstrappedPref(run_test_9); michael@0: }); michael@0: } michael@0: michael@0: // Test that items detected as removed during startup get removed properly michael@0: function run_test_9() { michael@0: shutdownManager(); michael@0: michael@0: manuallyUninstall(profileDir, "bootstrap1@tests.mozilla.org"); michael@0: michael@0: startupManager(false); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: do_check_eq(b1, null); michael@0: do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); michael@0: michael@0: do_check_bootstrappedPref(run_test_10); michael@0: }); michael@0: } michael@0: michael@0: michael@0: // Tests that installing a downgrade sends the right reason michael@0: function run_test_10() { michael@0: resetPrefs(); michael@0: prepare_test({ }, [ michael@0: "onNewInstall" michael@0: ]); michael@0: michael@0: AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_2"), function(install) { michael@0: ensure_test_completed(); michael@0: michael@0: do_check_neq(install, null); michael@0: do_check_eq(install.type, "extension"); michael@0: do_check_eq(install.version, "2.0"); michael@0: do_check_eq(install.name, "Test Bootstrap 1"); michael@0: do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); michael@0: do_check_true(install.addon.hasResource("install.rdf")); michael@0: do_check_true(install.addon.hasResource("bootstrap.js")); michael@0: do_check_false(install.addon.hasResource("foo.bar")); michael@0: do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "2.0"); michael@0: michael@0: waitForPref("bootstraptest.startup_reason", check_test_10_pt1); michael@0: prepare_test({ michael@0: "bootstrap1@tests.mozilla.org": [ michael@0: ["onInstalling", false], michael@0: "onInstalled" michael@0: ] michael@0: }, [ michael@0: "onInstallStarted", michael@0: "onInstallEnded", michael@0: ], function() { michael@0: do_print("Waiting for startup of bootstrap1_2"); michael@0: }); michael@0: install.install(); michael@0: }); michael@0: } michael@0: michael@0: function check_test_10_pt1() { michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "2.0"); michael@0: do_check_false(b1.appDisabled); michael@0: do_check_false(b1.userDisabled); michael@0: do_check_true(b1.isActive); michael@0: do_check_eq(getInstalledVersion(), 2); michael@0: do_check_eq(getActiveVersion(), 2); michael@0: do_check_eq(getStartupReason(), ADDON_INSTALL); michael@0: do_check_eq(getStartupOldVersion(), 0); michael@0: do_check_true(b1.hasResource("install.rdf")); michael@0: do_check_true(b1.hasResource("bootstrap.js")); michael@0: do_check_false(b1.hasResource("foo.bar")); michael@0: do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "2.0"); michael@0: michael@0: prepare_test({ }, [ michael@0: "onNewInstall" michael@0: ]); michael@0: michael@0: AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_1"), function(install) { michael@0: ensure_test_completed(); michael@0: michael@0: do_check_neq(install, null); michael@0: do_check_eq(install.type, "extension"); michael@0: do_check_eq(install.version, "1.0"); michael@0: do_check_eq(install.name, "Test Bootstrap 1"); michael@0: do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); michael@0: michael@0: waitForPref("bootstraptest.startup_reason", check_test_10_pt2); michael@0: prepare_test({ michael@0: "bootstrap1@tests.mozilla.org": [ michael@0: ["onInstalling", false], michael@0: "onInstalled" michael@0: ] michael@0: }, [ michael@0: "onInstallStarted", michael@0: "onInstallEnded", michael@0: ], function() { }); michael@0: install.install(); michael@0: }); michael@0: }); michael@0: } michael@0: michael@0: function check_test_10_pt2() { michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "1.0"); michael@0: do_check_false(b1.appDisabled); michael@0: do_check_false(b1.userDisabled); michael@0: do_check_true(b1.isActive); michael@0: do_check_eq(getInstalledVersion(), 1); michael@0: do_check_eq(getActiveVersion(), 1); michael@0: do_check_eq(getStartupReason(), ADDON_DOWNGRADE); michael@0: do_check_eq(getInstallOldVersion(), 2); michael@0: do_check_eq(getStartupOldVersion(), 2); michael@0: do_check_eq(getShutdownReason(), ADDON_DOWNGRADE); michael@0: do_check_eq(getShutdownNewVersion(), 1); michael@0: do_check_eq(getUninstallNewVersion(), 1); michael@0: do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); michael@0: do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "2.0"); michael@0: michael@0: do_check_bootstrappedPref(run_test_11); michael@0: }); michael@0: } michael@0: michael@0: // Tests that uninstalling a disabled add-on still calls the uninstall method michael@0: function run_test_11() { michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: prepare_test({ michael@0: "bootstrap1@tests.mozilla.org": [ michael@0: ["onDisabling", false], michael@0: "onDisabled", michael@0: ["onUninstalling", false], michael@0: "onUninstalled" michael@0: ] michael@0: }); michael@0: michael@0: b1.userDisabled = true; michael@0: michael@0: do_check_eq(getInstalledVersion(), 1); michael@0: do_check_eq(getActiveVersion(), 0); michael@0: do_check_eq(getShutdownReason(), ADDON_DISABLE); michael@0: do_check_eq(getShutdownNewVersion(), 0); michael@0: do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); michael@0: michael@0: b1.uninstall(); michael@0: michael@0: check_test_11(); michael@0: }); michael@0: } michael@0: michael@0: function check_test_11() { michael@0: ensure_test_completed(); michael@0: do_check_eq(getInstalledVersion(), 0); michael@0: do_check_eq(getActiveVersion(), 0); michael@0: do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); michael@0: michael@0: do_check_bootstrappedPref(run_test_12); michael@0: } michael@0: michael@0: // Tests that bootstrapped extensions are correctly loaded even if the app is michael@0: // upgraded at the same time michael@0: function run_test_12() { michael@0: shutdownManager(); michael@0: michael@0: manuallyInstall(do_get_addon("test_bootstrap1_1"), profileDir, michael@0: "bootstrap1@tests.mozilla.org"); michael@0: michael@0: startupManager(true); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "1.0"); michael@0: do_check_false(b1.appDisabled); michael@0: do_check_false(b1.userDisabled); michael@0: do_check_true(b1.isActive); michael@0: do_check_eq(getInstalledVersion(), 1); michael@0: do_check_eq(getActiveVersion(), 1); michael@0: do_check_eq(getStartupReason(), ADDON_INSTALL); michael@0: do_check_eq(getStartupOldVersion(), 0); michael@0: do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); michael@0: michael@0: b1.uninstall(); michael@0: do_execute_soon(test_12_restart); michael@0: }); michael@0: } michael@0: michael@0: function test_12_restart() { michael@0: restartManager(); michael@0: do_check_bootstrappedPref(run_test_13); michael@0: } michael@0: michael@0: michael@0: // Tests that installing a bootstrapped extension with an invalid application michael@0: // entry doesn't call it's startup method michael@0: function run_test_13() { michael@0: prepare_test({ }, [ michael@0: "onNewInstall" michael@0: ]); michael@0: michael@0: AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_3"), function(install) { michael@0: ensure_test_completed(); michael@0: michael@0: do_check_neq(install, null); michael@0: do_check_eq(install.type, "extension"); michael@0: do_check_eq(install.version, "3.0"); michael@0: do_check_eq(install.name, "Test Bootstrap 1"); michael@0: do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); michael@0: do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "3.0"); michael@0: michael@0: prepare_test({ michael@0: "bootstrap1@tests.mozilla.org": [ michael@0: ["onInstalling", false], michael@0: "onInstalled" michael@0: ] michael@0: }, [ michael@0: "onInstallStarted", michael@0: "onInstallEnded", michael@0: ], callback_soon(check_test_13)); michael@0: install.install(); michael@0: }); michael@0: } michael@0: michael@0: function check_test_13() { michael@0: AddonManager.getAllInstalls(function(installs) { michael@0: // There should be no active installs now since the install completed and michael@0: // doesn't require a restart. michael@0: do_check_eq(installs.length, 0); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "3.0"); michael@0: do_check_true(b1.appDisabled); michael@0: do_check_false(b1.userDisabled); michael@0: do_check_false(b1.isActive); michael@0: do_check_eq(getInstalledVersion(), 3); // We call install even for disabled add-ons michael@0: do_check_eq(getActiveVersion(), 0); // Should not have called startup though michael@0: do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "3.0"); michael@0: michael@0: do_execute_soon(test_13_restart); michael@0: }); michael@0: }); michael@0: } michael@0: michael@0: function test_13_restart() { michael@0: restartManager(); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "3.0"); michael@0: do_check_true(b1.appDisabled); michael@0: do_check_false(b1.userDisabled); michael@0: do_check_false(b1.isActive); michael@0: do_check_eq(getInstalledVersion(), 3); // We call install even for disabled add-ons michael@0: do_check_eq(getActiveVersion(), 0); // Should not have called startup though michael@0: do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "3.0"); michael@0: michael@0: do_check_bootstrappedPref(function() { michael@0: b1.uninstall(); michael@0: do_execute_soon(run_test_14); michael@0: }); michael@0: }); michael@0: } michael@0: michael@0: // Tests that a bootstrapped extension with an invalid target application entry michael@0: // does not get loaded when detected during startup michael@0: function run_test_14() { michael@0: restartManager(); michael@0: michael@0: shutdownManager(); michael@0: michael@0: manuallyInstall(do_get_addon("test_bootstrap1_3"), profileDir, michael@0: "bootstrap1@tests.mozilla.org"); michael@0: michael@0: startupManager(false); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "3.0"); michael@0: do_check_true(b1.appDisabled); michael@0: do_check_false(b1.userDisabled); michael@0: do_check_false(b1.isActive); michael@0: do_check_eq(getInstalledVersion(), 3); // We call install even for disabled add-ons michael@0: do_check_eq(getActiveVersion(), 0); // Should not have called startup though michael@0: do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "3.0"); michael@0: michael@0: do_check_bootstrappedPref(function() { michael@0: b1.uninstall(); michael@0: michael@0: run_test_15(); michael@0: }); michael@0: }); michael@0: } michael@0: michael@0: // Tests that upgrading a disabled bootstrapped extension still calls uninstall michael@0: // and install but doesn't startup the new version michael@0: function run_test_15() { michael@0: resetPrefs(); michael@0: waitForPref("bootstraptest.startup_reason", function test_15_after_startup() { michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "1.0"); michael@0: do_check_false(b1.appDisabled); michael@0: do_check_false(b1.userDisabled); michael@0: do_check_true(b1.isActive); michael@0: do_check_eq(getInstalledVersion(), 1); michael@0: do_check_eq(getActiveVersion(), 1); michael@0: michael@0: b1.userDisabled = true; michael@0: do_check_false(b1.isActive); michael@0: do_check_eq(getInstalledVersion(), 1); michael@0: do_check_eq(getActiveVersion(), 0); michael@0: michael@0: prepare_test({ }, [ michael@0: "onNewInstall" michael@0: ]); michael@0: michael@0: AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_2"), function(install) { michael@0: ensure_test_completed(); michael@0: michael@0: do_check_neq(install, null); michael@0: do_check_true(install.addon.userDisabled); michael@0: michael@0: prepare_test({ michael@0: "bootstrap1@tests.mozilla.org": [ michael@0: ["onInstalling", false], michael@0: "onInstalled" michael@0: ] michael@0: }, [ michael@0: "onInstallStarted", michael@0: "onInstallEnded", michael@0: ], callback_soon(check_test_15)); michael@0: install.install(); michael@0: }); michael@0: }); michael@0: }); michael@0: installAllFiles([do_get_addon("test_bootstrap1_1")], function test_15_addon_installed() { }); michael@0: } michael@0: michael@0: function check_test_15() { michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "2.0"); michael@0: do_check_false(b1.appDisabled); michael@0: do_check_true(b1.userDisabled); michael@0: do_check_false(b1.isActive); michael@0: do_check_eq(getInstalledVersion(), 2); michael@0: do_check_eq(getActiveVersion(), 0); michael@0: michael@0: do_check_bootstrappedPref(function() { michael@0: restartManager(); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "2.0"); michael@0: do_check_false(b1.appDisabled); michael@0: do_check_true(b1.userDisabled); michael@0: do_check_false(b1.isActive); michael@0: do_check_eq(getInstalledVersion(), 2); michael@0: do_check_eq(getActiveVersion(), 0); michael@0: michael@0: b1.uninstall(); michael@0: michael@0: run_test_16(); michael@0: }); michael@0: }); michael@0: }); michael@0: } michael@0: michael@0: // Tests that bootstrapped extensions don't get loaded when in safe mode michael@0: function run_test_16() { michael@0: resetPrefs(); michael@0: waitForPref("bootstraptest.startup_reason", function test_16_after_startup() { michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) { michael@0: // Should have installed and started michael@0: do_check_eq(getInstalledVersion(), 1); michael@0: do_check_eq(getActiveVersion(), 1); michael@0: do_check_true(b1.isActive); michael@0: do_check_eq(b1.iconURL, "chrome://foo/skin/icon.png"); michael@0: do_check_eq(b1.aboutURL, "chrome://foo/content/about.xul"); michael@0: do_check_eq(b1.optionsURL, "chrome://foo/content/options.xul"); michael@0: michael@0: shutdownManager(); michael@0: michael@0: // Should have stopped michael@0: do_check_eq(getInstalledVersion(), 1); michael@0: do_check_eq(getActiveVersion(), 0); michael@0: michael@0: gAppInfo.inSafeMode = true; michael@0: startupManager(false); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) { michael@0: // Should still be stopped michael@0: do_check_eq(getInstalledVersion(), 1); michael@0: do_check_eq(getActiveVersion(), 0); michael@0: do_check_false(b1.isActive); michael@0: do_check_eq(b1.iconURL, null); michael@0: do_check_eq(b1.aboutURL, null); michael@0: do_check_eq(b1.optionsURL, null); michael@0: michael@0: shutdownManager(); michael@0: gAppInfo.inSafeMode = false; michael@0: startupManager(false); michael@0: michael@0: // Should have started michael@0: do_check_eq(getInstalledVersion(), 1); michael@0: do_check_eq(getActiveVersion(), 1); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: b1.uninstall(); michael@0: michael@0: do_execute_soon(run_test_17); michael@0: }); michael@0: })); michael@0: })); michael@0: }); michael@0: installAllFiles([do_get_addon("test_bootstrap1_1")], function() { }); michael@0: } michael@0: michael@0: // Check that a bootstrapped extension in a non-profile location is loaded michael@0: function run_test_17() { michael@0: shutdownManager(); michael@0: michael@0: manuallyInstall(do_get_addon("test_bootstrap1_1"), userExtDir, michael@0: "bootstrap1@tests.mozilla.org"); michael@0: michael@0: resetPrefs(); michael@0: startupManager(); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: // Should have installed and started michael@0: do_check_eq(getInstalledVersion(), 1); michael@0: do_check_eq(getActiveVersion(), 1); michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "1.0"); michael@0: do_check_true(b1.isActive); michael@0: michael@0: do_check_bootstrappedPref(run_test_18); michael@0: }); michael@0: } michael@0: michael@0: // Check that installing a new bootstrapped extension in the profile replaces michael@0: // the existing one michael@0: function run_test_18() { michael@0: resetPrefs(); michael@0: waitForPref("bootstraptest.startup_reason", function test_16_after_startup() { michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: // Should have installed and started michael@0: do_check_eq(getInstalledVersion(), 2); michael@0: do_check_eq(getActiveVersion(), 2); michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "2.0"); michael@0: do_check_true(b1.isActive); michael@0: michael@0: do_check_eq(getShutdownReason(), ADDON_UPGRADE); michael@0: do_check_eq(getUninstallReason(), ADDON_UPGRADE); michael@0: do_check_eq(getInstallReason(), ADDON_UPGRADE); michael@0: do_check_eq(getStartupReason(), ADDON_UPGRADE); michael@0: michael@0: do_check_eq(getShutdownNewVersion(), 2); michael@0: do_check_eq(getUninstallNewVersion(), 2); michael@0: do_check_eq(getInstallOldVersion(), 1); michael@0: do_check_eq(getStartupOldVersion(), 1); michael@0: michael@0: do_check_bootstrappedPref(run_test_19); michael@0: }); michael@0: }); michael@0: installAllFiles([do_get_addon("test_bootstrap1_2")], function() { }); michael@0: } michael@0: michael@0: // Check that uninstalling the profile version reveals the non-profile one michael@0: function run_test_19() { michael@0: resetPrefs(); michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: // The revealed add-on gets activated asynchronously michael@0: prepare_test({ michael@0: "bootstrap1@tests.mozilla.org": [ michael@0: ["onUninstalling", false], michael@0: "onUninstalled", michael@0: ["onInstalling", false], michael@0: "onInstalled" michael@0: ] michael@0: }, [], check_test_19); michael@0: michael@0: b1.uninstall(); michael@0: }); michael@0: } michael@0: michael@0: function check_test_19() { michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: // Should have reverted to the older version michael@0: do_check_eq(getInstalledVersion(), 1); michael@0: do_check_eq(getActiveVersion(), 1); michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "1.0"); michael@0: do_check_true(b1.isActive); michael@0: michael@0: // TODO these reasons really should be ADDON_DOWNGRADE (bug 607818) michael@0: do_check_eq(getShutdownReason(), ADDON_UNINSTALL); michael@0: do_check_eq(getUninstallReason(), ADDON_UNINSTALL); michael@0: do_check_eq(getInstallReason(), ADDON_INSTALL); michael@0: do_check_eq(getStartupReason(), ADDON_INSTALL); michael@0: michael@0: do_check_eq(getShutdownNewVersion(), 0); michael@0: do_check_eq(getUninstallNewVersion(), 0); michael@0: do_check_eq(getInstallOldVersion(), 0); michael@0: do_check_eq(getStartupOldVersion(), 0); michael@0: michael@0: do_check_bootstrappedPref(run_test_20); michael@0: }); michael@0: } michael@0: michael@0: // Check that a new profile extension detected at startup replaces the non-profile michael@0: // one michael@0: function run_test_20() { michael@0: resetPrefs(); michael@0: shutdownManager(); michael@0: michael@0: manuallyInstall(do_get_addon("test_bootstrap1_2"), profileDir, michael@0: "bootstrap1@tests.mozilla.org"); michael@0: michael@0: startupManager(); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: // Should have installed and started michael@0: do_check_eq(getInstalledVersion(), 2); michael@0: do_check_eq(getActiveVersion(), 2); michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "2.0"); michael@0: do_check_true(b1.isActive); michael@0: michael@0: do_check_eq(getShutdownReason(), APP_SHUTDOWN); michael@0: do_check_eq(getUninstallReason(), ADDON_UPGRADE); michael@0: do_check_eq(getInstallReason(), ADDON_UPGRADE); michael@0: do_check_eq(getStartupReason(), APP_STARTUP); michael@0: michael@0: do_check_eq(getShutdownNewVersion(), 0); michael@0: do_check_eq(getUninstallNewVersion(), 2); michael@0: do_check_eq(getInstallOldVersion(), 1); michael@0: do_check_eq(getStartupOldVersion(), 0); michael@0: michael@0: do_execute_soon(run_test_21); michael@0: }); michael@0: } michael@0: michael@0: // Check that a detected removal reveals the non-profile one michael@0: function run_test_21() { michael@0: resetPrefs(); michael@0: shutdownManager(); michael@0: michael@0: manuallyUninstall(profileDir, "bootstrap1@tests.mozilla.org"); michael@0: michael@0: startupManager(); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: // Should have installed and started michael@0: do_check_eq(getInstalledVersion(), 1); michael@0: do_check_eq(getActiveVersion(), 1); michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "1.0"); michael@0: do_check_true(b1.isActive); michael@0: michael@0: do_check_eq(getShutdownReason(), APP_SHUTDOWN); michael@0: do_check_eq(getShutdownNewVersion(), 0); michael@0: michael@0: // This won't be set as the bootstrap script was gone so we couldn't michael@0: // uninstall it properly michael@0: do_check_eq(getUninstallReason(), -1); michael@0: do_check_eq(getUninstallNewVersion(), -1); michael@0: michael@0: // TODO this reason should probably be ADDON_DOWNGRADE (bug 607818) michael@0: do_check_eq(getInstallReason(), ADDON_INSTALL); michael@0: do_check_eq(getInstallOldVersion(), 0); michael@0: michael@0: do_check_eq(getStartupReason(), APP_STARTUP); michael@0: do_check_eq(getStartupOldVersion(), 0); michael@0: michael@0: do_check_bootstrappedPref(function() { michael@0: manuallyUninstall(userExtDir, "bootstrap1@tests.mozilla.org"); michael@0: michael@0: restartManager(); michael@0: run_test_22(); michael@0: }); michael@0: }); michael@0: } michael@0: michael@0: // Check that an upgrade from the filesystem is detected and applied correctly michael@0: function run_test_22() { michael@0: shutdownManager(); michael@0: michael@0: let file = manuallyInstall(do_get_addon("test_bootstrap1_1"), profileDir, michael@0: "bootstrap1@tests.mozilla.org"); michael@0: michael@0: // Make it look old so changes are detected michael@0: setExtensionModifiedTime(file, file.lastModifiedTime - 5000); michael@0: michael@0: startupManager(); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) { michael@0: // Should have installed and started michael@0: do_check_eq(getInstalledVersion(), 1); michael@0: do_check_eq(getActiveVersion(), 1); michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "1.0"); michael@0: do_check_true(b1.isActive); michael@0: michael@0: resetPrefs(); michael@0: shutdownManager(); michael@0: michael@0: manuallyUninstall(profileDir, "bootstrap1@tests.mozilla.org"); michael@0: manuallyInstall(do_get_addon("test_bootstrap1_2"), profileDir, michael@0: "bootstrap1@tests.mozilla.org"); michael@0: michael@0: startupManager(); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: // Should have installed and started michael@0: do_check_eq(getInstalledVersion(), 2); michael@0: do_check_eq(getActiveVersion(), 2); michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "2.0"); michael@0: do_check_true(b1.isActive); michael@0: michael@0: do_check_eq(getShutdownReason(), APP_SHUTDOWN); michael@0: do_check_eq(getShutdownNewVersion(), 0); michael@0: michael@0: // This won't be set as the bootstrap script was gone so we couldn't michael@0: // uninstall it properly michael@0: do_check_eq(getUninstallReason(), -1); michael@0: do_check_eq(getUninstallNewVersion(), -1); michael@0: michael@0: do_check_eq(getInstallReason(), ADDON_UPGRADE); michael@0: do_check_eq(getInstallOldVersion(), 1); michael@0: do_check_eq(getStartupReason(), APP_STARTUP); michael@0: do_check_eq(getStartupOldVersion(), 0); michael@0: michael@0: do_check_bootstrappedPref(function() { michael@0: b1.uninstall(); michael@0: michael@0: run_test_23(); michael@0: }); michael@0: }); michael@0: })); michael@0: } michael@0: michael@0: michael@0: // Tests that installing from a URL doesn't require a restart michael@0: function run_test_23() { michael@0: prepare_test({ }, [ michael@0: "onNewInstall" michael@0: ]); michael@0: michael@0: let url = "http://localhost:" + gPort + "/addons/test_bootstrap1_1.xpi"; michael@0: AddonManager.getInstallForURL(url, function(install) { michael@0: ensure_test_completed(); michael@0: michael@0: do_check_neq(install, null); michael@0: michael@0: prepare_test({ }, [ michael@0: "onDownloadStarted", michael@0: "onDownloadEnded" michael@0: ], function() { michael@0: do_check_eq(install.type, "extension"); michael@0: do_check_eq(install.version, "1.0"); michael@0: do_check_eq(install.name, "Test Bootstrap 1"); michael@0: do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); michael@0: do_check_true(install.addon.hasResource("install.rdf")); michael@0: do_check_true(install.addon.hasResource("bootstrap.js")); michael@0: do_check_false(install.addon.hasResource("foo.bar")); michael@0: do_check_eq(install.addon.operationsRequiringRestart & michael@0: AddonManager.OP_NEEDS_RESTART_INSTALL, 0); michael@0: do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); michael@0: michael@0: let addon = install.addon; michael@0: prepare_test({ michael@0: "bootstrap1@tests.mozilla.org": [ michael@0: ["onInstalling", false], michael@0: "onInstalled" michael@0: ] michael@0: }, [ michael@0: "onInstallStarted", michael@0: "onInstallEnded", michael@0: ], function() { michael@0: do_check_true(addon.hasResource("install.rdf")); michael@0: do_check_bootstrappedPref(check_test_23); michael@0: }); michael@0: }); michael@0: install.install(); michael@0: }, "application/x-xpinstall"); michael@0: } michael@0: michael@0: function check_test_23() { michael@0: AddonManager.getAllInstalls(function(installs) { michael@0: // There should be no active installs now since the install completed and michael@0: // doesn't require a restart. michael@0: do_check_eq(installs.length, 0); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: do_execute_soon(function test_23_after_startup() { michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "1.0"); michael@0: do_check_false(b1.appDisabled); michael@0: do_check_false(b1.userDisabled); michael@0: do_check_true(b1.isActive); michael@0: do_check_eq(getInstalledVersion(), 1); michael@0: do_check_eq(getActiveVersion(), 1); michael@0: do_check_eq(getStartupReason(), ADDON_INSTALL); michael@0: do_check_eq(getStartupOldVersion(), 0); michael@0: do_check_true(b1.hasResource("install.rdf")); michael@0: do_check_true(b1.hasResource("bootstrap.js")); michael@0: do_check_false(b1.hasResource("foo.bar")); michael@0: do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); michael@0: michael@0: let dir = do_get_addon_root_uri(profileDir, "bootstrap1@tests.mozilla.org"); michael@0: do_check_eq(b1.getResourceURI("bootstrap.js").spec, dir + "bootstrap.js"); michael@0: michael@0: AddonManager.getAddonsWithOperationsByTypes(null, callback_soon(function(list) { michael@0: do_check_eq(list.length, 0); michael@0: michael@0: restartManager(); michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) { michael@0: b1.uninstall(); michael@0: restartManager(); michael@0: michael@0: testserver.stop(run_test_24); michael@0: })); michael@0: })); michael@0: }); michael@0: }); michael@0: }); michael@0: } michael@0: michael@0: // Tests that we recover from a broken preference michael@0: function run_test_24() { michael@0: resetPrefs(); michael@0: do_print("starting 24"); michael@0: michael@0: Promise.all([promisePref("bootstraptest2.active_version"), michael@0: promiseInstall([do_get_addon("test_bootstrap1_1"), do_get_addon("test_bootstrap2_1")])]) michael@0: .then(function test_24_pref() { michael@0: do_print("test 24 got prefs"); michael@0: do_check_eq(getInstalledVersion(), 1); michael@0: do_check_eq(getActiveVersion(), 1); michael@0: do_check_eq(getInstalledVersion2(), 1); michael@0: do_check_eq(getActiveVersion2(), 1); michael@0: michael@0: resetPrefs(); michael@0: michael@0: restartManager(); michael@0: michael@0: do_check_eq(getInstalledVersion(), -1); michael@0: do_check_eq(getActiveVersion(), 1); michael@0: do_check_eq(getInstalledVersion2(), -1); michael@0: do_check_eq(getActiveVersion2(), 1); michael@0: michael@0: shutdownManager(); michael@0: michael@0: do_check_eq(getInstalledVersion(), -1); michael@0: do_check_eq(getActiveVersion(), 0); michael@0: do_check_eq(getInstalledVersion2(), -1); michael@0: do_check_eq(getActiveVersion2(), 0); michael@0: michael@0: // Break the preferece michael@0: let bootstrappedAddons = JSON.parse(Services.prefs.getCharPref("extensions.bootstrappedAddons")); michael@0: bootstrappedAddons["bootstrap1@tests.mozilla.org"].descriptor += "foo"; michael@0: Services.prefs.setCharPref("extensions.bootstrappedAddons", JSON.stringify(bootstrappedAddons)); michael@0: michael@0: startupManager(false); michael@0: michael@0: do_check_eq(getInstalledVersion(), -1); michael@0: do_check_eq(getActiveVersion(), 1); michael@0: do_check_eq(getInstalledVersion2(), -1); michael@0: do_check_eq(getActiveVersion2(), 1); michael@0: michael@0: run_test_25(); michael@0: }); michael@0: } michael@0: michael@0: // Tests that updating from a bootstrappable add-on to a normal add-on calls michael@0: // the uninstall method michael@0: function run_test_25() { michael@0: waitForPref("bootstraptest.startup_reason", function test_25_after_pref() { michael@0: do_print("test 25 pref change detected"); michael@0: do_check_eq(getInstalledVersion(), 1); michael@0: do_check_eq(getActiveVersion(), 1); michael@0: michael@0: installAllFiles([do_get_addon("test_bootstrap1_4")], function() { michael@0: // Needs a restart to complete this so the old version stays running michael@0: do_check_eq(getInstalledVersion(), 1); michael@0: do_check_eq(getActiveVersion(), 1); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) { michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "1.0"); michael@0: do_check_true(b1.isActive); michael@0: do_check_true(hasFlag(b1.pendingOperations, AddonManager.PENDING_UPGRADE)); michael@0: michael@0: restartManager(); michael@0: michael@0: do_check_eq(getInstalledVersion(), 0); michael@0: do_check_eq(getUninstallReason(), ADDON_UPGRADE); michael@0: do_check_eq(getUninstallNewVersion(), 4); michael@0: do_check_eq(getActiveVersion(), 0); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "4.0"); michael@0: do_check_true(b1.isActive); michael@0: do_check_eq(b1.pendingOperations, AddonManager.PENDING_NONE); michael@0: michael@0: do_check_bootstrappedPref(run_test_26); michael@0: }); michael@0: })); michael@0: }); michael@0: }); michael@0: installAllFiles([do_get_addon("test_bootstrap1_1")], function test_25_installed() { michael@0: do_print("test 25 install done"); michael@0: }); michael@0: } michael@0: michael@0: // Tests that updating from a normal add-on to a bootstrappable add-on calls michael@0: // the install method michael@0: function run_test_26() { michael@0: installAllFiles([do_get_addon("test_bootstrap1_1")], function() { michael@0: // Needs a restart to complete this michael@0: do_check_eq(getInstalledVersion(), 0); michael@0: do_check_eq(getActiveVersion(), 0); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) { michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "4.0"); michael@0: do_check_true(b1.isActive); michael@0: do_check_true(hasFlag(b1.pendingOperations, AddonManager.PENDING_UPGRADE)); michael@0: michael@0: restartManager(); michael@0: michael@0: do_check_eq(getInstalledVersion(), 1); michael@0: do_check_eq(getInstallReason(), ADDON_DOWNGRADE); michael@0: do_check_eq(getInstallOldVersion(), 4); michael@0: do_check_eq(getActiveVersion(), 1); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "1.0"); michael@0: do_check_true(b1.isActive); michael@0: do_check_eq(b1.pendingOperations, AddonManager.PENDING_NONE); michael@0: michael@0: do_check_bootstrappedPref(run_test_27); michael@0: }); michael@0: })); michael@0: }); michael@0: } michael@0: michael@0: // Tests that updating from a bootstrappable add-on to a normal add-on while michael@0: // disabled calls the uninstall method michael@0: function run_test_27() { michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: do_check_neq(b1, null); michael@0: b1.userDisabled = true; michael@0: do_check_eq(b1.version, "1.0"); michael@0: do_check_false(b1.isActive); michael@0: do_check_eq(b1.pendingOperations, AddonManager.PENDING_NONE); michael@0: do_check_eq(getInstalledVersion(), 1); michael@0: do_check_eq(getActiveVersion(), 0); michael@0: michael@0: installAllFiles([do_get_addon("test_bootstrap1_4")], function() { michael@0: // Updating disabled things happens immediately michael@0: do_check_eq(getInstalledVersion(), 0); michael@0: do_check_eq(getUninstallReason(), ADDON_UPGRADE); michael@0: do_check_eq(getUninstallNewVersion(), 4); michael@0: do_check_eq(getActiveVersion(), 0); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) { michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "4.0"); michael@0: do_check_false(b1.isActive); michael@0: do_check_eq(b1.pendingOperations, AddonManager.PENDING_NONE); michael@0: michael@0: restartManager(); michael@0: michael@0: do_check_eq(getInstalledVersion(), 0); michael@0: do_check_eq(getActiveVersion(), 0); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "4.0"); michael@0: do_check_false(b1.isActive); michael@0: do_check_eq(b1.pendingOperations, AddonManager.PENDING_NONE); michael@0: michael@0: do_check_bootstrappedPref(run_test_28); michael@0: }); michael@0: })); michael@0: }); michael@0: }); michael@0: } michael@0: michael@0: // Tests that updating from a normal add-on to a bootstrappable add-on when michael@0: // disabled calls the install method but not the startup method michael@0: function run_test_28() { michael@0: installAllFiles([do_get_addon("test_bootstrap1_1")], function() { michael@0: do_execute_soon(function bootstrap_disabled_downgrade_check() { michael@0: // Doesn't need a restart to complete this michael@0: do_check_eq(getInstalledVersion(), 1); michael@0: do_check_eq(getInstallReason(), ADDON_DOWNGRADE); michael@0: do_check_eq(getInstallOldVersion(), 4); michael@0: do_check_eq(getActiveVersion(), 0); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) { michael@0: do_check_neq(b1, null); michael@0: do_check_eq(b1.version, "1.0"); michael@0: do_check_false(b1.isActive); michael@0: do_check_true(b1.userDisabled); michael@0: do_check_eq(b1.pendingOperations, AddonManager.PENDING_NONE); michael@0: michael@0: restartManager(); michael@0: michael@0: do_check_eq(getInstalledVersion(), 1); michael@0: do_check_eq(getActiveVersion(), 0); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: do_check_neq(b1, null); michael@0: do_check_true(b1.userDisabled); michael@0: b1.userDisabled = false; michael@0: do_check_eq(b1.version, "1.0"); michael@0: do_check_true(b1.isActive); michael@0: do_check_eq(b1.pendingOperations, AddonManager.PENDING_NONE); michael@0: do_check_eq(getInstalledVersion(), 1); michael@0: do_check_eq(getActiveVersion(), 1); michael@0: michael@0: do_check_bootstrappedPref(do_test_finished); michael@0: }); michael@0: })); michael@0: }); michael@0: }); michael@0: }