event-dispatch-active-flag.any.js (3102B)
1 // META: title=IndexedDB Transaction - active flag is set during event dispatch 2 // META: global=window,worker 3 // META: script=resources/support.js 4 5 'use strict'; 6 7 function createObjectStore() { 8 return (t, db) => { 9 db.createObjectStore('store'); 10 }; 11 } 12 13 function initializeTransaction(t, db, mode = 'readonly') { 14 const tx = db.transaction('store', mode); 15 const release_tx = keep_alive(tx, 'store'); 16 assert_true( 17 is_transaction_active(tx, 'store'), 18 'Transaction should be active after creation'); 19 return {tx, release_tx}; 20 } 21 22 function assertLifetimeInMicrotasksAndEventLoop( 23 t, tx, release_tx, handlerMessage) { 24 assert_true(is_transaction_active(tx, 'store'), handlerMessage); 25 26 let saw_promise = false; 27 Promise.resolve().then(t.step_func(() => { 28 saw_promise = true; 29 assert_true( 30 is_transaction_active(tx, 'store'), 31 'Transaction should be active in microtasks'); 32 })); 33 34 setTimeout( 35 t.step_func(() => { 36 assert_true(saw_promise); 37 assert_false( 38 is_transaction_active(tx, 'store'), 39 'Transaction should be inactive in next task'); 40 release_tx(); 41 t.done(); 42 }), 43 0); 44 }; 45 46 indexeddb_test(createObjectStore(), (t, db) => { 47 const {tx, release_tx} = initializeTransaction(t, db); 48 const request = tx.objectStore('store').get(0); 49 request.onerror = t.unreached_func('request should succeed'); 50 request.onsuccess = t.step_func((e) => { 51 assertLifetimeInMicrotasksAndEventLoop( 52 t, tx, release_tx, 53 'Transaction should be active during success handler'); 54 }); 55 }, 'Active during success handlers'); 56 57 indexeddb_test(createObjectStore(), (t, db) => { 58 const {tx, release_tx} = initializeTransaction(t, db); 59 const request = tx.objectStore('store').get(0); 60 request.onerror = t.unreached_func('request should succeed'); 61 request.onsuccess = t.step_func((e) => { 62 assertLifetimeInMicrotasksAndEventLoop( 63 t, tx, release_tx, 64 'Transaction should be active during success listener'); 65 }); 66 }, 'Active during success listeners'); 67 68 indexeddb_test(createObjectStore(), (t, db) => { 69 const {tx, release_tx} = initializeTransaction(t, db, 'readwrite'); 70 tx.objectStore('store').put(0, 0); 71 const request = tx.objectStore('store').add(0, 0); 72 request.onsuccess = t.unreached_func('request should fail'); 73 request.onerror = t.step_func((e) => { 74 e.preventDefault(); 75 assertLifetimeInMicrotasksAndEventLoop( 76 t, tx, release_tx, 'Transaction should be active during error handler'); 77 }); 78 }, 'Active during error handlers'); 79 80 indexeddb_test(createObjectStore(), (t, db) => { 81 const {tx, release_tx} = initializeTransaction(t, db, 'readwrite'); 82 tx.objectStore('store').put(0, 0); 83 const request = tx.objectStore('store').add(0, 0); 84 request.onsuccess = t.unreached_func('request should fail'); 85 request.onerror = t.step_func((e) => { 86 e.preventDefault(); 87 assertLifetimeInMicrotasksAndEventLoop( 88 t, tx, release_tx, 89 'Transaction should be active during error listener'); 90 }); 91 }, 'Active during error listeners');