Source code

Revision control

Copy as Markdown

Other Tools

/* 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(
);
var httpserver = new HttpServer();
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.start(-1);
registerCleanupFunction(async function () {
await httpserver.stop();
});
});
async function test(oaLoad, oaClear, shouldExist) {
let port = httpserver.identity.primaryPort;
info("Starting test with port " + port);
let url = `http://localhost:${port}/test`;
let chan = makeHTTPChannel(url);
chan.loadInfo.originAttributes = oaLoad;
await new Promise(resolve => {
chan.asyncOpen(new ChannelListener(resolve, null, CL_ALLOW_UNKNOWN_CL));
});
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.clearOriginsByOriginAttributes(JSON.stringify(oaClear));
// clearOriginsByOriginAttributes is async, so we block on cacheIOThread
await new Promise(resolve => {
syncWithCacheIOThread(resolve, true);
});
let existsAgain = cache_storage.exists(make_uri(url), null);
Assert.equal(
existsAgain,
shouldExist,
shouldExist ? "Entry should be in cache" : "Entry should not be in cache"
);
}
add_task(async function test_clear_cache_with_usercontext_oa() {
await test({ userContextId: 0 }, { userContextId: 0 }, false);
});
add_task(async function test_clear_cache_with_usercontext_oa() {
await test({ userContextId: 0 }, { userContextId: 1 }, true);
});
add_task(
async function test_clear_cache_with_usercontext_oa_across_partition() {
await test(
{ userContextId: 0, partitionKey: "(https,example.com)" },
{ userContextId: 0 },
true
);
}
);