<!doctype html>
<meta charset="utf8">
<meta name="timeout" content="long">
<title>IndexedDB: request abort events are delivered in order</title>
<link rel="help" href="https://w3c.github.io/IndexedDB/#abort-transaction">
<link rel="author" href="pwnall@chromium.org" title="Victor Costan">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/support-promises.js"></script>
<script>
'use strict';

promise_test(testCase => {
  let requests;

  return createDatabase(testCase, (database, transaction) => {
    createBooksStore(testCase, database);
  }).then(database => {
    const transaction = database.transaction(['books'], 'readwrite');
    const store = transaction.objectStore('books');
    const index = store.index('by_author');
    const cursorRequest = store.openCursor(IDBKeyRange.lowerBound(0));

    return new Promise((resolve, reject) => {
      cursorRequest.onerror = testCase.step_func(event => {
        event.preventDefault();
        reject(cursorRequest.error);
      });

      cursorRequest.onsuccess = testCase.step_func(() => {
        const cursor = cursorRequest.result;
        requests = [
          () => store.get(123456),
          () => index.get('Fred'),
          () => store.count(),
          () => index.count(),
          () => store.put({title: 'Bedrock II', author: 'Barney', isbn: 987 }),
          () => store.getAll(),
          () => index.getAll(),
          () => store.get(999999),
          () => index.get('Nobody'),
          () => store.openCursor(IDBKeyRange.lowerBound(0)),
          () => index.openCursor(IDBKeyRange.lowerBound('')),
          () => { cursor.continue(); return cursorRequest; },
        ];

        const results = [];
        const promises = [];
        for (let i = 0; i < requests.length; ++i) {
          promises.push(new Promise((resolve, reject) => {
            const requestId = i;
            const request = requests[i](store);
            request.onsuccess = testCase.step_func(() => {
              reject(new Error(
                  'IDB requests should not succeed after transaction abort'));
            });
            request.onerror = testCase.step_func(event => {
              event.preventDefault();
              results.push([requestId, request.error]);
              resolve();
            });
          }));
        };
        transaction.abort();
        resolve(Promise.all(promises).then(() => results));
      });
    });
  }).then(results => {
    assert_equals(
        results.length, requests.length,
        'Promise.all should resolve after all sub-promises resolve');
    for (let i = 0; i < requests.length; ++i) {
      assert_equals(
          results[i][0], i,
          'error event order should match request order');
      assert_equals(
          results[i][1].name, 'AbortError',
          'transaction aborting should result in AbortError on all requests');
    }
  });
});

</script>
