Bug 1323128 Remove support for multi-package xpis r=rhelmer

MozReview-Commit-ID: LtLQ2phOlTK

--HG--
extra : rebase_source : 262d481b205aa536a5594fd6489f867d084e870b
This commit is contained in:
Andrew Swan 2016-12-16 21:43:38 -08:00
parent c3347c9d19
commit 96e56e12b2
29 changed files with 15 additions and 1019 deletions

View File

@ -115,17 +115,6 @@ Installer.prototype = {
failed.push(install);
else
installs.push(install);
if (install.linkedInstalls) {
for (let linkedInstall of install.linkedInstalls) {
linkedInstall.addListener(this);
// Corrupt or incompatible items fail to install
if (linkedInstall.state == AddonManager.STATE_DOWNLOAD_FAILED || linkedInstall.addon.appDisabled)
failed.push(linkedInstall);
else
installs.push(linkedInstall);
}
}
break;
case AddonManager.STATE_CANCELLED:
// Just ignore cancelled downloads

View File

@ -220,11 +220,12 @@ const BOOTSTRAP_REASONS = {
};
// Map new string type identifiers to old style nsIUpdateItem types
// Type 32 was previously used for multipackage xpi files so it should
// not be re-used since old files with that type may be floating around.
const TYPES = {
extension: 2,
theme: 4,
locale: 8,
multipackage: 32,
dictionary: 64,
experiment: 128,
};
@ -1181,14 +1182,12 @@ let loadManifestFromRDF = Task.async(function*(aUri, aStream) {
if (!(addon.type in TYPES))
throw new Error("Install manifest specifies unknown type: " + addon.type);
if (addon.type != "multipackage") {
if (!addon.id)
throw new Error("No ID in install manifest");
if (!gIDTest.test(addon.id))
throw new Error("Illegal add-on ID " + addon.id);
if (!addon.version)
throw new Error("No version in install manifest");
}
if (!addon.id)
throw new Error("No ID in install manifest");
if (!gIDTest.test(addon.id))
throw new Error("Illegal add-on ID " + addon.id);
if (!addon.version)
throw new Error("No version in install manifest");
addon.strictCompatibility = !(addon.type in COMPATIBLE_BY_DEFAULT_TYPES) ||
getRDFProperty(ds, root, "strictCompatibility") == "true";
@ -5419,7 +5418,6 @@ class AddonInstall {
this.certificate = null;
this.certName = null;
this.linkedInstalls = null;
this.addon = null;
this.state = null;
@ -5573,116 +5571,6 @@ class AddonInstall {
this.addon.releaseNotesURI = this.releaseNotesURI.spec;
}
/**
* Fills out linkedInstalls with AddonInstall instances for the other files
* in a multi-package XPI.
*
* @param aFiles
* An array of { entryName, file } for each remaining file from the
* multi-package XPI.
*/
_createLinkedInstalls(aFiles) {
return Task.spawn((function*() {
if (aFiles.length == 0)
return;
// Create new AddonInstall instances for every remaining file
if (!this.linkedInstalls)
this.linkedInstalls = [];
for (let { entryName, file } of aFiles) {
logger.debug("Creating linked install from " + entryName);
let install = yield createLocalInstall(file);
// Make the new install own its temporary file
install.ownsTempFile = true;
this.linkedInstalls.push(install);
// If one of the internal XPIs was multipackage then move its linked
// installs to the outer install
if (install.linkedInstalls) {
this.linkedInstalls.push(...install.linkedInstalls);
install.linkedInstalls = null;
}
install.sourceURI = this.sourceURI;
install.releaseNotesURI = this.releaseNotesURI;
if (install.state != AddonManager.STATE_DOWNLOAD_FAILED)
install.updateAddonURIs();
}
}).bind(this));
}
/**
* Loads add-on manifests from a multi-package XPI file. Each of the
* XPI and JAR files contained in the XPI will be extracted. Any that
* do not contain valid add-ons will be ignored. The first valid add-on will
* be installed by this AddonInstall instance, the rest will have new
* AddonInstall instances created for them.
*
* @param aZipReader
* An open nsIZipReader for the multi-package XPI's files. This will
* be closed before this method returns.
*/
_loadMultipackageManifests(aZipReader) {
return Task.spawn((function*() {
let files = [];
let entries = aZipReader.findEntries("(*.[Xx][Pp][Ii]|*.[Jj][Aa][Rr])");
while (entries.hasMore()) {
let entryName = entries.getNext();
let file = getTemporaryFile();
try {
aZipReader.extract(entryName, file);
files.push({ entryName, file });
}
catch (e) {
logger.warn("Failed to extract " + entryName + " from multi-package " +
"XPI", e);
file.remove(false);
}
}
aZipReader.close();
if (files.length == 0) {
return Promise.reject([AddonManager.ERROR_CORRUPT_FILE,
"Multi-package XPI does not contain any packages to install"]);
}
// Find the first file that is a valid install and use it for
// the add-on that this AddonInstall instance will install.
for (let { entryName, file } of files) {
this.removeTemporaryFile();
try {
yield this.loadManifest(file);
logger.debug("Base multi-package XPI install came from " + entryName);
this.file = file;
this.ownsTempFile = true;
yield this._createLinkedInstalls(files.filter(f => f.file != file));
return undefined;
}
catch (e) {
// _createLinkedInstalls will log errors when it tries to process this
// file
}
}
// No valid add-on was found, delete all the temporary files
for (let { file } of files) {
try {
file.remove(true);
} catch (e) {
this.logger.warn("Could not remove temp file " + file.path);
}
}
return Promise.reject([AddonManager.ERROR_CORRUPT_FILE,
"Multi-package XPI does not contain any valid packages to install"]);
}).bind(this));
}
/**
* Called after the add-on is a local file and the signature and install
* manifest can be read.
@ -5713,9 +5601,7 @@ class AddonInstall {
return Promise.reject([AddonManager.ERROR_CORRUPT_FILE, e]);
}
// A multi-package XPI is a container, the add-ons it holds each
// have their own id. Everything else had better have an id here.
if (!this.addon.id && this.addon.type != "multipackage") {
if (!this.addon.id) {
let err = new Error(`Cannot find id for addon ${file.path}`);
return Promise.reject([AddonManager.ERROR_CORRUPT_FILE, err]);
}
@ -5728,12 +5614,6 @@ class AddonInstall {
`Refusing to upgrade addon ${this.existingAddon.id} to different ID {this.addon.id}`]);
}
if (this.addon.type == "multipackage") {
zipreader.close();
return Promise.reject([AddonManager.ERROR_UNEXPECTED_ADDON_TYPE,
`Refusing to upgrade addon ${this.existingAddon.id} to a multi-package xpi`]);
}
if (this.existingAddon.type == "webextension" && this.addon.type != "webextension") {
zipreader.close();
return Promise.reject([AddonManager.ERROR_UNEXPECTED_ADDON_TYPE,
@ -5778,9 +5658,6 @@ class AddonInstall {
}
}
if (this.addon.type == "multipackage")
return this._loadMultipackageManifests(zipreader);
zipreader.close();
this.updateAddonURIs();
@ -6662,12 +6539,6 @@ class DownloadAddonInstall extends AddonInstall {
// proceed with the install state machine.
this.install();
if (this.linkedInstalls) {
for (let install of this.linkedInstalls) {
if (install.state == AddonManager.STATE_DOWNLOADED)
install.install();
}
}
}
});
}
@ -6834,13 +6705,6 @@ AddonInstallWrapper.prototype = {
return installFor(this).sourceURI;
},
get linkedInstalls() {
let install = installFor(this);
if (!install.linkedInstalls)
return null;
return install.linkedInstalls.map(i => i.wrapper);
},
set _permHandler(handler) {
installFor(this).permHandler = handler;
},

View File

@ -1 +0,0 @@
This is corrupt

View File

@ -1 +0,0 @@
This is corrupt

View File

@ -1 +0,0 @@
This is ignored

View File

@ -1,10 +0,0 @@
<?xml version="1.0"?>
<!-- A multi-package XPI -->
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<Description about="urn:mozilla:install-manifest">
<em:type>32</em:type>
</Description>
</RDF>

View File

@ -1,6 +0,0 @@
/* exported startup, shutdown, install, uninstall */
function install(data, reason) {}
function startup(data, reason) {}
function shutdown(data, reason) {}
function uninstall(data, reason) {}

View File

@ -1,16 +0,0 @@
<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<Description about="urn:mozilla:install-manifest">
<em:id>updatemulti@tests.mozilla.org</em:id>
<em:version>1.0</em:version>
<em:updateURL>http://localhost:4444/data/test_update_multi.rdf</em:updateURL>
<em:bootstrap>true</em:bootstrap>
<em:name>Test Addon 1</em:name>
<em:targetApplication><Description>
<em:id>xpcshell@tests.mozilla.org</em:id>
<em:minVersion>1</em:minVersion>
<em:maxVersion>1</em:maxVersion>
</Description></em:targetApplication>
</Description>
</RDF>

View File

@ -1,9 +0,0 @@
<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<Description about="urn:mozilla:install-manifest">
<em:id>updatemulti@tests.mozilla.org</em:id>
<em:type>32</em:type>
<em:version>2.0</em:version>
</Description>
</RDF>

View File

@ -1,26 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<Description about="urn:mozilla:extension:updatemulti@tests.mozilla.org">
<em:updates>
<Seq>
<li>
<Description>
<em:version>2.0</em:version>
<em:targetApplication>
<Description>
<em:id>xpcshell@tests.mozilla.org</em:id>
<em:minVersion>1</em:minVersion>
<em:maxVersion>1</em:maxVersion>
<em:updateLink>http://localhost:4444/addons/test_update_multi2.xpi</em:updateLink>
</Description>
</em:targetApplication>
</Description>
</li>
</Seq>
</em:updates>
</Description>
</RDF>

View File

@ -16,7 +16,6 @@ Cu.import("resource://testing-common/httpd.js");
var testserver;
var gInstallDate;
var gInstall = null;
// The test extension uses an insecure update url.
Services.prefs.setBoolPref(PREF_EM_CHECK_UPDATE_SECURITY, false);
@ -65,7 +64,6 @@ function run_test_1() {
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");
@ -216,7 +214,6 @@ function run_test_2() {
let url = "http://localhost:" + gPort + "/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);
@ -649,303 +646,10 @@ function check_test_10(install) {
}));
}
// 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",
"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, 5);
// Might be in any order so sort them based on ID
let installs = [install].concat(install.linkedInstalls);
installs.sort(function(a, b) {
if (a.state != b.state) {
if (a.state == AddonManager.STATE_DOWNLOAD_FAILED)
return 1;
else if (b.state == AddonManager.STATE_DOWNLOAD_FAILED)
return -1;
}
// Don't care what order the failed installs show up in
if (a.state == AddonManager.STATE_DOWNLOAD_FAILED)
return 0;
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 would be incompatible with strict compat enabled
do_check_eq(installs[2].sourceURI, install.sourceURI);
do_check_eq(installs[2].addon.id, "addon6@tests.mozilla.org");
do_check_false(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_true(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));
do_check_eq(installs[4].state, AddonManager.STATE_DOWNLOAD_FAILED);
do_check_eq(installs[4].error, AddonManager.ERROR_CORRUPT_FILE);
do_check_eq(installs[5].state, AddonManager.STATE_DOWNLOAD_FAILED);
do_check_eq(installs[5].error, AddonManager.ERROR_CORRUPT_FILE);
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"
],
"addon7@tests.mozilla.org": [
"onInstalling"
]
}, {
"addon4@tests.mozilla.org": [
"onInstallStarted",
"onInstallEnded"
],
"addon5@tests.mozilla.org": [
"onInstallStarted",
"onInstallEnded"
],
"addon6@tests.mozilla.org": [
"onInstallStarted",
"onInstallEnded"
],
"addon7@tests.mozilla.org": [
"onInstallStarted",
"onInstallEnded"
]
}, callback_soon(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();
do_execute_soon(run_test_12);
});
}
// Same as test 11 but for a remote XPI
function run_test_12() {
restartManager();
prepare_test({ }, [
"onNewInstall",
]);
let url = "http://localhost:" + gPort + "/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"
],
"addon7@tests.mozilla.org": [
"onInstalling"
]
}, {
"NO_ID": [
"onDownloadStarted",
"onNewInstall",
"onNewInstall",
"onNewInstall",
"onNewInstall",
"onNewInstall",
"onDownloadEnded"
],
"addon4@tests.mozilla.org": [
"onInstallStarted",
"onInstallEnded"
],
"addon5@tests.mozilla.org": [
"onInstallStarted",
"onInstallEnded"
],
"addon6@tests.mozilla.org": [
"onInstallStarted",
"onInstallEnded"
],
"addon7@tests.mozilla.org": [
"onInstallStarted",
"onInstallEnded"
]
}, callback_soon(check_test_12));
install.install();
}, "application/x-xpinstall", null, "Multi Test 4");
}
function check_test_12() {
do_check_eq(gInstall.linkedInstalls.length, 5);
// Might be in any order so sort them based on ID
let installs = [gInstall].concat(gInstall.linkedInstalls);
installs.sort(function(a, b) {
if (a.state != b.state) {
if (a.state == AddonManager.STATE_DOWNLOAD_FAILED)
return 1;
else if (b.state == AddonManager.STATE_DOWNLOAD_FAILED)
return -1;
}
// Don't care what order the failed installs show up in
if (a.state == AddonManager.STATE_DOWNLOAD_FAILED)
return 0;
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 would be incompatible with strict compat enabled
do_check_eq(installs[2].sourceURI, gInstall.sourceURI);
do_check_eq(installs[2].addon.id, "addon6@tests.mozilla.org");
do_check_false(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);
do_check_eq(installs[4].state, AddonManager.STATE_DOWNLOAD_FAILED);
do_check_eq(installs[4].error, AddonManager.ERROR_CORRUPT_FILE);
do_check_eq(installs[5].state, AddonManager.STATE_DOWNLOAD_FAILED);
do_check_eq(installs[5].error, AddonManager.ERROR_CORRUPT_FILE);
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();
do_execute_soon(run_test_13);
});
// Tests 11 and 12 were removed, to avoid churn of renumbering,
// just jump ahead to 13 here
run_test_13();
}
@ -1817,7 +1521,6 @@ function run_test_30() {
do_check_neq(install, null);
do_check_eq(install.state, AddonManager.STATE_DOWNLOAD_FAILED);
do_check_eq(install.error, AddonManager.ERROR_CORRUPT_FILE);
do_check_eq(install.linkedInstalls, null);
run_test_31();
});
@ -1836,7 +1539,6 @@ function run_test_31() {
do_check_neq(install, null);
do_check_eq(install.state, AddonManager.STATE_DOWNLOAD_FAILED);
do_check_eq(install.error, AddonManager.ERROR_CORRUPT_FILE);
do_check_eq(install.linkedInstalls, null);
end_test();
});

