tor-browser

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

transaction-scheduling-across-connections.any.js (2609B)


      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 connection to the same database.
     11    const open_request = indexedDB.open(db1.name);
     12    open_request.onerror = t.unreached_func('open() should succeed');
     13    open_request.onupgradeneeded =
     14      t.unreached_func('second connection should not upgrade');
     15    open_request.onsuccess = t.step_func(() => {
     16      const db2 = open_request.result;
     17      t.add_cleanup(() => { db2.close(); });
     18 
     19      const transaction1 = db1.transaction('store', 'readwrite');
     20      transaction1.onabort = t.unreached_func('transaction1 should complete');
     21 
     22      const transaction2 = db2.transaction('store', 'readwrite');
     23      transaction2.onabort = t.unreached_func('transaction2 should complete');
     24 
     25      let transaction1PutSuccess = false;
     26      let transaction1Complete = false;
     27      let transaction2PutSuccess = false;
     28 
     29      // Keep transaction1 alive for a while and ensure transaction2
     30      // doesn't start.
     31 
     32      let count = 0;
     33      (function doTransaction1Put() {
     34        const request = transaction1.objectStore('store').put(1, count++);
     35        request.onerror = t.unreached_func('request should succeed');
     36        request.onsuccess = t.step_func(evt => {
     37          transaction1PutSuccess = true;
     38          if (count < 5) {
     39            doTransaction1Put();
     40          }
     41        });
     42      }());
     43 
     44      transaction1.oncomplete = t.step_func(evt => {
     45        transaction1Complete = true;
     46        assert_false(
     47          transaction2PutSuccess,
     48          'transaction1 should complete before transaction2 put succeeds');
     49      });
     50 
     51      const request = transaction2.objectStore('store').put(2, 0);
     52      request.onerror = t.unreached_func('request should succeed');
     53      request.onsuccess = t.step_func(evt => {
     54        transaction2PutSuccess = true;
     55        assert_true(
     56          transaction1Complete,
     57          'transaction2 put should not succeed before transaction1 completes');
     58      });
     59 
     60      transaction2.oncomplete = t.step_func_done(evt => {
     61        assert_true(
     62          transaction1PutSuccess,
     63          'transaction1 put should succeed before transaction2 runs');
     64        assert_true(
     65          transaction1Complete,
     66          'transaction1 should complete before transaction2 runs');
     67        assert_true(
     68          transaction2PutSuccess,
     69          'transaction2 put should succeed before transaction2 completes');
     70      });
     71    });
     72  },
     73  "Check that readwrite transactions with overlapping scopes do not run in parallel.");