<!
DOCTYPE HTML>
<
html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=1180921
-->
<
head>
<
meta charset=
"utf-8">
<
title>Test for Bug 1180921</
title>
<
script src=
"chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></
script>
<
link rel=
"stylesheet" type=
"text/css" href=
"chrome://global/skin"/>
<
link rel=
"stylesheet" type=
"text/css" href=
"chrome://mochikit/content/tests/SimpleTest/test.css"/>
<
script type=
"application/javascript">
/** Test for Bug 1180921 */
let module = Cu.getGlobalForObject(Services);
let ssm = Services.scriptSecurityManager;
function StubPolicy(id, subdomain) {
/* globals MatchPatternSet */
return new module.WebExtensionPolicy({
id,
mozExtensionHostname: id,
baseURL: `file:///{id}`,
allowedOrigins: new MatchPatternSet([`*://${subdomain}.example.org/*`]),
localizeCallback() {},
});
}
/* globals WebExtensionPolicy */
let policyA = StubPolicy(
"addona",
"test1");
let policyB = StubPolicy(
"addonb",
"test2");
policyA.active = true;
policyB.active = true;
SimpleTest.waitForExplicitFinish();
SimpleTest.registerCleanupFunction(function() {
policyA.active = false;
policyB.active = false;
});
function tryLoad(sb, uri) {
let p = new Promise(function(resolve, reject) {
Cu.exportFunction(resolve, sb, { defineAs:
"finish" });
Cu.exportFunction(reject, sb, { defineAs:
"error" });
sb.eval(
"try { (function () { " +
" var xhr = new XMLHttpRequest();" +
" xhr.onreadystatechange = function() { if (xhr.readyState == XMLHttpRequest.DONE) { finish(xhr.status == 200); } };" +
" xhr.open('GET', '" + uri +
"', true);" +
" xhr.send();" +
"})() } catch (e) { error(e); }");
});
return p;
}
let addonA = new Cu.Sandbox(ssm.createContentPrincipal(Services.io.newURI(
"moz-extension://addonA/"), {}),
{wantGlobalProperties: [
"XMLHttpRequest"]});
let addonB = new Cu.Sandbox(ssm.createContentPrincipal(Services.io.newURI(
"moz-extension://addonB/"), {}),
{wantGlobalProperties: [
"XMLHttpRequest"]});
function uriForDomain(d) { return d +
"/tests/caps/tests/mochitest/file_data.txt"; }
tryLoad(addonA, uriForDomain(
"http://test4.example.org"))
.then(function(success) {
ok(!success,
"cross-origin load should fail for addon A");
return tryLoad(addonA, uriForDomain(
"http://test1.example.org"));
}).then(function(success) {
ok(success,
"allowlisted cross-origin load of test1 should succeed for addon A");
return tryLoad(addonB, uriForDomain(
"http://test1.example.org"));
}).then(function(success) {
ok(!success,
"non-allowlisted cross-origin load of test1 should fail for addon B");
return tryLoad(addonB, uriForDomain("http://test2.example.org"));
}).then(function(success) {
ok(success, "allowlisted cross-origin load of test2 should succeed for addon B");
return tryLoad(addonA, uriForDomain("http://test2.example.org"));
}).then(function(success) {
ok(!success, "non-allowlisted cross-origin load of test2 should fail for addon A");
SimpleTest.finish();
}, function(e) {
ok(false, "Rejected promise chain: " + e);
SimpleTest.finish();
});
</script>
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1180921">Mozilla Bug 1180921</a>
<p id="display"></p>
<div id="content" style="display: none">
</div>
<pre id="test">
</pre>
</body>
</html>