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.");