| // META: title=Web Locks API: Mixed Modes |
| // META: global=window,dedicatedworker,sharedworker,serviceworker |
| |
| 'use strict'; |
| |
| promise_test(async t => { |
| let unblock; |
| const blocked = new Promise(r => { unblock = r; }); |
| |
| const granted = []; |
| |
| // These should be granted immediately, and held until unblocked. |
| navigator.locks.request('a', {mode: 'shared'}, async lock => { |
| granted.push('a-shared-1'); await blocked; }); |
| navigator.locks.request('a', {mode: 'shared'}, async lock => { |
| granted.push('a-shared-2'); await blocked; }); |
| navigator.locks.request('a', {mode: 'shared'}, async lock => { |
| granted.push('a-shared-3'); await blocked; }); |
| |
| // This should be blocked. |
| let exclusive_lock; |
| const exclusive_request = navigator.locks.request('a', async lock => { |
| granted.push('a-exclusive'); |
| exclusive_lock = lock; |
| }); |
| |
| // This should be granted immediately (different name). |
| await navigator.locks.request('b', {mode: 'exclusive'}, lock => { |
| granted.push('b-exclusive'); }); |
| |
| assert_array_equals( |
| granted, ['a-shared-1', 'a-shared-2', 'a-shared-3', 'b-exclusive']); |
| |
| // Release the shared locks granted above. |
| unblock(); |
| |
| // Now the blocked request can be granted. |
| await exclusive_request; |
| assert_equals(exclusive_lock.mode, 'exclusive'); |
| |
| assert_array_equals( |
| granted, |
| ['a-shared-1', 'a-shared-2', 'a-shared-3', 'b-exclusive', 'a-exclusive']); |
| |
| }, 'Lock requests are granted in order'); |