Source code

Revision control

Copy as Markdown

Other Tools

/* Any copyright is dedicated to the Public Domain.
"use strict";
/**
* This test verifies that the EventSource created by a foreign worker will
* properly set the IsInThirdPartyContext flag on the channel's loadInfo.
*/
function createPromiseForObservingChannel(aURL, aExpected) {
return new Promise(resolve => {
let observer = (aSubject, aTopic) => {
if (aTopic === "http-on-modify-request") {
let httpChannel = aSubject.QueryInterface(Ci.nsIHttpChannel);
let reqLoadInfo = httpChannel.loadInfo;
// Make sure this is the request which we want to check.
if (httpChannel.URI.spec !== aURL) {
return;
}
is(
reqLoadInfo.isInThirdPartyContext,
aExpected,
`IsInThirdPartyContext is ${aExpected}`
);
Services.obs.removeObserver(observer, "http-on-modify-request");
resolve();
}
};
Services.obs.addObserver(observer, "http-on-modify-request");
});
}
add_setup(async function setup() {
await SpecialPowers.pushPrefEnv({
set: [
[
"network.cookie.cookieBehavior",
BEHAVIOR_REJECT_TRACKER_AND_PARTITION_FOREIGN,
],
],
});
registerCleanupFunction(async () => {
await new Promise(resolve => {
Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, () =>
resolve()
);
});
});
});
add_task(async function test_eventSource_firstParty() {
let tab = await BrowserTestUtils.openNewForegroundTab(
gBrowser,
TEST_TOP_PAGE_HTTPS
);
let promise = createPromiseForObservingChannel(
false
);
await SpecialPowers.spawn(tab.linkedBrowser, [], async () => {
let worker = new content.SharedWorker("eventsource_worker.js");
await new content.Promise(resolve => {
worker.port.onmessage = resolve;
});
});
await promise;
await BrowserTestUtils.removeTab(tab);
});
add_task(async function test_foreignWorker_eventSource() {
let tab = await BrowserTestUtils.openNewForegroundTab(
gBrowser,
TEST_TOP_PAGE_HTTPS
);
// Open a cross-site iframe.
let crossOriginBC = await SpecialPowers.spawn(
tab.linkedBrowser,
[TEST_3RD_PARTY_PAGE],
async src => {
let iframe = content.document.createElement("iframe");
iframe.src = src;
await new content.Promise(resolve => {
iframe.onload = resolve;
content.document.body.appendChild(iframe);
});
return iframe.browsingContext;
}
);
let promise = createPromiseForObservingChannel(
true
);
await SpecialPowers.spawn(crossOriginBC, [], async () => {
let worker = new content.SharedWorker("eventsource_worker.js");
await new content.Promise(resolve => {
worker.port.onmessage = resolve;
});
});
await promise;
await BrowserTestUtils.removeTab(tab);
});