View File

@ -16,7 +16,6 @@ Cu.import("resource://testing-common/httpd.js");
var testserver;
var gInstallDate;
var gInstall = null;
// The test extension uses an insecure update url.
Services.prefs.setBoolPref(PREF_EM_CHECK_UPDATE_SECURITY, false);
@ -65,7 +64,6 @@ function run_test_1() {
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");
@ -199,7 +197,6 @@ function run_test_2(aAddon) {
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);
@ -628,305 +625,10 @@ function check_test_10(install) {
}));
}
// 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",
"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, 5);
// Might be in any order so sort them based on ID
let installs = [install].concat(install.linkedInstalls);
installs.sort(function(a, b) {
if (a.state != b.state) {
if (a.state == AddonManager.STATE_DOWNLOAD_FAILED)
return 1;
else if (b.state == AddonManager.STATE_DOWNLOAD_FAILED)
return -1;
}
// Don't care what order the failed installs show up in
if (a.state == AddonManager.STATE_DOWNLOAD_FAILED)
return 0;
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));
do_check_eq(installs[4].state, AddonManager.STATE_DOWNLOAD_FAILED);
do_check_eq(installs[4].error, AddonManager.ERROR_CORRUPT_FILE);
do_check_eq(installs[5].state, AddonManager.STATE_DOWNLOAD_FAILED);
do_check_eq(installs[5].error, AddonManager.ERROR_CORRUPT_FILE);
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"
]
}, {
"addon4@tests.mozilla.org": [
"onInstallStarted",
"onInstallEnded"
],
"addon5@tests.mozilla.org": [
"onInstallStarted",
"onInstallEnded"
],
"addon6@tests.mozilla.org": [
"onInstallStarted",
"onInstallEnded"
],
"addon7@tests.mozilla.org": [
"onInstallStarted",
"onInstallEnded"
]
}, callback_soon(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();
do_execute_soon(run_test_12);
});
}
// Same as test 11 but for a remote XPI
function run_test_12() {
restartManager();
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"
]
}, {
"NO_ID": [
"onDownloadStarted",
"onNewInstall",
"onNewInstall",
"onNewInstall",
"onNewInstall",
"onNewInstall",
"onDownloadEnded"
],
"addon4@tests.mozilla.org": [
"onInstallStarted",
"onInstallEnded"
],
"addon5@tests.mozilla.org": [
"onInstallStarted",
"onInstallEnded"
],
"addon6@tests.mozilla.org": [
"onInstallStarted",
"onInstallEnded"
],
"addon7@tests.mozilla.org": [
"onInstallStarted",
"onInstallEnded"
]
}, callback_soon(check_test_12));
install.install();
}, "application/x-xpinstall", null, "Multi Test 4");
}
function check_test_12() {
do_check_eq(gInstall.linkedInstalls.length, 5);
// Might be in any order so sort them based on ID
let installs = [gInstall].concat(gInstall.linkedInstalls);
installs.sort(function(a, b) {
if (a.state != b.state) {
if (a.state == AddonManager.STATE_DOWNLOAD_FAILED)
return 1;
else if (b.state == AddonManager.STATE_DOWNLOAD_FAILED)
return -1;
}
// Don't care what order the failed installs show up in
if (a.state == AddonManager.STATE_DOWNLOAD_FAILED)
return 0;
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);
do_check_eq(installs[4].state, AddonManager.STATE_DOWNLOAD_FAILED);
do_check_eq(installs[4].error, AddonManager.ERROR_CORRUPT_FILE);
do_check_eq(installs[5].state, AddonManager.STATE_DOWNLOAD_FAILED);
do_check_eq(installs[5].error, AddonManager.ERROR_CORRUPT_FILE);
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();
do_execute_soon(run_test_13);
});
// Tests 11 and 12 were removed, to avoid churn of renumbering,
// just jump ahead to 13 here
run_test_13();
}
@ -1700,7 +1402,6 @@ function run_test_30() {
do_check_neq(install, null);
do_check_eq(install.state, AddonManager.STATE_DOWNLOAD_FAILED);
do_check_eq(install.error, AddonManager.ERROR_CORRUPT_FILE);
do_check_eq(install.linkedInstalls, null);
run_test_31();
});
@ -1719,7 +1420,6 @@ function run_test_31() {
do_check_neq(install, null);
do_check_eq(install.state, AddonManager.STATE_DOWNLOAD_FAILED);
do_check_eq(install.error, AddonManager.ERROR_CORRUPT_FILE);
do_check_eq(install.linkedInstalls, null);
end_test();
});

