<!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>
