// META: script=resources/support.js indexeddb_test( (t, db) => { const store = db.createObjectStore('store'); store.put('value', 'key'); }, (t, db) => { let transaction1GetSuccess = false; let transaction2GetSuccess = false; const onTransactionComplete = barrier_func(2, t.step_func_done(() => { assert_true(transaction1GetSuccess, 'transaction1 should have executed at least one request'); assert_true(transaction2GetSuccess, 'transaction1 should have executed at least one request'); })); const transaction1 = db.transaction('store', 'readonly', {durability: 'relaxed'}); transaction1.onabort = t.unreached_func('transaction1 should not abort'); transaction1.oncomplete = t.step_func(onTransactionComplete); const transaction2 = db.transaction('store', 'readonly', {durability: 'relaxed'}); transaction2.onabort = t.unreached_func('transaction2 should not abort'); transaction2.oncomplete = t.step_func(onTransactionComplete); // Keep both transactions alive until each has reported at least one // successful operation function doTransaction1Get() { const request = transaction1.objectStore('store').get('key'); request.onerror = t.unreached_func('request should not fail'); request.onsuccess = t.step_func(() => { transaction1GetSuccess = true; if (!transaction2GetSuccess) doTransaction1Get(); }); } function doTransaction2Get() { // NOTE: No logging since execution order is not deterministic. const request = transaction2.objectStore('store').get('key'); request.onerror = t.unreached_func('request should not fail'); request.onsuccess = t.step_func(() => { transaction2GetSuccess = true; if (!transaction1GetSuccess) doTransaction2Get(); }); } doTransaction1Get(); doTransaction2Get(); }, 'Check that read-only transactions within a database can run in parallel.');