gecko/toolkit/mozapps/extensions/test/xpcshell/test_install.js

908 lines
28 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/
*/
// This verifies that add-ons can be installed from XPI files
// The maximum allowable time since install. If an add-on claims to have been
// installed longer ago than this the the test will fail.
const MAX_INSTALL_TIME = 10000;
Components.utils.import("resource://gre/modules/Services.jsm");
Components.utils.import("resource://gre/modules/NetUtil.jsm");
// install.rdf size, icon.png, icon64.png size
const ADDON1_SIZE = 705 + 16 + 16;
do_load_httpd_js();
var testserver;
var gInstallDate;
var gInstall = null;
// The test extension uses an insecure update url.
Services.prefs.setBoolPref("extensions.checkUpdateSecurity", false);
const profileDir = gProfD.clone();
profileDir.append("extensions");
function run_test() {
createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2");
startupManager();
// Make sure we only register once despite multiple calls
AddonManager.addInstallListener(InstallListener);
AddonManager.addAddonListener(AddonListener);
AddonManager.addInstallListener(InstallListener);
AddonManager.addAddonListener(AddonListener);
// Create and configure the HTTP server.
testserver = new nsHttpServer();
testserver.registerDirectory("/addons/", do_get_file("addons"));
testserver.registerDirectory("/data/", do_get_file("data"));
testserver.start(4444);
do_test_pending();
run_test_1();
}
function end_test() {
testserver.stop(do_test_finished);
}
// Checks that an install from a local file proceeds as expected
function run_test_1() {
prepare_test({ }, [
"onNewInstall"
]);
AddonManager.getInstallForFile(do_get_addon("test_install1"), function(install) {
ensure_test_completed();
do_check_neq(install, null);
do_check_eq(install.linkedInstalls, null);
do_check_eq(install.type, "extension");
do_check_eq(install.version, "1.0");
do_check_eq(install.name, "Test 1");
do_check_eq(install.state, AddonManager.STATE_DOWNLOADED);
do_check_true(install.addon.hasResource("install.rdf"));
do_check_eq(install.addon.install, install);
do_check_eq(install.addon.size, ADDON1_SIZE);
do_check_true(hasFlag(install.addon.operationsRequiringRestart,
AddonManager.OP_NEEDS_RESTART_INSTALL));
let file = do_get_addon("test_install1");
let uri = Services.io.newFileURI(file).spec;
do_check_eq(install.addon.getResourceURI("install.rdf").spec, "jar:" + uri + "!/install.rdf");
do_check_eq(install.addon.iconURL, "jar:" + uri + "!/icon.png");
do_check_eq(install.addon.icon64URL, "jar:" + uri + "!/icon64.png");
do_check_eq(install.iconURL, null);
do_check_eq(install.sourceURI.spec, uri);
do_check_eq(install.addon.sourceURI.spec, uri);
AddonManager.getAllInstalls(function(activeInstalls) {
do_check_eq(activeInstalls.length, 1);
do_check_eq(activeInstalls[0], install);
AddonManager.getInstallsByTypes(["foo"], function(fooInstalls) {
do_check_eq(fooInstalls.length, 0);
AddonManager.getInstallsByTypes(["extension"], function(extensionInstalls) {
do_check_eq(extensionInstalls.length, 1);
do_check_eq(extensionInstalls[0], install);
prepare_test({
"addon1@tests.mozilla.org": [
"onInstalling"
]
}, [
"onInstallStarted",
"onInstallEnded",
], check_test_1);
install.install();
});
});
});
});
}
function check_test_1() {
ensure_test_completed();
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(olda1) {
do_check_eq(olda1, null);
AddonManager.getAddonsWithOperationsByTypes(null, function(pendingAddons) {
do_check_eq(pendingAddons.length, 1);
do_check_eq(pendingAddons[0].id, "addon1@tests.mozilla.org");
let iconFile = NetUtil.newURI(pendingAddons[0].iconURL)
.QueryInterface(AM_Ci.nsIFileURL).file;
do_check_true(iconFile.exists());
restartManager();
AddonManager.getAllInstalls(function(activeInstalls) {
do_check_eq(activeInstalls, 0);
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
do_check_neq(a1, null);
do_check_eq(a1.type, "extension");
do_check_eq(a1.version, "1.0");
do_check_eq(a1.name, "Test 1");
do_check_true(isExtensionInAddonsList(profileDir, a1.id));
do_check_true(do_get_addon("test_install1").exists());
do_check_in_crash_annotation(a1.id, a1.version);
do_check_eq(a1.size, ADDON1_SIZE);
do_check_eq(a1.sourceURI.spec,
Services.io.newFileURI(do_get_addon("test_install1")).spec);
// Should have been installed sometime in the last two second.
let difference = Date.now() - a1.installDate.getTime();
if (difference > MAX_INSTALL_TIME)
do_throw("Add-on was installed " + difference + "ms ago");
if (difference < 0)
do_throw("Add-on was installed " + difference + "ms in the future");
do_check_eq(a1.installDate.getTime(), a1.updateDate.getTime());
do_check_true(a1.hasResource("install.rdf"));
do_check_false(a1.hasResource("foo.bar"));
let dir = profileDir.clone();
dir.append("addon1@tests.mozilla.org");
let uri = Services.io.newFileURI(dir).spec;
do_check_eq(a1.getResourceURI("install.rdf").spec, uri + "install.rdf");
do_check_eq(a1.iconURL, uri + "icon.png");
do_check_eq(a1.icon64URL, uri + "icon64.png");
a1.uninstall();
restartManager();
do_check_not_in_crash_annotation(a1.id, a1.version);
run_test_2();
});
});
});
});
}
// Tests that an install from a url downloads.
function run_test_2() {
let url = "http://localhost:4444/addons/test_install2_1.xpi";
AddonManager.getInstallForURL(url, function(install) {
do_check_neq(install, null);
do_check_eq(install.linkedInstalls, null);
do_check_eq(install.version, "1.0");
do_check_eq(install.name, "Test 2");
do_check_eq(install.state, AddonManager.STATE_AVAILABLE);
do_check_eq(install.iconURL, null);
do_check_eq(install.sourceURI.spec, url);
AddonManager.getAllInstalls(function(activeInstalls) {
do_check_eq(activeInstalls.length, 1);
do_check_eq(activeInstalls[0], install);
prepare_test({}, [
"onDownloadStarted",
"onDownloadEnded",
], check_test_2);
install.addListener({
onDownloadProgress: function(install) {
do_execute_soon(function() {
Components.utils.forceGC();
});
}
});
install.install();
});
}, "application/x-xpinstall", null, "Test 2", null, "1.0");
}
function check_test_2(install) {
ensure_test_completed();
do_check_eq(install.version, "2.0");
do_check_eq(install.name, "Real Test 2");
do_check_eq(install.state, AddonManager.STATE_DOWNLOADED);
do_check_eq(install.addon.install, install);
do_check_true(hasFlag(install.addon.operationsRequiringRestart,
AddonManager.OP_NEEDS_RESTART_INSTALL));
do_check_eq(install.iconURL, null);
// Pause the install here and start it again in run_test_3
do_execute_soon(function() { run_test_3(install); });
return false;
}
// Tests that the downloaded XPI installs ok
function run_test_3(install) {
prepare_test({
"addon2@tests.mozilla.org": [
"onInstalling"
]
}, [
"onInstallStarted",
"onInstallEnded",
], check_test_3);
install.install();
}
function check_test_3() {
ensure_test_completed();
AddonManager.getAddonByID("addon2@tests.mozilla.org", function(olda2) {
do_check_eq(olda2, null);
restartManager();
AddonManager.getAllInstalls(function(installs) {
do_check_eq(installs, 0);
AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {
do_check_neq(a2, null);
do_check_eq(a2.type, "extension");
do_check_eq(a2.version, "2.0");
do_check_eq(a2.name, "Real Test 2");
do_check_true(isExtensionInAddonsList(profileDir, a2.id));
do_check_true(do_get_addon("test_install2_1").exists());
do_check_in_crash_annotation(a2.id, a2.version);
do_check_eq(a2.sourceURI.spec,
"http://localhost:4444/addons/test_install2_1.xpi");
// Should have been installed sometime in the last two second.
let difference = Date.now() - a2.installDate.getTime();
if (difference > MAX_INSTALL_TIME)
do_throw("Add-on was installed " + difference + "ms ago");
if (difference < 0)
do_throw("Add-on was installed " + difference + "ms in the future");
do_check_eq(a2.installDate.getTime(), a2.updateDate.getTime());
gInstallDate = a2.installDate.getTime();
run_test_4();
});
});
});
}
// Tests that installing a new version of an existing add-on works
function run_test_4() {
prepare_test({ }, [
"onNewInstall"
]);
let url = "http://localhost:4444/addons/test_install2_2.xpi";
AddonManager.getInstallForURL(url, function(install) {
ensure_test_completed();
do_check_neq(install, null);
do_check_eq(install.version, "3.0");
do_check_eq(install.name, "Test 3");
do_check_eq(install.state, AddonManager.STATE_AVAILABLE);
AddonManager.getAllInstalls(function(activeInstalls) {
do_check_eq(activeInstalls.length, 1);
do_check_eq(activeInstalls[0], install);
do_check_eq(install.existingAddon, null);
prepare_test({}, [
"onDownloadStarted",
"onDownloadEnded",
], check_test_4);
install.install();
});
}, "application/x-xpinstall", null, "Test 3", null, "3.0");
}
function check_test_4(install) {
ensure_test_completed();
do_check_eq(install.version, "3.0");
do_check_eq(install.name, "Real Test 3");
do_check_eq(install.state, AddonManager.STATE_DOWNLOADED);
do_check_neq(install.existingAddon);
do_check_eq(install.existingAddon.id, "addon2@tests.mozilla.org");
do_check_eq(install.addon.install, install);
do_check_true(hasFlag(install.addon.operationsRequiringRestart,
AddonManager.OP_NEEDS_RESTART_INSTALL));
run_test_5();
// Installation will continue when there is nothing returned.
}
// Continue installing the new version
function run_test_5() {
prepare_test({
"addon2@tests.mozilla.org": [
"onInstalling"
]
}, [
"onInstallStarted",
"onInstallEnded",
], check_test_5);
}
function check_test_5(install) {
ensure_test_completed();
do_check_eq(install.existingAddon.pendingUpgrade.install, install);
AddonManager.getAddonByID("addon2@tests.mozilla.org", function(olda2) {
do_check_neq(olda2, null);
do_check_true(hasFlag(olda2.pendingOperations, AddonManager.PENDING_UPGRADE));
AddonManager.getInstallsByTypes(null, function(installs) {
do_check_eq(installs.length, 1);
do_check_eq(installs[0].addon, olda2.pendingUpgrade);
restartManager();
AddonManager.getInstallsByTypes(null, function(installs) {
do_check_eq(installs.length, 0);
AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {
do_check_neq(a2, null);
do_check_eq(a2.type, "extension");
do_check_eq(a2.version, "3.0");
do_check_eq(a2.name, "Real Test 3");
do_check_true(a2.isActive);
do_check_true(isExtensionInAddonsList(profileDir, a2.id));
do_check_true(do_get_addon("test_install2_2").exists());
do_check_in_crash_annotation(a2.id, a2.version);
do_check_eq(a2.sourceURI.spec,
"http://localhost:4444/addons/test_install2_2.xpi");
do_check_eq(a2.installDate.getTime(), gInstallDate);
// Update date should be later (or the same if this test is too fast)
do_check_true(a2.installDate <= a2.updateDate);
a2.uninstall();
restartManager();
run_test_6();
});
});
});
});
}
// Tests that an install that requires a compatibility update works
function run_test_6() {
prepare_test({ }, [
"onNewInstall"
]);
let url = "http://localhost:4444/addons/test_install3.xpi";
AddonManager.getInstallForURL(url, function(install) {
ensure_test_completed();
do_check_neq(install, null);
do_check_eq(install.version, "1.0");
do_check_eq(install.name, "Real Test 4");
do_check_eq(install.state, AddonManager.STATE_AVAILABLE);
AddonManager.getInstallsByTypes(null, function(activeInstalls) {
do_check_eq(activeInstalls.length, 1);
do_check_eq(activeInstalls[0], install);
prepare_test({}, [
"onDownloadStarted",
"onDownloadEnded",
], check_test_6);
install.install();
});
}, "application/x-xpinstall", null, "Real Test 4", null, "1.0");
}
function check_test_6(install) {
ensure_test_completed();
do_check_eq(install.version, "1.0");
do_check_eq(install.name, "Real Test 4");
do_check_eq(install.state, AddonManager.STATE_DOWNLOADED);
do_check_eq(install.existingAddon, null);
do_check_false(install.addon.appDisabled);
run_test_7();
return true;
}
// Continue the install
function run_test_7() {
prepare_test({
"addon3@tests.mozilla.org": [
"onInstalling"
]
}, [
"onInstallStarted",
"onInstallEnded",
], check_test_7);
}
function check_test_7() {
ensure_test_completed();
AddonManager.getAddonByID("addon3@tests.mozilla.org", function(olda3) {
do_check_eq(olda3, null);
restartManager();
AddonManager.getAllInstalls(function(installs) {
do_check_eq(installs, 0);
AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) {
do_check_neq(a3, null);
do_check_eq(a3.type, "extension");
do_check_eq(a3.version, "1.0");
do_check_eq(a3.name, "Real Test 4");
do_check_true(a3.isActive);
do_check_false(a3.appDisabled);
do_check_true(isExtensionInAddonsList(profileDir, a3.id));
do_check_true(do_get_addon("test_install3").exists());
a3.uninstall();
restartManager();
run_test_8();
});
});
});
}
function run_test_8() {
AddonManager.addInstallListener(InstallListener);
AddonManager.addAddonListener(AddonListener);
prepare_test({ }, [
"onNewInstall"
]);
AddonManager.getInstallForFile(do_get_addon("test_install3"), function(install) {
do_check_true(install.addon.isCompatible);
prepare_test({
"addon3@tests.mozilla.org": [
"onInstalling"
]
}, [
"onInstallStarted",
"onInstallEnded",
], check_test_8);
install.install();
});
}
function check_test_8() {
restartManager();
AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) {
do_check_neq(a3, null);
do_check_eq(a3.type, "extension");
do_check_eq(a3.version, "1.0");
do_check_eq(a3.name, "Real Test 4");
do_check_true(a3.isActive);
do_check_false(a3.appDisabled);
do_check_true(isExtensionInAddonsList(profileDir, a3.id));
do_check_true(do_get_addon("test_install3").exists());
a3.uninstall();
restartManager();
run_test_9();
});
}
// Test that after cancelling a download it is removed from the active installs
function run_test_9() {
prepare_test({ }, [
"onNewInstall"
]);
let url = "http://localhost:4444/addons/test_install3.xpi";
AddonManager.getInstallForURL(url, function(install) {
ensure_test_completed();
do_check_neq(install, null);
do_check_eq(install.version, "1.0");
do_check_eq(install.name, "Real Test 4");
do_check_eq(install.state, AddonManager.STATE_AVAILABLE);
AddonManager.getInstallsByTypes(null, function(activeInstalls) {
do_check_eq(activeInstalls.length, 1);
do_check_eq(activeInstalls[0], install);
prepare_test({}, [
"onDownloadStarted",
"onDownloadEnded",
], check_test_9);
install.install();
});
}, "application/x-xpinstall", null, "Real Test 4", null, "1.0");
}
function check_test_9(install) {
prepare_test({}, [
"onDownloadCancelled"
]);
install.cancel();
ensure_test_completed();
AddonManager.getAllInstalls(function(activeInstalls) {
do_check_eq(activeInstalls.length, 0);
run_test_10();
});
}
// Tests that after cancelling a pending install it is removed from the active
// installs
function run_test_10() {
prepare_test({ }, [
"onNewInstall"
]);
let url = "http://localhost:4444/addons/test_install3.xpi";
AddonManager.getInstallForURL(url, function(install) {
ensure_test_completed();
do_check_neq(install, null);
do_check_eq(install.version, "1.0");
do_check_eq(install.name, "Real Test 4");
do_check_eq(install.state, AddonManager.STATE_AVAILABLE);
AddonManager.getInstallsByTypes(null, function(activeInstalls) {
do_check_eq(activeInstalls.length, 1);
do_check_eq(activeInstalls[0], install);
prepare_test({
"addon3@tests.mozilla.org": [
"onInstalling"
]
}, [
"onDownloadStarted",
"onDownloadEnded",
"onInstallStarted",
"onInstallEnded"
], check_test_10);
install.install();
});
}, "application/x-xpinstall", null, "Real Test 4", null, "1.0");
}
function check_test_10(install) {
prepare_test({
"addon3@tests.mozilla.org": [
"onOperationCancelled"
]
}, [
"onInstallCancelled"
]);
install.cancel();
ensure_test_completed();
AddonManager.getAllInstalls(function(activeInstalls) {
do_check_eq(activeInstalls.length, 0);
run_test_11();
});
}
// Tests that a multi-package install shows up as multiple installs with the
// correct sourceURI.
function run_test_11() {
prepare_test({ }, [
"onNewInstall",
"onNewInstall",
"onNewInstall",
"onNewInstall"
]);
AddonManager.getInstallForFile(do_get_addon("test_install4"), function(install) {
ensure_test_completed();
do_check_neq(install, null);
do_check_neq(install.linkedInstalls, null);
do_check_eq(install.linkedInstalls.length, 3);
// Might be in any order so sort them based on ID
let installs = [install].concat(install.linkedInstalls);
installs.sort(function(a, b) {
if (a.addon.id < b.addon.id)
return -1;
if (a.addon.id > b.addon.id)
return 1;
return 0;
});
// Comes from addon4.xpi and is made compatible by an update check
do_check_eq(installs[0].sourceURI, install.sourceURI);
do_check_eq(installs[0].addon.id, "addon4@tests.mozilla.org");
do_check_false(installs[0].addon.appDisabled);
do_check_eq(installs[0].version, "1.0");
do_check_eq(installs[0].name, "Multi Test 1");
do_check_eq(installs[0].state, AddonManager.STATE_DOWNLOADED);
do_check_true(hasFlag(installs[0].addon.operationsRequiringRestart,
AddonManager.OP_NEEDS_RESTART_INSTALL));
// Comes from addon5.jar and is compatible by default
do_check_eq(installs[1].sourceURI, install.sourceURI);
do_check_eq(installs[1].addon.id, "addon5@tests.mozilla.org");
do_check_false(installs[1].addon.appDisabled);
do_check_eq(installs[1].version, "3.0");
do_check_eq(installs[1].name, "Multi Test 2");
do_check_eq(installs[1].state, AddonManager.STATE_DOWNLOADED);
do_check_true(hasFlag(installs[1].addon.operationsRequiringRestart,
AddonManager.OP_NEEDS_RESTART_INSTALL));
// Comes from addon6.xpi and is incompatible
do_check_eq(installs[2].sourceURI, install.sourceURI);
do_check_eq(installs[2].addon.id, "addon6@tests.mozilla.org");
do_check_true(installs[2].addon.appDisabled);
do_check_eq(installs[2].version, "2.0");
do_check_eq(installs[2].name, "Multi Test 3");
do_check_eq(installs[2].state, AddonManager.STATE_DOWNLOADED);
do_check_false(hasFlag(installs[2].addon.operationsRequiringRestart,
AddonManager.OP_NEEDS_RESTART_INSTALL));
// Comes from addon7.jar and is made compatible by an update check
do_check_eq(installs[3].sourceURI, install.sourceURI);
do_check_eq(installs[3].addon.id, "addon7@tests.mozilla.org");
do_check_false(installs[3].addon.appDisabled);
do_check_eq(installs[3].version, "5.0");
do_check_eq(installs[3].name, "Multi Test 4");
do_check_eq(installs[3].state, AddonManager.STATE_DOWNLOADED);
do_check_true(hasFlag(installs[3].addon.operationsRequiringRestart,
AddonManager.OP_NEEDS_RESTART_INSTALL));
AddonManager.getAllInstalls(function(aInstalls) {
do_check_eq(aInstalls.length, 4);
prepare_test({
"addon4@tests.mozilla.org": [
"onInstalling"
],
"addon5@tests.mozilla.org": [
"onInstalling"
],
"addon6@tests.mozilla.org": [
["onInstalling", false],
"onInstalled"
],
"addon7@tests.mozilla.org": [
"onInstalling"
]
}, [
"onInstallStarted",
"onInstallEnded",
"onInstallStarted",
"onInstallEnded",
"onInstallStarted",
"onInstallEnded",
"onInstallStarted",
"onInstallEnded"
], check_test_11);
installs[0].install();
installs[1].install();
installs[3].install();
// Note that we install addon6 last. Since it doesn't need a restart to
// install it completes asynchronously which would otherwise make the
// onInstallStarted/onInstallEnded events go out of sequence unless this
// is the last install operation
installs[2].install();
});
});
}
function check_test_11() {
restartManager();
AddonManager.getAddonsByIDs(["addon4@tests.mozilla.org",
"addon5@tests.mozilla.org",
"addon6@tests.mozilla.org",
"addon7@tests.mozilla.org"],
function([a4, a5, a6, a7]) {
do_check_neq(a4, null);
do_check_neq(a5, null);
do_check_neq(a6, null);
do_check_neq(a7, null);
a4.uninstall();
a5.uninstall();
a6.uninstall();
a7.uninstall();
restartManager();
run_test_12();
});
}
// Same as test 11 but for a remote XPI
function run_test_12() {
prepare_test({ }, [
"onNewInstall",
]);
let url = "http://localhost:4444/addons/test_install4.xpi";
AddonManager.getInstallForURL(url, function(install) {
gInstall = install;
ensure_test_completed();
do_check_neq(install, null);
do_check_eq(install.linkedInstalls, null);
do_check_eq(install.state, AddonManager.STATE_AVAILABLE);
prepare_test({
"addon4@tests.mozilla.org": [
"onInstalling"
],
"addon5@tests.mozilla.org": [
"onInstalling"
],
"addon6@tests.mozilla.org": [
["onInstalling", false],
"onInstalled"
],
"addon7@tests.mozilla.org": [
"onInstalling"
]
}, [
"onDownloadStarted",
"onNewInstall",
"onNewInstall",
"onNewInstall",
"onDownloadEnded",
"onInstallStarted",
"onInstallEnded",
"onInstallStarted",
"onInstallEnded",
"onInstallStarted",
"onInstallEnded",
"onInstallStarted",
"onInstallEnded"
], check_test_12);
install.install();
}, "application/x-xpinstall", null, "Multi Test 4");
}
function check_test_12() {
do_check_eq(gInstall.linkedInstalls.length, 3);
// Might be in any order so sort them based on ID
let installs = [gInstall].concat(gInstall.linkedInstalls);
installs.sort(function(a, b) {
if (a.addon.id < b.addon.id)
return -1;
if (a.addon.id > b.addon.id)
return 1;
return 0;
});
// Comes from addon4.xpi and is made compatible by an update check
do_check_eq(installs[0].sourceURI, gInstall.sourceURI);
do_check_eq(installs[0].addon.id, "addon4@tests.mozilla.org");
do_check_false(installs[0].addon.appDisabled);
do_check_eq(installs[0].version, "1.0");
do_check_eq(installs[0].name, "Multi Test 1");
do_check_eq(installs[0].state, AddonManager.STATE_INSTALLED);
// Comes from addon5.jar and is compatible by default
do_check_eq(installs[1].sourceURI, gInstall.sourceURI);
do_check_eq(installs[1].addon.id, "addon5@tests.mozilla.org");
do_check_false(installs[1].addon.appDisabled);
do_check_eq(installs[1].version, "3.0");
do_check_eq(installs[1].name, "Multi Test 2");
do_check_eq(installs[1].state, AddonManager.STATE_INSTALLED);
// Comes from addon6.xpi and is incompatible
do_check_eq(installs[2].sourceURI, gInstall.sourceURI);
do_check_eq(installs[2].addon.id, "addon6@tests.mozilla.org");
do_check_true(installs[2].addon.appDisabled);
do_check_eq(installs[2].version, "2.0");
do_check_eq(installs[2].name, "Multi Test 3");
do_check_eq(installs[2].state, AddonManager.STATE_INSTALLED);
// Comes from addon7.jar and is made compatible by an update check
do_check_eq(installs[3].sourceURI, gInstall.sourceURI);
do_check_eq(installs[3].addon.id, "addon7@tests.mozilla.org");
do_check_false(installs[3].addon.appDisabled);
do_check_eq(installs[3].version, "5.0");
do_check_eq(installs[3].name, "Multi Test 4");
do_check_eq(installs[3].state, AddonManager.STATE_INSTALLED);
restartManager();
AddonManager.getAddonsByIDs(["addon4@tests.mozilla.org",
"addon5@tests.mozilla.org",
"addon6@tests.mozilla.org",
"addon7@tests.mozilla.org"],
function([a4, a5, a6, a7]) {
do_check_neq(a4, null);
do_check_neq(a5, null);
do_check_neq(a6, null);
do_check_neq(a7, null);
a4.uninstall();
a5.uninstall();
a6.uninstall();
a7.uninstall();
restartManager();
run_test_13();
});
}
// Tests that cancelling an upgrade leaves the original add-on's pendingOperations
// correct
function run_test_13() {
installAllFiles([do_get_addon("test_install2_1")], function() {
restartManager();
prepare_test({ }, [
"onNewInstall"
]);
let url = "http://localhost:4444/addons/test_install2_2.xpi";
AddonManager.getInstallForURL(url, function(install) {
ensure_test_completed();
do_check_neq(install, null);
do_check_eq(install.version, "3.0");
do_check_eq(install.name, "Test 3");
do_check_eq(install.state, AddonManager.STATE_AVAILABLE);
AddonManager.getAllInstalls(function(activeInstalls) {
do_check_eq(activeInstalls.length, 1);
do_check_eq(activeInstalls[0], install);
do_check_eq(install.existingAddon, null);
prepare_test({
"addon2@tests.mozilla.org": [
"onInstalling"
]
}, [
"onDownloadStarted",
"onDownloadEnded",
"onInstallStarted",
"onInstallEnded",
], check_test_13);
install.install();
});
}, "application/x-xpinstall", null, "Test 3", null, "3.0");
});
}
function check_test_13(install) {
ensure_test_completed();
do_check_eq(install.version, "3.0");
do_check_eq(install.name, "Real Test 3");
do_check_eq(install.state, AddonManager.STATE_INSTALLED);
do_check_neq(install.existingAddon, null);
do_check_eq(install.existingAddon.id, "addon2@tests.mozilla.org");
do_check_eq(install.addon.install, install);
AddonManager.getAddonByID("addon2@tests.mozilla.org", function(olda2) {
do_check_neq(olda2, null);
do_check_true(hasFlag(olda2.pendingOperations, AddonManager.PENDING_UPGRADE));
do_check_eq(olda2.pendingUpgrade, install.addon);
do_check_true(hasFlag(install.addon.pendingOperations,
AddonManager.PENDING_INSTALL));
prepare_test({
"addon2@tests.mozilla.org": [
"onOperationCancelled"
]
}, [
"onInstallCancelled",
]);
install.cancel();
do_check_false(hasFlag(install.addon.pendingOperations, AddonManager.PENDING_INSTALL));
do_check_false(hasFlag(olda2.pendingOperations, AddonManager.PENDING_UPGRADE));
do_check_eq(olda2.pendingUpgrade, null);
end_test();
});
}