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.

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

mercurial