View File

@ -1,55 +0,0 @@
// Enable signature checks for these tests
gUseRealCertChecks = true;
// Disable update security
Services.prefs.setBoolPref(PREF_EM_CHECK_UPDATE_SECURITY, false);
const DATA = "data/signing_checks/";
// Each multi-package XPI contains one valid theme and one other add-on that
// has the following error state:
const ADDONS = {
"multi_signed.xpi": 0,
"multi_badid.xpi": AddonManager.ERROR_CORRUPT_FILE,
"multi_broken.xpi": AddonManager.ERROR_CORRUPT_FILE,
"multi_unsigned.xpi": AddonManager.ERROR_SIGNEDSTATE_REQUIRED,
};
function createInstall(filename) {
return new Promise(resolve => {
AddonManager.getInstallForFile(do_get_file(DATA + filename), resolve, "application/x-xpinstall");
});
}
function run_test() {
createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "4", "4");
startupManager();
run_next_test();
}
function* test_addon(filename) {
do_print("Testing " + filename);
let install = yield createInstall(filename);
do_check_eq(install.state, AddonManager.STATE_DOWNLOADED);
do_check_eq(install.error, 0);
do_check_neq(install.linkedInstalls, null);
do_check_eq(install.linkedInstalls.length, 1);
let linked = install.linkedInstalls[0];
do_print(linked.state);
do_check_eq(linked.error, ADDONS[filename]);
if (linked.error == 0) {
do_check_eq(linked.state, AddonManager.STATE_DOWNLOADED);
linked.cancel();
}
else {
do_check_eq(linked.state, AddonManager.STATE_DOWNLOAD_FAILED);
}
install.cancel();
}
for (let filename of Object.keys(ADDONS))
add_task(test_addon.bind(null, filename));

