mode-mixed.https.any.js (3517B)
1 // META: title=Web Locks API: Mixed Modes 2 // META: script=resources/helpers.js 3 // META: global=window,dedicatedworker,sharedworker,serviceworker 4 5 'use strict'; 6 7 promise_test(async t => { 8 let unblock; 9 const blocked = new Promise(r => { unblock = r; }); 10 11 const granted = []; 12 13 // These should be granted immediately, and held until unblocked. 14 navigator.locks.request('a', {mode: 'shared'}, async lock => { 15 granted.push('a-shared-1'); await blocked; }); 16 navigator.locks.request('a', {mode: 'shared'}, async lock => { 17 granted.push('a-shared-2'); await blocked; }); 18 navigator.locks.request('a', {mode: 'shared'}, async lock => { 19 granted.push('a-shared-3'); await blocked; }); 20 21 // This should be blocked. 22 let exclusive_lock; 23 const exclusive_request = navigator.locks.request('a', async lock => { 24 granted.push('a-exclusive'); 25 exclusive_lock = lock; 26 }); 27 28 // This should be granted immediately (different name). 29 await navigator.locks.request('b', {mode: 'exclusive'}, lock => { 30 granted.push('b-exclusive'); }); 31 32 assert_array_equals( 33 granted, ['a-shared-1', 'a-shared-2', 'a-shared-3', 'b-exclusive']); 34 35 // Release the shared locks granted above. 36 unblock(); 37 38 // Now the blocked request can be granted. 39 await exclusive_request; 40 assert_equals(exclusive_lock.mode, 'exclusive'); 41 42 assert_array_equals( 43 granted, 44 ['a-shared-1', 'a-shared-2', 'a-shared-3', 'b-exclusive', 'a-exclusive']); 45 46 }, 'Lock requests are granted in order'); 47 48 promise_test(async t => { 49 const res = uniqueName(t); 50 51 let [promise, resolve] = makePromiseAndResolveFunc(); 52 53 const exclusive = navigator.locks.request(res, () => promise); 54 for (let i = 0; i < 5; i++) { 55 requestLockAndHold(t, res, { mode: "shared" }); 56 } 57 58 let answer = await navigator.locks.query(); 59 assert_equals(answer.held.length, 1, "An exclusive lock is held"); 60 assert_equals(answer.pending.length, 5, "Requests for shared locks are pending"); 61 resolve(); 62 await exclusive; 63 64 answer = await navigator.locks.query(); 65 assert_equals(answer.held.length, 5, "Shared locks are held"); 66 assert_true(answer.held.every(l => l.mode === "shared"), "All held locks are shared ones"); 67 }, 'Releasing exclusive lock grants multiple shared locks'); 68 69 promise_test(async t => { 70 const res = uniqueName(t); 71 72 let [sharedPromise, sharedResolve] = makePromiseAndResolveFunc(); 73 let [exclusivePromise, exclusiveResolve] = makePromiseAndResolveFunc(); 74 75 const sharedReleasedPromise = Promise.all(new Array(5).fill(0).map( 76 () => navigator.locks.request(res, { mode: "shared" }, () => sharedPromise)) 77 ); 78 const exclusiveReleasedPromise = navigator.locks.request(res, () => exclusivePromise); 79 for (let i = 0; i < 5; i++) { 80 requestLockAndHold(t, res, { mode: "shared" }); 81 } 82 83 let answer = await navigator.locks.query(); 84 assert_equals(answer.held.length, 5, "Shared locks are held"); 85 assert_true(answer.held.every(l => l.mode === "shared"), "All held locks are shared ones"); 86 sharedResolve(); 87 await sharedReleasedPromise; 88 89 answer = await navigator.locks.query(); 90 assert_equals(answer.held.length, 1, "An exclusive lock is held"); 91 assert_equals(answer.held[0].mode, "exclusive"); 92 exclusiveResolve(); 93 await exclusiveReleasedPromise; 94 95 answer = await navigator.locks.query(); 96 assert_equals(answer.held.length, 5, "The next shared locks are held"); 97 assert_true(answer.held.every(l => l.mode === "shared"), "All held locks are shared ones"); 98 }, 'An exclusive lock between shared locks');