Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

function baseURI(host) {
return `https://${host}/browser/toolkit/components/antitracking/test/browser/empty.html`;
}
async function do_iframe_test({
tabHost,
frameHost,
frameSandbox = false,
conclusion,
}) {
await BrowserTestUtils.withNewTab(
{ gBrowser, url: baseURI(tabHost) },
async browser => {
await SpecialPowers.spawn(
browser,
[{ frameURI: baseURI(frameHost), frameSandbox, conclusion }],
async props => {
// Create a mediaSource, and wait for it to be opened.
let mediaSource = new content.MediaSource();
let openPromise = new Promise(resolve =>
mediaSource.addEventListener(
"sourceopen",
_e => resolve("sourceopen"),
{ once: true }
)
);
let sourceURL = content.URL.createObjectURL(mediaSource);
let ifr = content.document.createElement("iframe");
ifr.src = props.frameURI;
if (props.frameSandbox) {
ifr.sandbox = props.frameSandbox;
}
content.document.body.appendChild(ifr);
await new Promise(resolve =>
ifr.addEventListener("load", resolve, { once: true })
);
let errorPromise = SpecialPowers.spawn(
ifr.contentWindow,
[sourceURL],
async src => {
let mediaTag = content.document.createElement("video");
content.document.body.appendChild(mediaTag);
let promise = new Promise(resolve =>
mediaTag.addEventListener("error", _e => resolve("error"), {
once: true,
})
);
mediaTag.src = src;
return promise;
}
);
info(`About to wait for a conclusion, inserted URL: ${sourceURL}`);
is(
await Promise.race([openPromise, errorPromise]),
props.conclusion,
`expected the ${props.conclusion} conclusion`
);
}
);
}
);
}
add_task(async function test_same_site_iframe() {
await do_iframe_test({
tabHost: "example.org",
frameHost: "example.org",
conclusion: "sourceopen",
});
});
add_task(async function test_same_site_sandbox_iframe() {
await do_iframe_test({
tabHost: "example.org",
frameHost: "example.org",
frameSandbox: "allow-scripts allow-same-origin",
conclusion: "sourceopen",
});
});
add_task(async function test_cross_site_iframe() {
await do_iframe_test({
tabHost: "example.org",
frameHost: "example.com",
conclusion: "error",
});
});
async function do_popup_test({ tabHost, popupHost, conclusion }) {
await BrowserTestUtils.withNewTab(
{ gBrowser, url: baseURI(tabHost) },
async browser => {
await SpecialPowers.spawn(
browser,
[{ popupURI: baseURI(popupHost), conclusion }],
async props => {
// Create a mediaSource, and wait for it to be opened.
let mediaSource = new content.MediaSource();
let openPromise = new Promise(resolve =>
mediaSource.addEventListener(
"sourceopen",
_evt => resolve("sourceopen"),
{ once: true }
)
);
let sourceURL = content.URL.createObjectURL(mediaSource);
let popup = content.open(props.popupURI, "_blank");
let loadPromise = SpecialPowers.spawnChrome(
[popup.browsingContext, props.popupURI],
async (bc, uri) => {
let { BrowserTestUtils } = ChromeUtils.importESModule(
);
await BrowserTestUtils.browserLoaded(
bc.embedderElement,
false,
uri
);
}
);
await loadPromise;
let errorPromise = SpecialPowers.spawn(
popup,
[sourceURL, props.popupURI],
async (src, expectedLocation) => {
is(content.location.href, expectedLocation);
let mediaTag = content.document.createElement("video");
content.document.body.appendChild(mediaTag);
let promise = new Promise(resolve =>
mediaTag.addEventListener("error", _evt => resolve("error"), {
once: true,
})
);
mediaTag.src = src;
return promise;
}
);
info(`About to wait for a conclusion, inserted URL: ${sourceURL}`);
is(
await Promise.race([openPromise, errorPromise]),
props.conclusion,
`expected the ${props.conclusion} conclusion`
);
popup.close();
}
);
}
);
}
add_task(async function test_same_site_popup() {
await do_popup_test({
tabHost: "example.org",
popupHost: "example.org",
conclusion: "sourceopen",
});
});
add_task(async function test_cross_site_popup() {
await do_popup_test({
tabHost: "example.org",
popupHost: "example.com",
conclusion: "error",
});
});
add_task(async function test_different_tab() {
let tab1 = await BrowserTestUtils.openNewForegroundTab(
gBrowser,
baseURI("example.org")
);
let browser1 = gBrowser.getBrowserForTab(tab1);
let tab2 = await BrowserTestUtils.openNewForegroundTab(
gBrowser,
baseURI("example.org")
);
let browser2 = gBrowser.getBrowserForTab(tab2);
let sourceURL = await SpecialPowers.spawn(browser1, [], () => {
let mediaSource = new content.MediaSource();
mediaSource.addEventListener(
"sourceopen",
_evt => {
ok(false, "source should not open");
},
{ once: true }
);
return content.URL.createObjectURL(mediaSource);
});
await SpecialPowers.spawn(browser2, [sourceURL], async url => {
let mediaTag = content.document.createElement("video");
content.document.body.appendChild(mediaTag);
let { promise, resolve } = Promise.withResolvers();
mediaTag.addEventListener("error", _evt => {
resolve("error");
});
mediaTag.src = url;
is(await promise, "error", "source should error");
});
BrowserTestUtils.removeTab(tab1);
BrowserTestUtils.removeTab(tab2);
});