// META: title=Web Locks API: steal option // META: script=resources/helpers.js // META: global=window,dedicatedworker,sharedworker,serviceworker 'use strict'; const never_settled = new Promise(resolve => { /* never */ }); promise_test(async t => { const res = uniqueName(t); let callback_called = false; await navigator.locks.request(res, {steal: true}, lock => { callback_called = true; assert_not_equals(lock, null, 'Lock should be granted'); }); assert_true(callback_called, 'Callback should be called'); }, 'Lock available'); promise_test(async t => { const res = uniqueName(t); let callback_called = false; // Grab and hold the lock. navigator.locks.request(res, lock => never_settled).catch(_ => {}); // Steal it. await navigator.locks.request(res, {steal: true}, lock => { callback_called = true; assert_not_equals(lock, null, 'Lock should be granted'); }); assert_true(callback_called, 'Callback should be called'); }, 'Lock not available'); promise_test(async t => { const res = uniqueName(t); // Grab and hold the lock. const promise = navigator.locks.request(res, lock => never_settled); const assertion = promise_rejects_dom( t, 'AbortError', promise, `Initial request's promise should reject`); // Steal it. await navigator.locks.request(res, {steal: true}, lock => {}); await assertion; }, `Broken lock's release promise rejects`); promise_test(async t => { const res = uniqueName(t); // Grab and hold the lock. navigator.locks.request(res, lock => never_settled).catch(_ => {}); // Make a request for it. let request_granted = false; const promise = navigator.locks.request(res, lock => { request_granted = true; }); // Steal it. await navigator.locks.request(res, {steal: true}, lock => { assert_false(request_granted, 'Steal should override request'); }); await promise; assert_true(request_granted, 'Request should eventually be granted'); }, `Requested lock's release promise is deferred`); promise_test(async t => { const res = uniqueName(t); // Grab and hold the lock. navigator.locks.request(res, lock => never_settled).catch(_ => {}); // Steal it. let saw_abort = false; const first_steal = navigator.locks.request( res, {steal: true}, lock => never_settled).catch(error => { saw_abort = true; }); // Steal it again. await navigator.locks.request(res, {steal: true}, lock => {}); await first_steal; assert_true(saw_abort, 'First steal should have aborted'); }, 'Last caller wins');