1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/toolkit/mozapps/extensions/test/xpcshell/test_install_strictcompat.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,1644 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 + * http://creativecommons.org/publicdomain/zero/1.0/ 1.6 + */ 1.7 + 1.8 +// This verifies that add-ons can be installed from XPI files 1.9 +const Cc = Components.classes; 1.10 +const Ci = Components.interfaces; 1.11 +const Cu = Components.utils; 1.12 + 1.13 +// Maximum error in file modification times. Some file systems don't store 1.14 +// modification times exactly. As long as we are closer than this then it 1.15 +// still passes. 1.16 +const MAX_TIME_DIFFERENCE = 3000; 1.17 + 1.18 +// install.rdf size, icon.png, icon64.png size 1.19 +const ADDON1_SIZE = 705 + 16 + 16; 1.20 + 1.21 +Cu.import("resource://gre/modules/Services.jsm"); 1.22 +Cu.import("resource://gre/modules/NetUtil.jsm"); 1.23 +Cu.import("resource://testing-common/httpd.js"); 1.24 + 1.25 +var testserver; 1.26 +var gInstallDate; 1.27 +var gInstall = null; 1.28 + 1.29 +// The test extension uses an insecure update url. 1.30 +Services.prefs.setBoolPref(PREF_EM_CHECK_UPDATE_SECURITY, false); 1.31 +Services.prefs.setBoolPref(PREF_EM_STRICT_COMPATIBILITY, true); 1.32 + 1.33 + 1.34 +const profileDir = gProfD.clone(); 1.35 +profileDir.append("extensions"); 1.36 + 1.37 +function run_test() { 1.38 + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); 1.39 + 1.40 + startupManager(); 1.41 + // Make sure we only register once despite multiple calls 1.42 + AddonManager.addInstallListener(InstallListener); 1.43 + AddonManager.addAddonListener(AddonListener); 1.44 + AddonManager.addInstallListener(InstallListener); 1.45 + AddonManager.addAddonListener(AddonListener); 1.46 + 1.47 + // Create and configure the HTTP server. 1.48 + testserver = new HttpServer(); 1.49 + testserver.registerDirectory("/addons/", do_get_file("addons")); 1.50 + testserver.registerDirectory("/data/", do_get_file("data")); 1.51 + testserver.registerPathHandler("/redirect", function(aRequest, aResponse) { 1.52 + aResponse.setStatusLine(null, 301, "Moved Permanently"); 1.53 + let url = aRequest.host + ":" + aRequest.port + aRequest.queryString; 1.54 + aResponse.setHeader("Location", "http://" + url); 1.55 + }); 1.56 + testserver.start(4444); 1.57 + 1.58 + do_test_pending(); 1.59 + run_test_1(); 1.60 +} 1.61 + 1.62 +function end_test() { 1.63 + testserver.stop(do_test_finished); 1.64 +} 1.65 + 1.66 +// Checks that an install from a local file proceeds as expected 1.67 +function run_test_1() { 1.68 + prepare_test({ }, [ 1.69 + "onNewInstall" 1.70 + ]); 1.71 + 1.72 + AddonManager.getInstallForFile(do_get_addon("test_install1"), function(install) { 1.73 + ensure_test_completed(); 1.74 + 1.75 + do_check_neq(install, null); 1.76 + do_check_eq(install.linkedInstalls, null); 1.77 + do_check_eq(install.type, "extension"); 1.78 + do_check_eq(install.version, "1.0"); 1.79 + do_check_eq(install.name, "Test 1"); 1.80 + do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); 1.81 + do_check_true(install.addon.hasResource("install.rdf")); 1.82 + do_check_eq(install.addon.install, install); 1.83 + do_check_eq(install.addon.size, ADDON1_SIZE); 1.84 + do_check_true(hasFlag(install.addon.operationsRequiringRestart, 1.85 + AddonManager.OP_NEEDS_RESTART_INSTALL)); 1.86 + let file = do_get_addon("test_install1"); 1.87 + let uri = Services.io.newFileURI(file).spec; 1.88 + do_check_eq(install.addon.getResourceURI("install.rdf").spec, "jar:" + uri + "!/install.rdf"); 1.89 + do_check_eq(install.addon.iconURL, "jar:" + uri + "!/icon.png"); 1.90 + do_check_eq(install.addon.icon64URL, "jar:" + uri + "!/icon64.png"); 1.91 + do_check_eq(install.iconURL, null); 1.92 + 1.93 + do_check_eq(install.sourceURI.spec, uri); 1.94 + do_check_eq(install.addon.sourceURI.spec, uri); 1.95 + 1.96 + AddonManager.getAllInstalls(function(activeInstalls) { 1.97 + do_check_eq(activeInstalls.length, 1); 1.98 + do_check_eq(activeInstalls[0], install); 1.99 + 1.100 + AddonManager.getInstallsByTypes(["foo"], function(fooInstalls) { 1.101 + do_check_eq(fooInstalls.length, 0); 1.102 + 1.103 + AddonManager.getInstallsByTypes(["extension"], function(extensionInstalls) { 1.104 + do_check_eq(extensionInstalls.length, 1); 1.105 + do_check_eq(extensionInstalls[0], install); 1.106 + 1.107 + prepare_test({ 1.108 + "addon1@tests.mozilla.org": [ 1.109 + "onInstalling" 1.110 + ] 1.111 + }, [ 1.112 + "onInstallStarted", 1.113 + "onInstallEnded", 1.114 + ], check_test_1); 1.115 + install.install(); 1.116 + }); 1.117 + }); 1.118 + }); 1.119 + }); 1.120 +} 1.121 + 1.122 +function check_test_1() { 1.123 + ensure_test_completed(); 1.124 + AddonManager.getAddonByID("addon1@tests.mozilla.org", function(olda1) { 1.125 + do_check_eq(olda1, null); 1.126 + 1.127 + AddonManager.getAddonsWithOperationsByTypes(null, callback_soon(function(pendingAddons) { 1.128 + do_check_eq(pendingAddons.length, 1); 1.129 + do_check_eq(pendingAddons[0].id, "addon1@tests.mozilla.org"); 1.130 + let uri = NetUtil.newURI(pendingAddons[0].iconURL); 1.131 + if (uri instanceof AM_Ci.nsIJARURI) { 1.132 + let jarURI = uri.QueryInterface(AM_Ci.nsIJARURI); 1.133 + let archiveURI = jarURI.JARFile; 1.134 + let archiveFile = archiveURI.QueryInterface(AM_Ci.nsIFileURL).file; 1.135 + let zipReader = Cc["@mozilla.org/libjar/zip-reader;1"]. 1.136 + createInstance(Ci.nsIZipReader); 1.137 + try { 1.138 + zipReader.open(archiveFile); 1.139 + do_check_true(zipReader.hasEntry(jarURI.JAREntry)); 1.140 + } 1.141 + finally { 1.142 + zipReader.close(); 1.143 + } 1.144 + } 1.145 + else { 1.146 + let iconFile = uri.QueryInterface(AM_Ci.nsIFileURL).file; 1.147 + do_check_true(iconFile.exists()); 1.148 + } 1.149 + 1.150 + // Make the pending install have a sensible date 1.151 + let updateDate = Date.now(); 1.152 + let extURI = pendingAddons[0].getResourceURI(""); 1.153 + let ext = extURI.QueryInterface(AM_Ci.nsIFileURL).file; 1.154 + setExtensionModifiedTime(ext, updateDate); 1.155 + 1.156 + // The pending add-on cannot be disabled or enabled. 1.157 + do_check_false(hasFlag(pendingAddons[0].permissions, AddonManager.PERM_CAN_ENABLE)); 1.158 + do_check_false(hasFlag(pendingAddons[0].permissions, AddonManager.PERM_CAN_DISABLE)); 1.159 + 1.160 + restartManager(); 1.161 + 1.162 + AddonManager.getAllInstalls(function(activeInstalls) { 1.163 + do_check_eq(activeInstalls, 0); 1.164 + 1.165 + AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) { 1.166 + do_check_neq(a1, null); 1.167 + do_check_eq(a1.type, "extension"); 1.168 + do_check_eq(a1.version, "1.0"); 1.169 + do_check_eq(a1.name, "Test 1"); 1.170 + do_check_true(isExtensionInAddonsList(profileDir, a1.id)); 1.171 + do_check_true(do_get_addon("test_install1").exists()); 1.172 + do_check_in_crash_annotation(a1.id, a1.version); 1.173 + do_check_eq(a1.size, ADDON1_SIZE); 1.174 + 1.175 + do_check_eq(a1.sourceURI.spec, 1.176 + Services.io.newFileURI(do_get_addon("test_install1")).spec); 1.177 + let difference = a1.installDate.getTime() - updateDate; 1.178 + if (Math.abs(difference) > MAX_TIME_DIFFERENCE) 1.179 + do_throw("Add-on install time was out by " + difference + "ms"); 1.180 + 1.181 + difference = a1.updateDate.getTime() - updateDate; 1.182 + if (Math.abs(difference) > MAX_TIME_DIFFERENCE) 1.183 + do_throw("Add-on update time was out by " + difference + "ms"); 1.184 + 1.185 + do_check_true(a1.hasResource("install.rdf")); 1.186 + do_check_false(a1.hasResource("foo.bar")); 1.187 + 1.188 + let uri = do_get_addon_root_uri(profileDir, "addon1@tests.mozilla.org"); 1.189 + do_check_eq(a1.getResourceURI("install.rdf").spec, uri + "install.rdf"); 1.190 + do_check_eq(a1.iconURL, uri + "icon.png"); 1.191 + do_check_eq(a1.icon64URL, uri + "icon64.png"); 1.192 + 1.193 + a1.uninstall(); 1.194 + do_execute_soon(function(){run_test_2(a1)}); 1.195 + }); 1.196 + }); 1.197 + })); 1.198 + }); 1.199 +} 1.200 + 1.201 +// Tests that an install from a url downloads. 1.202 +function run_test_2(aAddon) { 1.203 + restartManager(); 1.204 + do_check_not_in_crash_annotation(aAddon.id, aAddon.version); 1.205 + 1.206 + let url = "http://localhost:4444/addons/test_install2_1.xpi"; 1.207 + AddonManager.getInstallForURL(url, function(install) { 1.208 + do_check_neq(install, null); 1.209 + do_check_eq(install.linkedInstalls, null); 1.210 + do_check_eq(install.version, "1.0"); 1.211 + do_check_eq(install.name, "Test 2"); 1.212 + do_check_eq(install.state, AddonManager.STATE_AVAILABLE); 1.213 + do_check_eq(install.iconURL, null); 1.214 + do_check_eq(install.sourceURI.spec, url); 1.215 + 1.216 + AddonManager.getAllInstalls(function(activeInstalls) { 1.217 + do_check_eq(activeInstalls.length, 1); 1.218 + do_check_eq(activeInstalls[0], install); 1.219 + 1.220 + prepare_test({}, [ 1.221 + "onDownloadStarted", 1.222 + "onDownloadEnded", 1.223 + ], check_test_2); 1.224 + 1.225 + install.addListener({ 1.226 + onDownloadProgress: function(install) { 1.227 + do_execute_soon(function() { 1.228 + Components.utils.forceGC(); 1.229 + }); 1.230 + } 1.231 + }); 1.232 + 1.233 + install.install(); 1.234 + }); 1.235 + }, "application/x-xpinstall", null, "Test 2", null, "1.0"); 1.236 +} 1.237 + 1.238 +function check_test_2(install) { 1.239 + ensure_test_completed(); 1.240 + do_check_eq(install.version, "2.0"); 1.241 + do_check_eq(install.name, "Real Test 2"); 1.242 + do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); 1.243 + do_check_eq(install.addon.install, install); 1.244 + do_check_true(hasFlag(install.addon.operationsRequiringRestart, 1.245 + AddonManager.OP_NEEDS_RESTART_INSTALL)); 1.246 + do_check_eq(install.iconURL, null); 1.247 + 1.248 + // Pause the install here and start it again in run_test_3 1.249 + do_execute_soon(function() { run_test_3(install); }); 1.250 + return false; 1.251 +} 1.252 + 1.253 +// Tests that the downloaded XPI installs ok 1.254 +function run_test_3(install) { 1.255 + prepare_test({ 1.256 + "addon2@tests.mozilla.org": [ 1.257 + "onInstalling" 1.258 + ] 1.259 + }, [ 1.260 + "onInstallStarted", 1.261 + "onInstallEnded", 1.262 + ], check_test_3); 1.263 + install.install(); 1.264 +} 1.265 + 1.266 +function check_test_3(aInstall) { 1.267 + // Make the pending install have a sensible date 1.268 + let updateDate = Date.now(); 1.269 + let extURI = aInstall.addon.getResourceURI(""); 1.270 + let ext = extURI.QueryInterface(AM_Ci.nsIFileURL).file; 1.271 + setExtensionModifiedTime(ext, updateDate); 1.272 + 1.273 + ensure_test_completed(); 1.274 + AddonManager.getAddonByID("addon2@tests.mozilla.org", callback_soon(function(olda2) { 1.275 + do_check_eq(olda2, null); 1.276 + restartManager(); 1.277 + 1.278 + AddonManager.getAllInstalls(function(installs) { 1.279 + do_check_eq(installs, 0); 1.280 + 1.281 + AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { 1.282 + do_check_neq(a2, null); 1.283 + do_check_eq(a2.type, "extension"); 1.284 + do_check_eq(a2.version, "2.0"); 1.285 + do_check_eq(a2.name, "Real Test 2"); 1.286 + do_check_true(isExtensionInAddonsList(profileDir, a2.id)); 1.287 + do_check_true(do_get_addon("test_install2_1").exists()); 1.288 + do_check_in_crash_annotation(a2.id, a2.version); 1.289 + do_check_eq(a2.sourceURI.spec, 1.290 + "http://localhost:4444/addons/test_install2_1.xpi"); 1.291 + 1.292 + let difference = a2.installDate.getTime() - updateDate; 1.293 + if (Math.abs(difference) > MAX_TIME_DIFFERENCE) 1.294 + do_throw("Add-on install time was out by " + difference + "ms"); 1.295 + 1.296 + difference = a2.updateDate.getTime() - updateDate; 1.297 + if (Math.abs(difference) > MAX_TIME_DIFFERENCE) 1.298 + do_throw("Add-on update time was out by " + difference + "ms"); 1.299 + 1.300 + gInstallDate = a2.installDate.getTime(); 1.301 + 1.302 + run_test_4(); 1.303 + }); 1.304 + }); 1.305 + })); 1.306 +} 1.307 + 1.308 +// Tests that installing a new version of an existing add-on works 1.309 +function run_test_4() { 1.310 + prepare_test({ }, [ 1.311 + "onNewInstall" 1.312 + ]); 1.313 + 1.314 + let url = "http://localhost:4444/addons/test_install2_2.xpi"; 1.315 + AddonManager.getInstallForURL(url, function(install) { 1.316 + ensure_test_completed(); 1.317 + 1.318 + do_check_neq(install, null); 1.319 + do_check_eq(install.version, "3.0"); 1.320 + do_check_eq(install.name, "Test 3"); 1.321 + do_check_eq(install.state, AddonManager.STATE_AVAILABLE); 1.322 + 1.323 + AddonManager.getAllInstalls(function(activeInstalls) { 1.324 + do_check_eq(activeInstalls.length, 1); 1.325 + do_check_eq(activeInstalls[0], install); 1.326 + do_check_eq(install.existingAddon, null); 1.327 + 1.328 + prepare_test({}, [ 1.329 + "onDownloadStarted", 1.330 + "onDownloadEnded", 1.331 + ], check_test_4); 1.332 + install.install(); 1.333 + }); 1.334 + }, "application/x-xpinstall", null, "Test 3", null, "3.0"); 1.335 +} 1.336 + 1.337 +function check_test_4(install) { 1.338 + ensure_test_completed(); 1.339 + 1.340 + do_check_eq(install.version, "3.0"); 1.341 + do_check_eq(install.name, "Real Test 3"); 1.342 + do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); 1.343 + do_check_neq(install.existingAddon); 1.344 + do_check_eq(install.existingAddon.id, "addon2@tests.mozilla.org"); 1.345 + do_check_eq(install.addon.install, install); 1.346 + do_check_true(hasFlag(install.addon.operationsRequiringRestart, 1.347 + AddonManager.OP_NEEDS_RESTART_INSTALL)); 1.348 + 1.349 + run_test_5(); 1.350 + // Installation will continue when there is nothing returned. 1.351 +} 1.352 + 1.353 +// Continue installing the new version 1.354 +function run_test_5() { 1.355 + prepare_test({ 1.356 + "addon2@tests.mozilla.org": [ 1.357 + "onInstalling" 1.358 + ] 1.359 + }, [ 1.360 + "onInstallStarted", 1.361 + "onInstallEnded", 1.362 + ], check_test_5); 1.363 +} 1.364 + 1.365 +function check_test_5(install) { 1.366 + ensure_test_completed(); 1.367 + 1.368 + do_check_eq(install.existingAddon.pendingUpgrade.install, install); 1.369 + 1.370 + AddonManager.getAddonByID("addon2@tests.mozilla.org", function(olda2) { 1.371 + do_check_neq(olda2, null); 1.372 + do_check_true(hasFlag(olda2.pendingOperations, AddonManager.PENDING_UPGRADE)); 1.373 + 1.374 + AddonManager.getInstallsByTypes(null, callback_soon(function(installs) { 1.375 + do_check_eq(installs.length, 1); 1.376 + do_check_eq(installs[0].addon, olda2.pendingUpgrade); 1.377 + restartManager(); 1.378 + 1.379 + AddonManager.getInstallsByTypes(null, function(installs) { 1.380 + do_check_eq(installs.length, 0); 1.381 + 1.382 + AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { 1.383 + do_check_neq(a2, null); 1.384 + do_check_eq(a2.type, "extension"); 1.385 + do_check_eq(a2.version, "3.0"); 1.386 + do_check_eq(a2.name, "Real Test 3"); 1.387 + do_check_true(a2.isActive); 1.388 + do_check_true(isExtensionInAddonsList(profileDir, a2.id)); 1.389 + do_check_true(do_get_addon("test_install2_2").exists()); 1.390 + do_check_in_crash_annotation(a2.id, a2.version); 1.391 + do_check_eq(a2.sourceURI.spec, 1.392 + "http://localhost:4444/addons/test_install2_2.xpi"); 1.393 + 1.394 + do_check_eq(a2.installDate.getTime(), gInstallDate); 1.395 + // Update date should be later (or the same if this test is too fast) 1.396 + do_check_true(a2.installDate <= a2.updateDate); 1.397 + 1.398 + a2.uninstall(); 1.399 + do_execute_soon(run_test_6); 1.400 + }); 1.401 + }); 1.402 + })); 1.403 + }); 1.404 +} 1.405 + 1.406 +// Tests that an install that requires a compatibility update works 1.407 +function run_test_6() { 1.408 + restartManager(); 1.409 + 1.410 + prepare_test({ }, [ 1.411 + "onNewInstall" 1.412 + ]); 1.413 + 1.414 + let url = "http://localhost:4444/addons/test_install3.xpi"; 1.415 + AddonManager.getInstallForURL(url, function(install) { 1.416 + ensure_test_completed(); 1.417 + 1.418 + do_check_neq(install, null); 1.419 + do_check_eq(install.version, "1.0"); 1.420 + do_check_eq(install.name, "Real Test 4"); 1.421 + do_check_eq(install.state, AddonManager.STATE_AVAILABLE); 1.422 + 1.423 + AddonManager.getInstallsByTypes(null, function(activeInstalls) { 1.424 + do_check_eq(activeInstalls.length, 1); 1.425 + do_check_eq(activeInstalls[0], install); 1.426 + 1.427 + prepare_test({}, [ 1.428 + "onDownloadStarted", 1.429 + "onDownloadEnded", 1.430 + ], check_test_6); 1.431 + install.install(); 1.432 + }); 1.433 + }, "application/x-xpinstall", null, "Real Test 4", null, "1.0"); 1.434 +} 1.435 + 1.436 +function check_test_6(install) { 1.437 + ensure_test_completed(); 1.438 + do_check_eq(install.version, "1.0"); 1.439 + do_check_eq(install.name, "Real Test 4"); 1.440 + do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); 1.441 + do_check_eq(install.existingAddon, null); 1.442 + do_check_false(install.addon.appDisabled); 1.443 + run_test_7(); 1.444 + return true; 1.445 +} 1.446 + 1.447 +// Continue the install 1.448 +function run_test_7() { 1.449 + prepare_test({ 1.450 + "addon3@tests.mozilla.org": [ 1.451 + "onInstalling" 1.452 + ] 1.453 + }, [ 1.454 + "onInstallStarted", 1.455 + "onInstallEnded", 1.456 + ], check_test_7); 1.457 +} 1.458 + 1.459 +function check_test_7() { 1.460 + ensure_test_completed(); 1.461 + AddonManager.getAddonByID("addon3@tests.mozilla.org", callback_soon(function(olda3) { 1.462 + do_check_eq(olda3, null); 1.463 + restartManager(); 1.464 + 1.465 + AddonManager.getAllInstalls(function(installs) { 1.466 + do_check_eq(installs, 0); 1.467 + 1.468 + AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) { 1.469 + do_check_neq(a3, null); 1.470 + do_check_eq(a3.type, "extension"); 1.471 + do_check_eq(a3.version, "1.0"); 1.472 + do_check_eq(a3.name, "Real Test 4"); 1.473 + do_check_true(a3.isActive); 1.474 + do_check_false(a3.appDisabled); 1.475 + do_check_true(isExtensionInAddonsList(profileDir, a3.id)); 1.476 + do_check_true(do_get_addon("test_install3").exists()); 1.477 + a3.uninstall(); 1.478 + do_execute_soon(run_test_8); 1.479 + }); 1.480 + }); 1.481 + })); 1.482 +} 1.483 + 1.484 +function run_test_8() { 1.485 + restartManager(); 1.486 + 1.487 + AddonManager.addInstallListener(InstallListener); 1.488 + AddonManager.addAddonListener(AddonListener); 1.489 + 1.490 + prepare_test({ }, [ 1.491 + "onNewInstall" 1.492 + ]); 1.493 + 1.494 + AddonManager.getInstallForFile(do_get_addon("test_install3"), function(install) { 1.495 + do_check_true(install.addon.isCompatible); 1.496 + 1.497 + prepare_test({ 1.498 + "addon3@tests.mozilla.org": [ 1.499 + "onInstalling" 1.500 + ] 1.501 + }, [ 1.502 + "onInstallStarted", 1.503 + "onInstallEnded", 1.504 + ], callback_soon(check_test_8)); 1.505 + install.install(); 1.506 + }); 1.507 +} 1.508 + 1.509 +function check_test_8() { 1.510 + restartManager(); 1.511 + 1.512 + AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) { 1.513 + do_check_neq(a3, null); 1.514 + do_check_eq(a3.type, "extension"); 1.515 + do_check_eq(a3.version, "1.0"); 1.516 + do_check_eq(a3.name, "Real Test 4"); 1.517 + do_check_true(a3.isActive); 1.518 + do_check_false(a3.appDisabled); 1.519 + do_check_true(isExtensionInAddonsList(profileDir, a3.id)); 1.520 + do_check_true(do_get_addon("test_install3").exists()); 1.521 + a3.uninstall(); 1.522 + do_execute_soon(run_test_9); 1.523 + }); 1.524 +} 1.525 + 1.526 +// Test that after cancelling a download it is removed from the active installs 1.527 +function run_test_9() { 1.528 + restartManager(); 1.529 + 1.530 + prepare_test({ }, [ 1.531 + "onNewInstall" 1.532 + ]); 1.533 + 1.534 + let url = "http://localhost:4444/addons/test_install3.xpi"; 1.535 + AddonManager.getInstallForURL(url, function(install) { 1.536 + ensure_test_completed(); 1.537 + 1.538 + do_check_neq(install, null); 1.539 + do_check_eq(install.version, "1.0"); 1.540 + do_check_eq(install.name, "Real Test 4"); 1.541 + do_check_eq(install.state, AddonManager.STATE_AVAILABLE); 1.542 + 1.543 + AddonManager.getInstallsByTypes(null, function(activeInstalls) { 1.544 + do_check_eq(activeInstalls.length, 1); 1.545 + do_check_eq(activeInstalls[0], install); 1.546 + 1.547 + prepare_test({}, [ 1.548 + "onDownloadStarted", 1.549 + "onDownloadEnded", 1.550 + ], check_test_9); 1.551 + install.install(); 1.552 + }); 1.553 + }, "application/x-xpinstall", null, "Real Test 4", null, "1.0"); 1.554 +} 1.555 + 1.556 +function check_test_9(install) { 1.557 + prepare_test({}, [ 1.558 + "onDownloadCancelled" 1.559 + ]); 1.560 + 1.561 + install.cancel(); 1.562 + 1.563 + ensure_test_completed(); 1.564 + 1.565 + AddonManager.getAllInstalls(function(activeInstalls) { 1.566 + do_check_eq(activeInstalls.length, 0); 1.567 + 1.568 + run_test_10(); 1.569 + }); 1.570 +} 1.571 + 1.572 +// Tests that after cancelling a pending install it is removed from the active 1.573 +// installs 1.574 +function run_test_10() { 1.575 + prepare_test({ }, [ 1.576 + "onNewInstall" 1.577 + ]); 1.578 + 1.579 + let url = "http://localhost:4444/addons/test_install3.xpi"; 1.580 + AddonManager.getInstallForURL(url, function(install) { 1.581 + ensure_test_completed(); 1.582 + 1.583 + do_check_neq(install, null); 1.584 + do_check_eq(install.version, "1.0"); 1.585 + do_check_eq(install.name, "Real Test 4"); 1.586 + do_check_eq(install.state, AddonManager.STATE_AVAILABLE); 1.587 + 1.588 + AddonManager.getInstallsByTypes(null, function(activeInstalls) { 1.589 + do_check_eq(activeInstalls.length, 1); 1.590 + do_check_eq(activeInstalls[0], install); 1.591 + 1.592 + prepare_test({ 1.593 + "addon3@tests.mozilla.org": [ 1.594 + "onInstalling" 1.595 + ] 1.596 + }, [ 1.597 + "onDownloadStarted", 1.598 + "onDownloadEnded", 1.599 + "onInstallStarted", 1.600 + "onInstallEnded" 1.601 + ], check_test_10); 1.602 + install.install(); 1.603 + }); 1.604 + }, "application/x-xpinstall", null, "Real Test 4", null, "1.0"); 1.605 +} 1.606 + 1.607 +function check_test_10(install) { 1.608 + prepare_test({ 1.609 + "addon3@tests.mozilla.org": [ 1.610 + "onOperationCancelled" 1.611 + ] 1.612 + }, [ 1.613 + "onInstallCancelled" 1.614 + ]); 1.615 + 1.616 + install.cancel(); 1.617 + 1.618 + ensure_test_completed(); 1.619 + 1.620 + AddonManager.getAllInstalls(callback_soon(function(activeInstalls) { 1.621 + do_check_eq(activeInstalls.length, 0); 1.622 + 1.623 + restartManager(); 1.624 + 1.625 + // Check that the install did not complete 1.626 + AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) { 1.627 + do_check_eq(a3, null); 1.628 + 1.629 + run_test_11(); 1.630 + }); 1.631 + })); 1.632 +} 1.633 + 1.634 +// Tests that a multi-package install shows up as multiple installs with the 1.635 +// correct sourceURI. 1.636 +function run_test_11() { 1.637 + prepare_test({ }, [ 1.638 + "onNewInstall", 1.639 + "onNewInstall", 1.640 + "onNewInstall", 1.641 + "onNewInstall" 1.642 + ]); 1.643 + 1.644 + AddonManager.getInstallForFile(do_get_addon("test_install4"), function(install) { 1.645 + ensure_test_completed(); 1.646 + do_check_neq(install, null); 1.647 + do_check_neq(install.linkedInstalls, null); 1.648 + do_check_eq(install.linkedInstalls.length, 3); 1.649 + 1.650 + // Might be in any order so sort them based on ID 1.651 + let installs = [install].concat(install.linkedInstalls); 1.652 + installs.sort(function(a, b) { 1.653 + if (a.addon.id < b.addon.id) 1.654 + return -1; 1.655 + if (a.addon.id > b.addon.id) 1.656 + return 1; 1.657 + return 0; 1.658 + }); 1.659 + 1.660 + // Comes from addon4.xpi and is made compatible by an update check 1.661 + do_check_eq(installs[0].sourceURI, install.sourceURI); 1.662 + do_check_eq(installs[0].addon.id, "addon4@tests.mozilla.org"); 1.663 + do_check_false(installs[0].addon.appDisabled); 1.664 + do_check_eq(installs[0].version, "1.0"); 1.665 + do_check_eq(installs[0].name, "Multi Test 1"); 1.666 + do_check_eq(installs[0].state, AddonManager.STATE_DOWNLOADED); 1.667 + do_check_true(hasFlag(installs[0].addon.operationsRequiringRestart, 1.668 + AddonManager.OP_NEEDS_RESTART_INSTALL)); 1.669 + 1.670 + // Comes from addon5.jar and is compatible by default 1.671 + do_check_eq(installs[1].sourceURI, install.sourceURI); 1.672 + do_check_eq(installs[1].addon.id, "addon5@tests.mozilla.org"); 1.673 + do_check_false(installs[1].addon.appDisabled); 1.674 + do_check_eq(installs[1].version, "3.0"); 1.675 + do_check_eq(installs[1].name, "Multi Test 2"); 1.676 + do_check_eq(installs[1].state, AddonManager.STATE_DOWNLOADED); 1.677 + do_check_true(hasFlag(installs[1].addon.operationsRequiringRestart, 1.678 + AddonManager.OP_NEEDS_RESTART_INSTALL)); 1.679 + 1.680 + // Comes from addon6.xpi and is incompatible 1.681 + do_check_eq(installs[2].sourceURI, install.sourceURI); 1.682 + do_check_eq(installs[2].addon.id, "addon6@tests.mozilla.org"); 1.683 + do_check_true(installs[2].addon.appDisabled); 1.684 + do_check_eq(installs[2].version, "2.0"); 1.685 + do_check_eq(installs[2].name, "Multi Test 3"); 1.686 + do_check_eq(installs[2].state, AddonManager.STATE_DOWNLOADED); 1.687 + do_check_false(hasFlag(installs[2].addon.operationsRequiringRestart, 1.688 + AddonManager.OP_NEEDS_RESTART_INSTALL)); 1.689 + 1.690 + // Comes from addon7.jar and is made compatible by an update check 1.691 + do_check_eq(installs[3].sourceURI, install.sourceURI); 1.692 + do_check_eq(installs[3].addon.id, "addon7@tests.mozilla.org"); 1.693 + do_check_false(installs[3].addon.appDisabled); 1.694 + do_check_eq(installs[3].version, "5.0"); 1.695 + do_check_eq(installs[3].name, "Multi Test 4"); 1.696 + do_check_eq(installs[3].state, AddonManager.STATE_DOWNLOADED); 1.697 + do_check_true(hasFlag(installs[3].addon.operationsRequiringRestart, 1.698 + AddonManager.OP_NEEDS_RESTART_INSTALL)); 1.699 + 1.700 + AddonManager.getAllInstalls(function(aInstalls) { 1.701 + do_check_eq(aInstalls.length, 4); 1.702 + 1.703 + prepare_test({ 1.704 + "addon4@tests.mozilla.org": [ 1.705 + "onInstalling" 1.706 + ], 1.707 + "addon5@tests.mozilla.org": [ 1.708 + "onInstalling" 1.709 + ], 1.710 + "addon6@tests.mozilla.org": [ 1.711 + ["onInstalling", false], 1.712 + "onInstalled" 1.713 + ], 1.714 + "addon7@tests.mozilla.org": [ 1.715 + "onInstalling" 1.716 + ] 1.717 + }, { 1.718 + "addon4@tests.mozilla.org": [ 1.719 + "onInstallStarted", 1.720 + "onInstallEnded" 1.721 + ], 1.722 + "addon5@tests.mozilla.org": [ 1.723 + "onInstallStarted", 1.724 + "onInstallEnded" 1.725 + ], 1.726 + "addon6@tests.mozilla.org": [ 1.727 + "onInstallStarted", 1.728 + "onInstallEnded" 1.729 + ], 1.730 + "addon7@tests.mozilla.org": [ 1.731 + "onInstallStarted", 1.732 + "onInstallEnded" 1.733 + ] 1.734 + }, callback_soon(check_test_11)); 1.735 + 1.736 + installs[0].install(); 1.737 + installs[1].install(); 1.738 + installs[3].install(); 1.739 + 1.740 + // Note that we install addon6 last. Since it doesn't need a restart to 1.741 + // install it completes asynchronously which would otherwise make the 1.742 + // onInstallStarted/onInstallEnded events go out of sequence unless this 1.743 + // is the last install operation 1.744 + installs[2].install(); 1.745 + }); 1.746 + }); 1.747 +} 1.748 + 1.749 +function check_test_11() { 1.750 + restartManager(); 1.751 + 1.752 + AddonManager.getAddonsByIDs(["addon4@tests.mozilla.org", 1.753 + "addon5@tests.mozilla.org", 1.754 + "addon6@tests.mozilla.org", 1.755 + "addon7@tests.mozilla.org"], 1.756 + function([a4, a5, a6, a7]) { 1.757 + do_check_neq(a4, null); 1.758 + do_check_neq(a5, null); 1.759 + do_check_neq(a6, null); 1.760 + do_check_neq(a7, null); 1.761 + 1.762 + a4.uninstall(); 1.763 + a5.uninstall(); 1.764 + a6.uninstall(); 1.765 + a7.uninstall(); 1.766 + 1.767 + do_execute_soon(run_test_12); 1.768 + }); 1.769 +} 1.770 + 1.771 +// Same as test 11 but for a remote XPI 1.772 +function run_test_12() { 1.773 + restartManager(); 1.774 + 1.775 + prepare_test({ }, [ 1.776 + "onNewInstall", 1.777 + ]); 1.778 + 1.779 + let url = "http://localhost:4444/addons/test_install4.xpi"; 1.780 + AddonManager.getInstallForURL(url, function(install) { 1.781 + gInstall = install; 1.782 + 1.783 + ensure_test_completed(); 1.784 + do_check_neq(install, null); 1.785 + do_check_eq(install.linkedInstalls, null); 1.786 + do_check_eq(install.state, AddonManager.STATE_AVAILABLE); 1.787 + 1.788 + prepare_test({ 1.789 + "addon4@tests.mozilla.org": [ 1.790 + "onInstalling" 1.791 + ], 1.792 + "addon5@tests.mozilla.org": [ 1.793 + "onInstalling" 1.794 + ], 1.795 + "addon6@tests.mozilla.org": [ 1.796 + ["onInstalling", false], 1.797 + "onInstalled" 1.798 + ], 1.799 + "addon7@tests.mozilla.org": [ 1.800 + "onInstalling" 1.801 + ] 1.802 + }, { 1.803 + "NO_ID": [ 1.804 + "onDownloadStarted", 1.805 + "onNewInstall", 1.806 + "onNewInstall", 1.807 + "onNewInstall", 1.808 + "onDownloadEnded" 1.809 + ], 1.810 + "addon4@tests.mozilla.org": [ 1.811 + "onInstallStarted", 1.812 + "onInstallEnded" 1.813 + ], 1.814 + "addon5@tests.mozilla.org": [ 1.815 + "onInstallStarted", 1.816 + "onInstallEnded" 1.817 + ], 1.818 + "addon6@tests.mozilla.org": [ 1.819 + "onInstallStarted", 1.820 + "onInstallEnded" 1.821 + ], 1.822 + "addon7@tests.mozilla.org": [ 1.823 + "onInstallStarted", 1.824 + "onInstallEnded" 1.825 + ] 1.826 + }, callback_soon(check_test_12)); 1.827 + install.install(); 1.828 + }, "application/x-xpinstall", null, "Multi Test 4"); 1.829 +} 1.830 + 1.831 +function check_test_12() { 1.832 + do_check_eq(gInstall.linkedInstalls.length, 3); 1.833 + 1.834 + // Might be in any order so sort them based on ID 1.835 + let installs = [gInstall].concat(gInstall.linkedInstalls); 1.836 + installs.sort(function(a, b) { 1.837 + if (a.addon.id < b.addon.id) 1.838 + return -1; 1.839 + if (a.addon.id > b.addon.id) 1.840 + return 1; 1.841 + return 0; 1.842 + }); 1.843 + 1.844 + // Comes from addon4.xpi and is made compatible by an update check 1.845 + do_check_eq(installs[0].sourceURI, gInstall.sourceURI); 1.846 + do_check_eq(installs[0].addon.id, "addon4@tests.mozilla.org"); 1.847 + do_check_false(installs[0].addon.appDisabled); 1.848 + do_check_eq(installs[0].version, "1.0"); 1.849 + do_check_eq(installs[0].name, "Multi Test 1"); 1.850 + do_check_eq(installs[0].state, AddonManager.STATE_INSTALLED); 1.851 + 1.852 + // Comes from addon5.jar and is compatible by default 1.853 + do_check_eq(installs[1].sourceURI, gInstall.sourceURI); 1.854 + do_check_eq(installs[1].addon.id, "addon5@tests.mozilla.org"); 1.855 + do_check_false(installs[1].addon.appDisabled); 1.856 + do_check_eq(installs[1].version, "3.0"); 1.857 + do_check_eq(installs[1].name, "Multi Test 2"); 1.858 + do_check_eq(installs[1].state, AddonManager.STATE_INSTALLED); 1.859 + 1.860 + // Comes from addon6.xpi and is incompatible 1.861 + do_check_eq(installs[2].sourceURI, gInstall.sourceURI); 1.862 + do_check_eq(installs[2].addon.id, "addon6@tests.mozilla.org"); 1.863 + do_check_true(installs[2].addon.appDisabled); 1.864 + do_check_eq(installs[2].version, "2.0"); 1.865 + do_check_eq(installs[2].name, "Multi Test 3"); 1.866 + do_check_eq(installs[2].state, AddonManager.STATE_INSTALLED); 1.867 + 1.868 + // Comes from addon7.jar and is made compatible by an update check 1.869 + do_check_eq(installs[3].sourceURI, gInstall.sourceURI); 1.870 + do_check_eq(installs[3].addon.id, "addon7@tests.mozilla.org"); 1.871 + do_check_false(installs[3].addon.appDisabled); 1.872 + do_check_eq(installs[3].version, "5.0"); 1.873 + do_check_eq(installs[3].name, "Multi Test 4"); 1.874 + do_check_eq(installs[3].state, AddonManager.STATE_INSTALLED); 1.875 + 1.876 + restartManager(); 1.877 + 1.878 + AddonManager.getAddonsByIDs(["addon4@tests.mozilla.org", 1.879 + "addon5@tests.mozilla.org", 1.880 + "addon6@tests.mozilla.org", 1.881 + "addon7@tests.mozilla.org"], 1.882 + function([a4, a5, a6, a7]) { 1.883 + do_check_neq(a4, null); 1.884 + do_check_neq(a5, null); 1.885 + do_check_neq(a6, null); 1.886 + do_check_neq(a7, null); 1.887 + 1.888 + a4.uninstall(); 1.889 + a5.uninstall(); 1.890 + a6.uninstall(); 1.891 + a7.uninstall(); 1.892 + 1.893 + do_execute_soon(run_test_13); 1.894 + }); 1.895 +} 1.896 + 1.897 + 1.898 +// Tests that cancelling an upgrade leaves the original add-on's pendingOperations 1.899 +// correct 1.900 +function run_test_13() { 1.901 + restartManager(); 1.902 + 1.903 + installAllFiles([do_get_addon("test_install2_1")], function() { 1.904 + restartManager(); 1.905 + 1.906 + prepare_test({ }, [ 1.907 + "onNewInstall" 1.908 + ]); 1.909 + 1.910 + let url = "http://localhost:4444/addons/test_install2_2.xpi"; 1.911 + AddonManager.getInstallForURL(url, function(install) { 1.912 + ensure_test_completed(); 1.913 + 1.914 + do_check_neq(install, null); 1.915 + do_check_eq(install.version, "3.0"); 1.916 + do_check_eq(install.name, "Test 3"); 1.917 + do_check_eq(install.state, AddonManager.STATE_AVAILABLE); 1.918 + 1.919 + AddonManager.getAllInstalls(function(activeInstalls) { 1.920 + do_check_eq(activeInstalls.length, 1); 1.921 + do_check_eq(activeInstalls[0], install); 1.922 + do_check_eq(install.existingAddon, null); 1.923 + 1.924 + prepare_test({ 1.925 + "addon2@tests.mozilla.org": [ 1.926 + "onInstalling" 1.927 + ] 1.928 + }, [ 1.929 + "onDownloadStarted", 1.930 + "onDownloadEnded", 1.931 + "onInstallStarted", 1.932 + "onInstallEnded", 1.933 + ], check_test_13); 1.934 + install.install(); 1.935 + }); 1.936 + }, "application/x-xpinstall", null, "Test 3", null, "3.0"); 1.937 + }); 1.938 +} 1.939 + 1.940 +function check_test_13(install) { 1.941 + ensure_test_completed(); 1.942 + 1.943 + do_check_eq(install.version, "3.0"); 1.944 + do_check_eq(install.name, "Real Test 3"); 1.945 + do_check_eq(install.state, AddonManager.STATE_INSTALLED); 1.946 + do_check_neq(install.existingAddon, null); 1.947 + do_check_eq(install.existingAddon.id, "addon2@tests.mozilla.org"); 1.948 + do_check_eq(install.addon.install, install); 1.949 + 1.950 + AddonManager.getAddonByID("addon2@tests.mozilla.org", callback_soon(function(olda2) { 1.951 + do_check_neq(olda2, null); 1.952 + do_check_true(hasFlag(olda2.pendingOperations, AddonManager.PENDING_UPGRADE)); 1.953 + do_check_eq(olda2.pendingUpgrade, install.addon); 1.954 + 1.955 + do_check_true(hasFlag(install.addon.pendingOperations, 1.956 + AddonManager.PENDING_INSTALL)); 1.957 + 1.958 + prepare_test({ 1.959 + "addon2@tests.mozilla.org": [ 1.960 + "onOperationCancelled" 1.961 + ] 1.962 + }, [ 1.963 + "onInstallCancelled", 1.964 + ]); 1.965 + 1.966 + install.cancel(); 1.967 + 1.968 + do_check_false(hasFlag(install.addon.pendingOperations, AddonManager.PENDING_INSTALL)); 1.969 + 1.970 + do_check_false(hasFlag(olda2.pendingOperations, AddonManager.PENDING_UPGRADE)); 1.971 + do_check_eq(olda2.pendingUpgrade, null); 1.972 + 1.973 + restartManager(); 1.974 + 1.975 + // Check that the upgrade did not complete 1.976 + AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { 1.977 + do_check_eq(a2.version, "2.0"); 1.978 + 1.979 + a2.uninstall(); 1.980 + 1.981 + do_execute_soon(run_test_14); 1.982 + }); 1.983 + })); 1.984 +} 1.985 + 1.986 +// Check that cancelling the install from onDownloadStarted actually cancels it 1.987 +function run_test_14() { 1.988 + restartManager(); 1.989 + 1.990 + prepare_test({ }, [ 1.991 + "onNewInstall" 1.992 + ]); 1.993 + 1.994 + let url = "http://localhost:4444/addons/test_install2_1.xpi"; 1.995 + AddonManager.getInstallForURL(url, function(install) { 1.996 + ensure_test_completed(); 1.997 + 1.998 + do_check_eq(install.file, null); 1.999 + 1.1000 + prepare_test({ }, [ 1.1001 + "onDownloadStarted" 1.1002 + ], check_test_14); 1.1003 + install.install(); 1.1004 + }, "application/x-xpinstall"); 1.1005 +} 1.1006 + 1.1007 +function check_test_14(install) { 1.1008 + prepare_test({ }, [ 1.1009 + "onDownloadCancelled" 1.1010 + ]); 1.1011 + 1.1012 + install.cancel(); 1.1013 + 1.1014 + ensure_test_completed(); 1.1015 + 1.1016 + install.addListener({ 1.1017 + onDownloadProgress: function() { 1.1018 + do_throw("Download should not have continued"); 1.1019 + }, 1.1020 + onDownloadEnded: function() { 1.1021 + do_throw("Download should not have continued"); 1.1022 + } 1.1023 + }); 1.1024 + 1.1025 + // Allow the listener to return to see if it continues downloading. The 1.1026 + // The listener only really tests if we give it time to see progress, the 1.1027 + // file check isn't ideal either 1.1028 + do_execute_soon(function() { 1.1029 + do_check_eq(install.file, null); 1.1030 + 1.1031 + run_test_15(); 1.1032 + }); 1.1033 +} 1.1034 + 1.1035 +// Checks that cancelling the install from onDownloadEnded actually cancels it 1.1036 +function run_test_15() { 1.1037 + prepare_test({ }, [ 1.1038 + "onNewInstall" 1.1039 + ]); 1.1040 + 1.1041 + let url = "http://localhost:4444/addons/test_install2_1.xpi"; 1.1042 + AddonManager.getInstallForURL(url, function(install) { 1.1043 + ensure_test_completed(); 1.1044 + 1.1045 + do_check_eq(install.file, null); 1.1046 + 1.1047 + prepare_test({ }, [ 1.1048 + "onDownloadStarted", 1.1049 + "onDownloadEnded" 1.1050 + ], check_test_15); 1.1051 + install.install(); 1.1052 + }, "application/x-xpinstall"); 1.1053 +} 1.1054 + 1.1055 +function check_test_15(install) { 1.1056 + prepare_test({ }, [ 1.1057 + "onDownloadCancelled" 1.1058 + ]); 1.1059 + 1.1060 + install.cancel(); 1.1061 + 1.1062 + ensure_test_completed(); 1.1063 + 1.1064 + install.addListener({ 1.1065 + onInstallStarted: function() { 1.1066 + do_throw("Install should not have continued"); 1.1067 + } 1.1068 + }); 1.1069 + 1.1070 + // Allow the listener to return to see if it starts installing 1.1071 + do_execute_soon(run_test_16); 1.1072 +} 1.1073 + 1.1074 +// Verify that the userDisabled value carries over to the upgrade by default 1.1075 +function run_test_16() { 1.1076 + restartManager(); 1.1077 + 1.1078 + let url = "http://localhost:4444/addons/test_install2_1.xpi"; 1.1079 + AddonManager.getInstallForURL(url, function(aInstall) { 1.1080 + aInstall.addListener({ 1.1081 + onInstallStarted: function() { 1.1082 + do_check_false(aInstall.addon.userDisabled); 1.1083 + aInstall.addon.userDisabled = true; 1.1084 + }, 1.1085 + 1.1086 + onInstallEnded: function() { 1.1087 + do_execute_soon(function test16_install1() { 1.1088 + restartManager(); 1.1089 + 1.1090 + AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { 1.1091 + do_check_true(a2.userDisabled); 1.1092 + do_check_false(a2.isActive); 1.1093 + 1.1094 + let url = "http://localhost:4444/addons/test_install2_2.xpi"; 1.1095 + AddonManager.getInstallForURL(url, function(aInstall) { 1.1096 + aInstall.addListener({ 1.1097 + onInstallEnded: function() { 1.1098 + do_execute_soon(function test16_install2() { 1.1099 + do_check_true(aInstall.addon.userDisabled); 1.1100 + 1.1101 + restartManager(); 1.1102 + 1.1103 + AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { 1.1104 + do_check_true(a2.userDisabled); 1.1105 + do_check_false(a2.isActive); 1.1106 + 1.1107 + a2.uninstall(); 1.1108 + do_execute_soon(run_test_17); 1.1109 + }); 1.1110 + }); 1.1111 + } 1.1112 + }); 1.1113 + aInstall.install(); 1.1114 + }, "application/x-xpinstall"); 1.1115 + }); 1.1116 + }); 1.1117 + } 1.1118 + }); 1.1119 + aInstall.install(); 1.1120 + }, "application/x-xpinstall"); 1.1121 +} 1.1122 + 1.1123 +// Verify that changing the userDisabled value before onInstallEnded works 1.1124 +function run_test_17() { 1.1125 + restartManager(); 1.1126 + 1.1127 + let url = "http://localhost:4444/addons/test_install2_1.xpi"; 1.1128 + AddonManager.getInstallForURL(url, function(aInstall) { 1.1129 + aInstall.addListener({ 1.1130 + onInstallEnded: function() { 1.1131 + do_execute_soon(function test17_install1() { 1.1132 + do_check_false(aInstall.addon.userDisabled); 1.1133 + 1.1134 + restartManager(); 1.1135 + 1.1136 + AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { 1.1137 + do_check_false(a2.userDisabled); 1.1138 + do_check_true(a2.isActive); 1.1139 + 1.1140 + let url = "http://localhost:4444/addons/test_install2_2.xpi"; 1.1141 + AddonManager.getInstallForURL(url, function(aInstall) { 1.1142 + aInstall.addListener({ 1.1143 + onInstallStarted: function() { 1.1144 + do_check_false(aInstall.addon.userDisabled); 1.1145 + aInstall.addon.userDisabled = true; 1.1146 + }, 1.1147 + 1.1148 + onInstallEnded: function() { 1.1149 + do_execute_soon(function test17_install1() { 1.1150 + restartManager(); 1.1151 + 1.1152 + AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { 1.1153 + do_check_true(a2.userDisabled); 1.1154 + do_check_false(a2.isActive); 1.1155 + 1.1156 + a2.uninstall(); 1.1157 + do_execute_soon(run_test_18); 1.1158 + }); 1.1159 + }); 1.1160 + } 1.1161 + }); 1.1162 + aInstall.install(); 1.1163 + }, "application/x-xpinstall"); 1.1164 + }); 1.1165 + }); 1.1166 + } 1.1167 + }); 1.1168 + aInstall.install(); 1.1169 + }, "application/x-xpinstall"); 1.1170 +} 1.1171 + 1.1172 +// Verify that changing the userDisabled value before onInstallEnded works 1.1173 +function run_test_18() { 1.1174 + restartManager(); 1.1175 + 1.1176 + let url = "http://localhost:4444/addons/test_install2_1.xpi"; 1.1177 + AddonManager.getInstallForURL(url, function(aInstall) { 1.1178 + aInstall.addListener({ 1.1179 + onInstallStarted: function() { 1.1180 + do_check_false(aInstall.addon.userDisabled); 1.1181 + aInstall.addon.userDisabled = true; 1.1182 + }, 1.1183 + 1.1184 + onInstallEnded: function() { 1.1185 + do_execute_soon(function test18_install1() { 1.1186 + restartManager(); 1.1187 + 1.1188 + AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { 1.1189 + do_check_true(a2.userDisabled); 1.1190 + do_check_false(a2.isActive); 1.1191 + 1.1192 + let url = "http://localhost:4444/addons/test_install2_2.xpi"; 1.1193 + AddonManager.getInstallForURL(url, function(aInstall) { 1.1194 + aInstall.addListener({ 1.1195 + onInstallStarted: function() { 1.1196 + do_check_true(aInstall.addon.userDisabled); 1.1197 + aInstall.addon.userDisabled = false; 1.1198 + }, 1.1199 + 1.1200 + onInstallEnded: function() { 1.1201 + do_execute_soon(function test18_install2() { 1.1202 + restartManager(); 1.1203 + 1.1204 + AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { 1.1205 + do_check_false(a2.userDisabled); 1.1206 + do_check_true(a2.isActive); 1.1207 + 1.1208 + a2.uninstall(); 1.1209 + do_execute_soon(run_test_18_1); 1.1210 + }); 1.1211 + }); 1.1212 + } 1.1213 + }); 1.1214 + aInstall.install(); 1.1215 + }, "application/x-xpinstall"); 1.1216 + }); 1.1217 + }); 1.1218 + } 1.1219 + }); 1.1220 + aInstall.install(); 1.1221 + }, "application/x-xpinstall"); 1.1222 +} 1.1223 + 1.1224 + 1.1225 +// Checks that metadata is not stored if the pref is set to false 1.1226 +function run_test_18_1() { 1.1227 + restartManager(); 1.1228 + 1.1229 + Services.prefs.setBoolPref("extensions.getAddons.cache.enabled", true); 1.1230 + Services.prefs.setCharPref(PREF_GETADDONS_BYIDS, 1.1231 + "http://localhost:4444/data/test_install.xml"); 1.1232 + 1.1233 + Services.prefs.setBoolPref("extensions.addon2@tests.mozilla.org.getAddons.cache.enabled", false); 1.1234 + 1.1235 + let url = "http://localhost:4444/addons/test_install2_1.xpi"; 1.1236 + AddonManager.getInstallForURL(url, function(aInstall) { 1.1237 + aInstall.addListener({ 1.1238 + onInstallEnded: function(aInstall, aAddon) { 1.1239 + do_execute_soon(function test18_install() { 1.1240 + do_check_neq(aAddon.fullDescription, "Repository description"); 1.1241 + 1.1242 + restartManager(); 1.1243 + 1.1244 + AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { 1.1245 + do_check_neq(a2.fullDescription, "Repository description"); 1.1246 + 1.1247 + a2.uninstall(); 1.1248 + do_execute_soon(run_test_19); 1.1249 + }); 1.1250 + }); 1.1251 + } 1.1252 + }); 1.1253 + aInstall.install(); 1.1254 + }, "application/x-xpinstall"); 1.1255 +} 1.1256 + 1.1257 +// Checks that metadata is downloaded for new installs and is visible before and 1.1258 +// after restart 1.1259 +function run_test_19() { 1.1260 + restartManager(); 1.1261 + Services.prefs.setBoolPref("extensions.addon2@tests.mozilla.org.getAddons.cache.enabled", true); 1.1262 + 1.1263 + let url = "http://localhost:4444/addons/test_install2_1.xpi"; 1.1264 + AddonManager.getInstallForURL(url, function(aInstall) { 1.1265 + aInstall.addListener({ 1.1266 + onInstallEnded: function(aInstall, aAddon) { 1.1267 + do_execute_soon(function test19_install() { 1.1268 + do_check_eq(aAddon.fullDescription, "Repository description"); 1.1269 + 1.1270 + restartManager(); 1.1271 + 1.1272 + AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { 1.1273 + do_check_eq(a2.fullDescription, "Repository description"); 1.1274 + 1.1275 + a2.uninstall(); 1.1276 + do_execute_soon(run_test_20); 1.1277 + }); 1.1278 + }); 1.1279 + } 1.1280 + }); 1.1281 + aInstall.install(); 1.1282 + }, "application/x-xpinstall"); 1.1283 +} 1.1284 + 1.1285 +// Do the same again to make sure it works when the data is already in the cache 1.1286 +function run_test_20() { 1.1287 + restartManager(); 1.1288 + 1.1289 + let url = "http://localhost:4444/addons/test_install2_1.xpi"; 1.1290 + AddonManager.getInstallForURL(url, function(aInstall) { 1.1291 + aInstall.addListener({ 1.1292 + onInstallEnded: function(aInstall, aAddon) { 1.1293 + do_execute_soon(function test20_install() { 1.1294 + do_check_eq(aAddon.fullDescription, "Repository description"); 1.1295 + 1.1296 + restartManager(); 1.1297 + 1.1298 + AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { 1.1299 + do_check_eq(a2.fullDescription, "Repository description"); 1.1300 + 1.1301 + a2.uninstall(); 1.1302 + do_execute_soon(run_test_21); 1.1303 + }); 1.1304 + }); 1.1305 + } 1.1306 + }); 1.1307 + aInstall.install(); 1.1308 + }, "application/x-xpinstall"); 1.1309 +} 1.1310 + 1.1311 +// Verify that installing an add-on that is already pending install cancels the 1.1312 +// first install 1.1313 +function run_test_21() { 1.1314 + restartManager(); 1.1315 + Services.prefs.setBoolPref("extensions.getAddons.cache.enabled", false); 1.1316 + 1.1317 + installAllFiles([do_get_addon("test_install2_1")], function() { 1.1318 + AddonManager.getAllInstalls(function(aInstalls) { 1.1319 + do_check_eq(aInstalls.length, 1); 1.1320 + 1.1321 + prepare_test({ 1.1322 + "addon2@tests.mozilla.org": [ 1.1323 + "onOperationCancelled", 1.1324 + "onInstalling" 1.1325 + ] 1.1326 + }, [ 1.1327 + "onNewInstall", 1.1328 + "onDownloadStarted", 1.1329 + "onDownloadEnded", 1.1330 + "onInstallStarted", 1.1331 + "onInstallCancelled", 1.1332 + "onInstallEnded", 1.1333 + ], check_test_21); 1.1334 + 1.1335 + let url = "http://localhost:4444/addons/test_install2_1.xpi"; 1.1336 + AddonManager.getInstallForURL(url, function(aInstall) { 1.1337 + aInstall.install(); 1.1338 + }, "application/x-xpinstall"); 1.1339 + }); 1.1340 + }); 1.1341 +} 1.1342 + 1.1343 +function check_test_21(aInstall) { 1.1344 + AddonManager.getAllInstalls(callback_soon(function(aInstalls) { 1.1345 + do_check_eq(aInstalls.length, 1); 1.1346 + do_check_eq(aInstalls[0], aInstall); 1.1347 + 1.1348 + prepare_test({ 1.1349 + "addon2@tests.mozilla.org": [ 1.1350 + "onOperationCancelled" 1.1351 + ] 1.1352 + }, [ 1.1353 + "onInstallCancelled", 1.1354 + ]); 1.1355 + 1.1356 + aInstall.cancel(); 1.1357 + 1.1358 + ensure_test_completed(); 1.1359 + 1.1360 + restartManager(); 1.1361 + 1.1362 + AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { 1.1363 + do_check_eq(a2, null); 1.1364 + 1.1365 + run_test_22(); 1.1366 + }); 1.1367 + })); 1.1368 +} 1.1369 + 1.1370 +// Tests that an install can be restarted after being cancelled 1.1371 +function run_test_22() { 1.1372 + prepare_test({ }, [ 1.1373 + "onNewInstall" 1.1374 + ]); 1.1375 + 1.1376 + let url = "http://localhost:4444/addons/test_install3.xpi"; 1.1377 + AddonManager.getInstallForURL(url, function(aInstall) { 1.1378 + ensure_test_completed(); 1.1379 + 1.1380 + do_check_neq(aInstall, null); 1.1381 + do_check_eq(aInstall.state, AddonManager.STATE_AVAILABLE); 1.1382 + 1.1383 + prepare_test({}, [ 1.1384 + "onDownloadStarted", 1.1385 + "onDownloadEnded", 1.1386 + ], check_test_22); 1.1387 + aInstall.install(); 1.1388 + }, "application/x-xpinstall"); 1.1389 +} 1.1390 + 1.1391 +function check_test_22(aInstall) { 1.1392 + prepare_test({}, [ 1.1393 + "onDownloadCancelled" 1.1394 + ]); 1.1395 + 1.1396 + aInstall.cancel(); 1.1397 + 1.1398 + ensure_test_completed(); 1.1399 + 1.1400 + prepare_test({ 1.1401 + "addon3@tests.mozilla.org": [ 1.1402 + "onInstalling" 1.1403 + ] 1.1404 + }, [ 1.1405 + "onDownloadStarted", 1.1406 + "onDownloadEnded", 1.1407 + "onInstallStarted", 1.1408 + "onInstallEnded" 1.1409 + ], finish_test_22); 1.1410 + 1.1411 + aInstall.install(); 1.1412 +} 1.1413 + 1.1414 +function finish_test_22(aInstall) { 1.1415 + prepare_test({ 1.1416 + "addon3@tests.mozilla.org": [ 1.1417 + "onOperationCancelled" 1.1418 + ] 1.1419 + }, [ 1.1420 + "onInstallCancelled" 1.1421 + ]); 1.1422 + 1.1423 + aInstall.cancel(); 1.1424 + 1.1425 + ensure_test_completed(); 1.1426 + 1.1427 + run_test_23(); 1.1428 +} 1.1429 + 1.1430 +// Tests that an install can be restarted after being cancelled when a hash 1.1431 +// was provided 1.1432 +function run_test_23() { 1.1433 + prepare_test({ }, [ 1.1434 + "onNewInstall" 1.1435 + ]); 1.1436 + 1.1437 + let url = "http://localhost:4444/addons/test_install3.xpi"; 1.1438 + AddonManager.getInstallForURL(url, function(aInstall) { 1.1439 + ensure_test_completed(); 1.1440 + 1.1441 + do_check_neq(aInstall, null); 1.1442 + do_check_eq(aInstall.state, AddonManager.STATE_AVAILABLE); 1.1443 + 1.1444 + prepare_test({}, [ 1.1445 + "onDownloadStarted", 1.1446 + "onDownloadEnded", 1.1447 + ], check_test_23); 1.1448 + aInstall.install(); 1.1449 + }, "application/x-xpinstall", do_get_addon_hash("test_install3")); 1.1450 +} 1.1451 + 1.1452 +function check_test_23(aInstall) { 1.1453 + prepare_test({}, [ 1.1454 + "onDownloadCancelled" 1.1455 + ]); 1.1456 + 1.1457 + aInstall.cancel(); 1.1458 + 1.1459 + ensure_test_completed(); 1.1460 + 1.1461 + prepare_test({ 1.1462 + "addon3@tests.mozilla.org": [ 1.1463 + "onInstalling" 1.1464 + ] 1.1465 + }, [ 1.1466 + "onDownloadStarted", 1.1467 + "onDownloadEnded", 1.1468 + "onInstallStarted", 1.1469 + "onInstallEnded" 1.1470 + ], finish_test_23); 1.1471 + 1.1472 + aInstall.install(); 1.1473 +} 1.1474 + 1.1475 +function finish_test_23(aInstall) { 1.1476 + prepare_test({ 1.1477 + "addon3@tests.mozilla.org": [ 1.1478 + "onOperationCancelled" 1.1479 + ] 1.1480 + }, [ 1.1481 + "onInstallCancelled" 1.1482 + ]); 1.1483 + 1.1484 + aInstall.cancel(); 1.1485 + 1.1486 + ensure_test_completed(); 1.1487 + 1.1488 + run_test_24(); 1.1489 +} 1.1490 + 1.1491 +// Tests that an install with a bad hash can be restarted after it fails, though 1.1492 +// it will only fail again 1.1493 +function run_test_24() { 1.1494 + prepare_test({ }, [ 1.1495 + "onNewInstall" 1.1496 + ]); 1.1497 + 1.1498 + let url = "http://localhost:4444/addons/test_install3.xpi"; 1.1499 + AddonManager.getInstallForURL(url, function(aInstall) { 1.1500 + ensure_test_completed(); 1.1501 + 1.1502 + do_check_neq(aInstall, null); 1.1503 + do_check_eq(aInstall.state, AddonManager.STATE_AVAILABLE); 1.1504 + 1.1505 + prepare_test({}, [ 1.1506 + "onDownloadStarted", 1.1507 + "onDownloadFailed", 1.1508 + ], check_test_24); 1.1509 + aInstall.install(); 1.1510 + }, "application/x-xpinstall", "sha1:foo"); 1.1511 +} 1.1512 + 1.1513 +function check_test_24(aInstall) { 1.1514 + prepare_test({ }, [ 1.1515 + "onDownloadStarted", 1.1516 + "onDownloadFailed" 1.1517 + ], run_test_25); 1.1518 + 1.1519 + aInstall.install(); 1.1520 +} 1.1521 + 1.1522 +// Tests that installs with a hash for a local file work 1.1523 +function run_test_25() { 1.1524 + prepare_test({ }, [ 1.1525 + "onNewInstall" 1.1526 + ]); 1.1527 + 1.1528 + let url = Services.io.newFileURI(do_get_addon("test_install3")).spec; 1.1529 + AddonManager.getInstallForURL(url, function(aInstall) { 1.1530 + ensure_test_completed(); 1.1531 + 1.1532 + do_check_neq(aInstall, null); 1.1533 + do_check_eq(aInstall.state, AddonManager.STATE_DOWNLOADED); 1.1534 + do_check_eq(aInstall.error, 0); 1.1535 + 1.1536 + prepare_test({ }, [ 1.1537 + "onDownloadCancelled" 1.1538 + ]); 1.1539 + 1.1540 + aInstall.cancel(); 1.1541 + 1.1542 + ensure_test_completed(); 1.1543 + 1.1544 + run_test_26(); 1.1545 + }, "application/x-xpinstall", do_get_addon_hash("test_install3")); 1.1546 +} 1.1547 + 1.1548 +function run_test_26() { 1.1549 + prepare_test({ }, [ 1.1550 + "onNewInstall", 1.1551 + "onDownloadStarted", 1.1552 + "onDownloadCancelled" 1.1553 + ]); 1.1554 + 1.1555 + let observerService = AM_Cc["@mozilla.org/network/http-activity-distributor;1"]. 1.1556 + getService(AM_Ci.nsIHttpActivityDistributor); 1.1557 + observerService.addObserver({ 1.1558 + observeActivity: function(aChannel, aType, aSubtype, aTimestamp, aSizeData, 1.1559 + aStringData) { 1.1560 + aChannel.QueryInterface(AM_Ci.nsIChannel); 1.1561 + // Wait for the final event for the redirected URL 1.1562 + if (aChannel.URI.spec != "http://localhost:4444/addons/test_install1.xpi" || 1.1563 + aType != AM_Ci.nsIHttpActivityObserver.ACTIVITY_TYPE_HTTP_TRANSACTION || 1.1564 + aSubtype != AM_Ci.nsIHttpActivityObserver.ACTIVITY_SUBTYPE_TRANSACTION_CLOSE) 1.1565 + return; 1.1566 + 1.1567 + // Request should have been cancelled 1.1568 + do_check_eq(aChannel.status, Components.results.NS_BINDING_ABORTED); 1.1569 + 1.1570 + observerService.removeObserver(this); 1.1571 + 1.1572 + run_test_27(); 1.1573 + } 1.1574 + }); 1.1575 + 1.1576 + let url = "http://localhost:4444/redirect?/addons/test_install1.xpi"; 1.1577 + AddonManager.getInstallForURL(url, function(aInstall) { 1.1578 + aInstall.addListener({ 1.1579 + onDownloadProgress: function(aInstall) { 1.1580 + aInstall.cancel(); 1.1581 + } 1.1582 + }); 1.1583 + 1.1584 + aInstall.install(); 1.1585 + }, "application/x-xpinstall"); 1.1586 +} 1.1587 + 1.1588 + 1.1589 +// Tests that an install can be restarted during onDownloadCancelled after being 1.1590 +// cancelled in mid-download 1.1591 +function run_test_27() { 1.1592 + prepare_test({ }, [ 1.1593 + "onNewInstall" 1.1594 + ]); 1.1595 + 1.1596 + let url = "http://localhost:4444/addons/test_install3.xpi"; 1.1597 + AddonManager.getInstallForURL(url, function(aInstall) { 1.1598 + ensure_test_completed(); 1.1599 + 1.1600 + do_check_neq(aInstall, null); 1.1601 + do_check_eq(aInstall.state, AddonManager.STATE_AVAILABLE); 1.1602 + 1.1603 + aInstall.addListener({ 1.1604 + onDownloadProgress: function() { 1.1605 + aInstall.removeListener(this); 1.1606 + aInstall.cancel(); 1.1607 + } 1.1608 + }); 1.1609 + 1.1610 + prepare_test({}, [ 1.1611 + "onDownloadStarted", 1.1612 + "onDownloadCancelled", 1.1613 + ], check_test_27); 1.1614 + aInstall.install(); 1.1615 + }, "application/x-xpinstall"); 1.1616 +} 1.1617 + 1.1618 +function check_test_27(aInstall) { 1.1619 + prepare_test({ 1.1620 + "addon3@tests.mozilla.org": [ 1.1621 + "onInstalling" 1.1622 + ] 1.1623 + }, [ 1.1624 + "onDownloadStarted", 1.1625 + "onDownloadEnded", 1.1626 + "onInstallStarted", 1.1627 + "onInstallEnded" 1.1628 + ], finish_test_27); 1.1629 + 1.1630 + aInstall.install(); 1.1631 +} 1.1632 + 1.1633 +function finish_test_27(aInstall) { 1.1634 + prepare_test({ 1.1635 + "addon3@tests.mozilla.org": [ 1.1636 + "onOperationCancelled" 1.1637 + ] 1.1638 + }, [ 1.1639 + "onInstallCancelled" 1.1640 + ]); 1.1641 + 1.1642 + aInstall.cancel(); 1.1643 + 1.1644 + ensure_test_completed(); 1.1645 + 1.1646 + end_test(); 1.1647 +}