summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/IndexedDB/request-abort-ordering.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/IndexedDB/request-abort-ordering.html')
-rw-r--r--testing/web-platform/tests/IndexedDB/request-abort-ordering.html83
1 files changed, 83 insertions, 0 deletions
diff --git a/testing/web-platform/tests/IndexedDB/request-abort-ordering.html b/testing/web-platform/tests/IndexedDB/request-abort-ordering.html
new file mode 100644
index 0000000000..4374d8de70
--- /dev/null
+++ b/testing/web-platform/tests/IndexedDB/request-abort-ordering.html
@@ -0,0 +1,83 @@
+<!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>