Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

// META: title=Web Locks API: Windows
// META: script=resources/helpers.js
"use strict";
promise_test(async (t) => {
const { window, lockName } = await openWindowAndAcquireLockInWorker(t);
// This request should be blocked.
let lock_granted = false;
const blocked = navigator.locks.request(lockName, lock => { lock_granted = true; });
// Verify that we can't get it.
let available = undefined;
await navigator.locks.request(
lockName, {ifAvailable: true}, lock => { available = lock !== null; });
assert_false(available);
assert_false(lock_granted);
// Close the window, after which we should be able to acquire the lock here.
window.close();
await blocked;
assert_true(lock_granted);
}, 'Closed window with worker holding lock');
promise_test(async (t) => {
const { window, lockName } = await openWindowAndAcquireLockInWorker(t);
// This request should be blocked.
let lock_granted = false;
const blocked = navigator.locks.request(lockName, lock => { lock_granted = true; });
// Verify that we can't get it.
let available = undefined;
await navigator.locks.request(
lockName, {ifAvailable: true}, lock => { available = lock !== null; });
assert_false(available);
assert_false(lock_granted);
// Reload the window, after which we should be able to acquire the lock here.
window.location.href = 'resources/window.html?refresh=1';
await blocked;
assert_true(lock_granted);
}, 'Refreshed window with worker holding lock');
async function openWindowAndAcquireLockInWorker(t) {
const lockName = uniqueName(t);
const window = await new Promise((resolve) => {
const w = globalThis.window.open("resources/window.html");
w.addEventListener('load', () => { resolve(w); }, { once: true });
t.add_cleanup(() => w.close());
return w;
});
const {port1, port2} = new MessageChannel();
const acquiredLock = new Promise((resolve) => {
port1.onmessage = (_) => resolve();
});
// Make popup acquire a lock in a worker.
window.postMessage(
{ port: port2, worker: {op: 'request', name: lockName, mode: 'exclusive'}},
'*',
[port2]
);
await acquiredLock;
return { window, lockName };
}