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

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     1 /* Any copyright is dedicated to the Public Domain.
     2  * http://creativecommons.org/publicdomain/zero/1.0/
     3  */
     5 // This verifies that add-ons can be installed from XPI files
     6 const Cc = Components.classes;
     7 const Ci = Components.interfaces;
     8 const Cu = Components.utils;
    10 // Maximum error in file modification times. Some file systems don't store
    11 // modification times exactly. As long as we are closer than this then it
    12 // still passes.
    13 const MAX_TIME_DIFFERENCE = 3000;
    15 // install.rdf size, icon.png, icon64.png size
    16 const ADDON1_SIZE = 705 + 16 + 16;
    18 Cu.import("resource://gre/modules/Services.jsm");
    19 Cu.import("resource://gre/modules/NetUtil.jsm");
    20 Cu.import("resource://testing-common/httpd.js");
    22 var testserver;
    23 var gInstallDate;
    24 var gInstall = null;
    26 // The test extension uses an insecure update url.
    27 Services.prefs.setBoolPref(PREF_EM_CHECK_UPDATE_SECURITY, false);
    28 Services.prefs.setBoolPref(PREF_EM_STRICT_COMPATIBILITY, true);
    31 const profileDir = gProfD.clone();
    32 profileDir.append("extensions");
    34 function run_test() {
    35   createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2");
    37   startupManager();
    38   // Make sure we only register once despite multiple calls
    39   AddonManager.addInstallListener(InstallListener);
    40   AddonManager.addAddonListener(AddonListener);
    41   AddonManager.addInstallListener(InstallListener);
    42   AddonManager.addAddonListener(AddonListener);
    44   // Create and configure the HTTP server.
    45   testserver = new HttpServer();
    46   testserver.registerDirectory("/addons/", do_get_file("addons"));
    47   testserver.registerDirectory("/data/", do_get_file("data"));
    48   testserver.registerPathHandler("/redirect", function(aRequest, aResponse) {
    49     aResponse.setStatusLine(null, 301, "Moved Permanently");
    50     let url = aRequest.host + ":" + aRequest.port + aRequest.queryString;
    51     aResponse.setHeader("Location", "http://" + url);
    52   });
    53   testserver.start(4444);
    55   do_test_pending();
    56   run_test_1();
    57 }
    59 function end_test() {
    60   testserver.stop(do_test_finished);
    61 }
    63 // Checks that an install from a local file proceeds as expected
    64 function run_test_1() {
    65   prepare_test({ }, [
    66     "onNewInstall"
    67   ]);
    69   AddonManager.getInstallForFile(do_get_addon("test_install1"), function(install) {
    70     ensure_test_completed();
    72     do_check_neq(install, null);
    73     do_check_eq(install.linkedInstalls, null);
    74     do_check_eq(install.type, "extension");
    75     do_check_eq(install.version, "1.0");
    76     do_check_eq(install.name, "Test 1");
    77     do_check_eq(install.state, AddonManager.STATE_DOWNLOADED);
    78     do_check_true(install.addon.hasResource("install.rdf"));
    79     do_check_eq(install.addon.install, install);
    80     do_check_eq(install.addon.size, ADDON1_SIZE);
    81     do_check_true(hasFlag(install.addon.operationsRequiringRestart,
    82                           AddonManager.OP_NEEDS_RESTART_INSTALL));
    83     let file = do_get_addon("test_install1");
    84     let uri = Services.io.newFileURI(file).spec;
    85     do_check_eq(install.addon.getResourceURI("install.rdf").spec, "jar:" + uri + "!/install.rdf");
    86     do_check_eq(install.addon.iconURL, "jar:" + uri + "!/icon.png");
    87     do_check_eq(install.addon.icon64URL, "jar:" + uri + "!/icon64.png");
    88     do_check_eq(install.iconURL, null);
    90     do_check_eq(install.sourceURI.spec, uri);
    91     do_check_eq(install.addon.sourceURI.spec, uri);
    93     AddonManager.getAllInstalls(function(activeInstalls) {
    94       do_check_eq(activeInstalls.length, 1);
    95       do_check_eq(activeInstalls[0], install);
    97       AddonManager.getInstallsByTypes(["foo"], function(fooInstalls) {
    98         do_check_eq(fooInstalls.length, 0);
   100         AddonManager.getInstallsByTypes(["extension"], function(extensionInstalls) {
   101           do_check_eq(extensionInstalls.length, 1);
   102           do_check_eq(extensionInstalls[0], install);
   104           prepare_test({
   105             "addon1@tests.mozilla.org": [
   106               "onInstalling"
   107             ]
   108           }, [
   109             "onInstallStarted",
   110             "onInstallEnded",
   111           ], check_test_1);
   112           install.install();
   113         });
   114       });
   115     });
   116   });
   117 }
   119 function check_test_1() {
   120   ensure_test_completed();
   121   AddonManager.getAddonByID("addon1@tests.mozilla.org", function(olda1) {
   122     do_check_eq(olda1, null);
   124     AddonManager.getAddonsWithOperationsByTypes(null, callback_soon(function(pendingAddons) {
   125       do_check_eq(pendingAddons.length, 1);
   126       do_check_eq(pendingAddons[0].id, "addon1@tests.mozilla.org");
   127       let uri = NetUtil.newURI(pendingAddons[0].iconURL);
   128       if (uri instanceof AM_Ci.nsIJARURI) {
   129         let jarURI = uri.QueryInterface(AM_Ci.nsIJARURI);
   130         let archiveURI = jarURI.JARFile;
   131         let archiveFile = archiveURI.QueryInterface(AM_Ci.nsIFileURL).file;
   132         let zipReader = Cc["@mozilla.org/libjar/zip-reader;1"].
   133                         createInstance(Ci.nsIZipReader);
   134         try {
   135           zipReader.open(archiveFile);
   136           do_check_true(zipReader.hasEntry(jarURI.JAREntry));
   137         }
   138         finally {
   139           zipReader.close();
   140         }
   141       }
   142       else {
   143         let iconFile = uri.QueryInterface(AM_Ci.nsIFileURL).file;
   144         do_check_true(iconFile.exists());
   145       }
   147       // Make the pending install have a sensible date
   148       let updateDate = Date.now();
   149       let extURI = pendingAddons[0].getResourceURI("");
   150       let ext = extURI.QueryInterface(AM_Ci.nsIFileURL).file;
   151       setExtensionModifiedTime(ext, updateDate);
   153       // The pending add-on cannot be disabled or enabled.
   154       do_check_false(hasFlag(pendingAddons[0].permissions, AddonManager.PERM_CAN_ENABLE));
   155       do_check_false(hasFlag(pendingAddons[0].permissions, AddonManager.PERM_CAN_DISABLE));
   157       restartManager();
   159       AddonManager.getAllInstalls(function(activeInstalls) {
   160         do_check_eq(activeInstalls, 0);
   162         AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
   163           do_check_neq(a1, null);
   164           do_check_eq(a1.type, "extension");
   165           do_check_eq(a1.version, "1.0");
   166           do_check_eq(a1.name, "Test 1");
   167           do_check_true(isExtensionInAddonsList(profileDir, a1.id));
   168           do_check_true(do_get_addon("test_install1").exists());
   169           do_check_in_crash_annotation(a1.id, a1.version);
   170           do_check_eq(a1.size, ADDON1_SIZE);
   172           do_check_eq(a1.sourceURI.spec,
   173                       Services.io.newFileURI(do_get_addon("test_install1")).spec);
   174           let difference = a1.installDate.getTime() - updateDate;
   175           if (Math.abs(difference) > MAX_TIME_DIFFERENCE)
   176             do_throw("Add-on install time was out by " + difference + "ms");
   178           difference = a1.updateDate.getTime() - updateDate;
   179           if (Math.abs(difference) > MAX_TIME_DIFFERENCE)
   180             do_throw("Add-on update time was out by " + difference + "ms");
   182           do_check_true(a1.hasResource("install.rdf"));
   183           do_check_false(a1.hasResource("foo.bar"));
   185           let uri = do_get_addon_root_uri(profileDir, "addon1@tests.mozilla.org");
   186           do_check_eq(a1.getResourceURI("install.rdf").spec, uri + "install.rdf");
   187           do_check_eq(a1.iconURL, uri + "icon.png");
   188           do_check_eq(a1.icon64URL, uri + "icon64.png");
   190           a1.uninstall();
   191           do_execute_soon(function(){run_test_2(a1)});
   192         });
   193       });
   194     }));
   195   });
   196 }
   198 // Tests that an install from a url downloads.
   199 function run_test_2(aAddon) {
   200   restartManager();
   201   do_check_not_in_crash_annotation(aAddon.id, aAddon.version);
   203   let url = "http://localhost:4444/addons/test_install2_1.xpi";
   204   AddonManager.getInstallForURL(url, function(install) {
   205     do_check_neq(install, null);
   206     do_check_eq(install.linkedInstalls, null);
   207     do_check_eq(install.version, "1.0");
   208     do_check_eq(install.name, "Test 2");
   209     do_check_eq(install.state, AddonManager.STATE_AVAILABLE);
   210     do_check_eq(install.iconURL, null);
   211     do_check_eq(install.sourceURI.spec, url);
   213     AddonManager.getAllInstalls(function(activeInstalls) {
   214       do_check_eq(activeInstalls.length, 1);
   215       do_check_eq(activeInstalls[0], install);
   217       prepare_test({}, [
   218         "onDownloadStarted",
   219         "onDownloadEnded",
   220       ], check_test_2);
   222       install.addListener({
   223         onDownloadProgress: function(install) {
   224           do_execute_soon(function() {
   225             Components.utils.forceGC();
   226           });
   227         }
   228       });
   230       install.install();
   231     });
   232   }, "application/x-xpinstall", null, "Test 2", null, "1.0");
   233 }
   235 function check_test_2(install) {
   236   ensure_test_completed();
   237   do_check_eq(install.version, "2.0");
   238   do_check_eq(install.name, "Real Test 2");
   239   do_check_eq(install.state, AddonManager.STATE_DOWNLOADED);
   240   do_check_eq(install.addon.install, install);
   241   do_check_true(hasFlag(install.addon.operationsRequiringRestart,
   242                         AddonManager.OP_NEEDS_RESTART_INSTALL));
   243   do_check_eq(install.iconURL, null);
   245   // Pause the install here and start it again in run_test_3
   246   do_execute_soon(function() { run_test_3(install); });
   247   return false;
   248 }
   250 // Tests that the downloaded XPI installs ok
   251 function run_test_3(install) {
   252   prepare_test({
   253     "addon2@tests.mozilla.org": [
   254       "onInstalling"
   255     ]
   256   }, [
   257     "onInstallStarted",
   258     "onInstallEnded",
   259   ], check_test_3);
   260   install.install();
   261 }
   263 function check_test_3(aInstall) {
   264   // Make the pending install have a sensible date
   265   let updateDate = Date.now();
   266   let extURI = aInstall.addon.getResourceURI("");
   267   let ext = extURI.QueryInterface(AM_Ci.nsIFileURL).file;
   268   setExtensionModifiedTime(ext, updateDate);
   270   ensure_test_completed();
   271   AddonManager.getAddonByID("addon2@tests.mozilla.org", callback_soon(function(olda2) {
   272     do_check_eq(olda2, null);
   273     restartManager();
   275     AddonManager.getAllInstalls(function(installs) {
   276       do_check_eq(installs, 0);
   278       AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {
   279         do_check_neq(a2, null);
   280         do_check_eq(a2.type, "extension");
   281         do_check_eq(a2.version, "2.0");
   282         do_check_eq(a2.name, "Real Test 2");
   283         do_check_true(isExtensionInAddonsList(profileDir, a2.id));
   284         do_check_true(do_get_addon("test_install2_1").exists());
   285         do_check_in_crash_annotation(a2.id, a2.version);
   286         do_check_eq(a2.sourceURI.spec,
   287                     "http://localhost:4444/addons/test_install2_1.xpi");
   289         let difference = a2.installDate.getTime() - updateDate;
   290         if (Math.abs(difference) > MAX_TIME_DIFFERENCE)
   291           do_throw("Add-on install time was out by " + difference + "ms");
   293         difference = a2.updateDate.getTime() - updateDate;
   294         if (Math.abs(difference) > MAX_TIME_DIFFERENCE)
   295           do_throw("Add-on update time was out by " + difference + "ms");
   297         gInstallDate = a2.installDate.getTime();
   299         run_test_4();
   300       });
   301     });
   302   }));
   303 }
   305 // Tests that installing a new version of an existing add-on works
   306 function run_test_4() {
   307   prepare_test({ }, [
   308     "onNewInstall"
   309   ]);
   311   let url = "http://localhost:4444/addons/test_install2_2.xpi";
   312   AddonManager.getInstallForURL(url, function(install) {
   313     ensure_test_completed();
   315     do_check_neq(install, null);
   316     do_check_eq(install.version, "3.0");
   317     do_check_eq(install.name, "Test 3");
   318     do_check_eq(install.state, AddonManager.STATE_AVAILABLE);
   320     AddonManager.getAllInstalls(function(activeInstalls) {
   321       do_check_eq(activeInstalls.length, 1);
   322       do_check_eq(activeInstalls[0], install);
   323       do_check_eq(install.existingAddon, null);
   325       prepare_test({}, [
   326         "onDownloadStarted",
   327         "onDownloadEnded",
   328       ], check_test_4);
   329       install.install();
   330     });
   331   }, "application/x-xpinstall", null, "Test 3", null, "3.0");
   332 }
   334 function check_test_4(install) {
   335   ensure_test_completed();
   337   do_check_eq(install.version, "3.0");
   338   do_check_eq(install.name, "Real Test 3");
   339   do_check_eq(install.state, AddonManager.STATE_DOWNLOADED);
   340   do_check_neq(install.existingAddon);
   341   do_check_eq(install.existingAddon.id, "addon2@tests.mozilla.org");
   342   do_check_eq(install.addon.install, install);
   343   do_check_true(hasFlag(install.addon.operationsRequiringRestart,
   344                         AddonManager.OP_NEEDS_RESTART_INSTALL));
   346   run_test_5();
   347   // Installation will continue when there is nothing returned.
   348 }
   350 // Continue installing the new version
   351 function run_test_5() {
   352   prepare_test({
   353     "addon2@tests.mozilla.org": [
   354       "onInstalling"
   355     ]
   356   }, [
   357     "onInstallStarted",
   358     "onInstallEnded",
   359   ], check_test_5);
   360 }
   362 function check_test_5(install) {
   363   ensure_test_completed();
   365   do_check_eq(install.existingAddon.pendingUpgrade.install, install);
   367   AddonManager.getAddonByID("addon2@tests.mozilla.org", function(olda2) {
   368     do_check_neq(olda2, null);
   369     do_check_true(hasFlag(olda2.pendingOperations, AddonManager.PENDING_UPGRADE));
   371     AddonManager.getInstallsByTypes(null, callback_soon(function(installs) {
   372       do_check_eq(installs.length, 1);
   373       do_check_eq(installs[0].addon, olda2.pendingUpgrade);
   374       restartManager();
   376       AddonManager.getInstallsByTypes(null, function(installs) {
   377         do_check_eq(installs.length, 0);
   379         AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {
   380           do_check_neq(a2, null);
   381           do_check_eq(a2.type, "extension");
   382           do_check_eq(a2.version, "3.0");
   383           do_check_eq(a2.name, "Real Test 3");
   384           do_check_true(a2.isActive);
   385           do_check_true(isExtensionInAddonsList(profileDir, a2.id));
   386           do_check_true(do_get_addon("test_install2_2").exists());
   387           do_check_in_crash_annotation(a2.id, a2.version);
   388           do_check_eq(a2.sourceURI.spec,
   389                       "http://localhost:4444/addons/test_install2_2.xpi");
   391           do_check_eq(a2.installDate.getTime(), gInstallDate);
   392           // Update date should be later (or the same if this test is too fast)
   393           do_check_true(a2.installDate <= a2.updateDate);
   395           a2.uninstall();
   396           do_execute_soon(run_test_6);
   397         });
   398       });
   399     }));
   400   });
   401 }
   403 // Tests that an install that requires a compatibility update works
   404 function run_test_6() {
   405   restartManager();
   407   prepare_test({ }, [
   408     "onNewInstall"
   409   ]);
   411   let url = "http://localhost:4444/addons/test_install3.xpi";
   412   AddonManager.getInstallForURL(url, function(install) {
   413     ensure_test_completed();
   415     do_check_neq(install, null);
   416     do_check_eq(install.version, "1.0");
   417     do_check_eq(install.name, "Real Test 4");
   418     do_check_eq(install.state, AddonManager.STATE_AVAILABLE);
   420     AddonManager.getInstallsByTypes(null, function(activeInstalls) {
   421       do_check_eq(activeInstalls.length, 1);
   422       do_check_eq(activeInstalls[0], install);
   424       prepare_test({}, [
   425         "onDownloadStarted",
   426         "onDownloadEnded",
   427       ], check_test_6);
   428       install.install();
   429     });
   430   }, "application/x-xpinstall", null, "Real Test 4", null, "1.0");
   431 }
   433 function check_test_6(install) {
   434   ensure_test_completed();
   435   do_check_eq(install.version, "1.0");
   436   do_check_eq(install.name, "Real Test 4");
   437   do_check_eq(install.state, AddonManager.STATE_DOWNLOADED);
   438   do_check_eq(install.existingAddon, null);
   439   do_check_false(install.addon.appDisabled);
   440   run_test_7();
   441   return true;
   442 }
   444 // Continue the install
   445 function run_test_7() {
   446   prepare_test({
   447     "addon3@tests.mozilla.org": [
   448       "onInstalling"
   449     ]
   450   }, [
   451     "onInstallStarted",
   452     "onInstallEnded",
   453   ], check_test_7);
   454 }
   456 function check_test_7() {
   457   ensure_test_completed();
   458   AddonManager.getAddonByID("addon3@tests.mozilla.org", callback_soon(function(olda3) {
   459     do_check_eq(olda3, null);
   460     restartManager();
   462     AddonManager.getAllInstalls(function(installs) {
   463       do_check_eq(installs, 0);
   465       AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) {
   466         do_check_neq(a3, null);
   467         do_check_eq(a3.type, "extension");
   468         do_check_eq(a3.version, "1.0");
   469         do_check_eq(a3.name, "Real Test 4");
   470         do_check_true(a3.isActive);
   471         do_check_false(a3.appDisabled);
   472         do_check_true(isExtensionInAddonsList(profileDir, a3.id));
   473         do_check_true(do_get_addon("test_install3").exists());
   474         a3.uninstall();
   475         do_execute_soon(run_test_8);
   476       });
   477     });
   478   }));
   479 }
   481 function run_test_8() {
   482   restartManager();
   484   AddonManager.addInstallListener(InstallListener);
   485   AddonManager.addAddonListener(AddonListener);
   487   prepare_test({ }, [
   488     "onNewInstall"
   489   ]);
   491   AddonManager.getInstallForFile(do_get_addon("test_install3"), function(install) {
   492     do_check_true(install.addon.isCompatible);
   494     prepare_test({
   495       "addon3@tests.mozilla.org": [
   496         "onInstalling"
   497       ]
   498     }, [
   499       "onInstallStarted",
   500       "onInstallEnded",
   501     ], callback_soon(check_test_8));
   502     install.install();
   503   });
   504 }
   506 function check_test_8() {
   507   restartManager();
   509   AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) {
   510     do_check_neq(a3, null);
   511     do_check_eq(a3.type, "extension");
   512     do_check_eq(a3.version, "1.0");
   513     do_check_eq(a3.name, "Real Test 4");
   514     do_check_true(a3.isActive);
   515     do_check_false(a3.appDisabled);
   516     do_check_true(isExtensionInAddonsList(profileDir, a3.id));
   517     do_check_true(do_get_addon("test_install3").exists());
   518     a3.uninstall();
   519     do_execute_soon(run_test_9);
   520   });
   521 }
   523 // Test that after cancelling a download it is removed from the active installs
   524 function run_test_9() {
   525   restartManager();
   527   prepare_test({ }, [
   528     "onNewInstall"
   529   ]);
   531   let url = "http://localhost:4444/addons/test_install3.xpi";
   532   AddonManager.getInstallForURL(url, function(install) {
   533     ensure_test_completed();
   535     do_check_neq(install, null);
   536     do_check_eq(install.version, "1.0");
   537     do_check_eq(install.name, "Real Test 4");
   538     do_check_eq(install.state, AddonManager.STATE_AVAILABLE);
   540     AddonManager.getInstallsByTypes(null, function(activeInstalls) {
   541       do_check_eq(activeInstalls.length, 1);
   542       do_check_eq(activeInstalls[0], install);
   544       prepare_test({}, [
   545         "onDownloadStarted",
   546         "onDownloadEnded",
   547       ], check_test_9);
   548       install.install();
   549     });
   550   }, "application/x-xpinstall", null, "Real Test 4", null, "1.0");
   551 }
   553 function check_test_9(install) {
   554   prepare_test({}, [
   555     "onDownloadCancelled"
   556   ]);
   558   install.cancel();
   560   ensure_test_completed();
   562   AddonManager.getAllInstalls(function(activeInstalls) {
   563     do_check_eq(activeInstalls.length, 0);
   565     run_test_10();
   566   });
   567 }
   569 // Tests that after cancelling a pending install it is removed from the active
   570 // installs
   571 function run_test_10() {
   572   prepare_test({ }, [
   573     "onNewInstall"
   574   ]);
   576   let url = "http://localhost:4444/addons/test_install3.xpi";
   577   AddonManager.getInstallForURL(url, function(install) {
   578     ensure_test_completed();
   580     do_check_neq(install, null);
   581     do_check_eq(install.version, "1.0");
   582     do_check_eq(install.name, "Real Test 4");
   583     do_check_eq(install.state, AddonManager.STATE_AVAILABLE);
   585     AddonManager.getInstallsByTypes(null, function(activeInstalls) {
   586       do_check_eq(activeInstalls.length, 1);
   587       do_check_eq(activeInstalls[0], install);
   589       prepare_test({
   590         "addon3@tests.mozilla.org": [
   591           "onInstalling"
   592         ]
   593       }, [
   594         "onDownloadStarted",
   595         "onDownloadEnded",
   596         "onInstallStarted",
   597         "onInstallEnded"
   598       ], check_test_10);
   599       install.install();
   600     });
   601   }, "application/x-xpinstall", null, "Real Test 4", null, "1.0");
   602 }
   604 function check_test_10(install) {
   605   prepare_test({
   606     "addon3@tests.mozilla.org": [
   607       "onOperationCancelled"
   608     ]
   609   }, [
   610     "onInstallCancelled"
   611   ]);
   613   install.cancel();
   615   ensure_test_completed();
   617   AddonManager.getAllInstalls(callback_soon(function(activeInstalls) {
   618     do_check_eq(activeInstalls.length, 0);
   620     restartManager();
   622     // Check that the install did not complete
   623     AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) {
   624       do_check_eq(a3, null);
   626       run_test_11();
   627     });
   628   }));
   629 }
   631 // Tests that a multi-package install shows up as multiple installs with the
   632 // correct sourceURI.
   633 function run_test_11() {
   634   prepare_test({ }, [
   635     "onNewInstall",
   636     "onNewInstall",
   637     "onNewInstall",
   638     "onNewInstall"
   639   ]);
   641   AddonManager.getInstallForFile(do_get_addon("test_install4"), function(install) {
   642     ensure_test_completed();
   643     do_check_neq(install, null);
   644     do_check_neq(install.linkedInstalls, null);
   645     do_check_eq(install.linkedInstalls.length, 3);
   647     // Might be in any order so sort them based on ID
   648     let installs = [install].concat(install.linkedInstalls);
   649     installs.sort(function(a, b) {
   650       if (a.addon.id < b.addon.id)
   651         return -1;
   652       if (a.addon.id > b.addon.id)
   653         return 1;
   654       return 0;
   655     });
   657     // Comes from addon4.xpi and is made compatible by an update check
   658     do_check_eq(installs[0].sourceURI, install.sourceURI);
   659     do_check_eq(installs[0].addon.id, "addon4@tests.mozilla.org");
   660     do_check_false(installs[0].addon.appDisabled);
   661     do_check_eq(installs[0].version, "1.0");
   662     do_check_eq(installs[0].name, "Multi Test 1");
   663     do_check_eq(installs[0].state, AddonManager.STATE_DOWNLOADED);
   664     do_check_true(hasFlag(installs[0].addon.operationsRequiringRestart,
   665                           AddonManager.OP_NEEDS_RESTART_INSTALL));
   667     // Comes from addon5.jar and is compatible by default
   668     do_check_eq(installs[1].sourceURI, install.sourceURI);
   669     do_check_eq(installs[1].addon.id, "addon5@tests.mozilla.org");
   670     do_check_false(installs[1].addon.appDisabled);
   671     do_check_eq(installs[1].version, "3.0");
   672     do_check_eq(installs[1].name, "Multi Test 2");
   673     do_check_eq(installs[1].state, AddonManager.STATE_DOWNLOADED);
   674     do_check_true(hasFlag(installs[1].addon.operationsRequiringRestart,
   675                           AddonManager.OP_NEEDS_RESTART_INSTALL));
   677     // Comes from addon6.xpi and is incompatible
   678     do_check_eq(installs[2].sourceURI, install.sourceURI);
   679     do_check_eq(installs[2].addon.id, "addon6@tests.mozilla.org");
   680     do_check_true(installs[2].addon.appDisabled);
   681     do_check_eq(installs[2].version, "2.0");
   682     do_check_eq(installs[2].name, "Multi Test 3");
   683     do_check_eq(installs[2].state, AddonManager.STATE_DOWNLOADED);
   684     do_check_false(hasFlag(installs[2].addon.operationsRequiringRestart,
   685                            AddonManager.OP_NEEDS_RESTART_INSTALL));
   687     // Comes from addon7.jar and is made compatible by an update check
   688     do_check_eq(installs[3].sourceURI, install.sourceURI);
   689     do_check_eq(installs[3].addon.id, "addon7@tests.mozilla.org");
   690     do_check_false(installs[3].addon.appDisabled);
   691     do_check_eq(installs[3].version, "5.0");
   692     do_check_eq(installs[3].name, "Multi Test 4");
   693     do_check_eq(installs[3].state, AddonManager.STATE_DOWNLOADED);
   694     do_check_true(hasFlag(installs[3].addon.operationsRequiringRestart,
   695                           AddonManager.OP_NEEDS_RESTART_INSTALL));
   697     AddonManager.getAllInstalls(function(aInstalls) {
   698       do_check_eq(aInstalls.length, 4);
   700       prepare_test({
   701         "addon4@tests.mozilla.org": [
   702           "onInstalling"
   703         ],
   704         "addon5@tests.mozilla.org": [
   705           "onInstalling"
   706         ],
   707         "addon6@tests.mozilla.org": [
   708           ["onInstalling", false],
   709           "onInstalled"
   710         ],
   711         "addon7@tests.mozilla.org": [
   712           "onInstalling"
   713         ]
   714       }, {
   715         "addon4@tests.mozilla.org": [
   716           "onInstallStarted",
   717           "onInstallEnded"
   718         ],
   719         "addon5@tests.mozilla.org": [
   720           "onInstallStarted",
   721           "onInstallEnded"
   722         ],
   723         "addon6@tests.mozilla.org": [
   724           "onInstallStarted",
   725           "onInstallEnded"
   726         ],
   727         "addon7@tests.mozilla.org": [
   728           "onInstallStarted",
   729           "onInstallEnded"
   730         ]
   731       }, callback_soon(check_test_11));
   733       installs[0].install();
   734       installs[1].install();
   735       installs[3].install();
   737       // Note that we install addon6 last. Since it doesn't need a restart to
   738       // install it completes asynchronously which would otherwise make the
   739       // onInstallStarted/onInstallEnded events go out of sequence unless this
   740       // is the last install operation
   741       installs[2].install();
   742     });
   743   });
   744 }
   746 function check_test_11() {
   747   restartManager();
   749   AddonManager.getAddonsByIDs(["addon4@tests.mozilla.org",
   750                                "addon5@tests.mozilla.org",
   751                                "addon6@tests.mozilla.org",
   752                                "addon7@tests.mozilla.org"],
   753                                function([a4, a5, a6, a7]) {
   754     do_check_neq(a4, null);
   755     do_check_neq(a5, null);
   756     do_check_neq(a6, null);
   757     do_check_neq(a7, null);
   759     a4.uninstall();
   760     a5.uninstall();
   761     a6.uninstall();
   762     a7.uninstall();
   764     do_execute_soon(run_test_12);
   765   });
   766 }
   768 // Same as test 11 but for a remote XPI
   769 function run_test_12() {
   770   restartManager();
   772   prepare_test({ }, [
   773     "onNewInstall",
   774   ]);
   776   let url = "http://localhost:4444/addons/test_install4.xpi";
   777   AddonManager.getInstallForURL(url, function(install) {
   778     gInstall = install;
   780     ensure_test_completed();
   781     do_check_neq(install, null);
   782     do_check_eq(install.linkedInstalls, null);
   783     do_check_eq(install.state, AddonManager.STATE_AVAILABLE);
   785     prepare_test({
   786       "addon4@tests.mozilla.org": [
   787         "onInstalling"
   788       ],
   789       "addon5@tests.mozilla.org": [
   790         "onInstalling"
   791       ],
   792       "addon6@tests.mozilla.org": [
   793         ["onInstalling", false],
   794         "onInstalled"
   795       ],
   796       "addon7@tests.mozilla.org": [
   797         "onInstalling"
   798       ]
   799     }, {
   800       "NO_ID": [
   801         "onDownloadStarted",
   802         "onNewInstall",
   803         "onNewInstall",
   804         "onNewInstall",
   805         "onDownloadEnded"
   806       ],
   807       "addon4@tests.mozilla.org": [
   808         "onInstallStarted",
   809         "onInstallEnded"
   810       ],
   811       "addon5@tests.mozilla.org": [
   812         "onInstallStarted",
   813         "onInstallEnded"
   814       ],
   815       "addon6@tests.mozilla.org": [
   816         "onInstallStarted",
   817         "onInstallEnded"
   818       ],
   819       "addon7@tests.mozilla.org": [
   820         "onInstallStarted",
   821         "onInstallEnded"
   822       ]
   823     }, callback_soon(check_test_12));
   824     install.install();
   825   }, "application/x-xpinstall", null, "Multi Test 4");
   826 }
   828 function check_test_12() {
   829   do_check_eq(gInstall.linkedInstalls.length, 3);
   831   // Might be in any order so sort them based on ID
   832   let installs = [gInstall].concat(gInstall.linkedInstalls);
   833   installs.sort(function(a, b) {
   834     if (a.addon.id < b.addon.id)
   835       return -1;
   836     if (a.addon.id > b.addon.id)
   837       return 1;
   838     return 0;
   839   });
   841   // Comes from addon4.xpi and is made compatible by an update check
   842   do_check_eq(installs[0].sourceURI, gInstall.sourceURI);
   843   do_check_eq(installs[0].addon.id, "addon4@tests.mozilla.org");
   844   do_check_false(installs[0].addon.appDisabled);
   845   do_check_eq(installs[0].version, "1.0");
   846   do_check_eq(installs[0].name, "Multi Test 1");
   847   do_check_eq(installs[0].state, AddonManager.STATE_INSTALLED);
   849   // Comes from addon5.jar and is compatible by default
   850   do_check_eq(installs[1].sourceURI, gInstall.sourceURI);
   851   do_check_eq(installs[1].addon.id, "addon5@tests.mozilla.org");
   852   do_check_false(installs[1].addon.appDisabled);
   853   do_check_eq(installs[1].version, "3.0");
   854   do_check_eq(installs[1].name, "Multi Test 2");
   855   do_check_eq(installs[1].state, AddonManager.STATE_INSTALLED);
   857   // Comes from addon6.xpi and is incompatible
   858   do_check_eq(installs[2].sourceURI, gInstall.sourceURI);
   859   do_check_eq(installs[2].addon.id, "addon6@tests.mozilla.org");
   860   do_check_true(installs[2].addon.appDisabled);
   861   do_check_eq(installs[2].version, "2.0");
   862   do_check_eq(installs[2].name, "Multi Test 3");
   863   do_check_eq(installs[2].state, AddonManager.STATE_INSTALLED);
   865   // Comes from addon7.jar and is made compatible by an update check
   866   do_check_eq(installs[3].sourceURI, gInstall.sourceURI);
   867   do_check_eq(installs[3].addon.id, "addon7@tests.mozilla.org");
   868   do_check_false(installs[3].addon.appDisabled);
   869   do_check_eq(installs[3].version, "5.0");
   870   do_check_eq(installs[3].name, "Multi Test 4");
   871   do_check_eq(installs[3].state, AddonManager.STATE_INSTALLED);
   873   restartManager();
   875   AddonManager.getAddonsByIDs(["addon4@tests.mozilla.org",
   876                                "addon5@tests.mozilla.org",
   877                                "addon6@tests.mozilla.org",
   878                                "addon7@tests.mozilla.org"],
   879                                function([a4, a5, a6, a7]) {
   880     do_check_neq(a4, null);
   881     do_check_neq(a5, null);
   882     do_check_neq(a6, null);
   883     do_check_neq(a7, null);
   885     a4.uninstall();
   886     a5.uninstall();
   887     a6.uninstall();
   888     a7.uninstall();
   890     do_execute_soon(run_test_13);
   891   });
   892 }
   895 // Tests that cancelling an upgrade leaves the original add-on's pendingOperations
   896 // correct
   897 function run_test_13() {
   898   restartManager();
   900   installAllFiles([do_get_addon("test_install2_1")], function() {
   901     restartManager();
   903     prepare_test({ }, [
   904       "onNewInstall"
   905     ]);
   907     let url = "http://localhost:4444/addons/test_install2_2.xpi";
   908     AddonManager.getInstallForURL(url, function(install) {
   909       ensure_test_completed();
   911       do_check_neq(install, null);
   912       do_check_eq(install.version, "3.0");
   913       do_check_eq(install.name, "Test 3");
   914       do_check_eq(install.state, AddonManager.STATE_AVAILABLE);
   916       AddonManager.getAllInstalls(function(activeInstalls) {
   917         do_check_eq(activeInstalls.length, 1);
   918         do_check_eq(activeInstalls[0], install);
   919         do_check_eq(install.existingAddon, null);
   921         prepare_test({
   922           "addon2@tests.mozilla.org": [
   923             "onInstalling"
   924           ]
   925         }, [
   926           "onDownloadStarted",
   927           "onDownloadEnded",
   928           "onInstallStarted",
   929           "onInstallEnded",
   930         ], check_test_13);
   931         install.install();
   932       });
   933     }, "application/x-xpinstall", null, "Test 3", null, "3.0");
   934   });
   935 }
   937 function check_test_13(install) {
   938   ensure_test_completed();
   940   do_check_eq(install.version, "3.0");
   941   do_check_eq(install.name, "Real Test 3");
   942   do_check_eq(install.state, AddonManager.STATE_INSTALLED);
   943   do_check_neq(install.existingAddon, null);
   944   do_check_eq(install.existingAddon.id, "addon2@tests.mozilla.org");
   945   do_check_eq(install.addon.install, install);
   947   AddonManager.getAddonByID("addon2@tests.mozilla.org", callback_soon(function(olda2) {
   948     do_check_neq(olda2, null);
   949     do_check_true(hasFlag(olda2.pendingOperations, AddonManager.PENDING_UPGRADE));
   950     do_check_eq(olda2.pendingUpgrade, install.addon);
   952     do_check_true(hasFlag(install.addon.pendingOperations,
   953                           AddonManager.PENDING_INSTALL));
   955     prepare_test({
   956       "addon2@tests.mozilla.org": [
   957         "onOperationCancelled"
   958       ]
   959     }, [
   960       "onInstallCancelled",
   961     ]);
   963     install.cancel();
   965     do_check_false(hasFlag(install.addon.pendingOperations, AddonManager.PENDING_INSTALL));
   967     do_check_false(hasFlag(olda2.pendingOperations, AddonManager.PENDING_UPGRADE));
   968     do_check_eq(olda2.pendingUpgrade, null);
   970     restartManager();
   972     // Check that the upgrade did not complete
   973     AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {
   974       do_check_eq(a2.version, "2.0");
   976       a2.uninstall();
   978       do_execute_soon(run_test_14);
   979     });
   980   }));
   981 }
   983 // Check that cancelling the install from onDownloadStarted actually cancels it
   984 function run_test_14() {
   985   restartManager();
   987   prepare_test({ }, [
   988     "onNewInstall"
   989   ]);
   991   let url = "http://localhost:4444/addons/test_install2_1.xpi";
   992   AddonManager.getInstallForURL(url, function(install) {
   993     ensure_test_completed();
   995     do_check_eq(install.file, null);
   997     prepare_test({ }, [
   998       "onDownloadStarted"
   999     ], check_test_14);
  1000     install.install();
  1001   }, "application/x-xpinstall");
  1004 function check_test_14(install) {
  1005   prepare_test({ }, [
  1006     "onDownloadCancelled"
  1007   ]);
  1009   install.cancel();
  1011   ensure_test_completed();
  1013   install.addListener({
  1014     onDownloadProgress: function() {
  1015       do_throw("Download should not have continued");
  1016     },
  1017     onDownloadEnded: function() {
  1018       do_throw("Download should not have continued");
  1020   });
  1022   // Allow the listener to return to see if it continues downloading. The
  1023   // The listener only really tests if we give it time to see progress, the
  1024   // file check isn't ideal either
  1025   do_execute_soon(function() {
  1026     do_check_eq(install.file, null);
  1028     run_test_15();
  1029   });
  1032 // Checks that cancelling the install from onDownloadEnded actually cancels it
  1033 function run_test_15() {
  1034   prepare_test({ }, [
  1035     "onNewInstall"
  1036   ]);
  1038   let url = "http://localhost:4444/addons/test_install2_1.xpi";
  1039   AddonManager.getInstallForURL(url, function(install) {
  1040     ensure_test_completed();
  1042     do_check_eq(install.file, null);
  1044     prepare_test({ }, [
  1045       "onDownloadStarted",
  1046       "onDownloadEnded"
  1047     ], check_test_15);
  1048     install.install();
  1049   }, "application/x-xpinstall");
  1052 function check_test_15(install) {
  1053   prepare_test({ }, [
  1054     "onDownloadCancelled"
  1055   ]);
  1057   install.cancel();
  1059   ensure_test_completed();
  1061   install.addListener({
  1062     onInstallStarted: function() {
  1063       do_throw("Install should not have continued");
  1065   });
  1067   // Allow the listener to return to see if it starts installing
  1068   do_execute_soon(run_test_16);
  1071 // Verify that the userDisabled value carries over to the upgrade by default
  1072 function run_test_16() {
  1073   restartManager();
  1075   let url = "http://localhost:4444/addons/test_install2_1.xpi";
  1076   AddonManager.getInstallForURL(url, function(aInstall) {
  1077     aInstall.addListener({
  1078       onInstallStarted: function() {
  1079         do_check_false(aInstall.addon.userDisabled);
  1080         aInstall.addon.userDisabled = true;
  1081       },
  1083       onInstallEnded: function() {
  1084        do_execute_soon(function test16_install1() {
  1085         restartManager();
  1087         AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {
  1088           do_check_true(a2.userDisabled);
  1089           do_check_false(a2.isActive);
  1091           let url = "http://localhost:4444/addons/test_install2_2.xpi";
  1092           AddonManager.getInstallForURL(url, function(aInstall) {
  1093             aInstall.addListener({
  1094               onInstallEnded: function() {
  1095                do_execute_soon(function test16_install2() {
  1096                 do_check_true(aInstall.addon.userDisabled);
  1098                 restartManager();
  1100                 AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {
  1101                   do_check_true(a2.userDisabled);
  1102                   do_check_false(a2.isActive);
  1104                   a2.uninstall();
  1105                   do_execute_soon(run_test_17);
  1106                 });
  1107                });
  1109             });
  1110             aInstall.install();
  1111           }, "application/x-xpinstall");
  1112         });
  1113        });
  1115     });
  1116     aInstall.install();
  1117   }, "application/x-xpinstall");
  1120 // Verify that changing the userDisabled value before onInstallEnded works
  1121 function run_test_17() {
  1122   restartManager();
  1124   let url = "http://localhost:4444/addons/test_install2_1.xpi";
  1125   AddonManager.getInstallForURL(url, function(aInstall) {
  1126     aInstall.addListener({
  1127       onInstallEnded: function() {
  1128        do_execute_soon(function test17_install1() {
  1129         do_check_false(aInstall.addon.userDisabled);
  1131         restartManager();
  1133         AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {
  1134           do_check_false(a2.userDisabled);
  1135           do_check_true(a2.isActive);
  1137           let url = "http://localhost:4444/addons/test_install2_2.xpi";
  1138           AddonManager.getInstallForURL(url, function(aInstall) {
  1139             aInstall.addListener({
  1140               onInstallStarted: function() {
  1141                 do_check_false(aInstall.addon.userDisabled);
  1142                 aInstall.addon.userDisabled = true;
  1143               },
  1145               onInstallEnded: function() {
  1146                do_execute_soon(function test17_install1() {
  1147                 restartManager();
  1149                 AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {
  1150                   do_check_true(a2.userDisabled);
  1151                   do_check_false(a2.isActive);
  1153                   a2.uninstall();
  1154                   do_execute_soon(run_test_18);
  1155                 });
  1156                });
  1158             });
  1159             aInstall.install();
  1160           }, "application/x-xpinstall");
  1161         });
  1162        });
  1164     });
  1165     aInstall.install();
  1166   }, "application/x-xpinstall");
  1169 // Verify that changing the userDisabled value before onInstallEnded works
  1170 function run_test_18() {
  1171   restartManager();
  1173   let url = "http://localhost:4444/addons/test_install2_1.xpi";
  1174   AddonManager.getInstallForURL(url, function(aInstall) {
  1175     aInstall.addListener({
  1176       onInstallStarted: function() {
  1177         do_check_false(aInstall.addon.userDisabled);
  1178         aInstall.addon.userDisabled = true;
  1179       },
  1181       onInstallEnded: function() {
  1182        do_execute_soon(function test18_install1() {
  1183         restartManager();
  1185         AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {
  1186           do_check_true(a2.userDisabled);
  1187           do_check_false(a2.isActive);
  1189           let url = "http://localhost:4444/addons/test_install2_2.xpi";
  1190           AddonManager.getInstallForURL(url, function(aInstall) {
  1191             aInstall.addListener({
  1192               onInstallStarted: function() {
  1193                 do_check_true(aInstall.addon.userDisabled);
  1194                 aInstall.addon.userDisabled = false;
  1195               },
  1197               onInstallEnded: function() {
  1198                do_execute_soon(function test18_install2() {
  1199                 restartManager();
  1201                 AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {
  1202                   do_check_false(a2.userDisabled);
  1203                   do_check_true(a2.isActive);
  1205                   a2.uninstall();
  1206                   do_execute_soon(run_test_18_1);
  1207                 });
  1208                });
  1210             });
  1211             aInstall.install();
  1212           }, "application/x-xpinstall");
  1213         });
  1214        });
  1216     });
  1217     aInstall.install();
  1218   }, "application/x-xpinstall");
  1222 // Checks that metadata is not stored if the pref is set to false
  1223 function run_test_18_1() {
  1224   restartManager();
  1226   Services.prefs.setBoolPref("extensions.getAddons.cache.enabled", true);
  1227   Services.prefs.setCharPref(PREF_GETADDONS_BYIDS,
  1228                              "http://localhost:4444/data/test_install.xml");
  1230   Services.prefs.setBoolPref("extensions.addon2@tests.mozilla.org.getAddons.cache.enabled", false);
  1232   let url = "http://localhost:4444/addons/test_install2_1.xpi";
  1233   AddonManager.getInstallForURL(url, function(aInstall) {
  1234     aInstall.addListener({
  1235       onInstallEnded: function(aInstall, aAddon) {
  1236        do_execute_soon(function test18_install() {
  1237         do_check_neq(aAddon.fullDescription, "Repository description");
  1239         restartManager();
  1241         AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {
  1242           do_check_neq(a2.fullDescription, "Repository description");
  1244           a2.uninstall();
  1245           do_execute_soon(run_test_19);
  1246         });
  1247        });
  1249     });
  1250     aInstall.install();
  1251   }, "application/x-xpinstall");
  1254 // Checks that metadata is downloaded for new installs and is visible before and
  1255 // after restart
  1256 function run_test_19() {
  1257   restartManager();
  1258   Services.prefs.setBoolPref("extensions.addon2@tests.mozilla.org.getAddons.cache.enabled", true);
  1260   let url = "http://localhost:4444/addons/test_install2_1.xpi";
  1261   AddonManager.getInstallForURL(url, function(aInstall) {
  1262     aInstall.addListener({
  1263       onInstallEnded: function(aInstall, aAddon) {
  1264        do_execute_soon(function test19_install() {
  1265         do_check_eq(aAddon.fullDescription, "Repository description");
  1267         restartManager();
  1269         AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {
  1270           do_check_eq(a2.fullDescription, "Repository description");
  1272           a2.uninstall();
  1273           do_execute_soon(run_test_20);
  1274         });
  1275        });
  1277     });
  1278     aInstall.install();
  1279   }, "application/x-xpinstall");
  1282 // Do the same again to make sure it works when the data is already in the cache
  1283 function run_test_20() {
  1284   restartManager();
  1286   let url = "http://localhost:4444/addons/test_install2_1.xpi";
  1287   AddonManager.getInstallForURL(url, function(aInstall) {
  1288     aInstall.addListener({
  1289       onInstallEnded: function(aInstall, aAddon) {
  1290        do_execute_soon(function test20_install() {
  1291         do_check_eq(aAddon.fullDescription, "Repository description");
  1293         restartManager();
  1295         AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {
  1296           do_check_eq(a2.fullDescription, "Repository description");
  1298           a2.uninstall();
  1299           do_execute_soon(run_test_21);
  1300         });
  1301        });
  1303     });
  1304     aInstall.install();
  1305   }, "application/x-xpinstall");
  1308 // Verify that installing an add-on that is already pending install cancels the
  1309 // first install
  1310 function run_test_21() {
  1311   restartManager();
  1312   Services.prefs.setBoolPref("extensions.getAddons.cache.enabled", false);
  1314   installAllFiles([do_get_addon("test_install2_1")], function() {
  1315     AddonManager.getAllInstalls(function(aInstalls) {
  1316       do_check_eq(aInstalls.length, 1);
  1318       prepare_test({
  1319         "addon2@tests.mozilla.org": [
  1320           "onOperationCancelled",
  1321           "onInstalling"
  1323       }, [
  1324         "onNewInstall",
  1325         "onDownloadStarted",
  1326         "onDownloadEnded",
  1327         "onInstallStarted",
  1328         "onInstallCancelled",
  1329         "onInstallEnded",
  1330       ], check_test_21);
  1332       let url = "http://localhost:4444/addons/test_install2_1.xpi";
  1333       AddonManager.getInstallForURL(url, function(aInstall) {
  1334         aInstall.install();
  1335       }, "application/x-xpinstall");
  1336     });
  1337   });
  1340 function check_test_21(aInstall) {
  1341   AddonManager.getAllInstalls(callback_soon(function(aInstalls) {
  1342     do_check_eq(aInstalls.length, 1);
  1343     do_check_eq(aInstalls[0], aInstall);
  1345     prepare_test({
  1346       "addon2@tests.mozilla.org": [
  1347         "onOperationCancelled"
  1349     }, [
  1350       "onInstallCancelled",
  1351     ]);
  1353     aInstall.cancel();
  1355     ensure_test_completed();
  1357     restartManager();
  1359     AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {
  1360       do_check_eq(a2, null);
  1362       run_test_22();
  1363     });
  1364   }));
  1367 // Tests that an install can be restarted after being cancelled
  1368 function run_test_22() {
  1369   prepare_test({ }, [
  1370     "onNewInstall"
  1371   ]);
  1373   let url = "http://localhost:4444/addons/test_install3.xpi";
  1374   AddonManager.getInstallForURL(url, function(aInstall) {
  1375     ensure_test_completed();
  1377     do_check_neq(aInstall, null);
  1378     do_check_eq(aInstall.state, AddonManager.STATE_AVAILABLE);
  1380     prepare_test({}, [
  1381       "onDownloadStarted",
  1382       "onDownloadEnded",
  1383     ], check_test_22);
  1384     aInstall.install();
  1385   }, "application/x-xpinstall");
  1388 function check_test_22(aInstall) {
  1389   prepare_test({}, [
  1390     "onDownloadCancelled"
  1391   ]);
  1393   aInstall.cancel();
  1395   ensure_test_completed();
  1397   prepare_test({
  1398     "addon3@tests.mozilla.org": [
  1399       "onInstalling"
  1401   }, [
  1402     "onDownloadStarted",
  1403     "onDownloadEnded",
  1404     "onInstallStarted",
  1405     "onInstallEnded"
  1406   ], finish_test_22);
  1408   aInstall.install();
  1411 function finish_test_22(aInstall) {
  1412   prepare_test({
  1413     "addon3@tests.mozilla.org": [
  1414       "onOperationCancelled"
  1416   }, [
  1417     "onInstallCancelled"
  1418   ]);
  1420   aInstall.cancel();
  1422   ensure_test_completed();
  1424   run_test_23();
  1427 // Tests that an install can be restarted after being cancelled when a hash
  1428 // was provided
  1429 function run_test_23() {
  1430   prepare_test({ }, [
  1431     "onNewInstall"
  1432   ]);
  1434   let url = "http://localhost:4444/addons/test_install3.xpi";
  1435   AddonManager.getInstallForURL(url, function(aInstall) {
  1436     ensure_test_completed();
  1438     do_check_neq(aInstall, null);
  1439     do_check_eq(aInstall.state, AddonManager.STATE_AVAILABLE);
  1441     prepare_test({}, [
  1442       "onDownloadStarted",
  1443       "onDownloadEnded",
  1444     ], check_test_23);
  1445     aInstall.install();
  1446   }, "application/x-xpinstall", do_get_addon_hash("test_install3"));
  1449 function check_test_23(aInstall) {
  1450   prepare_test({}, [
  1451     "onDownloadCancelled"
  1452   ]);
  1454   aInstall.cancel();
  1456   ensure_test_completed();
  1458   prepare_test({
  1459     "addon3@tests.mozilla.org": [
  1460       "onInstalling"
  1462   }, [
  1463     "onDownloadStarted",
  1464     "onDownloadEnded",
  1465     "onInstallStarted",
  1466     "onInstallEnded"
  1467   ], finish_test_23);
  1469   aInstall.install();
  1472 function finish_test_23(aInstall) {
  1473   prepare_test({
  1474     "addon3@tests.mozilla.org": [
  1475       "onOperationCancelled"
  1477   }, [
  1478     "onInstallCancelled"
  1479   ]);
  1481   aInstall.cancel();
  1483   ensure_test_completed();
  1485   run_test_24();
  1488 // Tests that an install with a bad hash can be restarted after it fails, though
  1489 // it will only fail again
  1490 function run_test_24() {
  1491   prepare_test({ }, [
  1492     "onNewInstall"
  1493   ]);
  1495   let url = "http://localhost:4444/addons/test_install3.xpi";
  1496   AddonManager.getInstallForURL(url, function(aInstall) {
  1497     ensure_test_completed();
  1499     do_check_neq(aInstall, null);
  1500     do_check_eq(aInstall.state, AddonManager.STATE_AVAILABLE);
  1502     prepare_test({}, [
  1503       "onDownloadStarted",
  1504       "onDownloadFailed",
  1505     ], check_test_24);
  1506     aInstall.install();
  1507   }, "application/x-xpinstall", "sha1:foo");
  1510 function check_test_24(aInstall) {
  1511   prepare_test({ }, [
  1512     "onDownloadStarted",
  1513     "onDownloadFailed"
  1514   ], run_test_25);
  1516   aInstall.install();
  1519 // Tests that installs with a hash for a local file work
  1520 function run_test_25() {
  1521   prepare_test({ }, [
  1522     "onNewInstall"
  1523   ]);
  1525   let url = Services.io.newFileURI(do_get_addon("test_install3")).spec;
  1526   AddonManager.getInstallForURL(url, function(aInstall) {
  1527     ensure_test_completed();
  1529     do_check_neq(aInstall, null);
  1530     do_check_eq(aInstall.state, AddonManager.STATE_DOWNLOADED);
  1531     do_check_eq(aInstall.error, 0);
  1533     prepare_test({ }, [
  1534       "onDownloadCancelled"
  1535     ]);
  1537     aInstall.cancel();
  1539     ensure_test_completed();
  1541     run_test_26();
  1542   }, "application/x-xpinstall", do_get_addon_hash("test_install3"));
  1545 function run_test_26() {
  1546   prepare_test({ }, [
  1547     "onNewInstall",
  1548     "onDownloadStarted",
  1549     "onDownloadCancelled"
  1550   ]);
  1552   let observerService = AM_Cc["@mozilla.org/network/http-activity-distributor;1"].
  1553                         getService(AM_Ci.nsIHttpActivityDistributor);
  1554   observerService.addObserver({
  1555     observeActivity: function(aChannel, aType, aSubtype, aTimestamp, aSizeData,
  1556                               aStringData) {
  1557       aChannel.QueryInterface(AM_Ci.nsIChannel);
  1558       // Wait for the final event for the redirected URL
  1559       if (aChannel.URI.spec != "http://localhost:4444/addons/test_install1.xpi" ||
  1560           aType != AM_Ci.nsIHttpActivityObserver.ACTIVITY_TYPE_HTTP_TRANSACTION ||
  1561           aSubtype != AM_Ci.nsIHttpActivityObserver.ACTIVITY_SUBTYPE_TRANSACTION_CLOSE)
  1562         return;
  1564       // Request should have been cancelled
  1565       do_check_eq(aChannel.status, Components.results.NS_BINDING_ABORTED);
  1567       observerService.removeObserver(this);
  1569       run_test_27();
  1571   });
  1573   let url = "http://localhost:4444/redirect?/addons/test_install1.xpi";
  1574   AddonManager.getInstallForURL(url, function(aInstall) {
  1575     aInstall.addListener({
  1576       onDownloadProgress: function(aInstall) {
  1577         aInstall.cancel();
  1579     });
  1581     aInstall.install();
  1582   }, "application/x-xpinstall");
  1586 // Tests that an install can be restarted during onDownloadCancelled after being
  1587 // cancelled in mid-download
  1588 function run_test_27() {
  1589   prepare_test({ }, [
  1590     "onNewInstall"
  1591   ]);
  1593   let url = "http://localhost:4444/addons/test_install3.xpi";
  1594   AddonManager.getInstallForURL(url, function(aInstall) {
  1595     ensure_test_completed();
  1597     do_check_neq(aInstall, null);
  1598     do_check_eq(aInstall.state, AddonManager.STATE_AVAILABLE);
  1600     aInstall.addListener({
  1601       onDownloadProgress: function() {
  1602         aInstall.removeListener(this);
  1603         aInstall.cancel();
  1605     });
  1607     prepare_test({}, [
  1608       "onDownloadStarted",
  1609       "onDownloadCancelled",
  1610     ], check_test_27);
  1611     aInstall.install();
  1612   }, "application/x-xpinstall");
  1615 function check_test_27(aInstall) {
  1616   prepare_test({
  1617     "addon3@tests.mozilla.org": [
  1618       "onInstalling"
  1620   }, [
  1621     "onDownloadStarted",
  1622     "onDownloadEnded",
  1623     "onInstallStarted",
  1624     "onInstallEnded"
  1625   ], finish_test_27);
  1627   aInstall.install();
  1630 function finish_test_27(aInstall) {
  1631   prepare_test({
  1632     "addon3@tests.mozilla.org": [
  1633       "onOperationCancelled"
  1635   }, [
  1636     "onInstallCancelled"
  1637   ]);
  1639   aInstall.cancel();
  1641   ensure_test_completed();
  1643   end_test();

mercurial