// META: title=IndexedDB Transaction Request Queue Handling // META: global=window,worker // META: script=resources/support.js 'use strict'; async_test(t => { let db; let keys = {txn: [], txn2: []}; let open_rq = createdb(t); open_rq.onupgradeneeded = function(e) { let i; let os; db = e.target.result; for (i = 1; i < 6; i++) { os = db.createObjectStore('os' + i, {autoIncrement: true, keyPath: 'k'}); os.add({os: 'os' + i}); os.put({os: 'os' + i, k: i}); os.add({os: 'os' + i}); } }; open_rq.onsuccess = function(e) { let txn = db.transaction(['os2', 'os1', 'os3', 'os5']) txn.objectStore('os1').openCursor().onsuccess = reg('txn') txn.objectStore('os3').openCursor().onsuccess = reg('txn') txn.objectStore('os1').get(2).onsuccess = reg('txn') txn.objectStore('os2').get(3).onsuccess = reg('txn') let txn2 = db.transaction(['os4', 'os3', 'os1', 'os5']) let os4 = txn2.objectStore('os4') for (let i = 0; i < 3; i++) { os4.openCursor().onsuccess = reg('txn2') os4.get(5).onsuccess = reg('txn2') os4.get(4).onsuccess = reg('txn2') txn.objectStore('os2').get(1).onsuccess = reg('txn') txn2.objectStore('os3').get(1).onsuccess = reg('txn2') } txn2.objectStore('os1').get(2).onsuccess = reg('txn2') txn.objectStore('os1').openCursor(null, 'prev').onsuccess = reg('txn') os4.openCursor(null, 'prev').onsuccess = reg('txn2') txn.oncomplete = t.step_func(finish); txn2.oncomplete = t.step_func(finish); }; function reg(n) { return t.step_func(function(e) { let v = e.target.result; if (v.value) v = v.value; keys[n].push(v.os + ': ' + v.k); }); } let finish_to_go = 2; function finish() { if (--finish_to_go) return; assert_array_equals( keys['txn'], [ 'os1: 1', 'os3: 1', 'os1: 2', 'os2: 3', 'os2: 1', 'os2: 1', 'os2: 1', 'os1: 2', ], 'transaction keys'); assert_array_equals( keys['txn2'], [ 'os4: 1', 'os4: 5', 'os4: 4', 'os3: 1', 'os4: 1', 'os4: 5', 'os4: 4', 'os3: 1', 'os4: 1', 'os4: 5', 'os4: 4', 'os3: 1', 'os1: 2', 'os4: 5', ], 'transaction 2 keys'); t.done(); } }, 'Transactions have a request queue');