<!DOCTYPE html>
<meta charset=utf-8>
<title>Fire upgradeneeded event - Exception thrown</title>
<link rel="help" href="https://w3c.github.io/IndexedDB/#fire-a-version-change-event">
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=support.js></script>
<script>
setup({allow_uncaught_exception:true});

function fire_upgradeneeded_event_test(func, description) {
  async_test(t => {
    const dbname = document.location + '-' + t.name;
    const del = indexedDB.deleteDatabase(dbname);
    del.onerror = t.unreached_func('deleteDatabase should succeed');
    const open = indexedDB.open(dbname, 1);
    open.onsuccess = t.unreached_func('open should fail');
    func(t, open);
  }, description);
}

fire_upgradeneeded_event_test((t, open) => {
  let tx;
  open.onupgradeneeded = () => {
    tx = open.transaction;
    throw Error();
  };
  open.onerror = t.step_func_done(() => {
    assert_equals(tx.error.name, 'AbortError');
  });
}, 'Exception in upgradeneeded handler');

fire_upgradeneeded_event_test((t, open) => {
  let tx;
  open.addEventListener('upgradeneeded', () => {
    tx = open.transaction;
    throw Error();
  });
  open.onerror = t.step_func_done(() => {
    assert_equals(tx.error.name, 'AbortError');
  });
}, 'Exception in upgradeneeded listener');

fire_upgradeneeded_event_test((t, open) => {
  let tx;
  open.addEventListener('upgradeneeded', () => {
    // No-op.
  });
  open.addEventListener('upgradeneeded', () => {
    tx = open.transaction;
    throw Error();
  });
  open.onerror = t.step_func_done(() => {
    assert_equals(tx.error.name, 'AbortError');
  });
}, 'Exception in second upgradeneeded listener');

fire_upgradeneeded_event_test((t, open) => {
  let tx;
  let second_listener_called = false;
  open.addEventListener('upgradeneeded', () => {
    open.result.createObjectStore('s');
    throw Error();
  });
  open.addEventListener('upgradeneeded', t.step_func(() => {
    second_listener_called = true;
    tx = open.transaction;
    assert_true(is_transaction_active(tx, 's'),
                'Transaction should be active until dispatch completes');
  }));
  open.onerror = t.step_func_done(() => {
    assert_true(second_listener_called);
    assert_equals(tx.error.name, 'AbortError');
  });
}, 'Exception in first upgradeneeded listener, tx active in second');

</script>
