diff options
Diffstat (limited to 'testing/web-platform/tests/IndexedDB/request-abort-ordering.html')
-rw-r--r-- | testing/web-platform/tests/IndexedDB/request-abort-ordering.html | 83 |
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> |