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

changeset 0
6474c204b198
     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 +}

mercurial