// META: global=window,worker // META: title=Fire success event - Exception thrown // META: script=resources/support.js // Spec: "https://w3c.github.io/IndexedDB/#fire-success-event" 'use strict'; 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'); 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');