Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

// META: script=/common/get-host-info.sub.js
// META: script=/common/utils.js
// META: script=/common/dispatcher/dispatcher.js
// META: script=./credentialless/resources/common.js
// META: script=./resources/common.js
const cors_coep_headers = coep_require_corp + corp_cross_origin;
const same_origin = get_host_info().HTTPS_ORIGIN;
const cross_origin = get_host_info().HTTPS_REMOTE_ORIGIN;
const dedicatedWorkerPostMessage = `
self.addEventListener('message', (e) => {
e.data.port.postMessage(self.crossOriginIsolated);
});
`;
const postMessageIsWorkerCrossOriginIsolated = async (
test,
frame,
worker_url
) => {
const worker = new frame.contentWindow.Worker(worker_url);
const mc = new MessageChannel();
worker.postMessage({port: mc.port2}, [mc.port2]);
worker.onerror = test.unreached_func('cannot create dedicated worker');
return (await new Promise(r => mc.port1.onmessage = r)).data;
}
const isDataDedicatedWorkerCrossOriginIsolated = async (
test,
parent_headers
) => {
const [future_child, future_error] =
await createIsolatedFrame('', parent_headers);
future_error.then(test.unreached_func('cannot create isolated iframe'));
const child = await future_child;
add_completion_callback(() => child.remove());
const worker_url =
`data:application/javascript;base64,${btoa(dedicatedWorkerPostMessage)}`;
return postMessageIsWorkerCrossOriginIsolated(test, child, worker_url);
}
const isBlobURLDedicatedWorkerCrossOriginIsolated = async(
test,
parent_headers
) => {
const [future_child, future_error] =
await createIsolatedFrame("", parent_headers);
future_error.then(test.unreached_func('cannot create isolated iframe'));
const child = await future_child;
add_completion_callback(() => child.remove());
const blob =
new Blob([dedicatedWorkerPostMessage], {type: 'text/plaintext'});
const workerURL = URL.createObjectURL(blob);
return postMessageIsWorkerCrossOriginIsolated(test, child, workerURL)
}
const isHTTPSDedicatedWorkerCrossOriginIsolated = async(
test,
parent_headers
) => {
const [future_child, future_error] =
await createIsolatedFrame("", parent_headers);
future_error.then(test.unreached_func('cannot create isolated iframe'));
const child = await future_child;
add_completion_callback(() => child.remove());
const worker_token = token();
const workerURL =
`${executor_worker_path}${cors_coep_headers}&uuid=${worker_token}`;
const worker = new child.contentWindow.Worker(workerURL);
return IsCrossOriginIsolated(worker_token);
}
const sharedWorkerIsCrossOriginIsolated = async(
test,
withCoopCoep
) => {
const [worker, future_error] =
environments.shared_worker(withCoopCoep ? cors_coep_headers : "");
future_error.then(test.unreached_func('cannot create shared worker.'));
return IsCrossOriginIsolated(worker);
}
const serviceWorkerIsCrossOriginIsolated = async(
test,
withCoopCoep
) => {
const [worker, future_error] =
environments.service_worker(withCoopCoep ? cors_coep_headers : "");
future_error.then(test.unreached_func('cannot create service worker.'));
return IsCrossOriginIsolated(worker);
}
const dedicatedWorkerIsCrossOriginIsolated = async (
test,
scheme,
parent_permission_coi
) => {
let parent_headers = cors_coep_headers;
if (parent_permission_coi !== undefined) {
// Escape right parenthesis in WPT cors_coep_headers:
parent_permission_coi = parent_permission_coi.replace(')', '\\)');
parent_headers += `|header(permissions-policy,` +
`cross-origin-isolated=${parent_permission_coi})`;
}
switch (scheme) {
case 'https':
return isHTTPSDedicatedWorkerCrossOriginIsolated(test, parent_headers);
case 'data':
return isDataDedicatedWorkerCrossOriginIsolated(test, parent_headers);
case 'blob':
return isBlobURLDedicatedWorkerCrossOriginIsolated(test, parent_headers);
default:
assert_unreached("wrong scheme for dedicated worker test.");
}
}
const generate_shared_worker_test = async (withCoopCoep, expected) => {
promise_test_parallel(async (test) => {
const isCrossOriginIsolated =
await sharedWorkerIsCrossOriginIsolated(test, withCoopCoep);
assert_equals(isCrossOriginIsolated, expected)
}, `shared_worker (withCoopCoep: ${withCoopCoep}) ` +
`cross origin isolated permission test`);
}
const generate_dedicated_worker_test = async (
scheme,
parent_permission_coi,
expected
) => {
promise_test_parallel(async (test) => {
const isCrossOriginIsolated =
await dedicatedWorkerIsCrossOriginIsolated(test, scheme, parent_permission_coi);
assert_equals(isCrossOriginIsolated, expected)
}, `dedicated_worker (scheme: ${scheme}) cross origin ` +
`isolated (${parent_permission_coi}) permission test`);
}
const generate_service_worker_test = async (withCoopCoep, expected) => {
promise_test_parallel(async (test) => {
const isCrossOriginIsolated =
await serviceWorkerIsCrossOriginIsolated(test, withCoopCoep);
assert_equals(isCrossOriginIsolated, expected)
}, `service_worker (withCoopCoep: ${withCoopCoep}) ` +
`cross origin isolated permission test`);
}
generate_shared_worker_test(false, false);
generate_shared_worker_test(true, true);
generate_dedicated_worker_test('https', undefined, true);
generate_dedicated_worker_test('https', '*', true);
generate_dedicated_worker_test('https', 'self', true);
generate_dedicated_worker_test('https', '()', false);
generate_dedicated_worker_test('data', undefined, false);
generate_dedicated_worker_test('data', '*', false);
generate_dedicated_worker_test('data', 'self', false);
generate_dedicated_worker_test('blob', undefined, true);
generate_dedicated_worker_test('blob', '*', true);
generate_dedicated_worker_test('blob', 'self', true);
generate_dedicated_worker_test('blob', '()', false);
generate_service_worker_test(false, false);
generate_service_worker_test(true, true);