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