tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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