steal.https.any.js (2556B)
1 // META: title=Web Locks API: steal option 2 // META: script=resources/helpers.js 3 // META: global=window,dedicatedworker,sharedworker,serviceworker 4 5 'use strict'; 6 7 const never_settled = new Promise(resolve => { /* never */ }); 8 9 promise_test(async t => { 10 const res = uniqueName(t); 11 let callback_called = false; 12 await navigator.locks.request(res, {steal: true}, lock => { 13 callback_called = true; 14 assert_not_equals(lock, null, 'Lock should be granted'); 15 }); 16 assert_true(callback_called, 'Callback should be called'); 17 }, 'Lock available'); 18 19 promise_test(async t => { 20 const res = uniqueName(t); 21 let callback_called = false; 22 23 // Grab and hold the lock. 24 navigator.locks.request(res, lock => never_settled).catch(_ => {}); 25 26 // Steal it. 27 await navigator.locks.request(res, {steal: true}, lock => { 28 callback_called = true; 29 assert_not_equals(lock, null, 'Lock should be granted'); 30 }); 31 32 assert_true(callback_called, 'Callback should be called'); 33 }, 'Lock not available'); 34 35 promise_test(async t => { 36 const res = uniqueName(t); 37 38 // Grab and hold the lock. 39 const promise = navigator.locks.request(res, lock => never_settled); 40 const assertion = promise_rejects_dom( 41 t, 'AbortError', promise, `Initial request's promise should reject`); 42 43 // Steal it. 44 await navigator.locks.request(res, {steal: true}, lock => {}); 45 46 await assertion; 47 48 }, `Broken lock's release promise rejects`); 49 50 promise_test(async t => { 51 const res = uniqueName(t); 52 53 // Grab and hold the lock. 54 navigator.locks.request(res, lock => never_settled).catch(_ => {}); 55 56 // Make a request for it. 57 let request_granted = false; 58 const promise = navigator.locks.request(res, lock => { 59 request_granted = true; 60 }); 61 62 // Steal it. 63 await navigator.locks.request(res, {steal: true}, lock => { 64 assert_false(request_granted, 'Steal should override request'); 65 }); 66 67 await promise; 68 assert_true(request_granted, 'Request should eventually be granted'); 69 70 }, `Requested lock's release promise is deferred`); 71 72 promise_test(async t => { 73 const res = uniqueName(t); 74 75 // Grab and hold the lock. 76 navigator.locks.request(res, lock => never_settled).catch(_ => {}); 77 78 // Steal it. 79 let saw_abort = false; 80 const first_steal = navigator.locks.request( 81 res, {steal: true}, lock => never_settled).catch(error => { 82 saw_abort = true; 83 }); 84 85 // Steal it again. 86 await navigator.locks.request(res, {steal: true}, lock => {}); 87 88 await first_steal; 89 assert_true(saw_abort, 'First steal should have aborted'); 90 91 }, 'Last caller wins');