michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: * http://creativecommons.org/publicdomain/zero/1.0/ michael@0: */ michael@0: michael@0: // This verifies that add-ons can be installed from XPI files michael@0: const Cc = Components.classes; michael@0: const Ci = Components.interfaces; michael@0: const Cu = Components.utils; michael@0: michael@0: // Maximum error in file modification times. Some file systems don't store michael@0: // modification times exactly. As long as we are closer than this then it michael@0: // still passes. michael@0: const MAX_TIME_DIFFERENCE = 3000; michael@0: michael@0: // install.rdf size, icon.png, icon64.png size michael@0: const ADDON1_SIZE = 705 + 16 + 16; michael@0: michael@0: Cu.import("resource://gre/modules/Services.jsm"); michael@0: Cu.import("resource://gre/modules/NetUtil.jsm"); michael@0: Cu.import("resource://testing-common/httpd.js"); michael@0: michael@0: var testserver; michael@0: var gInstallDate; michael@0: var gInstall = null; michael@0: michael@0: // The test extension uses an insecure update url. michael@0: Services.prefs.setBoolPref(PREF_EM_CHECK_UPDATE_SECURITY, false); michael@0: Services.prefs.setBoolPref(PREF_EM_STRICT_COMPATIBILITY, false); michael@0: michael@0: const profileDir = gProfD.clone(); michael@0: profileDir.append("extensions"); michael@0: michael@0: function run_test() { michael@0: createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); michael@0: michael@0: startupManager(); michael@0: // Make sure we only register once despite multiple calls michael@0: AddonManager.addInstallListener(InstallListener); michael@0: AddonManager.addAddonListener(AddonListener); michael@0: AddonManager.addInstallListener(InstallListener); michael@0: AddonManager.addAddonListener(AddonListener); michael@0: michael@0: // Create and configure the HTTP server. michael@0: testserver = new HttpServer(); michael@0: testserver.registerDirectory("/addons/", do_get_file("addons")); michael@0: testserver.registerDirectory("/data/", do_get_file("data")); michael@0: testserver.registerPathHandler("/redirect", function(aRequest, aResponse) { michael@0: aResponse.setStatusLine(null, 301, "Moved Permanently"); michael@0: let url = aRequest.host + ":" + aRequest.port + aRequest.queryString; michael@0: aResponse.setHeader("Location", "http://" + url); michael@0: }); michael@0: testserver.start(-1); michael@0: gPort = testserver.identity.primaryPort; michael@0: michael@0: do_test_pending(); michael@0: run_test_1(); michael@0: } michael@0: michael@0: function end_test() { michael@0: testserver.stop(do_test_finished); michael@0: } michael@0: michael@0: // Checks that an install from a local file proceeds as expected michael@0: function run_test_1() { michael@0: prepare_test({ }, [ michael@0: "onNewInstall" michael@0: ]); michael@0: michael@0: AddonManager.getInstallForFile(do_get_addon("test_install1"), function(install) { michael@0: ensure_test_completed(); michael@0: michael@0: do_check_neq(install, null); michael@0: do_check_eq(install.linkedInstalls, null); michael@0: do_check_eq(install.type, "extension"); michael@0: do_check_eq(install.version, "1.0"); michael@0: do_check_eq(install.name, "Test 1"); michael@0: do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); michael@0: do_check_true(install.addon.hasResource("install.rdf")); michael@0: do_check_neq(install.addon.syncGUID, null); michael@0: do_check_eq(install.addon.install, install); michael@0: do_check_eq(install.addon.size, ADDON1_SIZE); michael@0: do_check_true(hasFlag(install.addon.operationsRequiringRestart, michael@0: AddonManager.OP_NEEDS_RESTART_INSTALL)); michael@0: let file = do_get_addon("test_install1"); michael@0: let uri = Services.io.newFileURI(file).spec; michael@0: do_check_eq(install.addon.getResourceURI("install.rdf").spec, "jar:" + uri + "!/install.rdf"); michael@0: do_check_eq(install.addon.iconURL, "jar:" + uri + "!/icon.png"); michael@0: do_check_eq(install.addon.icon64URL, "jar:" + uri + "!/icon64.png"); michael@0: do_check_eq(install.iconURL, null); michael@0: michael@0: do_check_eq(install.sourceURI.spec, uri); michael@0: do_check_eq(install.addon.sourceURI.spec, uri); michael@0: michael@0: AddonManager.getAllInstalls(function(activeInstalls) { michael@0: do_check_eq(activeInstalls.length, 1); michael@0: do_check_eq(activeInstalls[0], install); michael@0: michael@0: AddonManager.getInstallsByTypes(["foo"], function(fooInstalls) { michael@0: do_check_eq(fooInstalls.length, 0); michael@0: michael@0: AddonManager.getInstallsByTypes(["extension"], function(extensionInstalls) { michael@0: do_check_eq(extensionInstalls.length, 1); michael@0: do_check_eq(extensionInstalls[0], install); michael@0: michael@0: prepare_test({ michael@0: "addon1@tests.mozilla.org": [ michael@0: "onInstalling" michael@0: ] michael@0: }, [ michael@0: "onInstallStarted", michael@0: "onInstallEnded", michael@0: ], function() { michael@0: check_test_1(install.addon.syncGUID); michael@0: }); michael@0: install.install(); michael@0: }); michael@0: }); michael@0: }); michael@0: }); michael@0: } michael@0: michael@0: function check_test_1(installSyncGUID) { michael@0: ensure_test_completed(); michael@0: AddonManager.getAddonByID("addon1@tests.mozilla.org", function(olda1) { michael@0: do_check_eq(olda1, null); michael@0: michael@0: AddonManager.getAddonsWithOperationsByTypes(null, callback_soon(function(pendingAddons) { michael@0: do_check_eq(pendingAddons.length, 1); michael@0: do_check_eq(pendingAddons[0].id, "addon1@tests.mozilla.org"); michael@0: let uri = NetUtil.newURI(pendingAddons[0].iconURL); michael@0: if (uri instanceof AM_Ci.nsIJARURI) { michael@0: let jarURI = uri.QueryInterface(AM_Ci.nsIJARURI); michael@0: let archiveURI = jarURI.JARFile; michael@0: let archiveFile = archiveURI.QueryInterface(AM_Ci.nsIFileURL).file; michael@0: let zipReader = Cc["@mozilla.org/libjar/zip-reader;1"]. michael@0: createInstance(Ci.nsIZipReader); michael@0: try { michael@0: zipReader.open(archiveFile); michael@0: do_check_true(zipReader.hasEntry(jarURI.JAREntry)); michael@0: } michael@0: finally { michael@0: zipReader.close(); michael@0: } michael@0: } michael@0: else { michael@0: let iconFile = uri.QueryInterface(AM_Ci.nsIFileURL).file; michael@0: do_check_true(iconFile.exists()); michael@0: } michael@0: michael@0: // Make the pending install have a sensible date michael@0: let updateDate = Date.now(); michael@0: let extURI = pendingAddons[0].getResourceURI(""); michael@0: let ext = extURI.QueryInterface(AM_Ci.nsIFileURL).file; michael@0: setExtensionModifiedTime(ext, updateDate); michael@0: michael@0: // The pending add-on cannot be disabled or enabled. michael@0: do_check_false(hasFlag(pendingAddons[0].permissions, AddonManager.PERM_CAN_ENABLE)); michael@0: do_check_false(hasFlag(pendingAddons[0].permissions, AddonManager.PERM_CAN_DISABLE)); michael@0: michael@0: restartManager(); michael@0: michael@0: AddonManager.getAllInstalls(function(activeInstalls) { michael@0: do_check_eq(activeInstalls, 0); michael@0: michael@0: AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) { michael@0: do_check_neq(a1, null); michael@0: do_check_neq(a1.syncGUID, null); michael@0: do_check_true(a1.syncGUID.length >= 9); michael@0: do_check_eq(a1.syncGUID, installSyncGUID); michael@0: do_check_eq(a1.type, "extension"); michael@0: do_check_eq(a1.version, "1.0"); michael@0: do_check_eq(a1.name, "Test 1"); michael@0: do_check_true(isExtensionInAddonsList(profileDir, a1.id)); michael@0: do_check_true(do_get_addon("test_install1").exists()); michael@0: do_check_in_crash_annotation(a1.id, a1.version); michael@0: do_check_eq(a1.size, ADDON1_SIZE); michael@0: do_check_false(a1.foreignInstall); michael@0: michael@0: do_check_eq(a1.sourceURI.spec, michael@0: Services.io.newFileURI(do_get_addon("test_install1")).spec); michael@0: let difference = a1.installDate.getTime() - updateDate; michael@0: if (Math.abs(difference) > MAX_TIME_DIFFERENCE) michael@0: do_throw("Add-on install time was out by " + difference + "ms"); michael@0: michael@0: difference = a1.updateDate.getTime() - updateDate; michael@0: if (Math.abs(difference) > MAX_TIME_DIFFERENCE) michael@0: do_throw("Add-on update time was out by " + difference + "ms"); michael@0: michael@0: do_check_true(a1.hasResource("install.rdf")); michael@0: do_check_false(a1.hasResource("foo.bar")); michael@0: michael@0: let uri = do_get_addon_root_uri(profileDir, "addon1@tests.mozilla.org"); michael@0: do_check_eq(a1.getResourceURI("install.rdf").spec, uri + "install.rdf"); michael@0: do_check_eq(a1.iconURL, uri + "icon.png"); michael@0: do_check_eq(a1.icon64URL, uri + "icon64.png"); michael@0: michael@0: a1.uninstall(); michael@0: restartManager(); michael@0: do_check_not_in_crash_annotation(a1.id, a1.version); michael@0: michael@0: do_execute_soon(run_test_2); michael@0: })); michael@0: }); michael@0: })); michael@0: }); michael@0: } michael@0: michael@0: // Tests that an install from a url downloads. michael@0: function run_test_2() { michael@0: let url = "http://localhost:" + gPort + "/addons/test_install2_1.xpi"; michael@0: AddonManager.getInstallForURL(url, function(install) { michael@0: do_check_neq(install, null); michael@0: do_check_eq(install.linkedInstalls, null); michael@0: do_check_eq(install.version, "1.0"); michael@0: do_check_eq(install.name, "Test 2"); michael@0: do_check_eq(install.state, AddonManager.STATE_AVAILABLE); michael@0: do_check_eq(install.iconURL, null); michael@0: do_check_eq(install.sourceURI.spec, url); michael@0: michael@0: AddonManager.getAllInstalls(function(activeInstalls) { michael@0: do_check_eq(activeInstalls.length, 1); michael@0: do_check_eq(activeInstalls[0], install); michael@0: michael@0: prepare_test({}, [ michael@0: "onDownloadStarted", michael@0: "onDownloadEnded", michael@0: ], check_test_2); michael@0: michael@0: install.addListener({ michael@0: onDownloadProgress: function(install) { michael@0: do_execute_soon(function() { michael@0: Components.utils.forceGC(); michael@0: }); michael@0: } michael@0: }); michael@0: michael@0: install.install(); michael@0: }); michael@0: }, "application/x-xpinstall", null, "Test 2", null, "1.0"); michael@0: } michael@0: michael@0: function check_test_2(install) { michael@0: ensure_test_completed(); michael@0: do_check_eq(install.version, "2.0"); michael@0: do_check_eq(install.name, "Real Test 2"); michael@0: do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); michael@0: do_check_eq(install.addon.install, install); michael@0: do_check_true(hasFlag(install.addon.operationsRequiringRestart, michael@0: AddonManager.OP_NEEDS_RESTART_INSTALL)); michael@0: do_check_eq(install.iconURL, null); michael@0: michael@0: // Pause the install here and start it again in run_test_3 michael@0: do_execute_soon(function() { run_test_3(install); }); michael@0: return false; michael@0: } michael@0: michael@0: // Tests that the downloaded XPI installs ok michael@0: function run_test_3(install) { michael@0: prepare_test({ michael@0: "addon2@tests.mozilla.org": [ michael@0: "onInstalling" michael@0: ] michael@0: }, [ michael@0: "onInstallStarted", michael@0: "onInstallEnded", michael@0: ], check_test_3); michael@0: install.install(); michael@0: } michael@0: michael@0: function check_test_3(aInstall) { michael@0: // Make the pending install have a sensible date michael@0: let updateDate = Date.now(); michael@0: let extURI = aInstall.addon.getResourceURI(""); michael@0: let ext = extURI.QueryInterface(AM_Ci.nsIFileURL).file; michael@0: setExtensionModifiedTime(ext, updateDate); michael@0: michael@0: ensure_test_completed(); michael@0: AddonManager.getAddonByID("addon2@tests.mozilla.org", callback_soon(function(olda2) { michael@0: do_check_eq(olda2, null); michael@0: restartManager(); michael@0: michael@0: AddonManager.getAllInstalls(function(installs) { michael@0: do_check_eq(installs, 0); michael@0: michael@0: AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { michael@0: do_check_neq(a2, null); michael@0: do_check_neq(a2.syncGUID, null); michael@0: do_check_eq(a2.type, "extension"); michael@0: do_check_eq(a2.version, "2.0"); michael@0: do_check_eq(a2.name, "Real Test 2"); michael@0: do_check_true(isExtensionInAddonsList(profileDir, a2.id)); michael@0: do_check_true(do_get_addon("test_install2_1").exists()); michael@0: do_check_in_crash_annotation(a2.id, a2.version); michael@0: do_check_eq(a2.sourceURI.spec, michael@0: "http://localhost:" + gPort + "/addons/test_install2_1.xpi"); michael@0: michael@0: let difference = a2.installDate.getTime() - updateDate; michael@0: if (Math.abs(difference) > MAX_TIME_DIFFERENCE) michael@0: do_throw("Add-on install time was out by " + difference + "ms"); michael@0: michael@0: difference = a2.updateDate.getTime() - updateDate; michael@0: if (Math.abs(difference) > MAX_TIME_DIFFERENCE) michael@0: do_throw("Add-on update time was out by " + difference + "ms"); michael@0: michael@0: gInstallDate = a2.installDate.getTime(); michael@0: michael@0: run_test_4(); michael@0: }); michael@0: }); michael@0: })); michael@0: } michael@0: michael@0: // Tests that installing a new version of an existing add-on works michael@0: function run_test_4() { michael@0: prepare_test({ }, [ michael@0: "onNewInstall" michael@0: ]); michael@0: michael@0: let url = "http://localhost:" + gPort + "/addons/test_install2_2.xpi"; michael@0: AddonManager.getInstallForURL(url, function(install) { michael@0: ensure_test_completed(); michael@0: michael@0: do_check_neq(install, null); michael@0: do_check_eq(install.version, "3.0"); michael@0: do_check_eq(install.name, "Test 3"); michael@0: do_check_eq(install.state, AddonManager.STATE_AVAILABLE); michael@0: michael@0: AddonManager.getAllInstalls(function(activeInstalls) { michael@0: do_check_eq(activeInstalls.length, 1); michael@0: do_check_eq(activeInstalls[0], install); michael@0: do_check_eq(install.existingAddon, null); michael@0: michael@0: prepare_test({}, [ michael@0: "onDownloadStarted", michael@0: "onDownloadEnded", michael@0: ], check_test_4); michael@0: install.install(); michael@0: }); michael@0: }, "application/x-xpinstall", null, "Test 3", null, "3.0"); michael@0: } michael@0: michael@0: function check_test_4(install) { michael@0: ensure_test_completed(); michael@0: michael@0: do_check_eq(install.version, "3.0"); michael@0: do_check_eq(install.name, "Real Test 3"); michael@0: do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); michael@0: do_check_neq(install.existingAddon); michael@0: do_check_eq(install.existingAddon.id, "addon2@tests.mozilla.org"); michael@0: do_check_eq(install.addon.install, install); michael@0: do_check_true(hasFlag(install.addon.operationsRequiringRestart, michael@0: AddonManager.OP_NEEDS_RESTART_INSTALL)); michael@0: michael@0: run_test_5(); michael@0: // Installation will continue when there is nothing returned. michael@0: } michael@0: michael@0: // Continue installing the new version michael@0: function run_test_5() { michael@0: prepare_test({ michael@0: "addon2@tests.mozilla.org": [ michael@0: "onInstalling" michael@0: ] michael@0: }, [ michael@0: "onInstallStarted", michael@0: "onInstallEnded", michael@0: ], check_test_5); michael@0: } michael@0: michael@0: function check_test_5(install) { michael@0: ensure_test_completed(); michael@0: michael@0: do_check_eq(install.existingAddon.pendingUpgrade.install, install); michael@0: michael@0: AddonManager.getAddonByID("addon2@tests.mozilla.org", function(olda2) { michael@0: do_check_neq(olda2, null); michael@0: do_check_true(hasFlag(olda2.pendingOperations, AddonManager.PENDING_UPGRADE)); michael@0: michael@0: AddonManager.getInstallsByTypes(null, callback_soon(function(installs) { michael@0: do_check_eq(installs.length, 1); michael@0: do_check_eq(installs[0].addon, olda2.pendingUpgrade); michael@0: restartManager(); michael@0: michael@0: AddonManager.getInstallsByTypes(null, function(installs) { michael@0: do_check_eq(installs.length, 0); michael@0: michael@0: AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { michael@0: do_check_neq(a2, null); michael@0: do_check_eq(a2.type, "extension"); michael@0: do_check_eq(a2.version, "3.0"); michael@0: do_check_eq(a2.name, "Real Test 3"); michael@0: do_check_true(a2.isActive); michael@0: do_check_true(isExtensionInAddonsList(profileDir, a2.id)); michael@0: do_check_true(do_get_addon("test_install2_2").exists()); michael@0: do_check_in_crash_annotation(a2.id, a2.version); michael@0: do_check_eq(a2.sourceURI.spec, michael@0: "http://localhost:" + gPort + "/addons/test_install2_2.xpi"); michael@0: do_check_false(a2.foreignInstall); michael@0: michael@0: do_check_eq(a2.installDate.getTime(), gInstallDate); michael@0: // Update date should be later (or the same if this test is too fast) michael@0: do_check_true(a2.installDate <= a2.updateDate); michael@0: michael@0: a2.uninstall(); michael@0: do_execute_soon(run_test_6); michael@0: }); michael@0: }); michael@0: })); michael@0: }); michael@0: } michael@0: michael@0: // Tests that an install that requires a compatibility update works michael@0: function run_test_6() { michael@0: restartManager(); michael@0: michael@0: prepare_test({ }, [ michael@0: "onNewInstall" michael@0: ]); michael@0: michael@0: let url = "http://localhost:" + gPort + "/addons/test_install3.xpi"; michael@0: AddonManager.getInstallForURL(url, function(install) { michael@0: ensure_test_completed(); michael@0: michael@0: do_check_neq(install, null); michael@0: do_check_eq(install.version, "1.0"); michael@0: do_check_eq(install.name, "Real Test 4"); michael@0: do_check_eq(install.state, AddonManager.STATE_AVAILABLE); michael@0: michael@0: AddonManager.getInstallsByTypes(null, function(activeInstalls) { michael@0: do_check_eq(activeInstalls.length, 1); michael@0: do_check_eq(activeInstalls[0], install); michael@0: michael@0: prepare_test({}, [ michael@0: "onDownloadStarted", michael@0: "onDownloadEnded", michael@0: ], check_test_6); michael@0: install.install(); michael@0: }); michael@0: }, "application/x-xpinstall", null, "Real Test 4", null, "1.0"); michael@0: } michael@0: michael@0: function check_test_6(install) { michael@0: ensure_test_completed(); michael@0: do_check_eq(install.version, "1.0"); michael@0: do_check_eq(install.name, "Real Test 4"); michael@0: do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); michael@0: do_check_eq(install.existingAddon, null); michael@0: do_check_false(install.addon.appDisabled); michael@0: run_test_7(); michael@0: return true; michael@0: } michael@0: michael@0: // Continue the install michael@0: function run_test_7() { michael@0: prepare_test({ michael@0: "addon3@tests.mozilla.org": [ michael@0: "onInstalling" michael@0: ] michael@0: }, [ michael@0: "onInstallStarted", michael@0: "onInstallEnded", michael@0: ], check_test_7); michael@0: } michael@0: michael@0: function check_test_7() { michael@0: ensure_test_completed(); michael@0: AddonManager.getAddonByID("addon3@tests.mozilla.org", callback_soon(function(olda3) { michael@0: do_check_eq(olda3, null); michael@0: restartManager(); michael@0: michael@0: AddonManager.getAllInstalls(function(installs) { michael@0: do_check_eq(installs, 0); michael@0: michael@0: AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) { michael@0: do_check_neq(a3, null); michael@0: do_check_neq(a3.syncGUID, null); michael@0: do_check_eq(a3.type, "extension"); michael@0: do_check_eq(a3.version, "1.0"); michael@0: do_check_eq(a3.name, "Real Test 4"); michael@0: do_check_true(a3.isActive); michael@0: do_check_false(a3.appDisabled); michael@0: do_check_true(isExtensionInAddonsList(profileDir, a3.id)); michael@0: do_check_true(do_get_addon("test_install3").exists()); michael@0: a3.uninstall(); michael@0: do_execute_soon(run_test_8); michael@0: }); michael@0: }); michael@0: })); michael@0: } michael@0: michael@0: function run_test_8() { michael@0: restartManager(); michael@0: michael@0: AddonManager.addInstallListener(InstallListener); michael@0: AddonManager.addAddonListener(AddonListener); michael@0: michael@0: prepare_test({ }, [ michael@0: "onNewInstall" michael@0: ]); michael@0: michael@0: AddonManager.getInstallForFile(do_get_addon("test_install3"), function(install) { michael@0: do_check_true(install.addon.isCompatible); michael@0: michael@0: prepare_test({ michael@0: "addon3@tests.mozilla.org": [ michael@0: "onInstalling" michael@0: ] michael@0: }, [ michael@0: "onInstallStarted", michael@0: "onInstallEnded", michael@0: ], callback_soon(check_test_8)); michael@0: install.install(); michael@0: }); michael@0: } michael@0: michael@0: function check_test_8() { michael@0: restartManager(); michael@0: michael@0: AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) { michael@0: do_check_neq(a3, null); michael@0: do_check_neq(a3.syncGUID, null); michael@0: do_check_eq(a3.type, "extension"); michael@0: do_check_eq(a3.version, "1.0"); michael@0: do_check_eq(a3.name, "Real Test 4"); michael@0: do_check_true(a3.isActive); michael@0: do_check_false(a3.appDisabled); michael@0: do_check_true(isExtensionInAddonsList(profileDir, a3.id)); michael@0: do_check_true(do_get_addon("test_install3").exists()); michael@0: a3.uninstall(); michael@0: do_execute_soon(run_test_9); michael@0: }); michael@0: } michael@0: michael@0: // Test that after cancelling a download it is removed from the active installs michael@0: function run_test_9() { michael@0: restartManager(); michael@0: michael@0: prepare_test({ }, [ michael@0: "onNewInstall" michael@0: ]); michael@0: michael@0: let url = "http://localhost:" + gPort + "/addons/test_install3.xpi"; michael@0: AddonManager.getInstallForURL(url, function(install) { michael@0: ensure_test_completed(); michael@0: michael@0: do_check_neq(install, null); michael@0: do_check_eq(install.version, "1.0"); michael@0: do_check_eq(install.name, "Real Test 4"); michael@0: do_check_eq(install.state, AddonManager.STATE_AVAILABLE); michael@0: michael@0: AddonManager.getInstallsByTypes(null, function(activeInstalls) { michael@0: do_check_eq(activeInstalls.length, 1); michael@0: do_check_eq(activeInstalls[0], install); michael@0: michael@0: prepare_test({}, [ michael@0: "onDownloadStarted", michael@0: "onDownloadEnded", michael@0: ], check_test_9); michael@0: install.install(); michael@0: }); michael@0: }, "application/x-xpinstall", null, "Real Test 4", null, "1.0"); michael@0: } michael@0: michael@0: function check_test_9(install) { michael@0: prepare_test({}, [ michael@0: "onDownloadCancelled" michael@0: ]); michael@0: michael@0: install.cancel(); michael@0: michael@0: ensure_test_completed(); michael@0: michael@0: AddonManager.getAllInstalls(function(activeInstalls) { michael@0: do_check_eq(activeInstalls.length, 0); michael@0: michael@0: run_test_10(); michael@0: }); michael@0: } michael@0: michael@0: // Tests that after cancelling a pending install it is removed from the active michael@0: // installs michael@0: function run_test_10() { michael@0: prepare_test({ }, [ michael@0: "onNewInstall" michael@0: ]); michael@0: michael@0: let url = "http://localhost:" + gPort + "/addons/test_install3.xpi"; michael@0: AddonManager.getInstallForURL(url, function(install) { michael@0: ensure_test_completed(); michael@0: michael@0: do_check_neq(install, null); michael@0: do_check_eq(install.version, "1.0"); michael@0: do_check_eq(install.name, "Real Test 4"); michael@0: do_check_eq(install.state, AddonManager.STATE_AVAILABLE); michael@0: michael@0: AddonManager.getInstallsByTypes(null, function(activeInstalls) { michael@0: do_check_eq(activeInstalls.length, 1); michael@0: do_check_eq(activeInstalls[0], install); michael@0: michael@0: prepare_test({ michael@0: "addon3@tests.mozilla.org": [ michael@0: "onInstalling" michael@0: ] michael@0: }, [ michael@0: "onDownloadStarted", michael@0: "onDownloadEnded", michael@0: "onInstallStarted", michael@0: "onInstallEnded" michael@0: ], check_test_10); michael@0: install.install(); michael@0: }); michael@0: }, "application/x-xpinstall", null, "Real Test 4", null, "1.0"); michael@0: } michael@0: michael@0: function check_test_10(install) { michael@0: prepare_test({ michael@0: "addon3@tests.mozilla.org": [ michael@0: "onOperationCancelled" michael@0: ] michael@0: }, [ michael@0: "onInstallCancelled" michael@0: ]); michael@0: michael@0: install.cancel(); michael@0: michael@0: ensure_test_completed(); michael@0: michael@0: AddonManager.getAllInstalls(callback_soon(function(activeInstalls) { michael@0: do_check_eq(activeInstalls.length, 0); michael@0: michael@0: restartManager(); michael@0: michael@0: // Check that the install did not complete michael@0: AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) { michael@0: do_check_eq(a3, null); michael@0: michael@0: do_execute_soon(run_test_11); michael@0: }); michael@0: })); michael@0: } michael@0: michael@0: // Tests that a multi-package install shows up as multiple installs with the michael@0: // correct sourceURI. michael@0: function run_test_11() { michael@0: prepare_test({ }, [ michael@0: "onNewInstall", michael@0: "onNewInstall", michael@0: "onNewInstall", michael@0: "onNewInstall" michael@0: ]); michael@0: michael@0: AddonManager.getInstallForFile(do_get_addon("test_install4"), function(install) { michael@0: ensure_test_completed(); michael@0: do_check_neq(install, null); michael@0: do_check_neq(install.linkedInstalls, null); michael@0: do_check_eq(install.linkedInstalls.length, 3); michael@0: michael@0: // Might be in any order so sort them based on ID michael@0: let installs = [install].concat(install.linkedInstalls); michael@0: installs.sort(function(a, b) { michael@0: if (a.addon.id < b.addon.id) michael@0: return -1; michael@0: if (a.addon.id > b.addon.id) michael@0: return 1; michael@0: return 0; michael@0: }); michael@0: michael@0: // Comes from addon4.xpi and is made compatible by an update check michael@0: do_check_eq(installs[0].sourceURI, install.sourceURI); michael@0: do_check_eq(installs[0].addon.id, "addon4@tests.mozilla.org"); michael@0: do_check_false(installs[0].addon.appDisabled); michael@0: do_check_eq(installs[0].version, "1.0"); michael@0: do_check_eq(installs[0].name, "Multi Test 1"); michael@0: do_check_eq(installs[0].state, AddonManager.STATE_DOWNLOADED); michael@0: do_check_true(hasFlag(installs[0].addon.operationsRequiringRestart, michael@0: AddonManager.OP_NEEDS_RESTART_INSTALL)); michael@0: michael@0: // Comes from addon5.jar and is compatible by default michael@0: do_check_eq(installs[1].sourceURI, install.sourceURI); michael@0: do_check_eq(installs[1].addon.id, "addon5@tests.mozilla.org"); michael@0: do_check_false(installs[1].addon.appDisabled); michael@0: do_check_eq(installs[1].version, "3.0"); michael@0: do_check_eq(installs[1].name, "Multi Test 2"); michael@0: do_check_eq(installs[1].state, AddonManager.STATE_DOWNLOADED); michael@0: do_check_true(hasFlag(installs[1].addon.operationsRequiringRestart, michael@0: AddonManager.OP_NEEDS_RESTART_INSTALL)); michael@0: michael@0: // Comes from addon6.xpi and would be incompatible with strict compat enabled michael@0: do_check_eq(installs[2].sourceURI, install.sourceURI); michael@0: do_check_eq(installs[2].addon.id, "addon6@tests.mozilla.org"); michael@0: do_check_false(installs[2].addon.appDisabled); michael@0: do_check_eq(installs[2].version, "2.0"); michael@0: do_check_eq(installs[2].name, "Multi Test 3"); michael@0: do_check_eq(installs[2].state, AddonManager.STATE_DOWNLOADED); michael@0: do_check_true(hasFlag(installs[2].addon.operationsRequiringRestart, michael@0: AddonManager.OP_NEEDS_RESTART_INSTALL)); michael@0: michael@0: // Comes from addon7.jar and is made compatible by an update check michael@0: do_check_eq(installs[3].sourceURI, install.sourceURI); michael@0: do_check_eq(installs[3].addon.id, "addon7@tests.mozilla.org"); michael@0: do_check_false(installs[3].addon.appDisabled); michael@0: do_check_eq(installs[3].version, "5.0"); michael@0: do_check_eq(installs[3].name, "Multi Test 4"); michael@0: do_check_eq(installs[3].state, AddonManager.STATE_DOWNLOADED); michael@0: do_check_true(hasFlag(installs[3].addon.operationsRequiringRestart, michael@0: AddonManager.OP_NEEDS_RESTART_INSTALL)); michael@0: michael@0: AddonManager.getAllInstalls(function(aInstalls) { michael@0: do_check_eq(aInstalls.length, 4); michael@0: michael@0: prepare_test({ michael@0: "addon4@tests.mozilla.org": [ michael@0: "onInstalling" michael@0: ], michael@0: "addon5@tests.mozilla.org": [ michael@0: "onInstalling" michael@0: ], michael@0: "addon6@tests.mozilla.org": [ michael@0: "onInstalling" michael@0: ], michael@0: "addon7@tests.mozilla.org": [ michael@0: "onInstalling" michael@0: ] michael@0: }, { michael@0: "addon4@tests.mozilla.org": [ michael@0: "onInstallStarted", michael@0: "onInstallEnded" michael@0: ], michael@0: "addon5@tests.mozilla.org": [ michael@0: "onInstallStarted", michael@0: "onInstallEnded" michael@0: ], michael@0: "addon6@tests.mozilla.org": [ michael@0: "onInstallStarted", michael@0: "onInstallEnded" michael@0: ], michael@0: "addon7@tests.mozilla.org": [ michael@0: "onInstallStarted", michael@0: "onInstallEnded" michael@0: ] michael@0: }, callback_soon(check_test_11)); michael@0: michael@0: installs[0].install(); michael@0: installs[1].install(); michael@0: installs[3].install(); michael@0: michael@0: // Note that we install addon6 last. Since it doesn't need a restart to michael@0: // install it completes asynchronously which would otherwise make the michael@0: // onInstallStarted/onInstallEnded events go out of sequence unless this michael@0: // is the last install operation michael@0: installs[2].install(); michael@0: }); michael@0: }); michael@0: } michael@0: michael@0: function check_test_11() { michael@0: restartManager(); michael@0: michael@0: AddonManager.getAddonsByIDs(["addon4@tests.mozilla.org", michael@0: "addon5@tests.mozilla.org", michael@0: "addon6@tests.mozilla.org", michael@0: "addon7@tests.mozilla.org"], michael@0: function([a4, a5, a6, a7]) { michael@0: do_check_neq(a4, null); michael@0: do_check_neq(a5, null); michael@0: do_check_neq(a6, null); michael@0: do_check_neq(a7, null); michael@0: michael@0: a4.uninstall(); michael@0: a5.uninstall(); michael@0: a6.uninstall(); michael@0: a7.uninstall(); michael@0: michael@0: do_execute_soon(run_test_12); michael@0: }); michael@0: } michael@0: michael@0: // Same as test 11 but for a remote XPI michael@0: function run_test_12() { michael@0: restartManager(); michael@0: michael@0: prepare_test({ }, [ michael@0: "onNewInstall", michael@0: ]); michael@0: michael@0: let url = "http://localhost:" + gPort + "/addons/test_install4.xpi"; michael@0: AddonManager.getInstallForURL(url, function(install) { michael@0: gInstall = install; michael@0: michael@0: ensure_test_completed(); michael@0: do_check_neq(install, null); michael@0: do_check_eq(install.linkedInstalls, null); michael@0: do_check_eq(install.state, AddonManager.STATE_AVAILABLE); michael@0: michael@0: prepare_test({ michael@0: "addon4@tests.mozilla.org": [ michael@0: "onInstalling" michael@0: ], michael@0: "addon5@tests.mozilla.org": [ michael@0: "onInstalling" michael@0: ], michael@0: "addon6@tests.mozilla.org": [ michael@0: "onInstalling" michael@0: ], michael@0: "addon7@tests.mozilla.org": [ michael@0: "onInstalling" michael@0: ] michael@0: }, { michael@0: "NO_ID": [ michael@0: "onDownloadStarted", michael@0: "onNewInstall", michael@0: "onNewInstall", michael@0: "onNewInstall", michael@0: "onDownloadEnded" michael@0: ], michael@0: "addon4@tests.mozilla.org": [ michael@0: "onInstallStarted", michael@0: "onInstallEnded" michael@0: ], michael@0: "addon5@tests.mozilla.org": [ michael@0: "onInstallStarted", michael@0: "onInstallEnded" michael@0: ], michael@0: "addon6@tests.mozilla.org": [ michael@0: "onInstallStarted", michael@0: "onInstallEnded" michael@0: ], michael@0: "addon7@tests.mozilla.org": [ michael@0: "onInstallStarted", michael@0: "onInstallEnded" michael@0: ] michael@0: }, callback_soon(check_test_12)); michael@0: install.install(); michael@0: }, "application/x-xpinstall", null, "Multi Test 4"); michael@0: } michael@0: michael@0: function check_test_12() { michael@0: do_check_eq(gInstall.linkedInstalls.length, 3); michael@0: michael@0: // Might be in any order so sort them based on ID michael@0: let installs = [gInstall].concat(gInstall.linkedInstalls); michael@0: installs.sort(function(a, b) { michael@0: if (a.addon.id < b.addon.id) michael@0: return -1; michael@0: if (a.addon.id > b.addon.id) michael@0: return 1; michael@0: return 0; michael@0: }); michael@0: michael@0: // Comes from addon4.xpi and is made compatible by an update check michael@0: do_check_eq(installs[0].sourceURI, gInstall.sourceURI); michael@0: do_check_eq(installs[0].addon.id, "addon4@tests.mozilla.org"); michael@0: do_check_false(installs[0].addon.appDisabled); michael@0: do_check_eq(installs[0].version, "1.0"); michael@0: do_check_eq(installs[0].name, "Multi Test 1"); michael@0: do_check_eq(installs[0].state, AddonManager.STATE_INSTALLED); michael@0: michael@0: // Comes from addon5.jar and is compatible by default michael@0: do_check_eq(installs[1].sourceURI, gInstall.sourceURI); michael@0: do_check_eq(installs[1].addon.id, "addon5@tests.mozilla.org"); michael@0: do_check_false(installs[1].addon.appDisabled); michael@0: do_check_eq(installs[1].version, "3.0"); michael@0: do_check_eq(installs[1].name, "Multi Test 2"); michael@0: do_check_eq(installs[1].state, AddonManager.STATE_INSTALLED); michael@0: michael@0: // Comes from addon6.xpi and would be incompatible with strict compat enabled michael@0: do_check_eq(installs[2].sourceURI, gInstall.sourceURI); michael@0: do_check_eq(installs[2].addon.id, "addon6@tests.mozilla.org"); michael@0: do_check_false(installs[2].addon.appDisabled); michael@0: do_check_eq(installs[2].version, "2.0"); michael@0: do_check_eq(installs[2].name, "Multi Test 3"); michael@0: do_check_eq(installs[2].state, AddonManager.STATE_INSTALLED); michael@0: michael@0: // Comes from addon7.jar and is made compatible by an update check michael@0: do_check_eq(installs[3].sourceURI, gInstall.sourceURI); michael@0: do_check_eq(installs[3].addon.id, "addon7@tests.mozilla.org"); michael@0: do_check_false(installs[3].addon.appDisabled); michael@0: do_check_eq(installs[3].version, "5.0"); michael@0: do_check_eq(installs[3].name, "Multi Test 4"); michael@0: do_check_eq(installs[3].state, AddonManager.STATE_INSTALLED); michael@0: michael@0: restartManager(); michael@0: michael@0: AddonManager.getAddonsByIDs(["addon4@tests.mozilla.org", michael@0: "addon5@tests.mozilla.org", michael@0: "addon6@tests.mozilla.org", michael@0: "addon7@tests.mozilla.org"], michael@0: function([a4, a5, a6, a7]) { michael@0: do_check_neq(a4, null); michael@0: do_check_neq(a5, null); michael@0: do_check_neq(a6, null); michael@0: do_check_neq(a7, null); michael@0: michael@0: a4.uninstall(); michael@0: a5.uninstall(); michael@0: a6.uninstall(); michael@0: a7.uninstall(); michael@0: michael@0: do_execute_soon(run_test_13); michael@0: }); michael@0: } michael@0: michael@0: michael@0: // Tests that cancelling an upgrade leaves the original add-on's pendingOperations michael@0: // correct michael@0: function run_test_13() { michael@0: restartManager(); michael@0: michael@0: installAllFiles([do_get_addon("test_install2_1")], function() { michael@0: restartManager(); michael@0: michael@0: prepare_test({ }, [ michael@0: "onNewInstall" michael@0: ]); michael@0: michael@0: let url = "http://localhost:" + gPort + "/addons/test_install2_2.xpi"; michael@0: AddonManager.getInstallForURL(url, function(install) { michael@0: ensure_test_completed(); michael@0: michael@0: do_check_neq(install, null); michael@0: do_check_eq(install.version, "3.0"); michael@0: do_check_eq(install.name, "Test 3"); michael@0: do_check_eq(install.state, AddonManager.STATE_AVAILABLE); michael@0: michael@0: AddonManager.getAllInstalls(function(activeInstalls) { michael@0: do_check_eq(activeInstalls.length, 1); michael@0: do_check_eq(activeInstalls[0], install); michael@0: do_check_eq(install.existingAddon, null); michael@0: michael@0: prepare_test({ michael@0: "addon2@tests.mozilla.org": [ michael@0: "onInstalling" michael@0: ] michael@0: }, [ michael@0: "onDownloadStarted", michael@0: "onDownloadEnded", michael@0: "onInstallStarted", michael@0: "onInstallEnded", michael@0: ], check_test_13); michael@0: install.install(); michael@0: }); michael@0: }, "application/x-xpinstall", null, "Test 3", null, "3.0"); michael@0: }); michael@0: } michael@0: michael@0: function check_test_13(install) { michael@0: ensure_test_completed(); michael@0: michael@0: do_check_eq(install.version, "3.0"); michael@0: do_check_eq(install.name, "Real Test 3"); michael@0: do_check_eq(install.state, AddonManager.STATE_INSTALLED); michael@0: do_check_neq(install.existingAddon, null); michael@0: do_check_eq(install.existingAddon.id, "addon2@tests.mozilla.org"); michael@0: do_check_eq(install.addon.install, install); michael@0: michael@0: AddonManager.getAddonByID("addon2@tests.mozilla.org", callback_soon(function(olda2) { michael@0: do_check_neq(olda2, null); michael@0: do_check_true(hasFlag(olda2.pendingOperations, AddonManager.PENDING_UPGRADE)); michael@0: do_check_eq(olda2.pendingUpgrade, install.addon); michael@0: michael@0: do_check_true(hasFlag(install.addon.pendingOperations, michael@0: AddonManager.PENDING_INSTALL)); michael@0: michael@0: prepare_test({ michael@0: "addon2@tests.mozilla.org": [ michael@0: "onOperationCancelled" michael@0: ] michael@0: }, [ michael@0: "onInstallCancelled", michael@0: ]); michael@0: michael@0: install.cancel(); michael@0: michael@0: do_check_false(hasFlag(install.addon.pendingOperations, AddonManager.PENDING_INSTALL)); michael@0: michael@0: do_check_false(hasFlag(olda2.pendingOperations, AddonManager.PENDING_UPGRADE)); michael@0: do_check_eq(olda2.pendingUpgrade, null); michael@0: michael@0: restartManager(); michael@0: michael@0: // Check that the upgrade did not complete michael@0: AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { michael@0: do_check_eq(a2.version, "2.0"); michael@0: michael@0: a2.uninstall(); michael@0: michael@0: do_execute_soon(run_test_14); michael@0: }); michael@0: })); michael@0: } michael@0: michael@0: // Check that cancelling the install from onDownloadStarted actually cancels it michael@0: function run_test_14() { michael@0: restartManager(); michael@0: michael@0: prepare_test({ }, [ michael@0: "onNewInstall" michael@0: ]); michael@0: michael@0: let url = "http://localhost:" + gPort + "/addons/test_install2_1.xpi"; michael@0: AddonManager.getInstallForURL(url, function(install) { michael@0: ensure_test_completed(); michael@0: michael@0: do_check_eq(install.file, null); michael@0: michael@0: prepare_test({ }, [ michael@0: "onDownloadStarted" michael@0: ], check_test_14); michael@0: install.install(); michael@0: }, "application/x-xpinstall"); michael@0: } michael@0: michael@0: function check_test_14(install) { michael@0: prepare_test({ }, [ michael@0: "onDownloadCancelled" michael@0: ]); michael@0: michael@0: install.cancel(); michael@0: michael@0: ensure_test_completed(); michael@0: michael@0: install.addListener({ michael@0: onDownloadProgress: function() { michael@0: do_throw("Download should not have continued"); michael@0: }, michael@0: onDownloadEnded: function() { michael@0: do_throw("Download should not have continued"); michael@0: } michael@0: }); michael@0: michael@0: // Allow the listener to return to see if it continues downloading. The michael@0: // The listener only really tests if we give it time to see progress, the michael@0: // file check isn't ideal either michael@0: do_execute_soon(function() { michael@0: do_check_eq(install.file, null); michael@0: michael@0: run_test_15(); michael@0: }); michael@0: } michael@0: michael@0: // Checks that cancelling the install from onDownloadEnded actually cancels it michael@0: function run_test_15() { michael@0: prepare_test({ }, [ michael@0: "onNewInstall" michael@0: ]); michael@0: michael@0: let url = "http://localhost:" + gPort + "/addons/test_install2_1.xpi"; michael@0: AddonManager.getInstallForURL(url, function(install) { michael@0: ensure_test_completed(); michael@0: michael@0: do_check_eq(install.file, null); michael@0: michael@0: prepare_test({ }, [ michael@0: "onDownloadStarted", michael@0: "onDownloadEnded" michael@0: ], check_test_15); michael@0: install.install(); michael@0: }, "application/x-xpinstall"); michael@0: } michael@0: michael@0: function check_test_15(install) { michael@0: prepare_test({ }, [ michael@0: "onDownloadCancelled" michael@0: ]); michael@0: michael@0: install.cancel(); michael@0: michael@0: ensure_test_completed(); michael@0: michael@0: install.addListener({ michael@0: onInstallStarted: function() { michael@0: do_throw("Install should not have continued"); michael@0: } michael@0: }); michael@0: michael@0: // Allow the listener to return to see if it starts installing michael@0: do_execute_soon(run_test_16); michael@0: } michael@0: michael@0: // Verify that the userDisabled value carries over to the upgrade by default michael@0: function run_test_16() { michael@0: restartManager(); michael@0: michael@0: let url = "http://localhost:" + gPort + "/addons/test_install2_1.xpi"; michael@0: AddonManager.getInstallForURL(url, function(aInstall) { michael@0: aInstall.addListener({ michael@0: onInstallStarted: function() { michael@0: do_check_false(aInstall.addon.userDisabled); michael@0: aInstall.addon.userDisabled = true; michael@0: }, michael@0: michael@0: onInstallEnded: function() { michael@0: do_execute_soon(function install2_1_ended() { michael@0: restartManager(); michael@0: michael@0: AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { michael@0: do_check_true(a2.userDisabled); michael@0: do_check_false(a2.isActive); michael@0: michael@0: let url = "http://localhost:" + gPort + "/addons/test_install2_2.xpi"; michael@0: AddonManager.getInstallForURL(url, function(aInstall) { michael@0: aInstall.addListener({ michael@0: onInstallEnded: function() { michael@0: do_execute_soon(function install2_2_ended() { michael@0: do_check_true(aInstall.addon.userDisabled); michael@0: michael@0: restartManager(); michael@0: michael@0: AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { michael@0: do_check_true(a2.userDisabled); michael@0: do_check_false(a2.isActive); michael@0: michael@0: a2.uninstall(); michael@0: do_execute_soon(run_test_17); michael@0: }); michael@0: }); michael@0: } michael@0: }); michael@0: aInstall.install(); michael@0: }, "application/x-xpinstall"); michael@0: }); michael@0: }); michael@0: } michael@0: }); michael@0: aInstall.install(); michael@0: }, "application/x-xpinstall"); michael@0: } michael@0: michael@0: // Verify that changing the userDisabled value before onInstallEnded works michael@0: function run_test_17() { michael@0: restartManager(); michael@0: michael@0: let url = "http://localhost:" + gPort + "/addons/test_install2_1.xpi"; michael@0: AddonManager.getInstallForURL(url, function(aInstall) { michael@0: aInstall.addListener({ michael@0: onInstallEnded: function() { michael@0: do_execute_soon(function install2_1_ended2() { michael@0: do_check_false(aInstall.addon.userDisabled); michael@0: michael@0: restartManager(); michael@0: michael@0: AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { michael@0: do_check_false(a2.userDisabled); michael@0: do_check_true(a2.isActive); michael@0: michael@0: let url = "http://localhost:" + gPort + "/addons/test_install2_2.xpi"; michael@0: AddonManager.getInstallForURL(url, function(aInstall) { michael@0: aInstall.addListener({ michael@0: onInstallStarted: function() { michael@0: do_check_false(aInstall.addon.userDisabled); michael@0: aInstall.addon.userDisabled = true; michael@0: }, michael@0: michael@0: onInstallEnded: function() { michael@0: do_execute_soon(function install2_2_ended2() { michael@0: restartManager(); michael@0: michael@0: AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { michael@0: do_check_true(a2.userDisabled); michael@0: do_check_false(a2.isActive); michael@0: michael@0: a2.uninstall(); michael@0: do_execute_soon(run_test_18); michael@0: }); michael@0: }); michael@0: } michael@0: }); michael@0: aInstall.install(); michael@0: }, "application/x-xpinstall"); michael@0: }); michael@0: }); michael@0: } michael@0: }); michael@0: aInstall.install(); michael@0: }, "application/x-xpinstall"); michael@0: } michael@0: michael@0: // Verify that changing the userDisabled value before onInstallEnded works michael@0: function run_test_18() { michael@0: restartManager(); michael@0: michael@0: let url = "http://localhost:" + gPort + "/addons/test_install2_1.xpi"; michael@0: AddonManager.getInstallForURL(url, function(aInstall) { michael@0: aInstall.addListener({ michael@0: onInstallStarted: function() { michael@0: do_check_false(aInstall.addon.userDisabled); michael@0: aInstall.addon.userDisabled = true; michael@0: }, michael@0: michael@0: onInstallEnded: function() { michael@0: do_execute_soon(function install_2_1_ended3() { michael@0: restartManager(); michael@0: michael@0: AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { michael@0: do_check_true(a2.userDisabled); michael@0: do_check_false(a2.isActive); michael@0: michael@0: let url = "http://localhost:" + gPort + "/addons/test_install2_2.xpi"; michael@0: AddonManager.getInstallForURL(url, function(aInstall) { michael@0: aInstall.addListener({ michael@0: onInstallStarted: function() { michael@0: do_check_true(aInstall.addon.userDisabled); michael@0: aInstall.addon.userDisabled = false; michael@0: }, michael@0: michael@0: onInstallEnded: function() { michael@0: do_execute_soon(function install_2_2_ended3() { michael@0: restartManager(); michael@0: michael@0: AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { michael@0: do_check_false(a2.userDisabled); michael@0: do_check_true(a2.isActive); michael@0: michael@0: a2.uninstall(); michael@0: do_execute_soon(run_test_18_1); michael@0: }); michael@0: }); michael@0: } michael@0: }); michael@0: aInstall.install(); michael@0: }, "application/x-xpinstall"); michael@0: }); michael@0: }); michael@0: } michael@0: }); michael@0: aInstall.install(); michael@0: }, "application/x-xpinstall"); michael@0: } michael@0: michael@0: michael@0: // Checks that metadata is not stored if the pref is set to false michael@0: function run_test_18_1() { michael@0: restartManager(); michael@0: michael@0: Services.prefs.setBoolPref("extensions.getAddons.cache.enabled", true); michael@0: Services.prefs.setCharPref(PREF_GETADDONS_BYIDS, michael@0: "http://localhost:" + gPort + "/data/test_install.xml"); michael@0: michael@0: Services.prefs.setBoolPref("extensions.addon2@tests.mozilla.org.getAddons.cache.enabled", false); michael@0: michael@0: let url = "http://localhost:" + gPort + "/addons/test_install2_1.xpi"; michael@0: AddonManager.getInstallForURL(url, function(aInstall) { michael@0: aInstall.addListener({ michael@0: onInstallEnded: function(aInstall, aAddon) { michael@0: do_execute_soon(function test18_1_install_ended() { michael@0: do_check_neq(aAddon.fullDescription, "Repository description"); michael@0: michael@0: restartManager(); michael@0: michael@0: AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { michael@0: do_check_neq(a2.fullDescription, "Repository description"); michael@0: michael@0: a2.uninstall(); michael@0: do_execute_soon(run_test_19); michael@0: }); michael@0: }); michael@0: } michael@0: }); michael@0: aInstall.install(); michael@0: }, "application/x-xpinstall"); michael@0: } michael@0: michael@0: // Checks that metadata is downloaded for new installs and is visible before and michael@0: // after restart michael@0: function run_test_19() { michael@0: restartManager(); michael@0: Services.prefs.setBoolPref("extensions.addon2@tests.mozilla.org.getAddons.cache.enabled", true); michael@0: michael@0: let url = "http://localhost:" + gPort + "/addons/test_install2_1.xpi"; michael@0: AddonManager.getInstallForURL(url, function(aInstall) { michael@0: aInstall.addListener({ michael@0: onInstallEnded: function(aInstall, aAddon) { michael@0: do_execute_soon(function test19_install_ended() { michael@0: do_check_eq(aAddon.fullDescription, "Repository description"); michael@0: michael@0: restartManager(); michael@0: michael@0: AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { michael@0: do_check_eq(a2.fullDescription, "Repository description"); michael@0: michael@0: a2.uninstall(); michael@0: do_execute_soon(run_test_20); michael@0: }); michael@0: }); michael@0: } michael@0: }); michael@0: aInstall.install(); michael@0: }, "application/x-xpinstall"); michael@0: } michael@0: michael@0: // Do the same again to make sure it works when the data is already in the cache michael@0: function run_test_20() { michael@0: restartManager(); michael@0: michael@0: let url = "http://localhost:" + gPort + "/addons/test_install2_1.xpi"; michael@0: AddonManager.getInstallForURL(url, function(aInstall) { michael@0: aInstall.addListener({ michael@0: onInstallEnded: function(aInstall, aAddon) { michael@0: do_execute_soon(function test20_install_ended() { michael@0: do_check_eq(aAddon.fullDescription, "Repository description"); michael@0: michael@0: restartManager(); michael@0: michael@0: AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { michael@0: do_check_eq(a2.fullDescription, "Repository description"); michael@0: michael@0: a2.uninstall(); michael@0: do_execute_soon(run_test_21); michael@0: }); michael@0: }); michael@0: } michael@0: }); michael@0: aInstall.install(); michael@0: }, "application/x-xpinstall"); michael@0: } michael@0: michael@0: // Verify that installing an add-on that is already pending install cancels the michael@0: // first install michael@0: function run_test_21() { michael@0: restartManager(); michael@0: Services.prefs.setBoolPref("extensions.getAddons.cache.enabled", false); michael@0: michael@0: installAllFiles([do_get_addon("test_install2_1")], function() { michael@0: AddonManager.getAllInstalls(function(aInstalls) { michael@0: do_check_eq(aInstalls.length, 1); michael@0: michael@0: prepare_test({ michael@0: "addon2@tests.mozilla.org": [ michael@0: "onOperationCancelled", michael@0: "onInstalling" michael@0: ] michael@0: }, [ michael@0: "onNewInstall", michael@0: "onDownloadStarted", michael@0: "onDownloadEnded", michael@0: "onInstallStarted", michael@0: "onInstallCancelled", michael@0: "onInstallEnded", michael@0: ], check_test_21); michael@0: michael@0: let url = "http://localhost:" + gPort + "/addons/test_install2_1.xpi"; michael@0: AddonManager.getInstallForURL(url, function(aInstall) { michael@0: aInstall.install(); michael@0: }, "application/x-xpinstall"); michael@0: }); michael@0: }); michael@0: } michael@0: michael@0: function check_test_21(aInstall) { michael@0: AddonManager.getAllInstalls(callback_soon(function(aInstalls) { michael@0: do_check_eq(aInstalls.length, 1); michael@0: do_check_eq(aInstalls[0], aInstall); michael@0: michael@0: prepare_test({ michael@0: "addon2@tests.mozilla.org": [ michael@0: "onOperationCancelled" michael@0: ] michael@0: }, [ michael@0: "onInstallCancelled", michael@0: ]); michael@0: michael@0: aInstall.cancel(); michael@0: michael@0: ensure_test_completed(); michael@0: michael@0: restartManager(); michael@0: michael@0: AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { michael@0: do_check_eq(a2, null); michael@0: michael@0: run_test_22(); michael@0: }); michael@0: })); michael@0: } michael@0: michael@0: // Tests that an install can be restarted after being cancelled michael@0: function run_test_22() { michael@0: prepare_test({ }, [ michael@0: "onNewInstall" michael@0: ]); michael@0: michael@0: let url = "http://localhost:" + gPort + "/addons/test_install3.xpi"; michael@0: AddonManager.getInstallForURL(url, function(aInstall) { michael@0: ensure_test_completed(); michael@0: michael@0: do_check_neq(aInstall, null); michael@0: do_check_eq(aInstall.state, AddonManager.STATE_AVAILABLE); michael@0: michael@0: prepare_test({}, [ michael@0: "onDownloadStarted", michael@0: "onDownloadEnded", michael@0: ], check_test_22); michael@0: aInstall.install(); michael@0: }, "application/x-xpinstall"); michael@0: } michael@0: michael@0: function check_test_22(aInstall) { michael@0: prepare_test({}, [ michael@0: "onDownloadCancelled" michael@0: ]); michael@0: michael@0: aInstall.cancel(); michael@0: michael@0: ensure_test_completed(); michael@0: michael@0: prepare_test({ michael@0: "addon3@tests.mozilla.org": [ michael@0: "onInstalling" michael@0: ] michael@0: }, [ michael@0: "onDownloadStarted", michael@0: "onDownloadEnded", michael@0: "onInstallStarted", michael@0: "onInstallEnded" michael@0: ], finish_test_22); michael@0: michael@0: aInstall.install(); michael@0: } michael@0: michael@0: function finish_test_22(aInstall) { michael@0: prepare_test({ michael@0: "addon3@tests.mozilla.org": [ michael@0: "onOperationCancelled" michael@0: ] michael@0: }, [ michael@0: "onInstallCancelled" michael@0: ]); michael@0: michael@0: aInstall.cancel(); michael@0: michael@0: ensure_test_completed(); michael@0: michael@0: run_test_23(); michael@0: } michael@0: michael@0: // Tests that an install can be restarted after being cancelled when a hash michael@0: // was provided michael@0: function run_test_23() { michael@0: prepare_test({ }, [ michael@0: "onNewInstall" michael@0: ]); michael@0: michael@0: let url = "http://localhost:" + gPort + "/addons/test_install3.xpi"; michael@0: AddonManager.getInstallForURL(url, function(aInstall) { michael@0: ensure_test_completed(); michael@0: michael@0: do_check_neq(aInstall, null); michael@0: do_check_eq(aInstall.state, AddonManager.STATE_AVAILABLE); michael@0: michael@0: prepare_test({}, [ michael@0: "onDownloadStarted", michael@0: "onDownloadEnded", michael@0: ], check_test_23); michael@0: aInstall.install(); michael@0: }, "application/x-xpinstall", do_get_addon_hash("test_install3")); michael@0: } michael@0: michael@0: function check_test_23(aInstall) { michael@0: prepare_test({}, [ michael@0: "onDownloadCancelled" michael@0: ]); michael@0: michael@0: aInstall.cancel(); michael@0: michael@0: ensure_test_completed(); michael@0: michael@0: prepare_test({ michael@0: "addon3@tests.mozilla.org": [ michael@0: "onInstalling" michael@0: ] michael@0: }, [ michael@0: "onDownloadStarted", michael@0: "onDownloadEnded", michael@0: "onInstallStarted", michael@0: "onInstallEnded" michael@0: ], finish_test_23); michael@0: michael@0: aInstall.install(); michael@0: } michael@0: michael@0: function finish_test_23(aInstall) { michael@0: prepare_test({ michael@0: "addon3@tests.mozilla.org": [ michael@0: "onOperationCancelled" michael@0: ] michael@0: }, [ michael@0: "onInstallCancelled" michael@0: ]); michael@0: michael@0: aInstall.cancel(); michael@0: michael@0: ensure_test_completed(); michael@0: michael@0: run_test_24(); michael@0: } michael@0: michael@0: // Tests that an install with a bad hash can be restarted after it fails, though michael@0: // it will only fail again michael@0: function run_test_24() { michael@0: prepare_test({ }, [ michael@0: "onNewInstall" michael@0: ]); michael@0: michael@0: let url = "http://localhost:" + gPort + "/addons/test_install3.xpi"; michael@0: AddonManager.getInstallForURL(url, function(aInstall) { michael@0: ensure_test_completed(); michael@0: michael@0: do_check_neq(aInstall, null); michael@0: do_check_eq(aInstall.state, AddonManager.STATE_AVAILABLE); michael@0: michael@0: prepare_test({}, [ michael@0: "onDownloadStarted", michael@0: "onDownloadFailed", michael@0: ], check_test_24); michael@0: aInstall.install(); michael@0: }, "application/x-xpinstall", "sha1:foo"); michael@0: } michael@0: michael@0: function check_test_24(aInstall) { michael@0: prepare_test({ }, [ michael@0: "onDownloadStarted", michael@0: "onDownloadFailed" michael@0: ], run_test_25); michael@0: michael@0: aInstall.install(); michael@0: } michael@0: michael@0: // Tests that installs with a hash for a local file work michael@0: function run_test_25() { michael@0: prepare_test({ }, [ michael@0: "onNewInstall" michael@0: ]); michael@0: michael@0: let url = Services.io.newFileURI(do_get_addon("test_install3")).spec; michael@0: AddonManager.getInstallForURL(url, function(aInstall) { michael@0: ensure_test_completed(); michael@0: michael@0: do_check_neq(aInstall, null); michael@0: do_check_eq(aInstall.state, AddonManager.STATE_DOWNLOADED); michael@0: do_check_eq(aInstall.error, 0); michael@0: michael@0: prepare_test({ }, [ michael@0: "onDownloadCancelled" michael@0: ]); michael@0: michael@0: aInstall.cancel(); michael@0: michael@0: ensure_test_completed(); michael@0: michael@0: run_test_26(); michael@0: }, "application/x-xpinstall", do_get_addon_hash("test_install3")); michael@0: } michael@0: michael@0: function run_test_26() { michael@0: prepare_test({ }, [ michael@0: "onNewInstall", michael@0: "onDownloadStarted", michael@0: "onDownloadCancelled" michael@0: ]); michael@0: michael@0: let observerService = AM_Cc["@mozilla.org/network/http-activity-distributor;1"]. michael@0: getService(AM_Ci.nsIHttpActivityDistributor); michael@0: observerService.addObserver({ michael@0: observeActivity: function(aChannel, aType, aSubtype, aTimestamp, aSizeData, michael@0: aStringData) { michael@0: aChannel.QueryInterface(AM_Ci.nsIChannel); michael@0: // Wait for the final event for the redirected URL michael@0: if (aChannel.URI.spec != "http://localhost:" + gPort + "/addons/test_install1.xpi" || michael@0: aType != AM_Ci.nsIHttpActivityObserver.ACTIVITY_TYPE_HTTP_TRANSACTION || michael@0: aSubtype != AM_Ci.nsIHttpActivityObserver.ACTIVITY_SUBTYPE_TRANSACTION_CLOSE) michael@0: return; michael@0: michael@0: // Request should have been cancelled michael@0: do_check_eq(aChannel.status, Components.results.NS_BINDING_ABORTED); michael@0: michael@0: observerService.removeObserver(this); michael@0: michael@0: run_test_27(); michael@0: } michael@0: }); michael@0: michael@0: let url = "http://localhost:" + gPort + "/redirect?/addons/test_install1.xpi"; michael@0: AddonManager.getInstallForURL(url, function(aInstall) { michael@0: aInstall.addListener({ michael@0: onDownloadProgress: function(aInstall) { michael@0: aInstall.cancel(); michael@0: } michael@0: }); michael@0: michael@0: aInstall.install(); michael@0: }, "application/x-xpinstall"); michael@0: } michael@0: michael@0: michael@0: // Tests that an install can be restarted during onDownloadCancelled after being michael@0: // cancelled in mid-download michael@0: function run_test_27() { michael@0: prepare_test({ }, [ michael@0: "onNewInstall" michael@0: ]); michael@0: michael@0: let url = "http://localhost:" + gPort + "/addons/test_install3.xpi"; michael@0: AddonManager.getInstallForURL(url, function(aInstall) { michael@0: ensure_test_completed(); michael@0: michael@0: do_check_neq(aInstall, null); michael@0: do_check_eq(aInstall.state, AddonManager.STATE_AVAILABLE); michael@0: michael@0: aInstall.addListener({ michael@0: onDownloadProgress: function() { michael@0: aInstall.removeListener(this); michael@0: aInstall.cancel(); michael@0: } michael@0: }); michael@0: michael@0: prepare_test({}, [ michael@0: "onDownloadStarted", michael@0: "onDownloadCancelled", michael@0: ], check_test_27); michael@0: aInstall.install(); michael@0: }, "application/x-xpinstall"); michael@0: } michael@0: michael@0: function check_test_27(aInstall) { michael@0: prepare_test({ michael@0: "addon3@tests.mozilla.org": [ michael@0: "onInstalling" michael@0: ] michael@0: }, [ michael@0: "onDownloadStarted", michael@0: "onDownloadEnded", michael@0: "onInstallStarted", michael@0: "onInstallEnded" michael@0: ], finish_test_27); michael@0: michael@0: aInstall.install(); michael@0: } michael@0: michael@0: function finish_test_27(aInstall) { michael@0: prepare_test({ michael@0: "addon3@tests.mozilla.org": [ michael@0: "onOperationCancelled" michael@0: ] michael@0: }, [ michael@0: "onInstallCancelled" michael@0: ]); michael@0: michael@0: aInstall.cancel(); michael@0: michael@0: ensure_test_completed(); michael@0: michael@0: run_test_28(); michael@0: } michael@0: michael@0: // Tests that an install that isn't strictly compatible and has michael@0: // binary components correctly has appDisabled set (see bug 702868). michael@0: function run_test_28() { michael@0: prepare_test({ }, [ michael@0: "onNewInstall" michael@0: ]); michael@0: michael@0: let url = "http://localhost:" + gPort + "/addons/test_install5.xpi"; michael@0: AddonManager.getInstallForURL(url, function(install) { michael@0: ensure_test_completed(); michael@0: michael@0: do_check_neq(install, null); michael@0: do_check_eq(install.version, "1.0"); michael@0: do_check_eq(install.name, "Real Test 5"); michael@0: do_check_eq(install.state, AddonManager.STATE_AVAILABLE); michael@0: michael@0: AddonManager.getInstallsByTypes(null, function(activeInstalls) { michael@0: do_check_eq(activeInstalls.length, 1); michael@0: do_check_eq(activeInstalls[0], install); michael@0: michael@0: prepare_test({}, [ michael@0: "onDownloadStarted", michael@0: "onDownloadEnded", michael@0: "onInstallStarted" michael@0: ], check_test_28); michael@0: install.install(); michael@0: }); michael@0: }, "application/x-xpinstall", null, "Real Test 5", null, "1.0"); michael@0: } michael@0: michael@0: function check_test_28(install) { michael@0: ensure_test_completed(); michael@0: do_check_eq(install.version, "1.0"); michael@0: do_check_eq(install.name, "Real Test 5"); michael@0: do_check_eq(install.state, AddonManager.STATE_INSTALLING); michael@0: do_check_eq(install.existingAddon, null); michael@0: do_check_false(install.addon.isCompatible); michael@0: do_check_true(install.addon.appDisabled); michael@0: michael@0: prepare_test({}, [ michael@0: "onInstallCancelled" michael@0: ], finish_test_28); michael@0: return false; michael@0: } michael@0: michael@0: function finish_test_28(install) { michael@0: prepare_test({}, [ michael@0: "onDownloadCancelled" michael@0: ], run_test_29); michael@0: michael@0: install.cancel(); michael@0: } michael@0: michael@0: // Tests that an install with a matching compatibility override has appDisabled michael@0: // set correctly. michael@0: function run_test_29() { michael@0: Services.prefs.setBoolPref("extensions.getAddons.cache.enabled", true); michael@0: michael@0: prepare_test({ }, [ michael@0: "onNewInstall" michael@0: ]); michael@0: michael@0: let url = "http://localhost:" + gPort + "/addons/test_install6.xpi"; michael@0: AddonManager.getInstallForURL(url, function(install) { michael@0: ensure_test_completed(); michael@0: michael@0: do_check_neq(install, null); michael@0: do_check_eq(install.version, "1.0"); michael@0: do_check_eq(install.name, "Addon Test 6"); michael@0: do_check_eq(install.state, AddonManager.STATE_AVAILABLE); michael@0: michael@0: AddonManager.getInstallsByTypes(null, function(activeInstalls) { michael@0: do_check_eq(activeInstalls.length, 1); michael@0: do_check_eq(activeInstalls[0], install); michael@0: michael@0: prepare_test({}, [ michael@0: "onDownloadStarted", michael@0: "onDownloadEnded" michael@0: ], check_test_29); michael@0: install.install(); michael@0: }); michael@0: }, "application/x-xpinstall", null, "Addon Test 6", null, "1.0"); michael@0: } michael@0: michael@0: function check_test_29(install) { michael@0: //ensure_test_completed(); michael@0: do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); michael@0: do_check_neq(install.addon, null); michael@0: do_check_false(install.addon.isCompatible); michael@0: do_check_true(install.addon.appDisabled); michael@0: michael@0: prepare_test({}, [ michael@0: "onDownloadCancelled" michael@0: ], do_test_finished); michael@0: install.cancel(); michael@0: return false; michael@0: }