tor-browser

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

event-dispatch-active-flag.any.js (3102B)


      1 // META: title=IndexedDB Transaction - active flag is set during event dispatch
      2 // META: global=window,worker
      3 // META: script=resources/support.js
      4 
      5 'use strict';
      6 
      7 function createObjectStore() {
      8  return (t, db) => {
      9    db.createObjectStore('store');
     10  };
     11 }
     12 
     13 function initializeTransaction(t, db, mode = 'readonly') {
     14  const tx = db.transaction('store', mode);
     15  const release_tx = keep_alive(tx, 'store');
     16  assert_true(
     17      is_transaction_active(tx, 'store'),
     18      'Transaction should be active after creation');
     19  return {tx, release_tx};
     20 }
     21 
     22 function assertLifetimeInMicrotasksAndEventLoop(
     23    t, tx, release_tx, handlerMessage) {
     24  assert_true(is_transaction_active(tx, 'store'), handlerMessage);
     25 
     26  let saw_promise = false;
     27  Promise.resolve().then(t.step_func(() => {
     28    saw_promise = true;
     29    assert_true(
     30        is_transaction_active(tx, 'store'),
     31        'Transaction should be active in microtasks');
     32  }));
     33 
     34  setTimeout(
     35      t.step_func(() => {
     36        assert_true(saw_promise);
     37        assert_false(
     38            is_transaction_active(tx, 'store'),
     39            'Transaction should be inactive in next task');
     40        release_tx();
     41        t.done();
     42      }),
     43      0);
     44 };
     45 
     46 indexeddb_test(createObjectStore(), (t, db) => {
     47  const {tx, release_tx} = initializeTransaction(t, db);
     48  const request = tx.objectStore('store').get(0);
     49  request.onerror = t.unreached_func('request should succeed');
     50  request.onsuccess = t.step_func((e) => {
     51    assertLifetimeInMicrotasksAndEventLoop(
     52        t, tx, release_tx,
     53        'Transaction should be active during success handler');
     54  });
     55 }, 'Active during success handlers');
     56 
     57 indexeddb_test(createObjectStore(), (t, db) => {
     58  const {tx, release_tx} = initializeTransaction(t, db);
     59  const request = tx.objectStore('store').get(0);
     60  request.onerror = t.unreached_func('request should succeed');
     61  request.onsuccess = t.step_func((e) => {
     62    assertLifetimeInMicrotasksAndEventLoop(
     63        t, tx, release_tx,
     64        'Transaction should be active during success listener');
     65  });
     66 }, 'Active during success listeners');
     67 
     68 indexeddb_test(createObjectStore(), (t, db) => {
     69  const {tx, release_tx} = initializeTransaction(t, db, 'readwrite');
     70  tx.objectStore('store').put(0, 0);
     71  const request = tx.objectStore('store').add(0, 0);
     72  request.onsuccess = t.unreached_func('request should fail');
     73  request.onerror = t.step_func((e) => {
     74    e.preventDefault();
     75    assertLifetimeInMicrotasksAndEventLoop(
     76        t, tx, release_tx, 'Transaction should be active during error handler');
     77  });
     78 }, 'Active during error handlers');
     79 
     80 indexeddb_test(createObjectStore(), (t, db) => {
     81  const {tx, release_tx} = initializeTransaction(t, db, 'readwrite');
     82  tx.objectStore('store').put(0, 0);
     83  const request = tx.objectStore('store').add(0, 0);
     84  request.onsuccess = t.unreached_func('request should fail');
     85  request.onerror = t.step_func((e) => {
     86    e.preventDefault();
     87    assertLifetimeInMicrotasksAndEventLoop(
     88        t, tx, release_tx,
     89        'Transaction should be active during error listener');
     90  });
     91 }, 'Active during error listeners');