| // 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'); |