Source code

Revision control

Copy as Markdown

Other Tools

/* vim: set ts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* import-globals-from head.js */
"use strict";
this.DynamicFPIHelper = {
getTestPageConfig(runInSecureContext) {
if (runInSecureContext) {
return {
topPage: TEST_TOP_PAGE_HTTPS,
thirdPartyPage: TEST_4TH_PARTY_STORAGE_PAGE_HTTPS,
partitionKey: "(https,example.net)",
};
}
return {
topPage: TEST_TOP_PAGE,
thirdPartyPage: TEST_4TH_PARTY_STORAGE_PAGE,
partitionKey: "(http,example.net)",
};
},
runTest(
name,
callback,
cleanupFunction,
extraPrefs,
runInPrivateWindow,
{ runInSecureContext = false } = {}
) {
add_task(async _ => {
info(
"Starting test `" +
name +
"' with dynamic FPI running in a " +
(runInPrivateWindow ? "private" : "normal") +
" window..."
);
await SpecialPowers.flushPrefEnv();
await setCookieBehaviorPref(
BEHAVIOR_REJECT_TRACKER_AND_PARTITION_FOREIGN,
runInPrivateWindow
);
await SpecialPowers.pushPrefEnv({
set: [
["dom.storage_access.enabled", true],
[
"privacy.partition.always_partition_third_party_non_cookie_storage",
true,
],
["privacy.trackingprotection.enabled", false],
["privacy.trackingprotection.pbmode.enabled", false],
["privacy.trackingprotection.annotate_channels", true],
["privacy.dynamic_firstparty.use_site", true],
["dom.security.https_first_pbm", false],
[
"privacy.restrict3rdpartystorage.userInteractionRequiredForHosts",
"not-tracking.example.com",
],
],
});
if (extraPrefs && Array.isArray(extraPrefs) && extraPrefs.length) {
await SpecialPowers.pushPrefEnv({ set: extraPrefs });
}
let win = window;
if (runInPrivateWindow) {
win = OpenBrowserWindow({ private: true });
await TestUtils.topicObserved("browser-delayed-startup-finished");
}
const { topPage, thirdPartyPage, partitionKey } =
this.getTestPageConfig(runInSecureContext);
info("Creating a new tab");
let tab = BrowserTestUtils.addTab(win.gBrowser, topPage);
win.gBrowser.selectedTab = tab;
let browser = win.gBrowser.getBrowserForTab(tab);
await BrowserTestUtils.browserLoaded(browser);
info("Check the cookieJarSettings of the browser object");
ok(
browser.cookieJarSettings,
"The browser object has the cookieJarSettings."
);
is(
browser.cookieJarSettings.cookieBehavior,
Ci.nsICookieService.BEHAVIOR_REJECT_TRACKER_AND_PARTITION_FOREIGN,
"The cookieJarSettings has the correct cookieBehavior"
);
is(
browser.cookieJarSettings.partitionKey,
partitionKey,
"The cookieJarSettings has the correct partitionKey"
);
info("Creating a 3rd party content");
await SpecialPowers.spawn(
browser,
[
{
page: thirdPartyPage,
callback: callback.toString(),
partitionKey,
},
],
async obj => {
await new content.Promise(resolve => {
let ifr = content.document.createElement("iframe");
ifr.onload = async _ => {
await SpecialPowers.spawn(ifr, [obj], async obj => {
is(
content.document.nodePrincipal.originAttributes.partitionKey,
"",
"We don't have first-party set on nodePrincipal"
);
is(
content.document.effectiveStoragePrincipal.originAttributes
.partitionKey,
obj.partitionKey,
"We have first-party set on storagePrincipal"
);
});
info("Sending code to the 3rd party content");
ifr.contentWindow.postMessage(obj.callback, "*");
};
content.addEventListener("message", function msg(event) {
if (event.data.type == "finish") {
content.removeEventListener("message", msg);
resolve();
return;
}
if (event.data.type == "ok") {
ok(event.data.what, event.data.msg);
return;
}
if (event.data.type == "info") {
info(event.data.msg);
return;
}
ok(false, "Unknown message");
});
content.document.body.appendChild(ifr);
ifr.src = obj.page;
});
}
);
info("Removing the tab");
BrowserTestUtils.removeTab(tab);
if (runInPrivateWindow) {
win.close();
}
});
add_task(async _ => {
info("Cleaning up.");
if (cleanupFunction) {
await cleanupFunction();
}
// While running these tests we typically do not have enough idle time to do
// GC reliably, so force it here.
/* import-globals-from antitracking_head.js */
forceGC();
});
},
};