tor-browser

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

abortsignal.html (4199B)


      1 <!doctype html>
      2 <script src="/resources/testharness.js"></script>
      3 <script src="/resources/testharnessreport.js"></script>
      4 <script src="/resources/testdriver.js"></script>
      5 <script src="/resources/testdriver-vendor.js"></script>
      6 <script src="/resources/testdriver-actions.js"></script>
      7 <script src="resources/helpers.js"></script>
      8 
      9 <body>
     10 <script>
     11 // TODO(domenic): maybe update createRecordingCloseWatcher() to allow passing args and use it?
     12 
     13 test(() => {
     14  let watcher = new CloseWatcher({ signal: AbortSignal.abort() });
     15  let oncancel_called = false;
     16  let onclose_called = false;
     17  watcher.oncancel = () => oncancel_called = true;
     18  watcher.onclose = () => onclose_called = true;
     19 
     20  watcher.requestClose();
     21 
     22  assert_false(oncancel_called);
     23  assert_false(onclose_called);
     24 }, "already-aborted AbortSignal then requestClose() fires no events");
     25 
     26 test(() => {
     27  let controller = new AbortController();
     28  let watcher = new CloseWatcher({ signal: controller.signal });
     29  let oncancel_called = false;
     30  let onclose_called = false;
     31  watcher.oncancel = () => oncancel_called = true;
     32  watcher.onclose = () => onclose_called = true;
     33 
     34  controller.abort();
     35  watcher.requestClose();
     36 
     37  assert_false(oncancel_called);
     38  assert_false(onclose_called);
     39 }, "abortController.abort() then requestClose() fires no events");
     40 
     41 test(() => {
     42  let controller = new AbortController();
     43  let watcher = new CloseWatcher({ signal: controller.signal });
     44  let oncancel_call_count_ = 0;
     45  let onclose_call_count_ = 0;
     46  watcher.oncancel = () => oncancel_call_count_++;
     47  watcher.onclose = () => onclose_call_count_++;
     48 
     49  watcher.requestClose();
     50  controller.abort();
     51 
     52  assert_equals(oncancel_call_count_, 1);
     53  assert_equals(onclose_call_count_, 1);
     54 }, "requestClose() then abortController.abort() fires only one close event");
     55 
     56 promise_test(async () => {
     57  let watcher = new CloseWatcher({ signal: AbortSignal.abort() });
     58  let oncancel_called = false;
     59  let onclose_called = false;
     60  watcher.oncancel = () => oncancel_called = true;
     61  watcher.onclose = () => onclose_called = true;
     62 
     63  await sendCloseRequest();
     64 
     65  assert_false(oncancel_called);
     66  assert_false(onclose_called);
     67 }, "already-aborted AbortSignal then Esc key fires no events");
     68 
     69 promise_test(async t => {
     70  let controller = new AbortController();
     71  let watcher = new CloseWatcher({ signal: controller.signal });
     72  let oncancel_called = false;
     73  let onclose_called = false;
     74  watcher.oncancel = () => oncancel_called = true;
     75  watcher.onclose = () => onclose_called = true;
     76 
     77  controller.abort();
     78  await sendCloseRequest();
     79 
     80  assert_false(oncancel_called);
     81  assert_false(onclose_called);
     82 }, "abortController.abort() then close via Esc key fires no events");
     83 
     84 promise_test(async t => {
     85  let controller = new AbortController();
     86  let watcher = new CloseWatcher({ signal: controller.signal });
     87  let oncancel_call_count_ = 0;
     88  let onclose_call_count_ = 0;
     89  watcher.oncancel = () => oncancel_call_count_++;
     90  watcher.onclose = () => onclose_call_count_++;
     91 
     92  await sendCloseRequest();
     93  controller.abort();
     94 
     95  assert_equals(oncancel_call_count_, 1);
     96  assert_equals(onclose_call_count_, 1);
     97 }, "Esc key then abortController.abort() fires only one close event");
     98 
     99 test(t => {
    100  let controller = new AbortController();
    101  let watcher = new CloseWatcher({ signal: controller.signal });
    102  controller.abort();
    103  let watcher2 = new CloseWatcher();
    104  t.add_cleanup(() => watcher2.destroy());
    105 }, "abortController.abort()ing a free CloseWatcher allows a new one to be created without a user activation");
    106 
    107 promise_test(async t => {
    108  let controller = new AbortController();
    109  let watcher = new CloseWatcher({ signal: controller.signal });
    110  watcher.oncancel = () => { controller.abort(); }
    111  watcher.onclose = t.unreached_func("onclose");
    112  await test_driver.bless("give user activation so that cancel will fire", () => {
    113    watcher.requestClose();
    114  });
    115 }, "abortController.abort() inside oncancel");
    116 
    117 test(t => {
    118  let controller = new AbortController();
    119  let watcher = new CloseWatcher({ signal: controller.signal });
    120  watcher.onclose = () => { controller.abort(); }
    121  watcher.requestClose();
    122 }, "abortController.abort() inside onclose is benign");
    123 </script>