tor-browser

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

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