fire-success-event-exception.any.js (2383B)
1 // META: global=window,worker 2 // META: title=Fire success event - Exception thrown 3 // META: script=resources/support.js 4 5 // Spec: "https://w3c.github.io/IndexedDB/#fire-success-event" 6 7 'use strict'; 8 9 setup({allow_uncaught_exception: true}); 10 11 function fire_success_event_test(func, description) { 12 indexeddb_test( 13 (t, db) => { 14 db.createObjectStore('s'); 15 }, 16 (t, db) => { 17 const tx = db.transaction('s', 'readonly'); 18 tx.oncomplete = t.unreached_func('transaction should abort'); 19 const store = tx.objectStore('s'); 20 const request = store.get(0); 21 func(t, db, tx, request); 22 tx.addEventListener('abort', t.step_func_done(() => { 23 assert_equals(tx.error.name, 'AbortError'); 24 })); 25 }, 26 description); 27 } 28 29 fire_success_event_test((t, db, tx, request) => { 30 request.onsuccess = () => { 31 throw Error(); 32 }; 33 }, 'Exception in success event handler on request'); 34 35 fire_success_event_test((t, db, tx, request) => { 36 request.addEventListener('success', () => { 37 throw Error(); 38 }); 39 }, 'Exception in success event listener on request'); 40 41 fire_success_event_test((t, db, tx, request) => { 42 request.addEventListener('success', { 43 get handleEvent() { 44 throw new Error(); 45 }, 46 }); 47 }, 'Exception in success event listener ("handleEvent" lookup) on request'); 48 49 fire_success_event_test((t, db, tx, request) => { 50 request.addEventListener('success', { 51 handleEvent: null, 52 }); 53 }, 'Exception in success event listener (non-callable "handleEvent") on request'); 54 55 fire_success_event_test((t, db, tx, request) => { 56 request.addEventListener( 57 'success', 58 () => { 59 // no-op 60 }); 61 request.addEventListener('success', () => { 62 throw Error(); 63 }); 64 }, 'Exception in second success event listener on request'); 65 66 fire_success_event_test((t, db, tx, request) => { 67 let second_listener_called = false; 68 request.addEventListener('success', () => { 69 throw Error(); 70 }); 71 request.addEventListener('success', t.step_func(() => { 72 second_listener_called = true; 73 assert_true( 74 is_transaction_active(tx, 's'), 75 'Transaction should be active until dispatch completes'); 76 })); 77 tx.addEventListener('abort', t.step_func(() => { 78 assert_true(second_listener_called); 79 })); 80 }, 'Exception in first success event listener, tx active in second');