| // 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'); |