transaction-scheduling-across-databases.any.js (2656B)
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 database. 11 const db2name = db1.name + '-2'; 12 const delete_request = indexedDB.deleteDatabase(db2name); 13 delete_request.onerror = t.unreached_func('deleteDatabase() should succeed'); 14 const open_request = indexedDB.open(db2name, 1); 15 open_request.onerror = t.unreached_func('open() should succeed'); 16 open_request.onupgradeneeded = t.step_func(() => { 17 const db2 = open_request.result; 18 const store = db2.createObjectStore('store'); 19 }); 20 open_request.onsuccess = t.step_func(() => { 21 const db2 = open_request.result; 22 t.add_cleanup(() => { 23 db2.close(); 24 indexedDB.deleteDatabase(db2.name); 25 }); 26 27 let transaction1PutSuccess = false; 28 let transaction2PutSuccess = false; 29 30 const onTransactionComplete = barrier_func(2, t.step_func_done(() => { 31 assert_true(transaction1PutSuccess, 32 'transaction1 should have executed at least one request'); 33 assert_true(transaction2PutSuccess, 34 'transaction1 should have executed at least one request'); 35 })); 36 37 38 const transaction1 = db1.transaction('store', 'readwrite'); 39 transaction1.onabort = t.unreached_func('transaction1 should complete'); 40 transaction1.oncomplete = t.step_func(onTransactionComplete); 41 42 const transaction2 = db2.transaction('store', 'readwrite'); 43 transaction2.onabort = t.unreached_func('transaction2 should complete'); 44 transaction2.oncomplete = t.step_func(onTransactionComplete); 45 46 // Keep both transactions alive until each has reported at least one 47 // successful operation. 48 49 function doTransaction1Put() { 50 const request = transaction1.objectStore('store').put(0, 0); 51 request.onerror = t.unreached_func('put request should succeed'); 52 request.onsuccess = t.step_func(() => { 53 transaction1PutSuccess = true; 54 if (!transaction2PutSuccess) 55 doTransaction1Put(); 56 }); 57 } 58 59 function doTransaction2Put() { 60 const request = transaction2.objectStore('store').put(0, 0); 61 request.onerror = t.unreached_func('put request should succeed'); 62 request.onsuccess = t.step_func(() => { 63 transaction2PutSuccess = true; 64 if (!transaction1PutSuccess) 65 doTransaction2Put(); 66 }); 67 } 68 69 doTransaction1Put(); 70 doTransaction2Put(); 71 }); 72 }, 73 "Check that transactions in different databases can run in parallel.");