Source code
Revision control
Copy as Markdown
Other Tools
// META: timeout=long
// META: script=/common/get-host-info.sub.js
// META: script=/common/utils.js
// META: script=/common/dispatcher/dispatcher.js
// META: script=/service-workers/service-worker/resources/test-helpers.sub.js
// META: script=./resources/common.js
const same_origin = get_host_info().HTTPS_ORIGIN;
const cross_origin = get_host_info().HTTPS_REMOTE_ORIGIN;
const cookie_key = "credentialless_dedicated_worker";
const cookie_same_origin = "same_origin";
const cookie_cross_origin = "cross_origin";
promise_test(async test => {
await Promise.all([
setCookie(same_origin, cookie_key, cookie_same_origin +
cookie_same_site_none),
setCookie(cross_origin, cookie_key, cookie_cross_origin +
cookie_same_site_none),
]);
let GetCookie = (response) => {
const headers_credentialless = JSON.parse(response);
return parseCookies(headers_credentialless)[cookie_key];
}
async function fetchInRemoteContext(ctx, request_url) {
// The fail might fail in when a DedicatedWorker with DIP
// isolate-and-require-corp tries to fetch a cross-origin resource. Silently
// catch the error as we're only interested in whether the cookies were sent
// with the fetch in the first place.
try {
await ctx.execute_script(
async (url) => {
await fetch(url, {mode: 'no-cors', credentials: 'include'});
}, [request_url]);
} catch(error) {}
}
const dedicatedWorkerTest = function(
description, origin, dip_for_worker,
expected_cookies) {
promise_test_parallel(async t => {
// Create one iframe with the specified DIP isolate-and-credentialless.
// Then start a DedicatedWorker. The DedicatedWorker will inherit the DIP
// of its creator.
const worker = await createDedicatedWorkerContext(test, same_origin, dip_for_worker);
const worker_context = new RemoteContext(worker[0]);
// Fetch resources with the worker.
const request_token = token();
const request_url = showRequestHeaders(origin, request_token);
await fetchInRemoteContext(worker_context, request_url);
const response_worker = await receive(request_token).then(GetCookie);
assert_equals(response_worker,
expected_cookies,
"dip => ");
}, `fetch ${description}`)
};
dedicatedWorkerTest("same-origin + credentialless worker",
same_origin, dip_credentialless,
cookie_same_origin);
dedicatedWorkerTest("same-origin + require_corp worker",
same_origin, dip_require_corp,
cookie_same_origin);
dedicatedWorkerTest("cross-origin + credentialless worker",
cross_origin, dip_credentialless,
undefined // Worker created successfully with credentialless, and fetch doesn't get credentials
);
dedicatedWorkerTest("cross-origin + require_corp worker",
cross_origin, dip_require_corp,
cookie_cross_origin // The worker's policy is require_corp, so the resource will be requested with cookies
// but the load will fail because the response does not
// have CORP cross-origin.
);
})