<!DOCTYPE html>
<title>IndexedDB: IDBDatabase createObjectStore() Exception Ordering</title>
<meta charset=utf-8>
<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbdatabase-createobjectstore">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support.js"></script>
<script>

indexeddb_test(
  (t, db, txn, rq) => {
    db.createObjectStore('s');

    // Acknowledge the error, to prevent window.error from firing in
    // browsers that implement that.
    rq.onerror = e => { e.preventDefault(); };

    txn.onabort = () => {
      setTimeout(t.step_func(() => {
        assert_throws(
          'InvalidStateError', () => { db.createObjectStore('s2'); },
          '"running an upgrade transaction" check (InvalidStateError) ' +
          'should precede "not active" check (TransactionInactiveError)');

        t.done();
      }), 0);
    };
    txn.abort();
  },
  (t, db) => { t.assert_unreached('open should fail'); },
  'IDBDatabase.createObjectStore exception order: ' +
  'InvalidStateError vs. TransactionInactiveError',
  { upgrade_will_abort: true }
);

indexeddb_test(
  (t, db, txn) => {
    const store = db.createObjectStore('s');

    txn.abort();

    assert_throws(
      'TransactionInactiveError',
      () => { db.createObjectStore('s2', {keyPath: '-invalid-'}); },
      '"not active" check (TransactionInactiveError) should precede ' +
      '"valid key path" check (SyntaxError)');

    t.done();
  },
  (t, db) => { t.assert_unreached('open should fail'); },
  'IDBDatabase.createObjectStore exception order: ' +
  'TransactionInactiveError vs. SyntaxError',
  { upgrade_will_abort: true }
);

indexeddb_test(
  (t, db) => {
    db.createObjectStore('s');
    assert_throws('SyntaxError', () => {
      db.createObjectStore('s', {keyPath: 'not a valid key path'});
    }, '"Invalid key path" check (SyntaxError) should precede ' +
       '"duplicate store name" check (ConstraintError)');
    t.done();
  },
  (t, db) => {},
  'IDBDatabase.createObjectStore exception order: ' +
  'SyntaxError vs. ConstraintError'
);

indexeddb_test(
  (t, db) => {
    db.createObjectStore('s');
    assert_throws('ConstraintError', () => {
      db.createObjectStore('s', {autoIncrement: true, keyPath: ''});
    }, '"already exists" check (ConstraintError) should precede ' +
       '"autoIncrement vs. keyPath" check (InvalidAccessError)');
    t.done();
  },
  (t, db) => {},
  'IDBDatabase.createObjectStore exception order: ' +
  'ConstraintError vs. InvalidAccessError'
);

</script>
