Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

// 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 =
const SCRIPT_PATH = "/browser/dom/ipc/tests/file_disableScript.html";
const TEST_POLICY = {
exempt: [
],
notExempt: [
],
};
// 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();
});