Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

<!DOCTYPE html>
<title>SharedWorker extendedLifetime (Named and Module)</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/utils.js"></script>
<script src="/common/dispatcher/dispatcher.js"></script>
<script>
const connectToSharedWorker = async (options) => {
await window.pageShowPromise;
window.worker = new SharedWorker(
'/workers/tentative/resources/shared-worker-memory.js', options);
worker.port.start();
};
const postAndWait = async (data) => {
return new Promise(resolve => {
const listener = event => {
if (event.data.reqid !== data.reqid) {
return;
}
worker.port.removeEventListener('message', listener);
resolve(event.data);
};
worker.port.addEventListener('message', listener);
worker.port.postMessage(data);
});
};
promise_test(async t => {
const uuid = token();
const options = {name: 'named-worker', extendedLifetime: true};
const ctx = new RemoteContext(token());
const popup = window.open(remoteExecutorUrl(ctx.context_id));
await ctx.execute_script(connectToSharedWorker, [options]);
await ctx.execute_script(postAndWait, [{reqid: 1, op: 'store', data: uuid}]);
popup.close();
// Wait for potential worker teardown (if extendedLifetime were not working)
await new Promise(resolve => setTimeout(resolve, 100));
const ctx2 = new RemoteContext(token());
const popup2 = window.open(remoteExecutorUrl(ctx2.context_id));
await ctx2.execute_script(connectToSharedWorker, [options]);
const response = await ctx2.execute_script(postAndWait, [{reqid: 2, op: 'load'}]);
assert_equals(response.data, uuid);
}, "Named SharedWorker should survive across navigations with extendedLifetime");
promise_test(async t => {
const uuid = token();
const options = {type: 'module', extendedLifetime: true};
const ctx = new RemoteContext(token());
const popup = window.open(remoteExecutorUrl(ctx.context_id));
await ctx.execute_script(connectToSharedWorker, [options]);
await ctx.execute_script(postAndWait, [{reqid: 10, op: 'store', data: uuid}]);
popup.close();
// Wait for potential worker teardown
await new Promise(resolve => setTimeout(resolve, 100));
const ctx2 = new RemoteContext(token());
const popup2 = window.open(remoteExecutorUrl(ctx2.context_id));
await ctx2.execute_script(connectToSharedWorker, [options]);
const response = await ctx2.execute_script(postAndWait, [{reqid: 11, op: 'load'}]);
assert_equals(response.data, uuid);
}, "Module SharedWorker should survive across navigations with extendedLifetime");
</script>