Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/**
* Bug 1492607 - Test for assuring that postMessage cannot go across OAs.
*/
const FPD_ONE = "http://example.com";
const FPD_TWO = "http://example.org";
const TEST_BASE = "/browser/browser/components/originattributes/test/browser/";
add_setup(async function () {
// Make sure first party isolation is enabled.
await SpecialPowers.pushPrefEnv({
set: [
["privacy.firstparty.isolate", true],
["dom.security.https_first", false],
],
});
});
async function runTestWithOptions(
aDifferentFPD,
aStarTargetOrigin,
aBlockAcrossFPD
) {
let testPageURL = aDifferentFPD
? FPD_ONE + TEST_BASE + "file_postMessage.html"
: FPD_TWO + TEST_BASE + "file_postMessage.html";
// Deciding the targetOrigin according to the test setting.
let targetOrigin;
if (aStarTargetOrigin) {
targetOrigin = "*";
} else {
targetOrigin = aDifferentFPD ? FPD_ONE : FPD_TWO;
}
let senderURL =
FPD_TWO + TEST_BASE + `file_postMessageSender.html?${targetOrigin}`;
// Open a tab to listen messages.
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, testPageURL);
// Use window.open() in the tab to open the sender tab. The sender tab
// will send a message through postMessage to window.opener.
let senderTabPromise = BrowserTestUtils.waitForNewTab(
gBrowser,
senderURL,
true
);
SpecialPowers.spawn(tab.linkedBrowser, [senderURL], aSenderPath => {
content.open(aSenderPath, "_blank");
});
// Wait and get the tab of the sender tab.
let senderTab = await senderTabPromise;
// The postMessage should be blocked when the first parties are different with
// the following two cases. First, it is using a non-star target origin.
// Second, it is using the star target origin and the pref
// 'privacy.firstparty.isolate.block_post_message' is true.
let shouldBlock = aDifferentFPD && (!aStarTargetOrigin || aBlockAcrossFPD);
await SpecialPowers.spawn(tab.linkedBrowser, [shouldBlock], async aValue => {
await new Promise(resolve => {
content.addEventListener("message", async function eventHandler(aEvent) {
if (aEvent.data === "Self") {
let display = content.document.getElementById("display");
if (aValue) {
Assert.equal(
display.innerHTML,
"",
"It should not get a message from other OA."
);
} else {
await ContentTaskUtils.waitForCondition(
() => display.innerHTML == "Message",
"Wait for message to arrive"
);
Assert.equal(
display.innerHTML,
"Message",
"It should get a message from the same OA."
);
}
content.removeEventListener("message", eventHandler);
resolve();
}
});
// Trigger the content to send a postMessage to itself.
content.document.getElementById("button").click();
});
});
BrowserTestUtils.removeTab(tab);
BrowserTestUtils.removeTab(senderTab);
}
add_task(async function runTests() {
for (let useDifferentFPD of [true, false]) {
for (let useStarTargetOrigin of [true, false]) {
for (let enableBlocking of [true, false]) {
if (enableBlocking) {
await SpecialPowers.pushPrefEnv({
set: [["privacy.firstparty.isolate.block_post_message", true]],
});
}
await runTestWithOptions(
useDifferentFPD,
useStarTargetOrigin,
enableBlocking
);
if (enableBlocking) {
await SpecialPowers.popPrefEnv();
}
}
}
}
});