<!doctype html>
<title>COEP and dedicated worker</title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src="/common/get-host-info.sub.js"></script>
<script src="resources/worker-support.js"></script>
<body>
<script>
const targetUrl = resolveUrl("/common/blank.html", {
host: get_host_info().REMOTE_HOST,
}).href;
function workerUrl(options) {
return resolveUrl("resources/dedicated-worker.js", options);
}
async function createWorker(t, url, options) {
const { ownerCoep, workerOptions } = options || {};
const frameUrl = resolveUrl("/common/blank.html", {
coep: ownerCoep,
});
const frame = await withIframe(t, frameUrl);
return new frame.contentWindow.Worker(url, workerOptions);
}
promise_test(async (t) => {
const worker = await createWorker(t, workerUrl());
worker.onerror = t.unreached_func('Worker.onerror should not be called');
worker.postMessage(targetUrl);
const result = await waitForMessage(worker);
assert_equals(result.data, 'LOADED');
}, 'COEP: none worker in COEP: none frame');
promise_test(async (t) => {
const worker = await createWorker(t, workerUrl(), {
ownerCoep: "require-corp",
});
await new Promise(resolve => {
worker.onerror = resolve;
});
}, 'COEP: none worker in COEP: require-corp frame');
promise_test(async (t) => {
const worker = await createWorker(t, workerUrl({ coep: "require-corp" }));
worker.onerror = t.unreached_func('Worker.onerror should not be called');
worker.postMessage(targetUrl);
const result = await waitForMessage(worker);
assert_equals(result.data, 'FAILED');
}, 'COEP: require-corp worker in COEP: none frame');
promise_test(async (t) => {
const worker = await createWorker(t, workerUrl({ coep: "require-corp" }), {
ownerCoep: "require-corp",
});
worker.onerror = t.unreached_func('Worker.onerror should not be called');
worker.postMessage(targetUrl);
const result = await waitForMessage(worker);
assert_equals(result.data, 'FAILED');
}, 'COEP: require-corp worker in COEP: require-corp frame');
promise_test(async (t) => {
const worker = await createWorker(t, workerUrl(), {
workerOptions: { type: 'module' },
});
worker.onerror = t.unreached_func('Worker.onerror should not be called');
worker.postMessage(targetUrl);
const result = await waitForMessage(worker);
assert_equals(result.data, 'LOADED');
}, 'COEP: none module worker in COEP: none frame');
promise_test(async (t) => {
const worker = await createWorker(t, workerUrl(), {
ownerCoep: "require-corp",
workerOptions: { type: 'module' },
});
await new Promise(resolve => {
worker.onerror = resolve;
});
}, 'COEP: none module worker in COEP: require-corp frame');
promise_test(async (t) => {
const worker = await createWorker(t, workerUrl({ coep: "require-corp" }), {
workerOptions: { type: 'module' },
});
worker.onerror = t.unreached_func('Worker.onerror should not be called');
worker.postMessage(targetUrl);
const result = await waitForMessage(worker);
assert_equals(result.data, 'FAILED');
}, 'COEP: require-corp module worker in COEP: none frame');
promise_test(async (t) => {
const worker = await createWorker(t, workerUrl({ coep: "require-corp" }), {
ownerCoep: "require-corp",
workerOptions: { type: 'module' },
});
worker.onerror = t.unreached_func('Worker.onerror should not be called');
worker.postMessage(targetUrl);
const result = await waitForMessage(worker);
assert_equals(result.data, 'FAILED');
}, 'COEP: require-corp module worker in COEP: require-corp frame');
promise_test(async (t) => {
const url = await createLocalUrl(t, {
url: workerUrl(),
creatorCoep: "require-corp",
scheme: "blob",
});
const worker = await createWorker(t, url, { ownerCoep: "require-corp" });
worker.onerror = t.unreached_func('Worker.onerror should not be called');
worker.postMessage(targetUrl);
const result = await waitForMessage(worker);
assert_equals(result.data, 'FAILED');
}, "COEP: worker inherits COEP for blob URL.");
promise_test(async (t) => {
const url = await createLocalUrl(t, {
url: workerUrl(),
creatorCoep: "require-corp",
scheme: "blob",
});
const worker = await createWorker(t, url);
worker.onerror = t.unreached_func('Worker.onerror should not be called');
worker.postMessage(targetUrl);
const result = await waitForMessage(worker);
assert_equals(result.data, 'FAILED');
}, "COEP: worker inherits COEP from blob URL creator, not owner.");
promise_test(async (t) => {
const url = await createLocalUrl(t, {
url: workerUrl(),
creatorCoep: "require-corp",
scheme: "data",
});
const worker = await createWorker(t, url, { ownerCoep: "require-corp" });
worker.onerror = t.unreached_func('Worker.onerror should not be called');
worker.postMessage(targetUrl);
const result = await waitForMessage(worker);
assert_equals(result.data, 'FAILED');
}, "COEP: worker inherits COEP for data URL.");
promise_test(async (t) => {
const url = await createLocalUrl(t, {
url: workerUrl(),
creatorCoep: "require-corp",
scheme: "data",
});
const worker = await createWorker(t, url);
worker.onerror = t.unreached_func('Worker.onerror should not be called');
worker.postMessage(targetUrl);
const result = await waitForMessage(worker);
assert_equals(result.data, 'LOADED');
}, "COEP: worker inherits COEP from owner, not data URL creator.");
promise_test(async (t) => {
const url = await createLocalUrl(t, {
url: workerUrl(),
creatorCoep: "require-corp",
scheme: "filesystem",
});
const worker = await createWorker(t, url, { ownerCoep: "require-corp" });
worker.onerror = t.unreached_func('Worker.onerror should not be called');
worker.postMessage(targetUrl);
const result = await waitForMessage(worker);
assert_equals(result.data, 'FAILED');
}, "COEP: worker inherits COEP for filesystem URL.");
promise_test(async (t) => {
const url = await createLocalUrl(t, {
url: workerUrl(),
creatorCoep: "require-corp",
scheme: "filesystem",
});
const worker = await createWorker(t, url);
worker.onerror = t.unreached_func('Worker.onerror should not be called');
worker.postMessage(targetUrl);
const result = await waitForMessage(worker);
assert_equals(result.data, 'FAILED');
}, "COEP: worker inherits COEP from filesystem URL creator, not owner.");
</script>
</body>