// This test waits for a lot of subframe loads, causing it to take a long time,
// especially with Fission enabled.
requestLongerTimeout(2);
const BASE_FILE =
"http://mochi.test:8888/browser/dom/ipc/tests/file_domainPolicy_base.html";
const SCRIPT_PATH =
"/browser/dom/ipc/tests/file_disableScript.html";
const TEST_POLICY = {
exceptions: [
"http://test1.example.com", "http://example.com"],
superExceptions: [
"http://test2.example.org", "https://test1.example.com"],
exempt: [
"http://test1.example.com",
"http://example.com",
"http://test2.example.org",
"http://sub1.test2.example.org",
"https://sub1.test1.example.com",
],
notExempt: [
"http://test2.example.com",
"http://sub1.test1.example.com",
"http://www.example.com",
"https://test2.example.com",
"https://example.com",
"http://test1.example.org",
],
};
// To make sure we never leave up an activated domain policy after a failed
// test, let's make this global.
var policy;
function activateDomainPolicy(isBlock) {
policy = Services.scriptSecurityManager.activateDomainPolicy();
if (isBlock === undefined) {
return;
}
let set = isBlock ? policy.blocklist : policy.allowlist;
for (let e of TEST_POLICY.exceptions) {
set.add(makeURI(e));
}
let superSet = isBlock ? policy.superBlocklist : policy.superAllowlist;
for (let e of TEST_POLICY.superExceptions) {
superSet.add(makeURI(e));
}
}
function deactivateDomainPolicy() {
if (policy) {
policy.deactivate();
policy =
null;
}
}
add_setup(async
function () {
await SpecialPowers.pushPrefEnv({
set: [[
"browser.pagethumbnails.capturing_disabled",
false]],
});
registerCleanupFunction(() => {
deactivateDomainPolicy();
});
});
add_task(async
function test_domainPolicy() {
function test(testFunc, { activateFirst, isBlock }) {
if (activateFirst) {
activateDomainPolicy(isBlock);
}
return BrowserTestUtils.withNewTab(
{
gBrowser,
opening: BASE_FILE,
forceNewProcess:
true,
},
async browser => {
if (!activateFirst) {
activateDomainPolicy(isBlock);
}
await testFunc(browser);
deactivateDomainPolicy();
}
);
}
async
function testDomain(browser, domain, expectEnabled =
false) {
function navigateFrame() {
let url = domain + SCRIPT_PATH;
return SpecialPowers.spawn(browser, [url], async src => {
let iframe = content.document.getElementById(
"root");
await
new Promise(resolve => {
iframe.addEventListener(
"load", resolve, { once:
true });
iframe.src = src;
});
return iframe.browsingContext;
});
}
function checkScriptEnabled(bc) {
return SpecialPowers.spawn(bc, [expectEnabled], enabled => {
content.wrappedJSObject.gFiredOnclick =
false;
content.document.body.dispatchEvent(
new content.Event(
"click"));
Assert.equal(
content.wrappedJSObject.gFiredOnclick,
enabled,
`Checking script-enabled
for ${content.name} (${content.location})`
);
});
}
let browsingContext = await navigateFrame();
return checkScriptEnabled(browsingContext);
}
async
function testList(browser, list, expectEnabled) {
// Run these sequentially to avoid navigating multiple domains at once.
for (let domain of list) {
await testDomain(browser, domain, expectEnabled);
}
}
info(
"1. Testing simple blocklist policy");
info(
"1A. Creating child process first, activating domainPolicy after");
await test(
async browser => {
policy.blocklist.add(Services.io.newURI(
"http://example.com"));
await testDomain(browser,
"http://example.com");
},
{ activateFirst:
false }
);
info(
"1B. Activating domainPolicy first, creating child process after");
await test(
async browser => {
policy.blocklist.add(Services.io.newURI(
"http://example.com"));
await testDomain(browser,
"http://example.com");
},
{ activateFirst:
true }
);
info(
"2. Testing Blocklist-style Domain Policy");
info(
"2A. Activating domainPolicy first, creating child process after");
await test(
async browser => {
await testList(browser, TEST_POLICY.notExempt,
true);
await testList(browser, TEST_POLICY.exempt,
false);
},
{ activateFirst:
true, isBlock:
true }
);
info(
"2B. Creating child process first, activating domainPolicy after");
await test(
async browser => {
await testList(browser, TEST_POLICY.notExempt,
true);
await testList(browser, TEST_POLICY.exempt,
false);
},
{ activateFirst:
false, isBlock:
true }
);
info(
"3. Testing Allowlist-style Domain Policy");
await SpecialPowers.pushPrefEnv({ set: [[
"javascript.enabled",
false]] });
info(
"3A. Activating domainPolicy first, creating child process after");
await test(
async browser => {
await testList(browser, TEST_POLICY.notExempt,
false);
await testList(browser, TEST_POLICY.exempt,
true);
},
{ activateFirst:
true, isBlock:
false }
);
info(
"3B. Creating child process first, activating domainPolicy after");
await test(
async browser => {
await testList(browser, TEST_POLICY.notExempt,
false);
await testList(browser, TEST_POLICY.exempt,
true);
},
{ activateFirst:
false, isBlock:
false }
);
finish();
});