1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/toolkit/mozapps/extensions/test/xpcshell/test_bootstrap.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,1438 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 + * http://creativecommons.org/publicdomain/zero/1.0/ 1.6 + */ 1.7 + 1.8 +const APP_STARTUP = 1; 1.9 +const APP_SHUTDOWN = 2; 1.10 +const ADDON_ENABLE = 3; 1.11 +const ADDON_DISABLE = 4; 1.12 +const ADDON_INSTALL = 5; 1.13 +const ADDON_UNINSTALL = 6; 1.14 +const ADDON_UPGRADE = 7; 1.15 +const ADDON_DOWNGRADE = 8; 1.16 + 1.17 +// This verifies that bootstrappable add-ons can be used without restarts. 1.18 +Components.utils.import("resource://gre/modules/Services.jsm"); 1.19 +Components.utils.import("resource://gre/modules/Promise.jsm"); 1.20 + 1.21 +// Enable loading extensions from the user scopes 1.22 +Services.prefs.setIntPref("extensions.enabledScopes", 1.23 + AddonManager.SCOPE_PROFILE + AddonManager.SCOPE_USER); 1.24 + 1.25 +createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); 1.26 + 1.27 +const profileDir = gProfD.clone(); 1.28 +profileDir.append("extensions"); 1.29 +const userExtDir = gProfD.clone(); 1.30 +userExtDir.append("extensions2"); 1.31 +userExtDir.append(gAppInfo.ID); 1.32 +registerDirectory("XREUSysExt", userExtDir.parent); 1.33 + 1.34 +Components.utils.import("resource://testing-common/httpd.js"); 1.35 +var testserver = new HttpServer(); 1.36 +testserver.start(-1); 1.37 +gPort = testserver.identity.primaryPort; 1.38 + 1.39 +testserver.registerDirectory("/addons/", do_get_file("addons")); 1.40 + 1.41 +function resetPrefs() { 1.42 + Services.prefs.setIntPref("bootstraptest.active_version", -1); 1.43 + Services.prefs.setIntPref("bootstraptest.installed_version", -1); 1.44 + Services.prefs.setIntPref("bootstraptest2.active_version", -1); 1.45 + Services.prefs.setIntPref("bootstraptest2.installed_version", -1); 1.46 + Services.prefs.setIntPref("bootstraptest.startup_reason", -1); 1.47 + Services.prefs.setIntPref("bootstraptest.shutdown_reason", -1); 1.48 + Services.prefs.setIntPref("bootstraptest.install_reason", -1); 1.49 + Services.prefs.setIntPref("bootstraptest.uninstall_reason", -1); 1.50 + Services.prefs.setIntPref("bootstraptest.startup_oldversion", -1); 1.51 + Services.prefs.setIntPref("bootstraptest.shutdown_newversion", -1); 1.52 + Services.prefs.setIntPref("bootstraptest.install_oldversion", -1); 1.53 + Services.prefs.setIntPref("bootstraptest.uninstall_newversion", -1); 1.54 +} 1.55 + 1.56 +function waitForPref(aPref, aCallback) { 1.57 + function prefChanged() { 1.58 + Services.prefs.removeObserver(aPref, prefChanged); 1.59 + // Always let whoever set the preference keep running 1.60 + do_execute_soon(aCallback); 1.61 + } 1.62 + Services.prefs.addObserver(aPref, prefChanged, false); 1.63 +} 1.64 + 1.65 +function promisePref(aPref) { 1.66 + let deferred = Promise.defer(); 1.67 + 1.68 + waitForPref(aPref, deferred.resolve.bind(deferred)); 1.69 + 1.70 + return deferred.promise; 1.71 +} 1.72 + 1.73 +function promiseInstall(aFiles) { 1.74 + let deferred = Promise.defer(); 1.75 + 1.76 + installAllFiles(aFiles, function() { 1.77 + deferred.resolve(); 1.78 + }); 1.79 + 1.80 + return deferred.promise; 1.81 +} 1.82 + 1.83 +function getActiveVersion() { 1.84 + return Services.prefs.getIntPref("bootstraptest.active_version"); 1.85 +} 1.86 + 1.87 +function getInstalledVersion() { 1.88 + return Services.prefs.getIntPref("bootstraptest.installed_version"); 1.89 +} 1.90 + 1.91 +function getActiveVersion2() { 1.92 + return Services.prefs.getIntPref("bootstraptest2.active_version"); 1.93 +} 1.94 + 1.95 +function getInstalledVersion2() { 1.96 + return Services.prefs.getIntPref("bootstraptest2.installed_version"); 1.97 +} 1.98 + 1.99 +function getStartupReason() { 1.100 + return Services.prefs.getIntPref("bootstraptest.startup_reason"); 1.101 +} 1.102 + 1.103 +function getShutdownReason() { 1.104 + return Services.prefs.getIntPref("bootstraptest.shutdown_reason"); 1.105 +} 1.106 + 1.107 +function getInstallReason() { 1.108 + return Services.prefs.getIntPref("bootstraptest.install_reason"); 1.109 +} 1.110 + 1.111 +function getUninstallReason() { 1.112 + return Services.prefs.getIntPref("bootstraptest.uninstall_reason"); 1.113 +} 1.114 + 1.115 +function getStartupOldVersion() { 1.116 + return Services.prefs.getIntPref("bootstraptest.startup_oldversion"); 1.117 +} 1.118 + 1.119 +function getShutdownNewVersion() { 1.120 + return Services.prefs.getIntPref("bootstraptest.shutdown_newversion"); 1.121 +} 1.122 + 1.123 +function getInstallOldVersion() { 1.124 + return Services.prefs.getIntPref("bootstraptest.install_oldversion"); 1.125 +} 1.126 + 1.127 +function getUninstallNewVersion() { 1.128 + return Services.prefs.getIntPref("bootstraptest.uninstall_newversion"); 1.129 +} 1.130 + 1.131 +function do_check_bootstrappedPref(aCallback) { 1.132 + let data = "{}"; 1.133 + try { 1.134 + // This is ok to fail, as the pref won't exist on a fresh profile. 1.135 + data = Services.prefs.getCharPref("extensions.bootstrappedAddons"); 1.136 + } catch (e) {} 1.137 + data = JSON.parse(data); 1.138 + 1.139 + AddonManager.getAddonsByTypes(["extension"], function(aAddons) { 1.140 + for (let addon of aAddons) { 1.141 + if (!addon.id.endsWith("@tests.mozilla.org")) 1.142 + continue; 1.143 + if (!addon.isActive) 1.144 + continue; 1.145 + if (addon.operationsRequiringRestart != AddonManager.OP_NEEDS_RESTART_NONE) 1.146 + continue; 1.147 + 1.148 + do_check_true(addon.id in data); 1.149 + let addonData = data[addon.id]; 1.150 + delete data[addon.id]; 1.151 + 1.152 + do_check_eq(addonData.version, addon.version); 1.153 + do_check_eq(addonData.type, addon.type); 1.154 + let file = addon.getResourceURI().QueryInterface(Components.interfaces.nsIFileURL).file; 1.155 + do_check_eq(addonData.descriptor, file.persistentDescriptor); 1.156 + } 1.157 + do_check_eq(Object.keys(data).length, 0); 1.158 + 1.159 + aCallback(); 1.160 + }); 1.161 +} 1.162 + 1.163 + 1.164 +function run_test() { 1.165 + do_test_pending(); 1.166 + 1.167 + resetPrefs(); 1.168 + 1.169 + startupManager(); 1.170 + 1.171 + do_check_false(gExtensionsJSON.exists()); 1.172 + 1.173 + do_check_false(gExtensionsINI.exists()); 1.174 + 1.175 + do_check_bootstrappedPref(run_test_1); 1.176 +} 1.177 + 1.178 +// Tests that installing doesn't require a restart 1.179 +function run_test_1() { 1.180 + prepare_test({ }, [ 1.181 + "onNewInstall" 1.182 + ]); 1.183 + 1.184 + AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_1"), function(install) { 1.185 + ensure_test_completed(); 1.186 + 1.187 + do_check_neq(install, null); 1.188 + do_check_eq(install.type, "extension"); 1.189 + do_check_eq(install.version, "1.0"); 1.190 + do_check_eq(install.name, "Test Bootstrap 1"); 1.191 + do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); 1.192 + do_check_neq(install.addon.syncGUID, null); 1.193 + do_check_true(install.addon.hasResource("install.rdf")); 1.194 + do_check_true(install.addon.hasResource("bootstrap.js")); 1.195 + do_check_false(install.addon.hasResource("foo.bar")); 1.196 + do_check_eq(install.addon.operationsRequiringRestart & 1.197 + AddonManager.OP_NEEDS_RESTART_INSTALL, 0); 1.198 + do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); 1.199 + 1.200 + let addon = install.addon; 1.201 + 1.202 + waitForPref("bootstraptest.startup_reason", function() { 1.203 + do_check_bootstrappedPref(function() { 1.204 + check_test_1(addon.syncGUID); 1.205 + }); 1.206 + }); 1.207 + 1.208 + prepare_test({ 1.209 + "bootstrap1@tests.mozilla.org": [ 1.210 + ["onInstalling", false], 1.211 + "onInstalled" 1.212 + ] 1.213 + }, [ 1.214 + "onInstallStarted", 1.215 + "onInstallEnded", 1.216 + ], function() { 1.217 + do_check_true(addon.hasResource("install.rdf")); 1.218 + 1.219 + // startup should not have been called yet. 1.220 + do_check_eq(getActiveVersion(), -1); 1.221 + }); 1.222 + install.install(); 1.223 + }); 1.224 +} 1.225 + 1.226 +function check_test_1(installSyncGUID) { 1.227 + do_check_false(gExtensionsINI.exists()); 1.228 + 1.229 + AddonManager.getAllInstalls(function(installs) { 1.230 + // There should be no active installs now since the install completed and 1.231 + // doesn't require a restart. 1.232 + do_check_eq(installs.length, 0); 1.233 + 1.234 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.235 + do_check_neq(b1, null); 1.236 + do_check_eq(b1.version, "1.0"); 1.237 + do_check_neq(b1.syncGUID, null); 1.238 + do_check_eq(b1.syncGUID, installSyncGUID); 1.239 + do_check_false(b1.appDisabled); 1.240 + do_check_false(b1.userDisabled); 1.241 + do_check_true(b1.isActive); 1.242 + do_check_eq(getInstalledVersion(), 1); 1.243 + do_check_eq(getActiveVersion(), 1); 1.244 + do_check_eq(getStartupReason(), ADDON_INSTALL); 1.245 + do_check_eq(getStartupOldVersion(), 0); 1.246 + do_check_true(b1.hasResource("install.rdf")); 1.247 + do_check_true(b1.hasResource("bootstrap.js")); 1.248 + do_check_false(b1.hasResource("foo.bar")); 1.249 + do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); 1.250 + 1.251 + let dir = do_get_addon_root_uri(profileDir, "bootstrap1@tests.mozilla.org"); 1.252 + do_check_eq(b1.getResourceURI("bootstrap.js").spec, dir + "bootstrap.js"); 1.253 + 1.254 + AddonManager.getAddonsWithOperationsByTypes(null, function(list) { 1.255 + do_check_eq(list.length, 0); 1.256 + 1.257 + do_execute_soon(run_test_2); 1.258 + }); 1.259 + }); 1.260 + }); 1.261 +} 1.262 + 1.263 +// Tests that disabling doesn't require a restart 1.264 +function run_test_2() { 1.265 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.266 + prepare_test({ 1.267 + "bootstrap1@tests.mozilla.org": [ 1.268 + ["onDisabling", false], 1.269 + "onDisabled" 1.270 + ] 1.271 + }); 1.272 + 1.273 + do_check_eq(b1.operationsRequiringRestart & 1.274 + AddonManager.OP_NEEDS_RESTART_DISABLE, 0); 1.275 + b1.userDisabled = true; 1.276 + ensure_test_completed(); 1.277 + 1.278 + do_check_neq(b1, null); 1.279 + do_check_eq(b1.version, "1.0"); 1.280 + do_check_false(b1.appDisabled); 1.281 + do_check_true(b1.userDisabled); 1.282 + do_check_false(b1.isActive); 1.283 + do_check_eq(getInstalledVersion(), 1); 1.284 + do_check_eq(getActiveVersion(), 0); 1.285 + do_check_eq(getShutdownReason(), ADDON_DISABLE); 1.286 + do_check_eq(getShutdownNewVersion(), 0); 1.287 + do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); 1.288 + 1.289 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(newb1) { 1.290 + do_check_neq(newb1, null); 1.291 + do_check_eq(newb1.version, "1.0"); 1.292 + do_check_false(newb1.appDisabled); 1.293 + do_check_true(newb1.userDisabled); 1.294 + do_check_false(newb1.isActive); 1.295 + 1.296 + do_check_bootstrappedPref(run_test_3); 1.297 + }); 1.298 + }); 1.299 +} 1.300 + 1.301 +// Test that restarting doesn't accidentally re-enable 1.302 +function run_test_3() { 1.303 + shutdownManager(); 1.304 + do_check_eq(getInstalledVersion(), 1); 1.305 + do_check_eq(getActiveVersion(), 0); 1.306 + do_check_eq(getShutdownReason(), ADDON_DISABLE); 1.307 + do_check_eq(getShutdownNewVersion(), 0); 1.308 + startupManager(false); 1.309 + do_check_eq(getInstalledVersion(), 1); 1.310 + do_check_eq(getActiveVersion(), 0); 1.311 + do_check_eq(getShutdownReason(), ADDON_DISABLE); 1.312 + do_check_eq(getShutdownNewVersion(), 0); 1.313 + do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); 1.314 + 1.315 + do_check_false(gExtensionsINI.exists()); 1.316 + 1.317 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.318 + do_check_neq(b1, null); 1.319 + do_check_eq(b1.version, "1.0"); 1.320 + do_check_false(b1.appDisabled); 1.321 + do_check_true(b1.userDisabled); 1.322 + do_check_false(b1.isActive); 1.323 + 1.324 + do_check_bootstrappedPref(run_test_4); 1.325 + }); 1.326 +} 1.327 + 1.328 +// Tests that enabling doesn't require a restart 1.329 +function run_test_4() { 1.330 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.331 + prepare_test({ 1.332 + "bootstrap1@tests.mozilla.org": [ 1.333 + ["onEnabling", false], 1.334 + "onEnabled" 1.335 + ] 1.336 + }); 1.337 + 1.338 + do_check_eq(b1.operationsRequiringRestart & 1.339 + AddonManager.OP_NEEDS_RESTART_ENABLE, 0); 1.340 + b1.userDisabled = false; 1.341 + ensure_test_completed(); 1.342 + 1.343 + do_check_neq(b1, null); 1.344 + do_check_eq(b1.version, "1.0"); 1.345 + do_check_false(b1.appDisabled); 1.346 + do_check_false(b1.userDisabled); 1.347 + do_check_true(b1.isActive); 1.348 + do_check_eq(getInstalledVersion(), 1); 1.349 + do_check_eq(getActiveVersion(), 1); 1.350 + do_check_eq(getStartupReason(), ADDON_ENABLE); 1.351 + do_check_eq(getStartupOldVersion(), 0); 1.352 + do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); 1.353 + 1.354 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(newb1) { 1.355 + do_check_neq(newb1, null); 1.356 + do_check_eq(newb1.version, "1.0"); 1.357 + do_check_false(newb1.appDisabled); 1.358 + do_check_false(newb1.userDisabled); 1.359 + do_check_true(newb1.isActive); 1.360 + 1.361 + do_check_bootstrappedPref(run_test_5); 1.362 + }); 1.363 + }); 1.364 +} 1.365 + 1.366 +// Tests that a restart shuts down and restarts the add-on 1.367 +function run_test_5() { 1.368 + shutdownManager(); 1.369 + // By the time we've shut down, the database must have been written 1.370 + do_check_true(gExtensionsJSON.exists()); 1.371 + 1.372 + do_check_eq(getInstalledVersion(), 1); 1.373 + do_check_eq(getActiveVersion(), 0); 1.374 + do_check_eq(getShutdownReason(), APP_SHUTDOWN); 1.375 + do_check_eq(getShutdownNewVersion(), 0); 1.376 + do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); 1.377 + startupManager(false); 1.378 + do_check_eq(getInstalledVersion(), 1); 1.379 + do_check_eq(getActiveVersion(), 1); 1.380 + do_check_eq(getStartupReason(), APP_STARTUP); 1.381 + do_check_eq(getStartupOldVersion(), 0); 1.382 + do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); 1.383 + 1.384 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.385 + do_check_neq(b1, null); 1.386 + do_check_eq(b1.version, "1.0"); 1.387 + do_check_false(b1.appDisabled); 1.388 + do_check_false(b1.userDisabled); 1.389 + do_check_true(b1.isActive); 1.390 + do_check_false(isExtensionInAddonsList(profileDir, b1.id)); 1.391 + 1.392 + do_check_bootstrappedPref(run_test_6); 1.393 + }); 1.394 +} 1.395 + 1.396 +// Tests that installing an upgrade doesn't require a restart 1.397 +function run_test_6() { 1.398 + prepare_test({ }, [ 1.399 + "onNewInstall" 1.400 + ]); 1.401 + 1.402 + AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_2"), function(install) { 1.403 + ensure_test_completed(); 1.404 + 1.405 + do_check_neq(install, null); 1.406 + do_check_eq(install.type, "extension"); 1.407 + do_check_eq(install.version, "2.0"); 1.408 + do_check_eq(install.name, "Test Bootstrap 1"); 1.409 + do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); 1.410 + 1.411 + waitForPref("bootstraptest.startup_reason", check_test_6); 1.412 + prepare_test({ 1.413 + "bootstrap1@tests.mozilla.org": [ 1.414 + ["onInstalling", false], 1.415 + "onInstalled" 1.416 + ] 1.417 + }, [ 1.418 + "onInstallStarted", 1.419 + "onInstallEnded", 1.420 + ], function() { 1.421 + }); 1.422 + install.install(); 1.423 + }); 1.424 +} 1.425 + 1.426 +function check_test_6() { 1.427 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.428 + do_check_neq(b1, null); 1.429 + do_check_eq(b1.version, "2.0"); 1.430 + do_check_false(b1.appDisabled); 1.431 + do_check_false(b1.userDisabled); 1.432 + do_check_true(b1.isActive); 1.433 + do_check_eq(getInstalledVersion(), 2); 1.434 + do_check_eq(getActiveVersion(), 2); 1.435 + do_check_eq(getStartupReason(), ADDON_UPGRADE); 1.436 + do_check_eq(getInstallOldVersion(), 1); 1.437 + do_check_eq(getStartupOldVersion(), 1); 1.438 + do_check_eq(getShutdownReason(), ADDON_UPGRADE); 1.439 + do_check_eq(getShutdownNewVersion(), 2); 1.440 + do_check_eq(getUninstallNewVersion(), 2); 1.441 + do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); 1.442 + do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "2.0"); 1.443 + 1.444 + do_check_bootstrappedPref(run_test_7); 1.445 + }); 1.446 +} 1.447 + 1.448 +// Tests that uninstalling doesn't require a restart 1.449 +function run_test_7() { 1.450 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.451 + prepare_test({ 1.452 + "bootstrap1@tests.mozilla.org": [ 1.453 + ["onUninstalling", false], 1.454 + "onUninstalled" 1.455 + ] 1.456 + }); 1.457 + 1.458 + do_check_eq(b1.operationsRequiringRestart & 1.459 + AddonManager.OP_NEEDS_RESTART_UNINSTALL, 0); 1.460 + b1.uninstall(); 1.461 + 1.462 + do_check_bootstrappedPref(check_test_7); 1.463 + }); 1.464 +} 1.465 + 1.466 +function check_test_7() { 1.467 + ensure_test_completed(); 1.468 + do_check_eq(getInstalledVersion(), 0); 1.469 + do_check_eq(getActiveVersion(), 0); 1.470 + do_check_eq(getShutdownReason(), ADDON_UNINSTALL); 1.471 + do_check_eq(getShutdownNewVersion(), 0); 1.472 + do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "2.0"); 1.473 + 1.474 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) { 1.475 + do_check_eq(b1, null); 1.476 + 1.477 + restartManager(); 1.478 + 1.479 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(newb1) { 1.480 + do_check_eq(newb1, null); 1.481 + 1.482 + do_check_bootstrappedPref(run_test_8); 1.483 + }); 1.484 + })); 1.485 +} 1.486 + 1.487 +// Test that a bootstrapped extension dropped into the profile loads properly 1.488 +// on startup and doesn't cause an EM restart 1.489 +function run_test_8() { 1.490 + shutdownManager(); 1.491 + 1.492 + manuallyInstall(do_get_addon("test_bootstrap1_1"), profileDir, 1.493 + "bootstrap1@tests.mozilla.org"); 1.494 + 1.495 + startupManager(false); 1.496 + 1.497 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.498 + do_check_neq(b1, null); 1.499 + do_check_eq(b1.version, "1.0"); 1.500 + do_check_false(b1.appDisabled); 1.501 + do_check_false(b1.userDisabled); 1.502 + do_check_true(b1.isActive); 1.503 + do_check_eq(getInstalledVersion(), 1); 1.504 + do_check_eq(getActiveVersion(), 1); 1.505 + do_check_eq(getStartupReason(), ADDON_INSTALL); 1.506 + do_check_eq(getStartupOldVersion(), 0); 1.507 + do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); 1.508 + 1.509 + do_check_bootstrappedPref(run_test_9); 1.510 + }); 1.511 +} 1.512 + 1.513 +// Test that items detected as removed during startup get removed properly 1.514 +function run_test_9() { 1.515 + shutdownManager(); 1.516 + 1.517 + manuallyUninstall(profileDir, "bootstrap1@tests.mozilla.org"); 1.518 + 1.519 + startupManager(false); 1.520 + 1.521 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.522 + do_check_eq(b1, null); 1.523 + do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); 1.524 + 1.525 + do_check_bootstrappedPref(run_test_10); 1.526 + }); 1.527 +} 1.528 + 1.529 + 1.530 +// Tests that installing a downgrade sends the right reason 1.531 +function run_test_10() { 1.532 + resetPrefs(); 1.533 + prepare_test({ }, [ 1.534 + "onNewInstall" 1.535 + ]); 1.536 + 1.537 + AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_2"), function(install) { 1.538 + ensure_test_completed(); 1.539 + 1.540 + do_check_neq(install, null); 1.541 + do_check_eq(install.type, "extension"); 1.542 + do_check_eq(install.version, "2.0"); 1.543 + do_check_eq(install.name, "Test Bootstrap 1"); 1.544 + do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); 1.545 + do_check_true(install.addon.hasResource("install.rdf")); 1.546 + do_check_true(install.addon.hasResource("bootstrap.js")); 1.547 + do_check_false(install.addon.hasResource("foo.bar")); 1.548 + do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "2.0"); 1.549 + 1.550 + waitForPref("bootstraptest.startup_reason", check_test_10_pt1); 1.551 + prepare_test({ 1.552 + "bootstrap1@tests.mozilla.org": [ 1.553 + ["onInstalling", false], 1.554 + "onInstalled" 1.555 + ] 1.556 + }, [ 1.557 + "onInstallStarted", 1.558 + "onInstallEnded", 1.559 + ], function() { 1.560 + do_print("Waiting for startup of bootstrap1_2"); 1.561 + }); 1.562 + install.install(); 1.563 + }); 1.564 +} 1.565 + 1.566 +function check_test_10_pt1() { 1.567 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.568 + do_check_neq(b1, null); 1.569 + do_check_eq(b1.version, "2.0"); 1.570 + do_check_false(b1.appDisabled); 1.571 + do_check_false(b1.userDisabled); 1.572 + do_check_true(b1.isActive); 1.573 + do_check_eq(getInstalledVersion(), 2); 1.574 + do_check_eq(getActiveVersion(), 2); 1.575 + do_check_eq(getStartupReason(), ADDON_INSTALL); 1.576 + do_check_eq(getStartupOldVersion(), 0); 1.577 + do_check_true(b1.hasResource("install.rdf")); 1.578 + do_check_true(b1.hasResource("bootstrap.js")); 1.579 + do_check_false(b1.hasResource("foo.bar")); 1.580 + do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "2.0"); 1.581 + 1.582 + prepare_test({ }, [ 1.583 + "onNewInstall" 1.584 + ]); 1.585 + 1.586 + AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_1"), function(install) { 1.587 + ensure_test_completed(); 1.588 + 1.589 + do_check_neq(install, null); 1.590 + do_check_eq(install.type, "extension"); 1.591 + do_check_eq(install.version, "1.0"); 1.592 + do_check_eq(install.name, "Test Bootstrap 1"); 1.593 + do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); 1.594 + 1.595 + waitForPref("bootstraptest.startup_reason", check_test_10_pt2); 1.596 + prepare_test({ 1.597 + "bootstrap1@tests.mozilla.org": [ 1.598 + ["onInstalling", false], 1.599 + "onInstalled" 1.600 + ] 1.601 + }, [ 1.602 + "onInstallStarted", 1.603 + "onInstallEnded", 1.604 + ], function() { }); 1.605 + install.install(); 1.606 + }); 1.607 + }); 1.608 +} 1.609 + 1.610 +function check_test_10_pt2() { 1.611 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.612 + do_check_neq(b1, null); 1.613 + do_check_eq(b1.version, "1.0"); 1.614 + do_check_false(b1.appDisabled); 1.615 + do_check_false(b1.userDisabled); 1.616 + do_check_true(b1.isActive); 1.617 + do_check_eq(getInstalledVersion(), 1); 1.618 + do_check_eq(getActiveVersion(), 1); 1.619 + do_check_eq(getStartupReason(), ADDON_DOWNGRADE); 1.620 + do_check_eq(getInstallOldVersion(), 2); 1.621 + do_check_eq(getStartupOldVersion(), 2); 1.622 + do_check_eq(getShutdownReason(), ADDON_DOWNGRADE); 1.623 + do_check_eq(getShutdownNewVersion(), 1); 1.624 + do_check_eq(getUninstallNewVersion(), 1); 1.625 + do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); 1.626 + do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "2.0"); 1.627 + 1.628 + do_check_bootstrappedPref(run_test_11); 1.629 + }); 1.630 +} 1.631 + 1.632 +// Tests that uninstalling a disabled add-on still calls the uninstall method 1.633 +function run_test_11() { 1.634 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.635 + prepare_test({ 1.636 + "bootstrap1@tests.mozilla.org": [ 1.637 + ["onDisabling", false], 1.638 + "onDisabled", 1.639 + ["onUninstalling", false], 1.640 + "onUninstalled" 1.641 + ] 1.642 + }); 1.643 + 1.644 + b1.userDisabled = true; 1.645 + 1.646 + do_check_eq(getInstalledVersion(), 1); 1.647 + do_check_eq(getActiveVersion(), 0); 1.648 + do_check_eq(getShutdownReason(), ADDON_DISABLE); 1.649 + do_check_eq(getShutdownNewVersion(), 0); 1.650 + do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); 1.651 + 1.652 + b1.uninstall(); 1.653 + 1.654 + check_test_11(); 1.655 + }); 1.656 +} 1.657 + 1.658 +function check_test_11() { 1.659 + ensure_test_completed(); 1.660 + do_check_eq(getInstalledVersion(), 0); 1.661 + do_check_eq(getActiveVersion(), 0); 1.662 + do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); 1.663 + 1.664 + do_check_bootstrappedPref(run_test_12); 1.665 +} 1.666 + 1.667 +// Tests that bootstrapped extensions are correctly loaded even if the app is 1.668 +// upgraded at the same time 1.669 +function run_test_12() { 1.670 + shutdownManager(); 1.671 + 1.672 + manuallyInstall(do_get_addon("test_bootstrap1_1"), profileDir, 1.673 + "bootstrap1@tests.mozilla.org"); 1.674 + 1.675 + startupManager(true); 1.676 + 1.677 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.678 + do_check_neq(b1, null); 1.679 + do_check_eq(b1.version, "1.0"); 1.680 + do_check_false(b1.appDisabled); 1.681 + do_check_false(b1.userDisabled); 1.682 + do_check_true(b1.isActive); 1.683 + do_check_eq(getInstalledVersion(), 1); 1.684 + do_check_eq(getActiveVersion(), 1); 1.685 + do_check_eq(getStartupReason(), ADDON_INSTALL); 1.686 + do_check_eq(getStartupOldVersion(), 0); 1.687 + do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); 1.688 + 1.689 + b1.uninstall(); 1.690 + do_execute_soon(test_12_restart); 1.691 + }); 1.692 +} 1.693 + 1.694 +function test_12_restart() { 1.695 + restartManager(); 1.696 + do_check_bootstrappedPref(run_test_13); 1.697 +} 1.698 + 1.699 + 1.700 +// Tests that installing a bootstrapped extension with an invalid application 1.701 +// entry doesn't call it's startup method 1.702 +function run_test_13() { 1.703 + prepare_test({ }, [ 1.704 + "onNewInstall" 1.705 + ]); 1.706 + 1.707 + AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_3"), function(install) { 1.708 + ensure_test_completed(); 1.709 + 1.710 + do_check_neq(install, null); 1.711 + do_check_eq(install.type, "extension"); 1.712 + do_check_eq(install.version, "3.0"); 1.713 + do_check_eq(install.name, "Test Bootstrap 1"); 1.714 + do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); 1.715 + do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "3.0"); 1.716 + 1.717 + prepare_test({ 1.718 + "bootstrap1@tests.mozilla.org": [ 1.719 + ["onInstalling", false], 1.720 + "onInstalled" 1.721 + ] 1.722 + }, [ 1.723 + "onInstallStarted", 1.724 + "onInstallEnded", 1.725 + ], callback_soon(check_test_13)); 1.726 + install.install(); 1.727 + }); 1.728 +} 1.729 + 1.730 +function check_test_13() { 1.731 + AddonManager.getAllInstalls(function(installs) { 1.732 + // There should be no active installs now since the install completed and 1.733 + // doesn't require a restart. 1.734 + do_check_eq(installs.length, 0); 1.735 + 1.736 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.737 + do_check_neq(b1, null); 1.738 + do_check_eq(b1.version, "3.0"); 1.739 + do_check_true(b1.appDisabled); 1.740 + do_check_false(b1.userDisabled); 1.741 + do_check_false(b1.isActive); 1.742 + do_check_eq(getInstalledVersion(), 3); // We call install even for disabled add-ons 1.743 + do_check_eq(getActiveVersion(), 0); // Should not have called startup though 1.744 + do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "3.0"); 1.745 + 1.746 + do_execute_soon(test_13_restart); 1.747 + }); 1.748 + }); 1.749 +} 1.750 + 1.751 +function test_13_restart() { 1.752 + restartManager(); 1.753 + 1.754 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.755 + do_check_neq(b1, null); 1.756 + do_check_eq(b1.version, "3.0"); 1.757 + do_check_true(b1.appDisabled); 1.758 + do_check_false(b1.userDisabled); 1.759 + do_check_false(b1.isActive); 1.760 + do_check_eq(getInstalledVersion(), 3); // We call install even for disabled add-ons 1.761 + do_check_eq(getActiveVersion(), 0); // Should not have called startup though 1.762 + do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "3.0"); 1.763 + 1.764 + do_check_bootstrappedPref(function() { 1.765 + b1.uninstall(); 1.766 + do_execute_soon(run_test_14); 1.767 + }); 1.768 + }); 1.769 +} 1.770 + 1.771 +// Tests that a bootstrapped extension with an invalid target application entry 1.772 +// does not get loaded when detected during startup 1.773 +function run_test_14() { 1.774 + restartManager(); 1.775 + 1.776 + shutdownManager(); 1.777 + 1.778 + manuallyInstall(do_get_addon("test_bootstrap1_3"), profileDir, 1.779 + "bootstrap1@tests.mozilla.org"); 1.780 + 1.781 + startupManager(false); 1.782 + 1.783 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.784 + do_check_neq(b1, null); 1.785 + do_check_eq(b1.version, "3.0"); 1.786 + do_check_true(b1.appDisabled); 1.787 + do_check_false(b1.userDisabled); 1.788 + do_check_false(b1.isActive); 1.789 + do_check_eq(getInstalledVersion(), 3); // We call install even for disabled add-ons 1.790 + do_check_eq(getActiveVersion(), 0); // Should not have called startup though 1.791 + do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "3.0"); 1.792 + 1.793 + do_check_bootstrappedPref(function() { 1.794 + b1.uninstall(); 1.795 + 1.796 + run_test_15(); 1.797 + }); 1.798 + }); 1.799 +} 1.800 + 1.801 +// Tests that upgrading a disabled bootstrapped extension still calls uninstall 1.802 +// and install but doesn't startup the new version 1.803 +function run_test_15() { 1.804 + resetPrefs(); 1.805 + waitForPref("bootstraptest.startup_reason", function test_15_after_startup() { 1.806 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.807 + do_check_neq(b1, null); 1.808 + do_check_eq(b1.version, "1.0"); 1.809 + do_check_false(b1.appDisabled); 1.810 + do_check_false(b1.userDisabled); 1.811 + do_check_true(b1.isActive); 1.812 + do_check_eq(getInstalledVersion(), 1); 1.813 + do_check_eq(getActiveVersion(), 1); 1.814 + 1.815 + b1.userDisabled = true; 1.816 + do_check_false(b1.isActive); 1.817 + do_check_eq(getInstalledVersion(), 1); 1.818 + do_check_eq(getActiveVersion(), 0); 1.819 + 1.820 + prepare_test({ }, [ 1.821 + "onNewInstall" 1.822 + ]); 1.823 + 1.824 + AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_2"), function(install) { 1.825 + ensure_test_completed(); 1.826 + 1.827 + do_check_neq(install, null); 1.828 + do_check_true(install.addon.userDisabled); 1.829 + 1.830 + prepare_test({ 1.831 + "bootstrap1@tests.mozilla.org": [ 1.832 + ["onInstalling", false], 1.833 + "onInstalled" 1.834 + ] 1.835 + }, [ 1.836 + "onInstallStarted", 1.837 + "onInstallEnded", 1.838 + ], callback_soon(check_test_15)); 1.839 + install.install(); 1.840 + }); 1.841 + }); 1.842 + }); 1.843 + installAllFiles([do_get_addon("test_bootstrap1_1")], function test_15_addon_installed() { }); 1.844 +} 1.845 + 1.846 +function check_test_15() { 1.847 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.848 + do_check_neq(b1, null); 1.849 + do_check_eq(b1.version, "2.0"); 1.850 + do_check_false(b1.appDisabled); 1.851 + do_check_true(b1.userDisabled); 1.852 + do_check_false(b1.isActive); 1.853 + do_check_eq(getInstalledVersion(), 2); 1.854 + do_check_eq(getActiveVersion(), 0); 1.855 + 1.856 + do_check_bootstrappedPref(function() { 1.857 + restartManager(); 1.858 + 1.859 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.860 + do_check_neq(b1, null); 1.861 + do_check_eq(b1.version, "2.0"); 1.862 + do_check_false(b1.appDisabled); 1.863 + do_check_true(b1.userDisabled); 1.864 + do_check_false(b1.isActive); 1.865 + do_check_eq(getInstalledVersion(), 2); 1.866 + do_check_eq(getActiveVersion(), 0); 1.867 + 1.868 + b1.uninstall(); 1.869 + 1.870 + run_test_16(); 1.871 + }); 1.872 + }); 1.873 + }); 1.874 +} 1.875 + 1.876 +// Tests that bootstrapped extensions don't get loaded when in safe mode 1.877 +function run_test_16() { 1.878 + resetPrefs(); 1.879 + waitForPref("bootstraptest.startup_reason", function test_16_after_startup() { 1.880 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) { 1.881 + // Should have installed and started 1.882 + do_check_eq(getInstalledVersion(), 1); 1.883 + do_check_eq(getActiveVersion(), 1); 1.884 + do_check_true(b1.isActive); 1.885 + do_check_eq(b1.iconURL, "chrome://foo/skin/icon.png"); 1.886 + do_check_eq(b1.aboutURL, "chrome://foo/content/about.xul"); 1.887 + do_check_eq(b1.optionsURL, "chrome://foo/content/options.xul"); 1.888 + 1.889 + shutdownManager(); 1.890 + 1.891 + // Should have stopped 1.892 + do_check_eq(getInstalledVersion(), 1); 1.893 + do_check_eq(getActiveVersion(), 0); 1.894 + 1.895 + gAppInfo.inSafeMode = true; 1.896 + startupManager(false); 1.897 + 1.898 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) { 1.899 + // Should still be stopped 1.900 + do_check_eq(getInstalledVersion(), 1); 1.901 + do_check_eq(getActiveVersion(), 0); 1.902 + do_check_false(b1.isActive); 1.903 + do_check_eq(b1.iconURL, null); 1.904 + do_check_eq(b1.aboutURL, null); 1.905 + do_check_eq(b1.optionsURL, null); 1.906 + 1.907 + shutdownManager(); 1.908 + gAppInfo.inSafeMode = false; 1.909 + startupManager(false); 1.910 + 1.911 + // Should have started 1.912 + do_check_eq(getInstalledVersion(), 1); 1.913 + do_check_eq(getActiveVersion(), 1); 1.914 + 1.915 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.916 + b1.uninstall(); 1.917 + 1.918 + do_execute_soon(run_test_17); 1.919 + }); 1.920 + })); 1.921 + })); 1.922 + }); 1.923 + installAllFiles([do_get_addon("test_bootstrap1_1")], function() { }); 1.924 +} 1.925 + 1.926 +// Check that a bootstrapped extension in a non-profile location is loaded 1.927 +function run_test_17() { 1.928 + shutdownManager(); 1.929 + 1.930 + manuallyInstall(do_get_addon("test_bootstrap1_1"), userExtDir, 1.931 + "bootstrap1@tests.mozilla.org"); 1.932 + 1.933 + resetPrefs(); 1.934 + startupManager(); 1.935 + 1.936 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.937 + // Should have installed and started 1.938 + do_check_eq(getInstalledVersion(), 1); 1.939 + do_check_eq(getActiveVersion(), 1); 1.940 + do_check_neq(b1, null); 1.941 + do_check_eq(b1.version, "1.0"); 1.942 + do_check_true(b1.isActive); 1.943 + 1.944 + do_check_bootstrappedPref(run_test_18); 1.945 + }); 1.946 +} 1.947 + 1.948 +// Check that installing a new bootstrapped extension in the profile replaces 1.949 +// the existing one 1.950 +function run_test_18() { 1.951 + resetPrefs(); 1.952 + waitForPref("bootstraptest.startup_reason", function test_16_after_startup() { 1.953 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.954 + // Should have installed and started 1.955 + do_check_eq(getInstalledVersion(), 2); 1.956 + do_check_eq(getActiveVersion(), 2); 1.957 + do_check_neq(b1, null); 1.958 + do_check_eq(b1.version, "2.0"); 1.959 + do_check_true(b1.isActive); 1.960 + 1.961 + do_check_eq(getShutdownReason(), ADDON_UPGRADE); 1.962 + do_check_eq(getUninstallReason(), ADDON_UPGRADE); 1.963 + do_check_eq(getInstallReason(), ADDON_UPGRADE); 1.964 + do_check_eq(getStartupReason(), ADDON_UPGRADE); 1.965 + 1.966 + do_check_eq(getShutdownNewVersion(), 2); 1.967 + do_check_eq(getUninstallNewVersion(), 2); 1.968 + do_check_eq(getInstallOldVersion(), 1); 1.969 + do_check_eq(getStartupOldVersion(), 1); 1.970 + 1.971 + do_check_bootstrappedPref(run_test_19); 1.972 + }); 1.973 + }); 1.974 + installAllFiles([do_get_addon("test_bootstrap1_2")], function() { }); 1.975 +} 1.976 + 1.977 +// Check that uninstalling the profile version reveals the non-profile one 1.978 +function run_test_19() { 1.979 + resetPrefs(); 1.980 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.981 + // The revealed add-on gets activated asynchronously 1.982 + prepare_test({ 1.983 + "bootstrap1@tests.mozilla.org": [ 1.984 + ["onUninstalling", false], 1.985 + "onUninstalled", 1.986 + ["onInstalling", false], 1.987 + "onInstalled" 1.988 + ] 1.989 + }, [], check_test_19); 1.990 + 1.991 + b1.uninstall(); 1.992 + }); 1.993 +} 1.994 + 1.995 +function check_test_19() { 1.996 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.997 + // Should have reverted to the older version 1.998 + do_check_eq(getInstalledVersion(), 1); 1.999 + do_check_eq(getActiveVersion(), 1); 1.1000 + do_check_neq(b1, null); 1.1001 + do_check_eq(b1.version, "1.0"); 1.1002 + do_check_true(b1.isActive); 1.1003 + 1.1004 + // TODO these reasons really should be ADDON_DOWNGRADE (bug 607818) 1.1005 + do_check_eq(getShutdownReason(), ADDON_UNINSTALL); 1.1006 + do_check_eq(getUninstallReason(), ADDON_UNINSTALL); 1.1007 + do_check_eq(getInstallReason(), ADDON_INSTALL); 1.1008 + do_check_eq(getStartupReason(), ADDON_INSTALL); 1.1009 + 1.1010 + do_check_eq(getShutdownNewVersion(), 0); 1.1011 + do_check_eq(getUninstallNewVersion(), 0); 1.1012 + do_check_eq(getInstallOldVersion(), 0); 1.1013 + do_check_eq(getStartupOldVersion(), 0); 1.1014 + 1.1015 + do_check_bootstrappedPref(run_test_20); 1.1016 + }); 1.1017 +} 1.1018 + 1.1019 +// Check that a new profile extension detected at startup replaces the non-profile 1.1020 +// one 1.1021 +function run_test_20() { 1.1022 + resetPrefs(); 1.1023 + shutdownManager(); 1.1024 + 1.1025 + manuallyInstall(do_get_addon("test_bootstrap1_2"), profileDir, 1.1026 + "bootstrap1@tests.mozilla.org"); 1.1027 + 1.1028 + startupManager(); 1.1029 + 1.1030 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.1031 + // Should have installed and started 1.1032 + do_check_eq(getInstalledVersion(), 2); 1.1033 + do_check_eq(getActiveVersion(), 2); 1.1034 + do_check_neq(b1, null); 1.1035 + do_check_eq(b1.version, "2.0"); 1.1036 + do_check_true(b1.isActive); 1.1037 + 1.1038 + do_check_eq(getShutdownReason(), APP_SHUTDOWN); 1.1039 + do_check_eq(getUninstallReason(), ADDON_UPGRADE); 1.1040 + do_check_eq(getInstallReason(), ADDON_UPGRADE); 1.1041 + do_check_eq(getStartupReason(), APP_STARTUP); 1.1042 + 1.1043 + do_check_eq(getShutdownNewVersion(), 0); 1.1044 + do_check_eq(getUninstallNewVersion(), 2); 1.1045 + do_check_eq(getInstallOldVersion(), 1); 1.1046 + do_check_eq(getStartupOldVersion(), 0); 1.1047 + 1.1048 + do_execute_soon(run_test_21); 1.1049 + }); 1.1050 +} 1.1051 + 1.1052 +// Check that a detected removal reveals the non-profile one 1.1053 +function run_test_21() { 1.1054 + resetPrefs(); 1.1055 + shutdownManager(); 1.1056 + 1.1057 + manuallyUninstall(profileDir, "bootstrap1@tests.mozilla.org"); 1.1058 + 1.1059 + startupManager(); 1.1060 + 1.1061 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.1062 + // Should have installed and started 1.1063 + do_check_eq(getInstalledVersion(), 1); 1.1064 + do_check_eq(getActiveVersion(), 1); 1.1065 + do_check_neq(b1, null); 1.1066 + do_check_eq(b1.version, "1.0"); 1.1067 + do_check_true(b1.isActive); 1.1068 + 1.1069 + do_check_eq(getShutdownReason(), APP_SHUTDOWN); 1.1070 + do_check_eq(getShutdownNewVersion(), 0); 1.1071 + 1.1072 + // This won't be set as the bootstrap script was gone so we couldn't 1.1073 + // uninstall it properly 1.1074 + do_check_eq(getUninstallReason(), -1); 1.1075 + do_check_eq(getUninstallNewVersion(), -1); 1.1076 + 1.1077 + // TODO this reason should probably be ADDON_DOWNGRADE (bug 607818) 1.1078 + do_check_eq(getInstallReason(), ADDON_INSTALL); 1.1079 + do_check_eq(getInstallOldVersion(), 0); 1.1080 + 1.1081 + do_check_eq(getStartupReason(), APP_STARTUP); 1.1082 + do_check_eq(getStartupOldVersion(), 0); 1.1083 + 1.1084 + do_check_bootstrappedPref(function() { 1.1085 + manuallyUninstall(userExtDir, "bootstrap1@tests.mozilla.org"); 1.1086 + 1.1087 + restartManager(); 1.1088 + run_test_22(); 1.1089 + }); 1.1090 + }); 1.1091 +} 1.1092 + 1.1093 +// Check that an upgrade from the filesystem is detected and applied correctly 1.1094 +function run_test_22() { 1.1095 + shutdownManager(); 1.1096 + 1.1097 + let file = manuallyInstall(do_get_addon("test_bootstrap1_1"), profileDir, 1.1098 + "bootstrap1@tests.mozilla.org"); 1.1099 + 1.1100 + // Make it look old so changes are detected 1.1101 + setExtensionModifiedTime(file, file.lastModifiedTime - 5000); 1.1102 + 1.1103 + startupManager(); 1.1104 + 1.1105 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) { 1.1106 + // Should have installed and started 1.1107 + do_check_eq(getInstalledVersion(), 1); 1.1108 + do_check_eq(getActiveVersion(), 1); 1.1109 + do_check_neq(b1, null); 1.1110 + do_check_eq(b1.version, "1.0"); 1.1111 + do_check_true(b1.isActive); 1.1112 + 1.1113 + resetPrefs(); 1.1114 + shutdownManager(); 1.1115 + 1.1116 + manuallyUninstall(profileDir, "bootstrap1@tests.mozilla.org"); 1.1117 + manuallyInstall(do_get_addon("test_bootstrap1_2"), profileDir, 1.1118 + "bootstrap1@tests.mozilla.org"); 1.1119 + 1.1120 + startupManager(); 1.1121 + 1.1122 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.1123 + // Should have installed and started 1.1124 + do_check_eq(getInstalledVersion(), 2); 1.1125 + do_check_eq(getActiveVersion(), 2); 1.1126 + do_check_neq(b1, null); 1.1127 + do_check_eq(b1.version, "2.0"); 1.1128 + do_check_true(b1.isActive); 1.1129 + 1.1130 + do_check_eq(getShutdownReason(), APP_SHUTDOWN); 1.1131 + do_check_eq(getShutdownNewVersion(), 0); 1.1132 + 1.1133 + // This won't be set as the bootstrap script was gone so we couldn't 1.1134 + // uninstall it properly 1.1135 + do_check_eq(getUninstallReason(), -1); 1.1136 + do_check_eq(getUninstallNewVersion(), -1); 1.1137 + 1.1138 + do_check_eq(getInstallReason(), ADDON_UPGRADE); 1.1139 + do_check_eq(getInstallOldVersion(), 1); 1.1140 + do_check_eq(getStartupReason(), APP_STARTUP); 1.1141 + do_check_eq(getStartupOldVersion(), 0); 1.1142 + 1.1143 + do_check_bootstrappedPref(function() { 1.1144 + b1.uninstall(); 1.1145 + 1.1146 + run_test_23(); 1.1147 + }); 1.1148 + }); 1.1149 + })); 1.1150 +} 1.1151 + 1.1152 + 1.1153 +// Tests that installing from a URL doesn't require a restart 1.1154 +function run_test_23() { 1.1155 + prepare_test({ }, [ 1.1156 + "onNewInstall" 1.1157 + ]); 1.1158 + 1.1159 + let url = "http://localhost:" + gPort + "/addons/test_bootstrap1_1.xpi"; 1.1160 + AddonManager.getInstallForURL(url, function(install) { 1.1161 + ensure_test_completed(); 1.1162 + 1.1163 + do_check_neq(install, null); 1.1164 + 1.1165 + prepare_test({ }, [ 1.1166 + "onDownloadStarted", 1.1167 + "onDownloadEnded" 1.1168 + ], function() { 1.1169 + do_check_eq(install.type, "extension"); 1.1170 + do_check_eq(install.version, "1.0"); 1.1171 + do_check_eq(install.name, "Test Bootstrap 1"); 1.1172 + do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); 1.1173 + do_check_true(install.addon.hasResource("install.rdf")); 1.1174 + do_check_true(install.addon.hasResource("bootstrap.js")); 1.1175 + do_check_false(install.addon.hasResource("foo.bar")); 1.1176 + do_check_eq(install.addon.operationsRequiringRestart & 1.1177 + AddonManager.OP_NEEDS_RESTART_INSTALL, 0); 1.1178 + do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); 1.1179 + 1.1180 + let addon = install.addon; 1.1181 + prepare_test({ 1.1182 + "bootstrap1@tests.mozilla.org": [ 1.1183 + ["onInstalling", false], 1.1184 + "onInstalled" 1.1185 + ] 1.1186 + }, [ 1.1187 + "onInstallStarted", 1.1188 + "onInstallEnded", 1.1189 + ], function() { 1.1190 + do_check_true(addon.hasResource("install.rdf")); 1.1191 + do_check_bootstrappedPref(check_test_23); 1.1192 + }); 1.1193 + }); 1.1194 + install.install(); 1.1195 + }, "application/x-xpinstall"); 1.1196 +} 1.1197 + 1.1198 +function check_test_23() { 1.1199 + AddonManager.getAllInstalls(function(installs) { 1.1200 + // There should be no active installs now since the install completed and 1.1201 + // doesn't require a restart. 1.1202 + do_check_eq(installs.length, 0); 1.1203 + 1.1204 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.1205 + do_execute_soon(function test_23_after_startup() { 1.1206 + do_check_neq(b1, null); 1.1207 + do_check_eq(b1.version, "1.0"); 1.1208 + do_check_false(b1.appDisabled); 1.1209 + do_check_false(b1.userDisabled); 1.1210 + do_check_true(b1.isActive); 1.1211 + do_check_eq(getInstalledVersion(), 1); 1.1212 + do_check_eq(getActiveVersion(), 1); 1.1213 + do_check_eq(getStartupReason(), ADDON_INSTALL); 1.1214 + do_check_eq(getStartupOldVersion(), 0); 1.1215 + do_check_true(b1.hasResource("install.rdf")); 1.1216 + do_check_true(b1.hasResource("bootstrap.js")); 1.1217 + do_check_false(b1.hasResource("foo.bar")); 1.1218 + do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0"); 1.1219 + 1.1220 + let dir = do_get_addon_root_uri(profileDir, "bootstrap1@tests.mozilla.org"); 1.1221 + do_check_eq(b1.getResourceURI("bootstrap.js").spec, dir + "bootstrap.js"); 1.1222 + 1.1223 + AddonManager.getAddonsWithOperationsByTypes(null, callback_soon(function(list) { 1.1224 + do_check_eq(list.length, 0); 1.1225 + 1.1226 + restartManager(); 1.1227 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) { 1.1228 + b1.uninstall(); 1.1229 + restartManager(); 1.1230 + 1.1231 + testserver.stop(run_test_24); 1.1232 + })); 1.1233 + })); 1.1234 + }); 1.1235 + }); 1.1236 + }); 1.1237 +} 1.1238 + 1.1239 +// Tests that we recover from a broken preference 1.1240 +function run_test_24() { 1.1241 + resetPrefs(); 1.1242 + do_print("starting 24"); 1.1243 + 1.1244 + Promise.all([promisePref("bootstraptest2.active_version"), 1.1245 + promiseInstall([do_get_addon("test_bootstrap1_1"), do_get_addon("test_bootstrap2_1")])]) 1.1246 + .then(function test_24_pref() { 1.1247 + do_print("test 24 got prefs"); 1.1248 + do_check_eq(getInstalledVersion(), 1); 1.1249 + do_check_eq(getActiveVersion(), 1); 1.1250 + do_check_eq(getInstalledVersion2(), 1); 1.1251 + do_check_eq(getActiveVersion2(), 1); 1.1252 + 1.1253 + resetPrefs(); 1.1254 + 1.1255 + restartManager(); 1.1256 + 1.1257 + do_check_eq(getInstalledVersion(), -1); 1.1258 + do_check_eq(getActiveVersion(), 1); 1.1259 + do_check_eq(getInstalledVersion2(), -1); 1.1260 + do_check_eq(getActiveVersion2(), 1); 1.1261 + 1.1262 + shutdownManager(); 1.1263 + 1.1264 + do_check_eq(getInstalledVersion(), -1); 1.1265 + do_check_eq(getActiveVersion(), 0); 1.1266 + do_check_eq(getInstalledVersion2(), -1); 1.1267 + do_check_eq(getActiveVersion2(), 0); 1.1268 + 1.1269 + // Break the preferece 1.1270 + let bootstrappedAddons = JSON.parse(Services.prefs.getCharPref("extensions.bootstrappedAddons")); 1.1271 + bootstrappedAddons["bootstrap1@tests.mozilla.org"].descriptor += "foo"; 1.1272 + Services.prefs.setCharPref("extensions.bootstrappedAddons", JSON.stringify(bootstrappedAddons)); 1.1273 + 1.1274 + startupManager(false); 1.1275 + 1.1276 + do_check_eq(getInstalledVersion(), -1); 1.1277 + do_check_eq(getActiveVersion(), 1); 1.1278 + do_check_eq(getInstalledVersion2(), -1); 1.1279 + do_check_eq(getActiveVersion2(), 1); 1.1280 + 1.1281 + run_test_25(); 1.1282 + }); 1.1283 +} 1.1284 + 1.1285 +// Tests that updating from a bootstrappable add-on to a normal add-on calls 1.1286 +// the uninstall method 1.1287 +function run_test_25() { 1.1288 + waitForPref("bootstraptest.startup_reason", function test_25_after_pref() { 1.1289 + do_print("test 25 pref change detected"); 1.1290 + do_check_eq(getInstalledVersion(), 1); 1.1291 + do_check_eq(getActiveVersion(), 1); 1.1292 + 1.1293 + installAllFiles([do_get_addon("test_bootstrap1_4")], function() { 1.1294 + // Needs a restart to complete this so the old version stays running 1.1295 + do_check_eq(getInstalledVersion(), 1); 1.1296 + do_check_eq(getActiveVersion(), 1); 1.1297 + 1.1298 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) { 1.1299 + do_check_neq(b1, null); 1.1300 + do_check_eq(b1.version, "1.0"); 1.1301 + do_check_true(b1.isActive); 1.1302 + do_check_true(hasFlag(b1.pendingOperations, AddonManager.PENDING_UPGRADE)); 1.1303 + 1.1304 + restartManager(); 1.1305 + 1.1306 + do_check_eq(getInstalledVersion(), 0); 1.1307 + do_check_eq(getUninstallReason(), ADDON_UPGRADE); 1.1308 + do_check_eq(getUninstallNewVersion(), 4); 1.1309 + do_check_eq(getActiveVersion(), 0); 1.1310 + 1.1311 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.1312 + do_check_neq(b1, null); 1.1313 + do_check_eq(b1.version, "4.0"); 1.1314 + do_check_true(b1.isActive); 1.1315 + do_check_eq(b1.pendingOperations, AddonManager.PENDING_NONE); 1.1316 + 1.1317 + do_check_bootstrappedPref(run_test_26); 1.1318 + }); 1.1319 + })); 1.1320 + }); 1.1321 + }); 1.1322 + installAllFiles([do_get_addon("test_bootstrap1_1")], function test_25_installed() { 1.1323 + do_print("test 25 install done"); 1.1324 + }); 1.1325 +} 1.1326 + 1.1327 +// Tests that updating from a normal add-on to a bootstrappable add-on calls 1.1328 +// the install method 1.1329 +function run_test_26() { 1.1330 + installAllFiles([do_get_addon("test_bootstrap1_1")], function() { 1.1331 + // Needs a restart to complete this 1.1332 + do_check_eq(getInstalledVersion(), 0); 1.1333 + do_check_eq(getActiveVersion(), 0); 1.1334 + 1.1335 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) { 1.1336 + do_check_neq(b1, null); 1.1337 + do_check_eq(b1.version, "4.0"); 1.1338 + do_check_true(b1.isActive); 1.1339 + do_check_true(hasFlag(b1.pendingOperations, AddonManager.PENDING_UPGRADE)); 1.1340 + 1.1341 + restartManager(); 1.1342 + 1.1343 + do_check_eq(getInstalledVersion(), 1); 1.1344 + do_check_eq(getInstallReason(), ADDON_DOWNGRADE); 1.1345 + do_check_eq(getInstallOldVersion(), 4); 1.1346 + do_check_eq(getActiveVersion(), 1); 1.1347 + 1.1348 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.1349 + do_check_neq(b1, null); 1.1350 + do_check_eq(b1.version, "1.0"); 1.1351 + do_check_true(b1.isActive); 1.1352 + do_check_eq(b1.pendingOperations, AddonManager.PENDING_NONE); 1.1353 + 1.1354 + do_check_bootstrappedPref(run_test_27); 1.1355 + }); 1.1356 + })); 1.1357 + }); 1.1358 +} 1.1359 + 1.1360 +// Tests that updating from a bootstrappable add-on to a normal add-on while 1.1361 +// disabled calls the uninstall method 1.1362 +function run_test_27() { 1.1363 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.1364 + do_check_neq(b1, null); 1.1365 + b1.userDisabled = true; 1.1366 + do_check_eq(b1.version, "1.0"); 1.1367 + do_check_false(b1.isActive); 1.1368 + do_check_eq(b1.pendingOperations, AddonManager.PENDING_NONE); 1.1369 + do_check_eq(getInstalledVersion(), 1); 1.1370 + do_check_eq(getActiveVersion(), 0); 1.1371 + 1.1372 + installAllFiles([do_get_addon("test_bootstrap1_4")], function() { 1.1373 + // Updating disabled things happens immediately 1.1374 + do_check_eq(getInstalledVersion(), 0); 1.1375 + do_check_eq(getUninstallReason(), ADDON_UPGRADE); 1.1376 + do_check_eq(getUninstallNewVersion(), 4); 1.1377 + do_check_eq(getActiveVersion(), 0); 1.1378 + 1.1379 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) { 1.1380 + do_check_neq(b1, null); 1.1381 + do_check_eq(b1.version, "4.0"); 1.1382 + do_check_false(b1.isActive); 1.1383 + do_check_eq(b1.pendingOperations, AddonManager.PENDING_NONE); 1.1384 + 1.1385 + restartManager(); 1.1386 + 1.1387 + do_check_eq(getInstalledVersion(), 0); 1.1388 + do_check_eq(getActiveVersion(), 0); 1.1389 + 1.1390 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.1391 + do_check_neq(b1, null); 1.1392 + do_check_eq(b1.version, "4.0"); 1.1393 + do_check_false(b1.isActive); 1.1394 + do_check_eq(b1.pendingOperations, AddonManager.PENDING_NONE); 1.1395 + 1.1396 + do_check_bootstrappedPref(run_test_28); 1.1397 + }); 1.1398 + })); 1.1399 + }); 1.1400 + }); 1.1401 +} 1.1402 + 1.1403 +// Tests that updating from a normal add-on to a bootstrappable add-on when 1.1404 +// disabled calls the install method but not the startup method 1.1405 +function run_test_28() { 1.1406 + installAllFiles([do_get_addon("test_bootstrap1_1")], function() { 1.1407 + do_execute_soon(function bootstrap_disabled_downgrade_check() { 1.1408 + // Doesn't need a restart to complete this 1.1409 + do_check_eq(getInstalledVersion(), 1); 1.1410 + do_check_eq(getInstallReason(), ADDON_DOWNGRADE); 1.1411 + do_check_eq(getInstallOldVersion(), 4); 1.1412 + do_check_eq(getActiveVersion(), 0); 1.1413 + 1.1414 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) { 1.1415 + do_check_neq(b1, null); 1.1416 + do_check_eq(b1.version, "1.0"); 1.1417 + do_check_false(b1.isActive); 1.1418 + do_check_true(b1.userDisabled); 1.1419 + do_check_eq(b1.pendingOperations, AddonManager.PENDING_NONE); 1.1420 + 1.1421 + restartManager(); 1.1422 + 1.1423 + do_check_eq(getInstalledVersion(), 1); 1.1424 + do_check_eq(getActiveVersion(), 0); 1.1425 + 1.1426 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.1427 + do_check_neq(b1, null); 1.1428 + do_check_true(b1.userDisabled); 1.1429 + b1.userDisabled = false; 1.1430 + do_check_eq(b1.version, "1.0"); 1.1431 + do_check_true(b1.isActive); 1.1432 + do_check_eq(b1.pendingOperations, AddonManager.PENDING_NONE); 1.1433 + do_check_eq(getInstalledVersion(), 1); 1.1434 + do_check_eq(getActiveVersion(), 1); 1.1435 + 1.1436 + do_check_bootstrappedPref(do_test_finished); 1.1437 + }); 1.1438 + })); 1.1439 + }); 1.1440 + }); 1.1441 +}