tor-browser

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

transaction-scheduling-within-database.any.js (1992B)


      1 // META: script=resources/support.js
      2 'use strict';
      3 
      4 indexeddb_test(
      5  (t, db) => {
      6    const store = db.createObjectStore('store');
      7    store.put('value', 'key');
      8  },
      9 
     10  (t, db) => {
     11    let transaction1GetSuccess = false;
     12    let transaction2GetSuccess = false;
     13 
     14    const onTransactionComplete = barrier_func(2, t.step_func_done(() => {
     15      assert_true(transaction1GetSuccess,
     16                  'transaction1 should have executed at least one request');
     17      assert_true(transaction2GetSuccess,
     18                  'transaction1 should have executed at least one request');
     19    }));
     20 
     21    const transaction1 = db.transaction('store', 'readonly');
     22    transaction1.onabort = t.unreached_func('transaction1 should not abort');
     23    transaction1.oncomplete = t.step_func(onTransactionComplete);
     24 
     25    const transaction2 = db.transaction('store', 'readonly');
     26    transaction2.onabort = t.unreached_func('transaction2 should not abort');
     27    transaction2.oncomplete = t.step_func(onTransactionComplete);
     28 
     29    // Keep both transactions alive until each has reported at least one
     30    // successful operation
     31 
     32    function doTransaction1Get() {
     33      const request = transaction1.objectStore('store').get('key');
     34      request.onerror = t.unreached_func('request should not fail');
     35      request.onsuccess = t.step_func(() => {
     36        transaction1GetSuccess = true;
     37        if (!transaction2GetSuccess)
     38          doTransaction1Get();
     39      });
     40    }
     41 
     42    function doTransaction2Get() {
     43      // NOTE: No logging since execution order is not deterministic.
     44      const request = transaction2.objectStore('store').get('key');
     45      request.onerror = t.unreached_func('request should not fail');
     46      request.onsuccess = t.step_func(() => {
     47        transaction2GetSuccess = true;
     48        if (!transaction1GetSuccess)
     49          doTransaction2Get();
     50      });
     51    }
     52 
     53    doTransaction1Get();
     54    doTransaction2Get();
     55  },
     56  'Check that read-only transactions within a database can run in parallel.');