145 lines
4.2 KiB
JavaScript
145 lines
4.2 KiB
JavaScript
/* 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/. */
|
|
|
|
"use strict";
|
|
|
|
const { HttpServer } = ChromeUtils.importESModule(
|
|
"resource://testing-common/httpd.sys.mjs"
|
|
);
|
|
|
|
const { TestUtils } = ChromeUtils.importESModule(
|
|
"resource://testing-common/TestUtils.sys.mjs"
|
|
);
|
|
|
|
var httpserver = new HttpServer();
|
|
var port;
|
|
|
|
function make_uri(urlStr) {
|
|
return Services.io.newURI(urlStr);
|
|
}
|
|
|
|
function serverHandler(_metadata, response) {
|
|
const body = "hello world";
|
|
response.setHeader("Content-Type", "text/plain", false);
|
|
response.bodyOutputStream.write(body, body.length);
|
|
}
|
|
|
|
add_setup(async function setup() {
|
|
httpserver.registerPathHandler("/test", serverHandler);
|
|
httpserver.registerPathHandler("/ignore", serverHandler);
|
|
httpserver.start(-1);
|
|
port = httpserver.identity.primaryPort;
|
|
|
|
info("Starting test with port " + port);
|
|
|
|
registerCleanupFunction(async function () {
|
|
await httpserver.stop();
|
|
});
|
|
});
|
|
|
|
async function load_get_principal(url, oa) {
|
|
let chan = makeHTTPChannel(url);
|
|
chan.loadInfo.originAttributes = oa;
|
|
await new Promise(resolve => {
|
|
chan.asyncOpen(new ChannelListener(resolve, null, CL_ALLOW_UNKNOWN_CL));
|
|
});
|
|
return chan.loadInfo.loadingPrincipal;
|
|
}
|
|
|
|
async function test(oaLoad, oaClear, shouldExist) {
|
|
// populate cache entry
|
|
let url = `http://localhost:${port}/test`;
|
|
await load_get_principal(url, oaLoad);
|
|
|
|
let clearPrincipal = Services.scriptSecurityManager.createContentPrincipal(
|
|
Services.io.newURI(`http://localhost:${port}/`),
|
|
oaClear
|
|
);
|
|
// sanity check that the originAttributes match
|
|
let expectedOa = { ...clearPrincipal.originAttributes, ...oaClear };
|
|
Assert.deepEqual(clearPrincipal.originAttributes, expectedOa);
|
|
|
|
let cache_storage = getCacheStorage(
|
|
"disk",
|
|
Services.loadContextInfo.custom(false, oaLoad)
|
|
);
|
|
let exists = cache_storage.exists(make_uri(url), null);
|
|
Assert.ok(exists, "Entry should be in cache");
|
|
|
|
Services.cache2.clearOriginsByPrincipal(clearPrincipal);
|
|
|
|
// clearOriginsByPrincipal is async, so we block on cacheIOThread
|
|
await new Promise(resolve => {
|
|
syncWithCacheIOThread(resolve, true);
|
|
});
|
|
|
|
await TestUtils.waitForCondition(
|
|
() => {
|
|
let existsAgain = cache_storage.exists(make_uri(url), null);
|
|
// times out when codition isn't met.
|
|
return shouldExist == existsAgain;
|
|
},
|
|
shouldExist ? "Entry stay in cache" : "Entry get cleared from the cache"
|
|
);
|
|
}
|
|
|
|
add_task(async function test_usercontextid_same() {
|
|
await test({ userContextId: 0 }, { userContextId: 0 }, false);
|
|
});
|
|
|
|
add_task(async function test_usercontextid_same_nondefault() {
|
|
await test({ userContextId: 1 }, { userContextId: 1 }, false);
|
|
});
|
|
|
|
add_task(async function test_usercontextid_different_1() {
|
|
await test({ userContextId: 1 }, { userContextId: 0 }, true);
|
|
});
|
|
|
|
add_task(async function test_usercontextid_different_2() {
|
|
await test({ userContextId: 0 }, { userContextId: 1 }, true);
|
|
});
|
|
|
|
add_task(async function test_privatebrowsingid_same() {
|
|
await test({ privateBrowsingId: 1 }, { privateBrowsingId: 1 }, false);
|
|
});
|
|
|
|
add_task(async function test_privatebrowsingid_default() {
|
|
await test({ privateBrowsingId: 0 }, { privateBrowsingId: 1 }, true);
|
|
});
|
|
|
|
add_task(async function test_privatebrowsingid_private() {
|
|
await test({ privateBrowsingId: 1 }, { privateBrowsingId: 0 }, true);
|
|
});
|
|
|
|
add_task(async function test_partitionkey_same() {
|
|
await test(
|
|
{ partitionKey: "(https,example.com)" },
|
|
{ partitionKey: "(https,example.com)" },
|
|
false
|
|
);
|
|
});
|
|
|
|
add_task(async function test_partitionkey_different_1() {
|
|
await test(
|
|
{ partitionKey: "(http,example.com)" },
|
|
{ partitionKey: "(https,example.com)" },
|
|
true
|
|
);
|
|
});
|
|
|
|
add_task(async function test_partitionkey_different_2() {
|
|
await test(
|
|
{ partitionKey: "(http,example.com)" },
|
|
{ partitionKey: "(https,example.com)" },
|
|
true
|
|
);
|
|
});
|
|
|
|
add_task(async function test_partitionkey_nonexisting_firstparty() {
|
|
await test({ partitionKey: `(http,localhost,${port})` }, {}, true);
|
|
});
|
|
|
|
add_task(async function test_partitionkey_firstparty_nonexisting() {
|
|
await test({}, { partitionKey: `(http,localhost,${port})` }, true);
|
|
});
|