tor-browser

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

transaction-scheduling-across-databases.any.js (2656B)


      1 // META: script=resources/support.js
      2 'use strict';
      3 
      4 indexeddb_test(
      5  (t, db) => {
      6    const store = db.createObjectStore('store');
      7  },
      8 
      9  (t, db1) => {
     10    // Open a second database.
     11    const db2name = db1.name + '-2';
     12    const delete_request = indexedDB.deleteDatabase(db2name);
     13    delete_request.onerror = t.unreached_func('deleteDatabase() should succeed');
     14    const open_request = indexedDB.open(db2name, 1);
     15    open_request.onerror = t.unreached_func('open() should succeed');
     16    open_request.onupgradeneeded = t.step_func(() => {
     17      const db2 = open_request.result;
     18      const store = db2.createObjectStore('store');
     19    });
     20    open_request.onsuccess = t.step_func(() => {
     21      const db2 = open_request.result;
     22      t.add_cleanup(() => {
     23        db2.close();
     24        indexedDB.deleteDatabase(db2.name);
     25      });
     26 
     27      let transaction1PutSuccess = false;
     28      let transaction2PutSuccess = false;
     29 
     30      const onTransactionComplete = barrier_func(2, t.step_func_done(() => {
     31        assert_true(transaction1PutSuccess,
     32                    'transaction1 should have executed at least one request');
     33        assert_true(transaction2PutSuccess,
     34                    'transaction1 should have executed at least one request');
     35      }));
     36 
     37 
     38      const transaction1 = db1.transaction('store', 'readwrite');
     39      transaction1.onabort = t.unreached_func('transaction1 should complete');
     40      transaction1.oncomplete = t.step_func(onTransactionComplete);
     41 
     42      const transaction2 = db2.transaction('store', 'readwrite');
     43      transaction2.onabort = t.unreached_func('transaction2 should complete');
     44      transaction2.oncomplete = t.step_func(onTransactionComplete);
     45 
     46      // Keep both transactions alive until each has reported at least one
     47      // successful operation.
     48 
     49      function doTransaction1Put() {
     50        const request = transaction1.objectStore('store').put(0, 0);
     51        request.onerror = t.unreached_func('put request should succeed');
     52        request.onsuccess = t.step_func(() => {
     53          transaction1PutSuccess = true;
     54          if (!transaction2PutSuccess)
     55            doTransaction1Put();
     56        });
     57      }
     58 
     59      function doTransaction2Put() {
     60        const request = transaction2.objectStore('store').put(0, 0);
     61        request.onerror = t.unreached_func('put request should succeed');
     62        request.onsuccess = t.step_func(() => {
     63          transaction2PutSuccess = true;
     64          if (!transaction1PutSuccess)
     65            doTransaction2Put();
     66        });
     67      }
     68 
     69      doTransaction1Put();
     70      doTransaction2Put();
     71    });
     72  },
     73  "Check that transactions in different databases can run in parallel.");