View File

@ -62,25 +62,3 @@ add_task(function* test_update_new_id() {
addon.uninstall();
});
// Verify that an update to a multi-package xpi fails
add_task(function* test_update_new_id() {
yield promiseInstallFile(do_get_addon("test_update_multi1"));
let addon = yield promiseAddonByID("updatemulti@tests.mozilla.org");
do_check_neq(addon, null);
do_check_eq(addon.version, "1.0");
let update = yield promiseFindAddonUpdates(addon, AddonManager.UPDATE_WHEN_USER_REQUESTED);
let install = update.updateAvailable;
do_check_eq(install.name, addon.name);
do_check_eq(install.version, "2.0");
do_check_eq(install.state, AddonManager.STATE_AVAILABLE);
do_check_eq(install.existingAddon, addon);
yield Assert.rejects(promiseInstallUpdate(install),
function(err) { return err.code == AddonManager.ERROR_UNEXPECTED_ADDON_TYPE },
"Upgrade to a multipackage xpi fails");
addon.uninstall();
});

View File

@ -256,8 +256,6 @@ run-sequentially = Uses hardcoded ports in xpi files.
run-if = addon_signing
[test_signed_migrate.js]
run-if = addon_signing
[test_signed_multi.js]
run-if = addon_signing
[test_startup.js]
# Bug 676992: test consistently fails on Android
fail-if = os == "android"

