<!DOCTYPE html> <meta charset=utf-8> <title>Fire success event - Exception thrown</title> <link rel="help" href="https://w3c.github.io/IndexedDB/#fire-success-event"> <script src=/resources/testharness.js></script> <script src=/resources/testharnessreport.js></script> <script src=resources/support.js></script> <script> setup({allow_uncaught_exception:true}); function fire_success_event_test(func, description) { indexeddb_test( (t, db) => { db.createObjectStore('s'); }, (t, db) => { const tx = db.transaction('s', 'readonly', {durability: 'relaxed'}); tx.oncomplete = t.unreached_func('transaction should abort'); const store = tx.objectStore('s'); const request = store.get(0); func(t, db, tx, request); tx.addEventListener('abort', t.step_func_done(() => { assert_equals(tx.error.name, 'AbortError'); })); }, description); } fire_success_event_test((t, db, tx, request) => { request.onsuccess = () => { throw Error(); }; }, 'Exception in success event handler on request'); fire_success_event_test((t, db, tx, request) => { request.addEventListener('success', () => { throw Error(); }); }, 'Exception in success event listener on request'); fire_success_event_test((t, db, tx, request) => { request.addEventListener('success', { get handleEvent() { throw new Error(); }, }); }, 'Exception in success event listener ("handleEvent" lookup) on request'); fire_success_event_test((t, db, tx, request) => { request.addEventListener('success', { handleEvent: null, }); }, 'Exception in success event listener (non-callable "handleEvent") on request'); fire_success_event_test((t, db, tx, request) => { request.addEventListener('success', () => { // no-op }); request.addEventListener('success', () => { throw Error(); }); }, 'Exception in second success event listener on request'); fire_success_event_test((t, db, tx, request) => { let second_listener_called = false; request.addEventListener('success', () => { throw Error(); }); request.addEventListener('success', t.step_func(() => { second_listener_called = true; assert_true(is_transaction_active(tx, 's'), 'Transaction should be active until dispatch completes'); })); tx.addEventListener('abort', t.step_func(() => { assert_true(second_listener_called); })); }, 'Exception in first success event listener, tx active in second'); </script>