1
0
Fork 0
firefox/toolkit/components/antitracking/test/xpcshell/test_getPartitionKeyFromURL.js
Daniel Baumann 5e9a113729
Adding upstream version 140.0.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-25 09:37:52 +02:00

234 lines
6.1 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
const { CookieXPCShellUtils } = ChromeUtils.importESModule(
"resource://testing-common/CookieXPCShellUtils.sys.mjs"
);
CookieXPCShellUtils.init(this);
const TEST_CASES = [
// Tests for different schemes.
{
url: "http://example.com/",
partitionKeySite: "(http,example.com)",
partitionKeyWithoutSite: "example.com",
},
{
url: "https://example.com/",
partitionKeySite: "(https,example.com)",
partitionKeyWithoutSite: "example.com",
},
// Tests for sub domains
{
url: "http://sub.example.com/",
partitionKeySite: "(http,example.com)",
partitionKeyWithoutSite: "example.com",
},
{
url: "http://sub.sub.example.com/",
partitionKeySite: "(http,example.com)",
partitionKeyWithoutSite: "example.com",
},
// Tests for path and query.
{
url: "http://www.example.com/path/to/somewhere/",
partitionKeySite: "(http,example.com)",
partitionKeyWithoutSite: "example.com",
},
{
url: "http://www.example.com/?query=string",
partitionKeySite: "(http,example.com)",
partitionKeyWithoutSite: "example.com",
},
// Tests for other ports.
{
url: "http://example.com:8080/",
partitionKeySite: "(http,example.com)",
partitionKeyWithoutSite: "example.com",
},
{
url: "https://example.com:8080/",
partitionKeySite: "(https,example.com)",
partitionKeyWithoutSite: "example.com",
},
// Tests for about urls
{
url: "about:about",
partitionKeySite:
"(about,about.ef2a7dd5-93bc-417f-a698-142c3116864f.mozilla)",
partitionKeyWithoutSite:
"about.ef2a7dd5-93bc-417f-a698-142c3116864f.mozilla",
},
{
url: "about:preferences",
partitionKeySite:
"(about,about.ef2a7dd5-93bc-417f-a698-142c3116864f.mozilla)",
partitionKeyWithoutSite:
"about.ef2a7dd5-93bc-417f-a698-142c3116864f.mozilla",
},
// Test for ip addresses
{
url: "http://127.0.0.1/",
partitionKeySite: "(http,127.0.0.1)",
partitionKeyWithoutSite: "127.0.0.1",
},
{
url: "http://127.0.0.1:8080/",
partitionKeySite: "(http,127.0.0.1,8080)",
partitionKeyWithoutSite: "127.0.0.1",
},
{
url: "http://[2001:db8::ff00:42:8329]",
partitionKeySite: "(http,[2001:db8::ff00:42:8329])",
partitionKeyWithoutSite: "[2001:db8::ff00:42:8329]",
},
{
url: "http://[2001:db8::ff00:42:8329]:8080",
partitionKeySite: "(http,[2001:db8::ff00:42:8329],8080)",
partitionKeyWithoutSite: "[2001:db8::ff00:42:8329]",
},
// Tests for moz-extension
{
url: "moz-extension://bafa4a3f-5c49-48d6-9788-03489419b70e",
partitionKeySite: "",
partitionKeyWithoutSite: "",
},
// Tests for non tld
{
url: "http://notld",
partitionKeySite: "(http,notld)",
partitionKeyWithoutSite: "notld",
},
{
url: "http://com",
partitionKeySite: "(http,com)",
partitionKeyWithoutSite: "com",
},
{
url: "http://com:8080",
partitionKeySite: "(http,com,8080)",
partitionKeyWithoutSite: "com",
},
];
const SUBRESOURCE_URL = "https://example.net/";
const TEST_INVALID_URLS = [
"",
"/foo",
"An invalid URL",
"https://",
"http:///",
"http://foo:bar",
];
add_task(async function test_get_partition_key_from_url() {
for (const test of TEST_CASES) {
info(`Testing url: ${test.url}`);
let partitionKey = ChromeUtils.getPartitionKeyFromURL(
test.url,
SUBRESOURCE_URL
);
Assert.equal(
partitionKey,
test.partitionKeySite,
"The partitionKey is correct."
);
}
});
add_task(async function test_get_partition_key_from_url_without_site() {
Services.prefs.setBoolPref("privacy.dynamic_firstparty.use_site", false);
for (const test of TEST_CASES) {
info(`Testing url: ${test.url}`);
let partitionKey = ChromeUtils.getPartitionKeyFromURL(
test.url,
SUBRESOURCE_URL
);
Assert.equal(
partitionKey,
test.partitionKeyWithoutSite,
"The partitionKey is correct."
);
}
Services.prefs.clearUserPref("privacy.dynamic_firstparty.use_site");
});
add_task(async function test_blob_url() {
do_get_profile();
const server = CookieXPCShellUtils.createServer({
hosts: ["example.org", "foo.com"],
});
server.registerPathHandler("/empty", (metadata, response) => {
var body = "<h1>Hello!</h1>";
response.write(body);
});
server.registerPathHandler("/iframe", (metadata, response) => {
var body = `
<script>
var blobUrl = URL.createObjectURL(new Blob([]));
parent.postMessage(blobUrl, "http://example.org");
</script>
`;
response.write(body);
});
let contentPage = await CookieXPCShellUtils.loadContentPage(
"http://example.org/empty"
);
let blobUrl = await contentPage.spawn([], async () => {
// Create a third-party iframe and create a blob url in there.
let f = this.content.document.createElement("iframe");
f.src = "http://foo.com/iframe";
let blob_url = await new Promise(resolve => {
this.content.addEventListener("message", event => resolve(event.data), {
once: true,
});
this.content.document.body.append(f);
});
return blob_url;
});
let partitionKey = ChromeUtils.getPartitionKeyFromURL(
blobUrl,
SUBRESOURCE_URL
);
// The partitionKey of the blob url is empty because the principal of the
// blob url is the JS principal of the global, which doesn't have
// partitionKey. And ChromeUtils.getPartitionKeyFromURL() will get
// partitionKey from that principal. So, we will get an empty partitionKey
// here.
// XXX: The behavior here is debatable.
Assert.equal(partitionKey, "", "The partitionKey of blob url is correct.");
await contentPage.close();
});
add_task(async function test_throw_with_invalid_URL() {
// The API should throw if the url is invalid.
for (const invalidURL of TEST_INVALID_URLS) {
info(`Testing invalid url: ${invalidURL}`);
Assert.throws(
() => {
ChromeUtils.getPartitionKeyFromURL(invalidURL, SUBRESOURCE_URL);
},
/NS_ERROR_MALFORMED_URI/,
"It should fail on invalid URLs."
);
}
});