View File

@ -17,12 +17,10 @@ support-files =
installchrome.html
installtrigger.html
installtrigger_frame.html
multipackage.xpi
navigate.html
redirect.sjs
restartless.xpi
restartless-unsigned.xpi
signed-multipackage.xpi
signed-no-cn.xpi
signed-no-o.xpi
signed-tampered.xpi
@ -78,7 +76,6 @@ skip-if = true # Bug 1084646
[browser_localfile2.js]
[browser_localfile3.js]
[browser_localfile4.js]
[browser_multipackage.js]
[browser_navigateaway.js]
[browser_navigateaway2.js]
[browser_navigateaway3.js]
@ -86,8 +83,6 @@ skip-if = (os == "mac" || os == "win") # Bug 1198261
[browser_navigateaway4.js]
[browser_offline.js]
[browser_relative.js]
[browser_signed_multipackage.js]
skip-if = require_signing
[browser_signed_multiple.js]
skip-if = require_signing
[browser_signed_naming.js]

View File

@ -1,52 +0,0 @@
// ----------------------------------------------------------------------------
// Tests installing an signed add-on by navigating directly to the url
function test() {
Harness.installConfirmCallback = confirm_install;
Harness.installEndedCallback = install_ended;
Harness.installsCompletedCallback = finish_test;
Harness.setup();
gBrowser.selectedTab = gBrowser.addTab("about:blank");
BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser).then(() => {
gBrowser.loadURI(TESTROOT + "multipackage.xpi");
});
}
function get_item(items, name) {
for (let item of items) {
if (item.name == name)
return item;
}
ok(false, "Item for " + name + " was not listed");
return null;
}
function confirm_install(window) {
let items = window.document.getElementById("itemList").childNodes;
is(items.length, 2, "Should be 2 items listed in the confirmation dialog");
let item = get_item(items, "XPI Test");
if (item) {
is(item.signed, "false", "Should not have listed the item as signed");
is(item.icon, "", "Should have listed no icon for the item");
}
item = get_item(items, "Signed XPI Test");
if (item) {
is(item.signed, "false", "Should have listed the item as signed");
is(item.icon, "", "Should have listed no icon for the item");
}
return true;
}
function install_ended(install, addon) {
install.cancel();
}
function finish_test(count) {
is(count, 2, "2 Add-ons should have been successfully installed");
gBrowser.removeCurrentTab();
Harness.finish();
}
// ----------------------------------------------------------------------------

