toolkit/mozapps/extensions/test/xpcshell/test_bootstrap.js

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

michael@0 1 /* Any copyright is dedicated to the Public Domain.
michael@0 2 * http://creativecommons.org/publicdomain/zero/1.0/
michael@0 3 */
michael@0 4
michael@0 5 const APP_STARTUP = 1;
michael@0 6 const APP_SHUTDOWN = 2;
michael@0 7 const ADDON_ENABLE = 3;
michael@0 8 const ADDON_DISABLE = 4;
michael@0 9 const ADDON_INSTALL = 5;
michael@0 10 const ADDON_UNINSTALL = 6;
michael@0 11 const ADDON_UPGRADE = 7;
michael@0 12 const ADDON_DOWNGRADE = 8;
michael@0 13
michael@0 14 // This verifies that bootstrappable add-ons can be used without restarts.
michael@0 15 Components.utils.import("resource://gre/modules/Services.jsm");
michael@0 16 Components.utils.import("resource://gre/modules/Promise.jsm");
michael@0 17
michael@0 18 // Enable loading extensions from the user scopes
michael@0 19 Services.prefs.setIntPref("extensions.enabledScopes",
michael@0 20 AddonManager.SCOPE_PROFILE + AddonManager.SCOPE_USER);
michael@0 21
michael@0 22 createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2");
michael@0 23
michael@0 24 const profileDir = gProfD.clone();
michael@0 25 profileDir.append("extensions");
michael@0 26 const userExtDir = gProfD.clone();
michael@0 27 userExtDir.append("extensions2");
michael@0 28 userExtDir.append(gAppInfo.ID);
michael@0 29 registerDirectory("XREUSysExt", userExtDir.parent);
michael@0 30
michael@0 31 Components.utils.import("resource://testing-common/httpd.js");
michael@0 32 var testserver = new HttpServer();
michael@0 33 testserver.start(-1);
michael@0 34 gPort = testserver.identity.primaryPort;
michael@0 35
michael@0 36 testserver.registerDirectory("/addons/", do_get_file("addons"));
michael@0 37
michael@0 38 function resetPrefs() {
michael@0 39 Services.prefs.setIntPref("bootstraptest.active_version", -1);
michael@0 40 Services.prefs.setIntPref("bootstraptest.installed_version", -1);
michael@0 41 Services.prefs.setIntPref("bootstraptest2.active_version", -1);
michael@0 42 Services.prefs.setIntPref("bootstraptest2.installed_version", -1);
michael@0 43 Services.prefs.setIntPref("bootstraptest.startup_reason", -1);
michael@0 44 Services.prefs.setIntPref("bootstraptest.shutdown_reason", -1);
michael@0 45 Services.prefs.setIntPref("bootstraptest.install_reason", -1);
michael@0 46 Services.prefs.setIntPref("bootstraptest.uninstall_reason", -1);
michael@0 47 Services.prefs.setIntPref("bootstraptest.startup_oldversion", -1);
michael@0 48 Services.prefs.setIntPref("bootstraptest.shutdown_newversion", -1);
michael@0 49 Services.prefs.setIntPref("bootstraptest.install_oldversion", -1);
michael@0 50 Services.prefs.setIntPref("bootstraptest.uninstall_newversion", -1);
michael@0 51 }
michael@0 52
michael@0 53 function waitForPref(aPref, aCallback) {
michael@0 54 function prefChanged() {
michael@0 55 Services.prefs.removeObserver(aPref, prefChanged);
michael@0 56 // Always let whoever set the preference keep running
michael@0 57 do_execute_soon(aCallback);
michael@0 58 }
michael@0 59 Services.prefs.addObserver(aPref, prefChanged, false);
michael@0 60 }
michael@0 61
michael@0 62 function promisePref(aPref) {
michael@0 63 let deferred = Promise.defer();
michael@0 64
michael@0 65 waitForPref(aPref, deferred.resolve.bind(deferred));
michael@0 66
michael@0 67 return deferred.promise;
michael@0 68 }
michael@0 69
michael@0 70 function promiseInstall(aFiles) {
michael@0 71 let deferred = Promise.defer();
michael@0 72
michael@0 73 installAllFiles(aFiles, function() {
michael@0 74 deferred.resolve();
michael@0 75 });
michael@0 76
michael@0 77 return deferred.promise;
michael@0 78 }
michael@0 79
michael@0 80 function getActiveVersion() {
michael@0 81 return Services.prefs.getIntPref("bootstraptest.active_version");
michael@0 82 }
michael@0 83
michael@0 84 function getInstalledVersion() {
michael@0 85 return Services.prefs.getIntPref("bootstraptest.installed_version");
michael@0 86 }
michael@0 87
michael@0 88 function getActiveVersion2() {
michael@0 89 return Services.prefs.getIntPref("bootstraptest2.active_version");
michael@0 90 }
michael@0 91
michael@0 92 function getInstalledVersion2() {
michael@0 93 return Services.prefs.getIntPref("bootstraptest2.installed_version");
michael@0 94 }
michael@0 95
michael@0 96 function getStartupReason() {
michael@0 97 return Services.prefs.getIntPref("bootstraptest.startup_reason");
michael@0 98 }
michael@0 99
michael@0 100 function getShutdownReason() {
michael@0 101 return Services.prefs.getIntPref("bootstraptest.shutdown_reason");
michael@0 102 }
michael@0 103
michael@0 104 function getInstallReason() {
michael@0 105 return Services.prefs.getIntPref("bootstraptest.install_reason");
michael@0 106 }
michael@0 107
michael@0 108 function getUninstallReason() {
michael@0 109 return Services.prefs.getIntPref("bootstraptest.uninstall_reason");
michael@0 110 }
michael@0 111
michael@0 112 function getStartupOldVersion() {
michael@0 113 return Services.prefs.getIntPref("bootstraptest.startup_oldversion");
michael@0 114 }
michael@0 115
michael@0 116 function getShutdownNewVersion() {
michael@0 117 return Services.prefs.getIntPref("bootstraptest.shutdown_newversion");
michael@0 118 }
michael@0 119
michael@0 120 function getInstallOldVersion() {
michael@0 121 return Services.prefs.getIntPref("bootstraptest.install_oldversion");
michael@0 122 }
michael@0 123
michael@0 124 function getUninstallNewVersion() {
michael@0 125 return Services.prefs.getIntPref("bootstraptest.uninstall_newversion");
michael@0 126 }
michael@0 127
michael@0 128 function do_check_bootstrappedPref(aCallback) {
michael@0 129 let data = "{}";
michael@0 130 try {
michael@0 131 // This is ok to fail, as the pref won't exist on a fresh profile.
michael@0 132 data = Services.prefs.getCharPref("extensions.bootstrappedAddons");
michael@0 133 } catch (e) {}
michael@0 134 data = JSON.parse(data);
michael@0 135
michael@0 136 AddonManager.getAddonsByTypes(["extension"], function(aAddons) {
michael@0 137 for (let addon of aAddons) {
michael@0 138 if (!addon.id.endsWith("@tests.mozilla.org"))
michael@0 139 continue;
michael@0 140 if (!addon.isActive)
michael@0 141 continue;
michael@0 142 if (addon.operationsRequiringRestart != AddonManager.OP_NEEDS_RESTART_NONE)
michael@0 143 continue;
michael@0 144
michael@0 145 do_check_true(addon.id in data);
michael@0 146 let addonData = data[addon.id];
michael@0 147 delete data[addon.id];
michael@0 148
michael@0 149 do_check_eq(addonData.version, addon.version);
michael@0 150 do_check_eq(addonData.type, addon.type);
michael@0 151 let file = addon.getResourceURI().QueryInterface(Components.interfaces.nsIFileURL).file;
michael@0 152 do_check_eq(addonData.descriptor, file.persistentDescriptor);
michael@0 153 }
michael@0 154 do_check_eq(Object.keys(data).length, 0);
michael@0 155
michael@0 156 aCallback();
michael@0 157 });
michael@0 158 }
michael@0 159
michael@0 160
michael@0 161 function run_test() {
michael@0 162 do_test_pending();
michael@0 163
michael@0 164 resetPrefs();
michael@0 165
michael@0 166 startupManager();
michael@0 167
michael@0 168 do_check_false(gExtensionsJSON.exists());
michael@0 169
michael@0 170 do_check_false(gExtensionsINI.exists());
michael@0 171
michael@0 172 do_check_bootstrappedPref(run_test_1);
michael@0 173 }
michael@0 174
michael@0 175 // Tests that installing doesn't require a restart
michael@0 176 function run_test_1() {
michael@0 177 prepare_test({ }, [
michael@0 178 "onNewInstall"
michael@0 179 ]);
michael@0 180
michael@0 181 AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_1"), function(install) {
michael@0 182 ensure_test_completed();
michael@0 183
michael@0 184 do_check_neq(install, null);
michael@0 185 do_check_eq(install.type, "extension");
michael@0 186 do_check_eq(install.version, "1.0");
michael@0 187 do_check_eq(install.name, "Test Bootstrap 1");
michael@0 188 do_check_eq(install.state, AddonManager.STATE_DOWNLOADED);
michael@0 189 do_check_neq(install.addon.syncGUID, null);
michael@0 190 do_check_true(install.addon.hasResource("install.rdf"));
michael@0 191 do_check_true(install.addon.hasResource("bootstrap.js"));
michael@0 192 do_check_false(install.addon.hasResource("foo.bar"));
michael@0 193 do_check_eq(install.addon.operationsRequiringRestart &
michael@0 194 AddonManager.OP_NEEDS_RESTART_INSTALL, 0);
michael@0 195 do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0");
michael@0 196
michael@0 197 let addon = install.addon;
michael@0 198
michael@0 199 waitForPref("bootstraptest.startup_reason", function() {
michael@0 200 do_check_bootstrappedPref(function() {
michael@0 201 check_test_1(addon.syncGUID);
michael@0 202 });
michael@0 203 });
michael@0 204
michael@0 205 prepare_test({
michael@0 206 "bootstrap1@tests.mozilla.org": [
michael@0 207 ["onInstalling", false],
michael@0 208 "onInstalled"
michael@0 209 ]
michael@0 210 }, [
michael@0 211 "onInstallStarted",
michael@0 212 "onInstallEnded",
michael@0 213 ], function() {
michael@0 214 do_check_true(addon.hasResource("install.rdf"));
michael@0 215
michael@0 216 // startup should not have been called yet.
michael@0 217 do_check_eq(getActiveVersion(), -1);
michael@0 218 });
michael@0 219 install.install();
michael@0 220 });
michael@0 221 }
michael@0 222
michael@0 223 function check_test_1(installSyncGUID) {
michael@0 224 do_check_false(gExtensionsINI.exists());
michael@0 225
michael@0 226 AddonManager.getAllInstalls(function(installs) {
michael@0 227 // There should be no active installs now since the install completed and
michael@0 228 // doesn't require a restart.
michael@0 229 do_check_eq(installs.length, 0);
michael@0 230
michael@0 231 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 232 do_check_neq(b1, null);
michael@0 233 do_check_eq(b1.version, "1.0");
michael@0 234 do_check_neq(b1.syncGUID, null);
michael@0 235 do_check_eq(b1.syncGUID, installSyncGUID);
michael@0 236 do_check_false(b1.appDisabled);
michael@0 237 do_check_false(b1.userDisabled);
michael@0 238 do_check_true(b1.isActive);
michael@0 239 do_check_eq(getInstalledVersion(), 1);
michael@0 240 do_check_eq(getActiveVersion(), 1);
michael@0 241 do_check_eq(getStartupReason(), ADDON_INSTALL);
michael@0 242 do_check_eq(getStartupOldVersion(), 0);
michael@0 243 do_check_true(b1.hasResource("install.rdf"));
michael@0 244 do_check_true(b1.hasResource("bootstrap.js"));
michael@0 245 do_check_false(b1.hasResource("foo.bar"));
michael@0 246 do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0");
michael@0 247
michael@0 248 let dir = do_get_addon_root_uri(profileDir, "bootstrap1@tests.mozilla.org");
michael@0 249 do_check_eq(b1.getResourceURI("bootstrap.js").spec, dir + "bootstrap.js");
michael@0 250
michael@0 251 AddonManager.getAddonsWithOperationsByTypes(null, function(list) {
michael@0 252 do_check_eq(list.length, 0);
michael@0 253
michael@0 254 do_execute_soon(run_test_2);
michael@0 255 });
michael@0 256 });
michael@0 257 });
michael@0 258 }
michael@0 259
michael@0 260 // Tests that disabling doesn't require a restart
michael@0 261 function run_test_2() {
michael@0 262 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 263 prepare_test({
michael@0 264 "bootstrap1@tests.mozilla.org": [
michael@0 265 ["onDisabling", false],
michael@0 266 "onDisabled"
michael@0 267 ]
michael@0 268 });
michael@0 269
michael@0 270 do_check_eq(b1.operationsRequiringRestart &
michael@0 271 AddonManager.OP_NEEDS_RESTART_DISABLE, 0);
michael@0 272 b1.userDisabled = true;
michael@0 273 ensure_test_completed();
michael@0 274
michael@0 275 do_check_neq(b1, null);
michael@0 276 do_check_eq(b1.version, "1.0");
michael@0 277 do_check_false(b1.appDisabled);
michael@0 278 do_check_true(b1.userDisabled);
michael@0 279 do_check_false(b1.isActive);
michael@0 280 do_check_eq(getInstalledVersion(), 1);
michael@0 281 do_check_eq(getActiveVersion(), 0);
michael@0 282 do_check_eq(getShutdownReason(), ADDON_DISABLE);
michael@0 283 do_check_eq(getShutdownNewVersion(), 0);
michael@0 284 do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0");
michael@0 285
michael@0 286 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(newb1) {
michael@0 287 do_check_neq(newb1, null);
michael@0 288 do_check_eq(newb1.version, "1.0");
michael@0 289 do_check_false(newb1.appDisabled);
michael@0 290 do_check_true(newb1.userDisabled);
michael@0 291 do_check_false(newb1.isActive);
michael@0 292
michael@0 293 do_check_bootstrappedPref(run_test_3);
michael@0 294 });
michael@0 295 });
michael@0 296 }
michael@0 297
michael@0 298 // Test that restarting doesn't accidentally re-enable
michael@0 299 function run_test_3() {
michael@0 300 shutdownManager();
michael@0 301 do_check_eq(getInstalledVersion(), 1);
michael@0 302 do_check_eq(getActiveVersion(), 0);
michael@0 303 do_check_eq(getShutdownReason(), ADDON_DISABLE);
michael@0 304 do_check_eq(getShutdownNewVersion(), 0);
michael@0 305 startupManager(false);
michael@0 306 do_check_eq(getInstalledVersion(), 1);
michael@0 307 do_check_eq(getActiveVersion(), 0);
michael@0 308 do_check_eq(getShutdownReason(), ADDON_DISABLE);
michael@0 309 do_check_eq(getShutdownNewVersion(), 0);
michael@0 310 do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0");
michael@0 311
michael@0 312 do_check_false(gExtensionsINI.exists());
michael@0 313
michael@0 314 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 315 do_check_neq(b1, null);
michael@0 316 do_check_eq(b1.version, "1.0");
michael@0 317 do_check_false(b1.appDisabled);
michael@0 318 do_check_true(b1.userDisabled);
michael@0 319 do_check_false(b1.isActive);
michael@0 320
michael@0 321 do_check_bootstrappedPref(run_test_4);
michael@0 322 });
michael@0 323 }
michael@0 324
michael@0 325 // Tests that enabling doesn't require a restart
michael@0 326 function run_test_4() {
michael@0 327 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 328 prepare_test({
michael@0 329 "bootstrap1@tests.mozilla.org": [
michael@0 330 ["onEnabling", false],
michael@0 331 "onEnabled"
michael@0 332 ]
michael@0 333 });
michael@0 334
michael@0 335 do_check_eq(b1.operationsRequiringRestart &
michael@0 336 AddonManager.OP_NEEDS_RESTART_ENABLE, 0);
michael@0 337 b1.userDisabled = false;
michael@0 338 ensure_test_completed();
michael@0 339
michael@0 340 do_check_neq(b1, null);
michael@0 341 do_check_eq(b1.version, "1.0");
michael@0 342 do_check_false(b1.appDisabled);
michael@0 343 do_check_false(b1.userDisabled);
michael@0 344 do_check_true(b1.isActive);
michael@0 345 do_check_eq(getInstalledVersion(), 1);
michael@0 346 do_check_eq(getActiveVersion(), 1);
michael@0 347 do_check_eq(getStartupReason(), ADDON_ENABLE);
michael@0 348 do_check_eq(getStartupOldVersion(), 0);
michael@0 349 do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0");
michael@0 350
michael@0 351 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(newb1) {
michael@0 352 do_check_neq(newb1, null);
michael@0 353 do_check_eq(newb1.version, "1.0");
michael@0 354 do_check_false(newb1.appDisabled);
michael@0 355 do_check_false(newb1.userDisabled);
michael@0 356 do_check_true(newb1.isActive);
michael@0 357
michael@0 358 do_check_bootstrappedPref(run_test_5);
michael@0 359 });
michael@0 360 });
michael@0 361 }
michael@0 362
michael@0 363 // Tests that a restart shuts down and restarts the add-on
michael@0 364 function run_test_5() {
michael@0 365 shutdownManager();
michael@0 366 // By the time we've shut down, the database must have been written
michael@0 367 do_check_true(gExtensionsJSON.exists());
michael@0 368
michael@0 369 do_check_eq(getInstalledVersion(), 1);
michael@0 370 do_check_eq(getActiveVersion(), 0);
michael@0 371 do_check_eq(getShutdownReason(), APP_SHUTDOWN);
michael@0 372 do_check_eq(getShutdownNewVersion(), 0);
michael@0 373 do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0");
michael@0 374 startupManager(false);
michael@0 375 do_check_eq(getInstalledVersion(), 1);
michael@0 376 do_check_eq(getActiveVersion(), 1);
michael@0 377 do_check_eq(getStartupReason(), APP_STARTUP);
michael@0 378 do_check_eq(getStartupOldVersion(), 0);
michael@0 379 do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0");
michael@0 380
michael@0 381 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 382 do_check_neq(b1, null);
michael@0 383 do_check_eq(b1.version, "1.0");
michael@0 384 do_check_false(b1.appDisabled);
michael@0 385 do_check_false(b1.userDisabled);
michael@0 386 do_check_true(b1.isActive);
michael@0 387 do_check_false(isExtensionInAddonsList(profileDir, b1.id));
michael@0 388
michael@0 389 do_check_bootstrappedPref(run_test_6);
michael@0 390 });
michael@0 391 }
michael@0 392
michael@0 393 // Tests that installing an upgrade doesn't require a restart
michael@0 394 function run_test_6() {
michael@0 395 prepare_test({ }, [
michael@0 396 "onNewInstall"
michael@0 397 ]);
michael@0 398
michael@0 399 AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_2"), function(install) {
michael@0 400 ensure_test_completed();
michael@0 401
michael@0 402 do_check_neq(install, null);
michael@0 403 do_check_eq(install.type, "extension");
michael@0 404 do_check_eq(install.version, "2.0");
michael@0 405 do_check_eq(install.name, "Test Bootstrap 1");
michael@0 406 do_check_eq(install.state, AddonManager.STATE_DOWNLOADED);
michael@0 407
michael@0 408 waitForPref("bootstraptest.startup_reason", check_test_6);
michael@0 409 prepare_test({
michael@0 410 "bootstrap1@tests.mozilla.org": [
michael@0 411 ["onInstalling", false],
michael@0 412 "onInstalled"
michael@0 413 ]
michael@0 414 }, [
michael@0 415 "onInstallStarted",
michael@0 416 "onInstallEnded",
michael@0 417 ], function() {
michael@0 418 });
michael@0 419 install.install();
michael@0 420 });
michael@0 421 }
michael@0 422
michael@0 423 function check_test_6() {
michael@0 424 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 425 do_check_neq(b1, null);
michael@0 426 do_check_eq(b1.version, "2.0");
michael@0 427 do_check_false(b1.appDisabled);
michael@0 428 do_check_false(b1.userDisabled);
michael@0 429 do_check_true(b1.isActive);
michael@0 430 do_check_eq(getInstalledVersion(), 2);
michael@0 431 do_check_eq(getActiveVersion(), 2);
michael@0 432 do_check_eq(getStartupReason(), ADDON_UPGRADE);
michael@0 433 do_check_eq(getInstallOldVersion(), 1);
michael@0 434 do_check_eq(getStartupOldVersion(), 1);
michael@0 435 do_check_eq(getShutdownReason(), ADDON_UPGRADE);
michael@0 436 do_check_eq(getShutdownNewVersion(), 2);
michael@0 437 do_check_eq(getUninstallNewVersion(), 2);
michael@0 438 do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0");
michael@0 439 do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "2.0");
michael@0 440
michael@0 441 do_check_bootstrappedPref(run_test_7);
michael@0 442 });
michael@0 443 }
michael@0 444
michael@0 445 // Tests that uninstalling doesn't require a restart
michael@0 446 function run_test_7() {
michael@0 447 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 448 prepare_test({
michael@0 449 "bootstrap1@tests.mozilla.org": [
michael@0 450 ["onUninstalling", false],
michael@0 451 "onUninstalled"
michael@0 452 ]
michael@0 453 });
michael@0 454
michael@0 455 do_check_eq(b1.operationsRequiringRestart &
michael@0 456 AddonManager.OP_NEEDS_RESTART_UNINSTALL, 0);
michael@0 457 b1.uninstall();
michael@0 458
michael@0 459 do_check_bootstrappedPref(check_test_7);
michael@0 460 });
michael@0 461 }
michael@0 462
michael@0 463 function check_test_7() {
michael@0 464 ensure_test_completed();
michael@0 465 do_check_eq(getInstalledVersion(), 0);
michael@0 466 do_check_eq(getActiveVersion(), 0);
michael@0 467 do_check_eq(getShutdownReason(), ADDON_UNINSTALL);
michael@0 468 do_check_eq(getShutdownNewVersion(), 0);
michael@0 469 do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "2.0");
michael@0 470
michael@0 471 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) {
michael@0 472 do_check_eq(b1, null);
michael@0 473
michael@0 474 restartManager();
michael@0 475
michael@0 476 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(newb1) {
michael@0 477 do_check_eq(newb1, null);
michael@0 478
michael@0 479 do_check_bootstrappedPref(run_test_8);
michael@0 480 });
michael@0 481 }));
michael@0 482 }
michael@0 483
michael@0 484 // Test that a bootstrapped extension dropped into the profile loads properly
michael@0 485 // on startup and doesn't cause an EM restart
michael@0 486 function run_test_8() {
michael@0 487 shutdownManager();
michael@0 488
michael@0 489 manuallyInstall(do_get_addon("test_bootstrap1_1"), profileDir,
michael@0 490 "bootstrap1@tests.mozilla.org");
michael@0 491
michael@0 492 startupManager(false);
michael@0 493
michael@0 494 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 495 do_check_neq(b1, null);
michael@0 496 do_check_eq(b1.version, "1.0");
michael@0 497 do_check_false(b1.appDisabled);
michael@0 498 do_check_false(b1.userDisabled);
michael@0 499 do_check_true(b1.isActive);
michael@0 500 do_check_eq(getInstalledVersion(), 1);
michael@0 501 do_check_eq(getActiveVersion(), 1);
michael@0 502 do_check_eq(getStartupReason(), ADDON_INSTALL);
michael@0 503 do_check_eq(getStartupOldVersion(), 0);
michael@0 504 do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0");
michael@0 505
michael@0 506 do_check_bootstrappedPref(run_test_9);
michael@0 507 });
michael@0 508 }
michael@0 509
michael@0 510 // Test that items detected as removed during startup get removed properly
michael@0 511 function run_test_9() {
michael@0 512 shutdownManager();
michael@0 513
michael@0 514 manuallyUninstall(profileDir, "bootstrap1@tests.mozilla.org");
michael@0 515
michael@0 516 startupManager(false);
michael@0 517
michael@0 518 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 519 do_check_eq(b1, null);
michael@0 520 do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0");
michael@0 521
michael@0 522 do_check_bootstrappedPref(run_test_10);
michael@0 523 });
michael@0 524 }
michael@0 525
michael@0 526
michael@0 527 // Tests that installing a downgrade sends the right reason
michael@0 528 function run_test_10() {
michael@0 529 resetPrefs();
michael@0 530 prepare_test({ }, [
michael@0 531 "onNewInstall"
michael@0 532 ]);
michael@0 533
michael@0 534 AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_2"), function(install) {
michael@0 535 ensure_test_completed();
michael@0 536
michael@0 537 do_check_neq(install, null);
michael@0 538 do_check_eq(install.type, "extension");
michael@0 539 do_check_eq(install.version, "2.0");
michael@0 540 do_check_eq(install.name, "Test Bootstrap 1");
michael@0 541 do_check_eq(install.state, AddonManager.STATE_DOWNLOADED);
michael@0 542 do_check_true(install.addon.hasResource("install.rdf"));
michael@0 543 do_check_true(install.addon.hasResource("bootstrap.js"));
michael@0 544 do_check_false(install.addon.hasResource("foo.bar"));
michael@0 545 do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "2.0");
michael@0 546
michael@0 547 waitForPref("bootstraptest.startup_reason", check_test_10_pt1);
michael@0 548 prepare_test({
michael@0 549 "bootstrap1@tests.mozilla.org": [
michael@0 550 ["onInstalling", false],
michael@0 551 "onInstalled"
michael@0 552 ]
michael@0 553 }, [
michael@0 554 "onInstallStarted",
michael@0 555 "onInstallEnded",
michael@0 556 ], function() {
michael@0 557 do_print("Waiting for startup of bootstrap1_2");
michael@0 558 });
michael@0 559 install.install();
michael@0 560 });
michael@0 561 }
michael@0 562
michael@0 563 function check_test_10_pt1() {
michael@0 564 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 565 do_check_neq(b1, null);
michael@0 566 do_check_eq(b1.version, "2.0");
michael@0 567 do_check_false(b1.appDisabled);
michael@0 568 do_check_false(b1.userDisabled);
michael@0 569 do_check_true(b1.isActive);
michael@0 570 do_check_eq(getInstalledVersion(), 2);
michael@0 571 do_check_eq(getActiveVersion(), 2);
michael@0 572 do_check_eq(getStartupReason(), ADDON_INSTALL);
michael@0 573 do_check_eq(getStartupOldVersion(), 0);
michael@0 574 do_check_true(b1.hasResource("install.rdf"));
michael@0 575 do_check_true(b1.hasResource("bootstrap.js"));
michael@0 576 do_check_false(b1.hasResource("foo.bar"));
michael@0 577 do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "2.0");
michael@0 578
michael@0 579 prepare_test({ }, [
michael@0 580 "onNewInstall"
michael@0 581 ]);
michael@0 582
michael@0 583 AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_1"), function(install) {
michael@0 584 ensure_test_completed();
michael@0 585
michael@0 586 do_check_neq(install, null);
michael@0 587 do_check_eq(install.type, "extension");
michael@0 588 do_check_eq(install.version, "1.0");
michael@0 589 do_check_eq(install.name, "Test Bootstrap 1");
michael@0 590 do_check_eq(install.state, AddonManager.STATE_DOWNLOADED);
michael@0 591
michael@0 592 waitForPref("bootstraptest.startup_reason", check_test_10_pt2);
michael@0 593 prepare_test({
michael@0 594 "bootstrap1@tests.mozilla.org": [
michael@0 595 ["onInstalling", false],
michael@0 596 "onInstalled"
michael@0 597 ]
michael@0 598 }, [
michael@0 599 "onInstallStarted",
michael@0 600 "onInstallEnded",
michael@0 601 ], function() { });
michael@0 602 install.install();
michael@0 603 });
michael@0 604 });
michael@0 605 }
michael@0 606
michael@0 607 function check_test_10_pt2() {
michael@0 608 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 609 do_check_neq(b1, null);
michael@0 610 do_check_eq(b1.version, "1.0");
michael@0 611 do_check_false(b1.appDisabled);
michael@0 612 do_check_false(b1.userDisabled);
michael@0 613 do_check_true(b1.isActive);
michael@0 614 do_check_eq(getInstalledVersion(), 1);
michael@0 615 do_check_eq(getActiveVersion(), 1);
michael@0 616 do_check_eq(getStartupReason(), ADDON_DOWNGRADE);
michael@0 617 do_check_eq(getInstallOldVersion(), 2);
michael@0 618 do_check_eq(getStartupOldVersion(), 2);
michael@0 619 do_check_eq(getShutdownReason(), ADDON_DOWNGRADE);
michael@0 620 do_check_eq(getShutdownNewVersion(), 1);
michael@0 621 do_check_eq(getUninstallNewVersion(), 1);
michael@0 622 do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0");
michael@0 623 do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "2.0");
michael@0 624
michael@0 625 do_check_bootstrappedPref(run_test_11);
michael@0 626 });
michael@0 627 }
michael@0 628
michael@0 629 // Tests that uninstalling a disabled add-on still calls the uninstall method
michael@0 630 function run_test_11() {
michael@0 631 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 632 prepare_test({
michael@0 633 "bootstrap1@tests.mozilla.org": [
michael@0 634 ["onDisabling", false],
michael@0 635 "onDisabled",
michael@0 636 ["onUninstalling", false],
michael@0 637 "onUninstalled"
michael@0 638 ]
michael@0 639 });
michael@0 640
michael@0 641 b1.userDisabled = true;
michael@0 642
michael@0 643 do_check_eq(getInstalledVersion(), 1);
michael@0 644 do_check_eq(getActiveVersion(), 0);
michael@0 645 do_check_eq(getShutdownReason(), ADDON_DISABLE);
michael@0 646 do_check_eq(getShutdownNewVersion(), 0);
michael@0 647 do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0");
michael@0 648
michael@0 649 b1.uninstall();
michael@0 650
michael@0 651 check_test_11();
michael@0 652 });
michael@0 653 }
michael@0 654
michael@0 655 function check_test_11() {
michael@0 656 ensure_test_completed();
michael@0 657 do_check_eq(getInstalledVersion(), 0);
michael@0 658 do_check_eq(getActiveVersion(), 0);
michael@0 659 do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0");
michael@0 660
michael@0 661 do_check_bootstrappedPref(run_test_12);
michael@0 662 }
michael@0 663
michael@0 664 // Tests that bootstrapped extensions are correctly loaded even if the app is
michael@0 665 // upgraded at the same time
michael@0 666 function run_test_12() {
michael@0 667 shutdownManager();
michael@0 668
michael@0 669 manuallyInstall(do_get_addon("test_bootstrap1_1"), profileDir,
michael@0 670 "bootstrap1@tests.mozilla.org");
michael@0 671
michael@0 672 startupManager(true);
michael@0 673
michael@0 674 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 675 do_check_neq(b1, null);
michael@0 676 do_check_eq(b1.version, "1.0");
michael@0 677 do_check_false(b1.appDisabled);
michael@0 678 do_check_false(b1.userDisabled);
michael@0 679 do_check_true(b1.isActive);
michael@0 680 do_check_eq(getInstalledVersion(), 1);
michael@0 681 do_check_eq(getActiveVersion(), 1);
michael@0 682 do_check_eq(getStartupReason(), ADDON_INSTALL);
michael@0 683 do_check_eq(getStartupOldVersion(), 0);
michael@0 684 do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0");
michael@0 685
michael@0 686 b1.uninstall();
michael@0 687 do_execute_soon(test_12_restart);
michael@0 688 });
michael@0 689 }
michael@0 690
michael@0 691 function test_12_restart() {
michael@0 692 restartManager();
michael@0 693 do_check_bootstrappedPref(run_test_13);
michael@0 694 }
michael@0 695
michael@0 696
michael@0 697 // Tests that installing a bootstrapped extension with an invalid application
michael@0 698 // entry doesn't call it's startup method
michael@0 699 function run_test_13() {
michael@0 700 prepare_test({ }, [
michael@0 701 "onNewInstall"
michael@0 702 ]);
michael@0 703
michael@0 704 AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_3"), function(install) {
michael@0 705 ensure_test_completed();
michael@0 706
michael@0 707 do_check_neq(install, null);
michael@0 708 do_check_eq(install.type, "extension");
michael@0 709 do_check_eq(install.version, "3.0");
michael@0 710 do_check_eq(install.name, "Test Bootstrap 1");
michael@0 711 do_check_eq(install.state, AddonManager.STATE_DOWNLOADED);
michael@0 712 do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "3.0");
michael@0 713
michael@0 714 prepare_test({
michael@0 715 "bootstrap1@tests.mozilla.org": [
michael@0 716 ["onInstalling", false],
michael@0 717 "onInstalled"
michael@0 718 ]
michael@0 719 }, [
michael@0 720 "onInstallStarted",
michael@0 721 "onInstallEnded",
michael@0 722 ], callback_soon(check_test_13));
michael@0 723 install.install();
michael@0 724 });
michael@0 725 }
michael@0 726
michael@0 727 function check_test_13() {
michael@0 728 AddonManager.getAllInstalls(function(installs) {
michael@0 729 // There should be no active installs now since the install completed and
michael@0 730 // doesn't require a restart.
michael@0 731 do_check_eq(installs.length, 0);
michael@0 732
michael@0 733 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 734 do_check_neq(b1, null);
michael@0 735 do_check_eq(b1.version, "3.0");
michael@0 736 do_check_true(b1.appDisabled);
michael@0 737 do_check_false(b1.userDisabled);
michael@0 738 do_check_false(b1.isActive);
michael@0 739 do_check_eq(getInstalledVersion(), 3); // We call install even for disabled add-ons
michael@0 740 do_check_eq(getActiveVersion(), 0); // Should not have called startup though
michael@0 741 do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "3.0");
michael@0 742
michael@0 743 do_execute_soon(test_13_restart);
michael@0 744 });
michael@0 745 });
michael@0 746 }
michael@0 747
michael@0 748 function test_13_restart() {
michael@0 749 restartManager();
michael@0 750
michael@0 751 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 752 do_check_neq(b1, null);
michael@0 753 do_check_eq(b1.version, "3.0");
michael@0 754 do_check_true(b1.appDisabled);
michael@0 755 do_check_false(b1.userDisabled);
michael@0 756 do_check_false(b1.isActive);
michael@0 757 do_check_eq(getInstalledVersion(), 3); // We call install even for disabled add-ons
michael@0 758 do_check_eq(getActiveVersion(), 0); // Should not have called startup though
michael@0 759 do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "3.0");
michael@0 760
michael@0 761 do_check_bootstrappedPref(function() {
michael@0 762 b1.uninstall();
michael@0 763 do_execute_soon(run_test_14);
michael@0 764 });
michael@0 765 });
michael@0 766 }
michael@0 767
michael@0 768 // Tests that a bootstrapped extension with an invalid target application entry
michael@0 769 // does not get loaded when detected during startup
michael@0 770 function run_test_14() {
michael@0 771 restartManager();
michael@0 772
michael@0 773 shutdownManager();
michael@0 774
michael@0 775 manuallyInstall(do_get_addon("test_bootstrap1_3"), profileDir,
michael@0 776 "bootstrap1@tests.mozilla.org");
michael@0 777
michael@0 778 startupManager(false);
michael@0 779
michael@0 780 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 781 do_check_neq(b1, null);
michael@0 782 do_check_eq(b1.version, "3.0");
michael@0 783 do_check_true(b1.appDisabled);
michael@0 784 do_check_false(b1.userDisabled);
michael@0 785 do_check_false(b1.isActive);
michael@0 786 do_check_eq(getInstalledVersion(), 3); // We call install even for disabled add-ons
michael@0 787 do_check_eq(getActiveVersion(), 0); // Should not have called startup though
michael@0 788 do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "3.0");
michael@0 789
michael@0 790 do_check_bootstrappedPref(function() {
michael@0 791 b1.uninstall();
michael@0 792
michael@0 793 run_test_15();
michael@0 794 });
michael@0 795 });
michael@0 796 }
michael@0 797
michael@0 798 // Tests that upgrading a disabled bootstrapped extension still calls uninstall
michael@0 799 // and install but doesn't startup the new version
michael@0 800 function run_test_15() {
michael@0 801 resetPrefs();
michael@0 802 waitForPref("bootstraptest.startup_reason", function test_15_after_startup() {
michael@0 803 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 804 do_check_neq(b1, null);
michael@0 805 do_check_eq(b1.version, "1.0");
michael@0 806 do_check_false(b1.appDisabled);
michael@0 807 do_check_false(b1.userDisabled);
michael@0 808 do_check_true(b1.isActive);
michael@0 809 do_check_eq(getInstalledVersion(), 1);
michael@0 810 do_check_eq(getActiveVersion(), 1);
michael@0 811
michael@0 812 b1.userDisabled = true;
michael@0 813 do_check_false(b1.isActive);
michael@0 814 do_check_eq(getInstalledVersion(), 1);
michael@0 815 do_check_eq(getActiveVersion(), 0);
michael@0 816
michael@0 817 prepare_test({ }, [
michael@0 818 "onNewInstall"
michael@0 819 ]);
michael@0 820
michael@0 821 AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_2"), function(install) {
michael@0 822 ensure_test_completed();
michael@0 823
michael@0 824 do_check_neq(install, null);
michael@0 825 do_check_true(install.addon.userDisabled);
michael@0 826
michael@0 827 prepare_test({
michael@0 828 "bootstrap1@tests.mozilla.org": [
michael@0 829 ["onInstalling", false],
michael@0 830 "onInstalled"
michael@0 831 ]
michael@0 832 }, [
michael@0 833 "onInstallStarted",
michael@0 834 "onInstallEnded",
michael@0 835 ], callback_soon(check_test_15));
michael@0 836 install.install();
michael@0 837 });
michael@0 838 });
michael@0 839 });
michael@0 840 installAllFiles([do_get_addon("test_bootstrap1_1")], function test_15_addon_installed() { });
michael@0 841 }
michael@0 842
michael@0 843 function check_test_15() {
michael@0 844 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 845 do_check_neq(b1, null);
michael@0 846 do_check_eq(b1.version, "2.0");
michael@0 847 do_check_false(b1.appDisabled);
michael@0 848 do_check_true(b1.userDisabled);
michael@0 849 do_check_false(b1.isActive);
michael@0 850 do_check_eq(getInstalledVersion(), 2);
michael@0 851 do_check_eq(getActiveVersion(), 0);
michael@0 852
michael@0 853 do_check_bootstrappedPref(function() {
michael@0 854 restartManager();
michael@0 855
michael@0 856 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 857 do_check_neq(b1, null);
michael@0 858 do_check_eq(b1.version, "2.0");
michael@0 859 do_check_false(b1.appDisabled);
michael@0 860 do_check_true(b1.userDisabled);
michael@0 861 do_check_false(b1.isActive);
michael@0 862 do_check_eq(getInstalledVersion(), 2);
michael@0 863 do_check_eq(getActiveVersion(), 0);
michael@0 864
michael@0 865 b1.uninstall();
michael@0 866
michael@0 867 run_test_16();
michael@0 868 });
michael@0 869 });
michael@0 870 });
michael@0 871 }
michael@0 872
michael@0 873 // Tests that bootstrapped extensions don't get loaded when in safe mode
michael@0 874 function run_test_16() {
michael@0 875 resetPrefs();
michael@0 876 waitForPref("bootstraptest.startup_reason", function test_16_after_startup() {
michael@0 877 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) {
michael@0 878 // Should have installed and started
michael@0 879 do_check_eq(getInstalledVersion(), 1);
michael@0 880 do_check_eq(getActiveVersion(), 1);
michael@0 881 do_check_true(b1.isActive);
michael@0 882 do_check_eq(b1.iconURL, "chrome://foo/skin/icon.png");
michael@0 883 do_check_eq(b1.aboutURL, "chrome://foo/content/about.xul");
michael@0 884 do_check_eq(b1.optionsURL, "chrome://foo/content/options.xul");
michael@0 885
michael@0 886 shutdownManager();
michael@0 887
michael@0 888 // Should have stopped
michael@0 889 do_check_eq(getInstalledVersion(), 1);
michael@0 890 do_check_eq(getActiveVersion(), 0);
michael@0 891
michael@0 892 gAppInfo.inSafeMode = true;
michael@0 893 startupManager(false);
michael@0 894
michael@0 895 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) {
michael@0 896 // Should still be stopped
michael@0 897 do_check_eq(getInstalledVersion(), 1);
michael@0 898 do_check_eq(getActiveVersion(), 0);
michael@0 899 do_check_false(b1.isActive);
michael@0 900 do_check_eq(b1.iconURL, null);
michael@0 901 do_check_eq(b1.aboutURL, null);
michael@0 902 do_check_eq(b1.optionsURL, null);
michael@0 903
michael@0 904 shutdownManager();
michael@0 905 gAppInfo.inSafeMode = false;
michael@0 906 startupManager(false);
michael@0 907
michael@0 908 // Should have started
michael@0 909 do_check_eq(getInstalledVersion(), 1);
michael@0 910 do_check_eq(getActiveVersion(), 1);
michael@0 911
michael@0 912 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 913 b1.uninstall();
michael@0 914
michael@0 915 do_execute_soon(run_test_17);
michael@0 916 });
michael@0 917 }));
michael@0 918 }));
michael@0 919 });
michael@0 920 installAllFiles([do_get_addon("test_bootstrap1_1")], function() { });
michael@0 921 }
michael@0 922
michael@0 923 // Check that a bootstrapped extension in a non-profile location is loaded
michael@0 924 function run_test_17() {
michael@0 925 shutdownManager();
michael@0 926
michael@0 927 manuallyInstall(do_get_addon("test_bootstrap1_1"), userExtDir,
michael@0 928 "bootstrap1@tests.mozilla.org");
michael@0 929
michael@0 930 resetPrefs();
michael@0 931 startupManager();
michael@0 932
michael@0 933 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 934 // Should have installed and started
michael@0 935 do_check_eq(getInstalledVersion(), 1);
michael@0 936 do_check_eq(getActiveVersion(), 1);
michael@0 937 do_check_neq(b1, null);
michael@0 938 do_check_eq(b1.version, "1.0");
michael@0 939 do_check_true(b1.isActive);
michael@0 940
michael@0 941 do_check_bootstrappedPref(run_test_18);
michael@0 942 });
michael@0 943 }
michael@0 944
michael@0 945 // Check that installing a new bootstrapped extension in the profile replaces
michael@0 946 // the existing one
michael@0 947 function run_test_18() {
michael@0 948 resetPrefs();
michael@0 949 waitForPref("bootstraptest.startup_reason", function test_16_after_startup() {
michael@0 950 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 951 // Should have installed and started
michael@0 952 do_check_eq(getInstalledVersion(), 2);
michael@0 953 do_check_eq(getActiveVersion(), 2);
michael@0 954 do_check_neq(b1, null);
michael@0 955 do_check_eq(b1.version, "2.0");
michael@0 956 do_check_true(b1.isActive);
michael@0 957
michael@0 958 do_check_eq(getShutdownReason(), ADDON_UPGRADE);
michael@0 959 do_check_eq(getUninstallReason(), ADDON_UPGRADE);
michael@0 960 do_check_eq(getInstallReason(), ADDON_UPGRADE);
michael@0 961 do_check_eq(getStartupReason(), ADDON_UPGRADE);
michael@0 962
michael@0 963 do_check_eq(getShutdownNewVersion(), 2);
michael@0 964 do_check_eq(getUninstallNewVersion(), 2);
michael@0 965 do_check_eq(getInstallOldVersion(), 1);
michael@0 966 do_check_eq(getStartupOldVersion(), 1);
michael@0 967
michael@0 968 do_check_bootstrappedPref(run_test_19);
michael@0 969 });
michael@0 970 });
michael@0 971 installAllFiles([do_get_addon("test_bootstrap1_2")], function() { });
michael@0 972 }
michael@0 973
michael@0 974 // Check that uninstalling the profile version reveals the non-profile one
michael@0 975 function run_test_19() {
michael@0 976 resetPrefs();
michael@0 977 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 978 // The revealed add-on gets activated asynchronously
michael@0 979 prepare_test({
michael@0 980 "bootstrap1@tests.mozilla.org": [
michael@0 981 ["onUninstalling", false],
michael@0 982 "onUninstalled",
michael@0 983 ["onInstalling", false],
michael@0 984 "onInstalled"
michael@0 985 ]
michael@0 986 }, [], check_test_19);
michael@0 987
michael@0 988 b1.uninstall();
michael@0 989 });
michael@0 990 }
michael@0 991
michael@0 992 function check_test_19() {
michael@0 993 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 994 // Should have reverted to the older version
michael@0 995 do_check_eq(getInstalledVersion(), 1);
michael@0 996 do_check_eq(getActiveVersion(), 1);
michael@0 997 do_check_neq(b1, null);
michael@0 998 do_check_eq(b1.version, "1.0");
michael@0 999 do_check_true(b1.isActive);
michael@0 1000
michael@0 1001 // TODO these reasons really should be ADDON_DOWNGRADE (bug 607818)
michael@0 1002 do_check_eq(getShutdownReason(), ADDON_UNINSTALL);
michael@0 1003 do_check_eq(getUninstallReason(), ADDON_UNINSTALL);
michael@0 1004 do_check_eq(getInstallReason(), ADDON_INSTALL);
michael@0 1005 do_check_eq(getStartupReason(), ADDON_INSTALL);
michael@0 1006
michael@0 1007 do_check_eq(getShutdownNewVersion(), 0);
michael@0 1008 do_check_eq(getUninstallNewVersion(), 0);
michael@0 1009 do_check_eq(getInstallOldVersion(), 0);
michael@0 1010 do_check_eq(getStartupOldVersion(), 0);
michael@0 1011
michael@0 1012 do_check_bootstrappedPref(run_test_20);
michael@0 1013 });
michael@0 1014 }
michael@0 1015
michael@0 1016 // Check that a new profile extension detected at startup replaces the non-profile
michael@0 1017 // one
michael@0 1018 function run_test_20() {
michael@0 1019 resetPrefs();
michael@0 1020 shutdownManager();
michael@0 1021
michael@0 1022 manuallyInstall(do_get_addon("test_bootstrap1_2"), profileDir,
michael@0 1023 "bootstrap1@tests.mozilla.org");
michael@0 1024
michael@0 1025 startupManager();
michael@0 1026
michael@0 1027 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 1028 // Should have installed and started
michael@0 1029 do_check_eq(getInstalledVersion(), 2);
michael@0 1030 do_check_eq(getActiveVersion(), 2);
michael@0 1031 do_check_neq(b1, null);
michael@0 1032 do_check_eq(b1.version, "2.0");
michael@0 1033 do_check_true(b1.isActive);
michael@0 1034
michael@0 1035 do_check_eq(getShutdownReason(), APP_SHUTDOWN);
michael@0 1036 do_check_eq(getUninstallReason(), ADDON_UPGRADE);
michael@0 1037 do_check_eq(getInstallReason(), ADDON_UPGRADE);
michael@0 1038 do_check_eq(getStartupReason(), APP_STARTUP);
michael@0 1039
michael@0 1040 do_check_eq(getShutdownNewVersion(), 0);
michael@0 1041 do_check_eq(getUninstallNewVersion(), 2);
michael@0 1042 do_check_eq(getInstallOldVersion(), 1);
michael@0 1043 do_check_eq(getStartupOldVersion(), 0);
michael@0 1044
michael@0 1045 do_execute_soon(run_test_21);
michael@0 1046 });
michael@0 1047 }
michael@0 1048
michael@0 1049 // Check that a detected removal reveals the non-profile one
michael@0 1050 function run_test_21() {
michael@0 1051 resetPrefs();
michael@0 1052 shutdownManager();
michael@0 1053
michael@0 1054 manuallyUninstall(profileDir, "bootstrap1@tests.mozilla.org");
michael@0 1055
michael@0 1056 startupManager();
michael@0 1057
michael@0 1058 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 1059 // Should have installed and started
michael@0 1060 do_check_eq(getInstalledVersion(), 1);
michael@0 1061 do_check_eq(getActiveVersion(), 1);
michael@0 1062 do_check_neq(b1, null);
michael@0 1063 do_check_eq(b1.version, "1.0");
michael@0 1064 do_check_true(b1.isActive);
michael@0 1065
michael@0 1066 do_check_eq(getShutdownReason(), APP_SHUTDOWN);
michael@0 1067 do_check_eq(getShutdownNewVersion(), 0);
michael@0 1068
michael@0 1069 // This won't be set as the bootstrap script was gone so we couldn't
michael@0 1070 // uninstall it properly
michael@0 1071 do_check_eq(getUninstallReason(), -1);
michael@0 1072 do_check_eq(getUninstallNewVersion(), -1);
michael@0 1073
michael@0 1074 // TODO this reason should probably be ADDON_DOWNGRADE (bug 607818)
michael@0 1075 do_check_eq(getInstallReason(), ADDON_INSTALL);
michael@0 1076 do_check_eq(getInstallOldVersion(), 0);
michael@0 1077
michael@0 1078 do_check_eq(getStartupReason(), APP_STARTUP);
michael@0 1079 do_check_eq(getStartupOldVersion(), 0);
michael@0 1080
michael@0 1081 do_check_bootstrappedPref(function() {
michael@0 1082 manuallyUninstall(userExtDir, "bootstrap1@tests.mozilla.org");
michael@0 1083
michael@0 1084 restartManager();
michael@0 1085 run_test_22();
michael@0 1086 });
michael@0 1087 });
michael@0 1088 }
michael@0 1089
michael@0 1090 // Check that an upgrade from the filesystem is detected and applied correctly
michael@0 1091 function run_test_22() {
michael@0 1092 shutdownManager();
michael@0 1093
michael@0 1094 let file = manuallyInstall(do_get_addon("test_bootstrap1_1"), profileDir,
michael@0 1095 "bootstrap1@tests.mozilla.org");
michael@0 1096
michael@0 1097 // Make it look old so changes are detected
michael@0 1098 setExtensionModifiedTime(file, file.lastModifiedTime - 5000);
michael@0 1099
michael@0 1100 startupManager();
michael@0 1101
michael@0 1102 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) {
michael@0 1103 // Should have installed and started
michael@0 1104 do_check_eq(getInstalledVersion(), 1);
michael@0 1105 do_check_eq(getActiveVersion(), 1);
michael@0 1106 do_check_neq(b1, null);
michael@0 1107 do_check_eq(b1.version, "1.0");
michael@0 1108 do_check_true(b1.isActive);
michael@0 1109
michael@0 1110 resetPrefs();
michael@0 1111 shutdownManager();
michael@0 1112
michael@0 1113 manuallyUninstall(profileDir, "bootstrap1@tests.mozilla.org");
michael@0 1114 manuallyInstall(do_get_addon("test_bootstrap1_2"), profileDir,
michael@0 1115 "bootstrap1@tests.mozilla.org");
michael@0 1116
michael@0 1117 startupManager();
michael@0 1118
michael@0 1119 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 1120 // Should have installed and started
michael@0 1121 do_check_eq(getInstalledVersion(), 2);
michael@0 1122 do_check_eq(getActiveVersion(), 2);
michael@0 1123 do_check_neq(b1, null);
michael@0 1124 do_check_eq(b1.version, "2.0");
michael@0 1125 do_check_true(b1.isActive);
michael@0 1126
michael@0 1127 do_check_eq(getShutdownReason(), APP_SHUTDOWN);
michael@0 1128 do_check_eq(getShutdownNewVersion(), 0);
michael@0 1129
michael@0 1130 // This won't be set as the bootstrap script was gone so we couldn't
michael@0 1131 // uninstall it properly
michael@0 1132 do_check_eq(getUninstallReason(), -1);
michael@0 1133 do_check_eq(getUninstallNewVersion(), -1);
michael@0 1134
michael@0 1135 do_check_eq(getInstallReason(), ADDON_UPGRADE);
michael@0 1136 do_check_eq(getInstallOldVersion(), 1);
michael@0 1137 do_check_eq(getStartupReason(), APP_STARTUP);
michael@0 1138 do_check_eq(getStartupOldVersion(), 0);
michael@0 1139
michael@0 1140 do_check_bootstrappedPref(function() {
michael@0 1141 b1.uninstall();
michael@0 1142
michael@0 1143 run_test_23();
michael@0 1144 });
michael@0 1145 });
michael@0 1146 }));
michael@0 1147 }
michael@0 1148
michael@0 1149
michael@0 1150 // Tests that installing from a URL doesn't require a restart
michael@0 1151 function run_test_23() {
michael@0 1152 prepare_test({ }, [
michael@0 1153 "onNewInstall"
michael@0 1154 ]);
michael@0 1155
michael@0 1156 let url = "http://localhost:" + gPort + "/addons/test_bootstrap1_1.xpi";
michael@0 1157 AddonManager.getInstallForURL(url, function(install) {
michael@0 1158 ensure_test_completed();
michael@0 1159
michael@0 1160 do_check_neq(install, null);
michael@0 1161
michael@0 1162 prepare_test({ }, [
michael@0 1163 "onDownloadStarted",
michael@0 1164 "onDownloadEnded"
michael@0 1165 ], function() {
michael@0 1166 do_check_eq(install.type, "extension");
michael@0 1167 do_check_eq(install.version, "1.0");
michael@0 1168 do_check_eq(install.name, "Test Bootstrap 1");
michael@0 1169 do_check_eq(install.state, AddonManager.STATE_DOWNLOADED);
michael@0 1170 do_check_true(install.addon.hasResource("install.rdf"));
michael@0 1171 do_check_true(install.addon.hasResource("bootstrap.js"));
michael@0 1172 do_check_false(install.addon.hasResource("foo.bar"));
michael@0 1173 do_check_eq(install.addon.operationsRequiringRestart &
michael@0 1174 AddonManager.OP_NEEDS_RESTART_INSTALL, 0);
michael@0 1175 do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0");
michael@0 1176
michael@0 1177 let addon = install.addon;
michael@0 1178 prepare_test({
michael@0 1179 "bootstrap1@tests.mozilla.org": [
michael@0 1180 ["onInstalling", false],
michael@0 1181 "onInstalled"
michael@0 1182 ]
michael@0 1183 }, [
michael@0 1184 "onInstallStarted",
michael@0 1185 "onInstallEnded",
michael@0 1186 ], function() {
michael@0 1187 do_check_true(addon.hasResource("install.rdf"));
michael@0 1188 do_check_bootstrappedPref(check_test_23);
michael@0 1189 });
michael@0 1190 });
michael@0 1191 install.install();
michael@0 1192 }, "application/x-xpinstall");
michael@0 1193 }
michael@0 1194
michael@0 1195 function check_test_23() {
michael@0 1196 AddonManager.getAllInstalls(function(installs) {
michael@0 1197 // There should be no active installs now since the install completed and
michael@0 1198 // doesn't require a restart.
michael@0 1199 do_check_eq(installs.length, 0);
michael@0 1200
michael@0 1201 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 1202 do_execute_soon(function test_23_after_startup() {
michael@0 1203 do_check_neq(b1, null);
michael@0 1204 do_check_eq(b1.version, "1.0");
michael@0 1205 do_check_false(b1.appDisabled);
michael@0 1206 do_check_false(b1.userDisabled);
michael@0 1207 do_check_true(b1.isActive);
michael@0 1208 do_check_eq(getInstalledVersion(), 1);
michael@0 1209 do_check_eq(getActiveVersion(), 1);
michael@0 1210 do_check_eq(getStartupReason(), ADDON_INSTALL);
michael@0 1211 do_check_eq(getStartupOldVersion(), 0);
michael@0 1212 do_check_true(b1.hasResource("install.rdf"));
michael@0 1213 do_check_true(b1.hasResource("bootstrap.js"));
michael@0 1214 do_check_false(b1.hasResource("foo.bar"));
michael@0 1215 do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0");
michael@0 1216
michael@0 1217 let dir = do_get_addon_root_uri(profileDir, "bootstrap1@tests.mozilla.org");
michael@0 1218 do_check_eq(b1.getResourceURI("bootstrap.js").spec, dir + "bootstrap.js");
michael@0 1219
michael@0 1220 AddonManager.getAddonsWithOperationsByTypes(null, callback_soon(function(list) {
michael@0 1221 do_check_eq(list.length, 0);
michael@0 1222
michael@0 1223 restartManager();
michael@0 1224 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) {
michael@0 1225 b1.uninstall();
michael@0 1226 restartManager();
michael@0 1227
michael@0 1228 testserver.stop(run_test_24);
michael@0 1229 }));
michael@0 1230 }));
michael@0 1231 });
michael@0 1232 });
michael@0 1233 });
michael@0 1234 }
michael@0 1235
michael@0 1236 // Tests that we recover from a broken preference
michael@0 1237 function run_test_24() {
michael@0 1238 resetPrefs();
michael@0 1239 do_print("starting 24");
michael@0 1240
michael@0 1241 Promise.all([promisePref("bootstraptest2.active_version"),
michael@0 1242 promiseInstall([do_get_addon("test_bootstrap1_1"), do_get_addon("test_bootstrap2_1")])])
michael@0 1243 .then(function test_24_pref() {
michael@0 1244 do_print("test 24 got prefs");
michael@0 1245 do_check_eq(getInstalledVersion(), 1);
michael@0 1246 do_check_eq(getActiveVersion(), 1);
michael@0 1247 do_check_eq(getInstalledVersion2(), 1);
michael@0 1248 do_check_eq(getActiveVersion2(), 1);
michael@0 1249
michael@0 1250 resetPrefs();
michael@0 1251
michael@0 1252 restartManager();
michael@0 1253
michael@0 1254 do_check_eq(getInstalledVersion(), -1);
michael@0 1255 do_check_eq(getActiveVersion(), 1);
michael@0 1256 do_check_eq(getInstalledVersion2(), -1);
michael@0 1257 do_check_eq(getActiveVersion2(), 1);
michael@0 1258
michael@0 1259 shutdownManager();
michael@0 1260
michael@0 1261 do_check_eq(getInstalledVersion(), -1);
michael@0 1262 do_check_eq(getActiveVersion(), 0);
michael@0 1263 do_check_eq(getInstalledVersion2(), -1);
michael@0 1264 do_check_eq(getActiveVersion2(), 0);
michael@0 1265
michael@0 1266 // Break the preferece
michael@0 1267 let bootstrappedAddons = JSON.parse(Services.prefs.getCharPref("extensions.bootstrappedAddons"));
michael@0 1268 bootstrappedAddons["bootstrap1@tests.mozilla.org"].descriptor += "foo";
michael@0 1269 Services.prefs.setCharPref("extensions.bootstrappedAddons", JSON.stringify(bootstrappedAddons));
michael@0 1270
michael@0 1271 startupManager(false);
michael@0 1272
michael@0 1273 do_check_eq(getInstalledVersion(), -1);
michael@0 1274 do_check_eq(getActiveVersion(), 1);
michael@0 1275 do_check_eq(getInstalledVersion2(), -1);
michael@0 1276 do_check_eq(getActiveVersion2(), 1);
michael@0 1277
michael@0 1278 run_test_25();
michael@0 1279 });
michael@0 1280 }
michael@0 1281
michael@0 1282 // Tests that updating from a bootstrappable add-on to a normal add-on calls
michael@0 1283 // the uninstall method
michael@0 1284 function run_test_25() {
michael@0 1285 waitForPref("bootstraptest.startup_reason", function test_25_after_pref() {
michael@0 1286 do_print("test 25 pref change detected");
michael@0 1287 do_check_eq(getInstalledVersion(), 1);
michael@0 1288 do_check_eq(getActiveVersion(), 1);
michael@0 1289
michael@0 1290 installAllFiles([do_get_addon("test_bootstrap1_4")], function() {
michael@0 1291 // Needs a restart to complete this so the old version stays running
michael@0 1292 do_check_eq(getInstalledVersion(), 1);
michael@0 1293 do_check_eq(getActiveVersion(), 1);
michael@0 1294
michael@0 1295 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) {
michael@0 1296 do_check_neq(b1, null);
michael@0 1297 do_check_eq(b1.version, "1.0");
michael@0 1298 do_check_true(b1.isActive);
michael@0 1299 do_check_true(hasFlag(b1.pendingOperations, AddonManager.PENDING_UPGRADE));
michael@0 1300
michael@0 1301 restartManager();
michael@0 1302
michael@0 1303 do_check_eq(getInstalledVersion(), 0);
michael@0 1304 do_check_eq(getUninstallReason(), ADDON_UPGRADE);
michael@0 1305 do_check_eq(getUninstallNewVersion(), 4);
michael@0 1306 do_check_eq(getActiveVersion(), 0);
michael@0 1307
michael@0 1308 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 1309 do_check_neq(b1, null);
michael@0 1310 do_check_eq(b1.version, "4.0");
michael@0 1311 do_check_true(b1.isActive);
michael@0 1312 do_check_eq(b1.pendingOperations, AddonManager.PENDING_NONE);
michael@0 1313
michael@0 1314 do_check_bootstrappedPref(run_test_26);
michael@0 1315 });
michael@0 1316 }));
michael@0 1317 });
michael@0 1318 });
michael@0 1319 installAllFiles([do_get_addon("test_bootstrap1_1")], function test_25_installed() {
michael@0 1320 do_print("test 25 install done");
michael@0 1321 });
michael@0 1322 }
michael@0 1323
michael@0 1324 // Tests that updating from a normal add-on to a bootstrappable add-on calls
michael@0 1325 // the install method
michael@0 1326 function run_test_26() {
michael@0 1327 installAllFiles([do_get_addon("test_bootstrap1_1")], function() {
michael@0 1328 // Needs a restart to complete this
michael@0 1329 do_check_eq(getInstalledVersion(), 0);
michael@0 1330 do_check_eq(getActiveVersion(), 0);
michael@0 1331
michael@0 1332 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) {
michael@0 1333 do_check_neq(b1, null);
michael@0 1334 do_check_eq(b1.version, "4.0");
michael@0 1335 do_check_true(b1.isActive);
michael@0 1336 do_check_true(hasFlag(b1.pendingOperations, AddonManager.PENDING_UPGRADE));
michael@0 1337
michael@0 1338 restartManager();
michael@0 1339
michael@0 1340 do_check_eq(getInstalledVersion(), 1);
michael@0 1341 do_check_eq(getInstallReason(), ADDON_DOWNGRADE);
michael@0 1342 do_check_eq(getInstallOldVersion(), 4);
michael@0 1343 do_check_eq(getActiveVersion(), 1);
michael@0 1344
michael@0 1345 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 1346 do_check_neq(b1, null);
michael@0 1347 do_check_eq(b1.version, "1.0");
michael@0 1348 do_check_true(b1.isActive);
michael@0 1349 do_check_eq(b1.pendingOperations, AddonManager.PENDING_NONE);
michael@0 1350
michael@0 1351 do_check_bootstrappedPref(run_test_27);
michael@0 1352 });
michael@0 1353 }));
michael@0 1354 });
michael@0 1355 }
michael@0 1356
michael@0 1357 // Tests that updating from a bootstrappable add-on to a normal add-on while
michael@0 1358 // disabled calls the uninstall method
michael@0 1359 function run_test_27() {
michael@0 1360 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 1361 do_check_neq(b1, null);
michael@0 1362 b1.userDisabled = true;
michael@0 1363 do_check_eq(b1.version, "1.0");
michael@0 1364 do_check_false(b1.isActive);
michael@0 1365 do_check_eq(b1.pendingOperations, AddonManager.PENDING_NONE);
michael@0 1366 do_check_eq(getInstalledVersion(), 1);
michael@0 1367 do_check_eq(getActiveVersion(), 0);
michael@0 1368
michael@0 1369 installAllFiles([do_get_addon("test_bootstrap1_4")], function() {
michael@0 1370 // Updating disabled things happens immediately
michael@0 1371 do_check_eq(getInstalledVersion(), 0);
michael@0 1372 do_check_eq(getUninstallReason(), ADDON_UPGRADE);
michael@0 1373 do_check_eq(getUninstallNewVersion(), 4);
michael@0 1374 do_check_eq(getActiveVersion(), 0);
michael@0 1375
michael@0 1376 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) {
michael@0 1377 do_check_neq(b1, null);
michael@0 1378 do_check_eq(b1.version, "4.0");
michael@0 1379 do_check_false(b1.isActive);
michael@0 1380 do_check_eq(b1.pendingOperations, AddonManager.PENDING_NONE);
michael@0 1381
michael@0 1382 restartManager();
michael@0 1383
michael@0 1384 do_check_eq(getInstalledVersion(), 0);
michael@0 1385 do_check_eq(getActiveVersion(), 0);
michael@0 1386
michael@0 1387 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 1388 do_check_neq(b1, null);
michael@0 1389 do_check_eq(b1.version, "4.0");
michael@0 1390 do_check_false(b1.isActive);
michael@0 1391 do_check_eq(b1.pendingOperations, AddonManager.PENDING_NONE);
michael@0 1392
michael@0 1393 do_check_bootstrappedPref(run_test_28);
michael@0 1394 });
michael@0 1395 }));
michael@0 1396 });
michael@0 1397 });
michael@0 1398 }
michael@0 1399
michael@0 1400 // Tests that updating from a normal add-on to a bootstrappable add-on when
michael@0 1401 // disabled calls the install method but not the startup method
michael@0 1402 function run_test_28() {
michael@0 1403 installAllFiles([do_get_addon("test_bootstrap1_1")], function() {
michael@0 1404 do_execute_soon(function bootstrap_disabled_downgrade_check() {
michael@0 1405 // Doesn't need a restart to complete this
michael@0 1406 do_check_eq(getInstalledVersion(), 1);
michael@0 1407 do_check_eq(getInstallReason(), ADDON_DOWNGRADE);
michael@0 1408 do_check_eq(getInstallOldVersion(), 4);
michael@0 1409 do_check_eq(getActiveVersion(), 0);
michael@0 1410
michael@0 1411 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) {
michael@0 1412 do_check_neq(b1, null);
michael@0 1413 do_check_eq(b1.version, "1.0");
michael@0 1414 do_check_false(b1.isActive);
michael@0 1415 do_check_true(b1.userDisabled);
michael@0 1416 do_check_eq(b1.pendingOperations, AddonManager.PENDING_NONE);
michael@0 1417
michael@0 1418 restartManager();
michael@0 1419
michael@0 1420 do_check_eq(getInstalledVersion(), 1);
michael@0 1421 do_check_eq(getActiveVersion(), 0);
michael@0 1422
michael@0 1423 AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
michael@0 1424 do_check_neq(b1, null);
michael@0 1425 do_check_true(b1.userDisabled);
michael@0 1426 b1.userDisabled = false;
michael@0 1427 do_check_eq(b1.version, "1.0");
michael@0 1428 do_check_true(b1.isActive);
michael@0 1429 do_check_eq(b1.pendingOperations, AddonManager.PENDING_NONE);
michael@0 1430 do_check_eq(getInstalledVersion(), 1);
michael@0 1431 do_check_eq(getActiveVersion(), 1);
michael@0 1432
michael@0 1433 do_check_bootstrappedPref(do_test_finished);
michael@0 1434 });
michael@0 1435 }));
michael@0 1436 });
michael@0 1437 });
michael@0 1438 }

mercurial