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