View File

@ -1,53 +0,0 @@
// ----------------------------------------------------------------------------
// Tests installing an signed add-on by navigating directly to the url
function test() {
Harness.installConfirmCallback = confirm_install;
Harness.installEndedCallback = install_ended;
Harness.installsCompletedCallback = finish_test;
Harness.setup();
gBrowser.selectedTab = gBrowser.addTab("about:blank");
BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser).then(() => {
gBrowser.loadURI(TESTROOT + "signed-multipackage.xpi");
});
}
function get_item(items, name) {
for (let item of items) {
if (item.name == name)
return item;
}
ok(false, "Item for " + name + " was not listed");
return null;
}
function confirm_install(window) {
let items = window.document.getElementById("itemList").childNodes;
is(items.length, 2, "Should be 2 items listed in the confirmation dialog");
let item = get_item(items, "XPI Test");
if (item) {
is(item.signed, "false", "Should not have listed the item as signed");
is(item.icon, "", "Should have listed no icon for the item");
}
item = get_item(items, "Signed XPI Test");
if (item) {
is(item.cert, "(Object Signer)", "Should have seen the signer");
is(item.signed, "true", "Should have listed the item as signed");
is(item.icon, "", "Should have listed no icon for the item");
}
return true;
}
function install_ended(install, addon) {
install.cancel();
}
function finish_test(count) {
is(count, 2, "2 Add-ons should have been successfully installed");
gBrowser.removeCurrentTab();
Harness.finish();
}
// ----------------------------------------------------------------------------