| // 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 }; |
| } |