/* Any copyright is dedicated to the Public Domain. http://creativecommons.org/publicdomain/zero/1.0/ */ "use strict"; const DIRPATH = getRootDirectory(gTestPath).replace( "chrome://mochitests/content/", "" ); const ORIGIN = "https://example.com"; const CROSSORIGIN = "https://example.org"; const TABURL = `${ORIGIN}/${DIRPATH}dummy_page.html`; const IMAGEURL = `${ORIGIN}/${DIRPATH}image.png`; const CROSSIMAGEURL = `${CROSSORIGIN}/${DIRPATH}image.png`; const DOCUMENTURL = `${ORIGIN}/${DIRPATH}dummy_page.html`; const CROSSDOCUMENTURL = `${CROSSORIGIN}/${DIRPATH}dummy_page.html`; function getPids(browser) { return browser.browsingContext.children.map( child => child.currentWindowContext.osPid ); } async function runTest(spec, tabUrl, imageurl, crossimageurl, check) { await BrowserTestUtils.withNewTab(tabUrl, async browser => { await SpecialPowers.spawn( browser, [spec, imageurl, crossimageurl], async ({ element, attribute }, url1, url2) => { for (let url of [url1, url2]) { const object = content.document.createElement(element); object[attribute] = url; const onloadPromise = new Promise(res => { object.onload = res; }); content.document.body.appendChild(object); await onloadPromise; } } ); await check(browser); }); } let iframe = { element: "iframe", attribute: "src" }; let embed = { element: "embed", attribute: "src" }; let object = { element: "object", attribute: "data" }; async function checkImage(browser) { let pids = getPids(browser); is(pids.length, 2, "There should be two browsing contexts"); ok(pids[0], "The first pid should have a sane value"); ok(pids[1], "The second pid should have a sane value"); isnot(pids[0], pids[1], "The two pids should be different"); let images = []; for (let context of browser.browsingContext.children) { images.push( await SpecialPowers.spawn(context, [], async () => { let img = new URL(content.document.querySelector("img").src); is( `${img.protocol}//${img.host}`, `${content.location.protocol}//${content.location.host}`, "Images should be loaded in the same domain as the document" ); return img.href; }) ); } isnot(images[0], images[1], "The images should have different sources"); } function checkDocument(browser) { let pids = getPids(browser); is(pids.length, 2, "There should be two browsing contexts"); ok(pids[0], "The first pid should have a sane value"); ok(pids[1], "The second pid should have a sane value"); isnot(pids[0], pids[1], "The two pids should be different"); } add_task(async function test_iframeImageDocument() { await runTest(iframe, TABURL, IMAGEURL, CROSSIMAGEURL, checkImage); }); add_task(async function test_embedImageDocument() { await runTest(embed, TABURL, IMAGEURL, CROSSIMAGEURL, checkImage); }); add_task(async function test_objectImageDocument() { await runTest(object, TABURL, IMAGEURL, CROSSIMAGEURL, checkImage); }); add_task(async function test_iframeDocument() { await runTest(iframe, TABURL, DOCUMENTURL, CROSSDOCUMENTURL, checkDocument); }); add_task(async function test_embedDocument() { await runTest(embed, TABURL, DOCUMENTURL, CROSSDOCUMENTURL, checkDocument); }); add_task(async function test_objectDocument() { await runTest(object, TABURL, DOCUMENTURL, CROSSDOCUMENTURL, checkDocument); });