request-abort-ordering.any.js (3107B)
1 // META: title=IndexedDB: request abort events are delivered in order 2 // META: global=window,worker 3 // META: script=resources/support-promises.js 4 // META: script=resources/support.js 5 6 // Spec: https://w3c.github.io/IndexedDB/#abort-transaction 7 8 'use strict'; 9 10 promise_test(testCase => { 11 let requests; 12 13 return createDatabase( 14 testCase, 15 (database, transaction) => { 16 createBooksStore(testCase, database); 17 }) 18 .then(database => { 19 const transaction = database.transaction(['books'], 'readwrite'); 20 const store = transaction.objectStore('books'); 21 const index = store.index('by_author'); 22 const cursorRequest = store.openCursor(IDBKeyRange.lowerBound(0)); 23 24 return new Promise((resolve, reject) => { 25 cursorRequest.onerror = testCase.step_func(event => { 26 event.preventDefault(); 27 reject(cursorRequest.error); 28 }); 29 30 cursorRequest.onsuccess = testCase.step_func(() => { 31 const cursor = cursorRequest.result; 32 requests = [ 33 () => store.get(123456), 34 () => index.get('Fred'), 35 () => store.count(), 36 () => index.count(), 37 () => 38 store.put({title: 'Bedrock II', author: 'Barney', isbn: 987}), 39 () => store.getAll(), 40 () => index.getAll(), 41 () => store.get(999999), 42 () => index.get('Nobody'), 43 () => store.openCursor(IDBKeyRange.lowerBound(0)), 44 () => index.openCursor(IDBKeyRange.lowerBound('')), 45 () => { 46 cursor.continue(); 47 return cursorRequest; 48 }, 49 ]; 50 51 const results = []; 52 const promises = []; 53 for (let i = 0; i < requests.length; ++i) { 54 promises.push(new Promise((resolve, reject) => { 55 const requestId = i; 56 const request = requests[i](store); 57 request.onsuccess = testCase.step_func(() => { 58 reject(new Error( 59 'IDB requests should not succeed after transaction abort')); 60 }); 61 request.onerror = testCase.step_func(event => { 62 event.preventDefault(); 63 results.push([requestId, request.error]); 64 resolve(); 65 }); 66 })); 67 }; 68 transaction.abort(); 69 resolve(Promise.all(promises).then(() => results)); 70 }); 71 }); 72 }) 73 .then(results => { 74 assert_equals( 75 results.length, requests.length, 76 'Promise.all should resolve after all sub-promises resolve'); 77 for (let i = 0; i < requests.length; ++i) { 78 assert_equals( 79 results[i][0], i, 'error event order should match request order'); 80 assert_equals( 81 results[i][1].name, 'AbortError', 82 'transaction aborting should result in AbortError on all requests'); 83 } 84 }); 85 });