OLD | NEW |
(Empty) | |
| 1 <!doctype html> |
| 2 <title>IndexedDB: committed versionchange transaction lifecycle</title> |
| 3 <link rel="help" |
| 4 href="https://w3c.github.io/IndexedDB/#upgrade-transaction-steps"> |
| 5 <link rel="help" |
| 6 href="https://w3c.github.io/IndexedDB/#dom-idbdatabase-createobjectstore"> |
| 7 <link rel="help" |
| 8 href="https://w3c.github.io/IndexedDB/#dom-idbdatabase-deleteobjectstore"> |
| 9 <link rel="author" href="pwnall@chromium.org" title="Victor Costan"> |
| 10 <script src="../../resources/testharness.js"></script> |
| 11 <script src="../../resources/testharnessreport.js"></script> |
| 12 <script src="resources/support-promises.js"></script> |
| 13 <script> |
| 14 'use strict'; |
| 15 |
| 16 promise_test(t => { |
| 17 let timeoutPromise = null, completePromise = null; |
| 18 return createDatabase(t, database => { |
| 19 createBooksStore(t, database); |
| 20 }).then(database => { |
| 21 database.close(); |
| 22 }).then(() => migrateDatabase(t, 2, (database, transaction, request) => { |
| 23 // Queue I/O operations to make sure the transaction does not complete |
| 24 // before setTimeout's callback is called. |
| 25 createNotBooksStore(t, database); |
| 26 const store = transaction.objectStore('books'); |
| 27 for (let i = 0; i < 1000; ++i) |
| 28 store.put({ title: 'Bedrock Nights ' + i, author: 'Barney' }); |
| 29 |
| 30 let completeFired = false; |
| 31 completePromise = new Promise((resolve, reject) => { |
| 32 transaction.addEventListener('complete', () => { |
| 33 completeFired = true; |
| 34 resolve(); |
| 35 }, false); |
| 36 }); |
| 37 |
| 38 timeoutPromise = new Promise((resolve, reject) => { |
| 39 setTimeout(() => { |
| 40 const testStepPromise = new Promise((resolve, reject) => { |
| 41 assert_false( |
| 42 completeFired, |
| 43 'The complete event should fire after setTimeout expires'); |
| 44 assert_equals( |
| 45 request.transaction, transaction, |
| 46 "The open request's transaction should be reset after " + |
| 47 'oncomplete'); |
| 48 assert_throws( |
| 49 'TransactionInactiveError', |
| 50 () => { database.createObjectStore('books2'); }, |
| 51 'createObjectStore exception should reflect that the ' + |
| 52 'transaction is still running'); |
| 53 assert_throws( |
| 54 'TransactionInactiveError', |
| 55 () => { database.deleteObjectStore('books'); }, |
| 56 'deleteObjectStore exception should reflect that the ' + |
| 57 'transaction is still running'); |
| 58 resolve(); |
| 59 }); |
| 60 resolve(testStepPromise); |
| 61 }, 0); |
| 62 }); |
| 63 })).then(database => { |
| 64 database.close(); |
| 65 return Promise.all([timeoutPromise, completePromise]); |
| 66 }); |
| 67 }, 'in a setTimeout(0) callback after the transaction requests are performed'); |
| 68 |
| 69 promise_test(t => { |
| 70 let completePromise = null; |
| 71 return createDatabase(t, database => { |
| 72 createBooksStore(t, database); |
| 73 }).then(database => { |
| 74 database.close(); |
| 75 }).then(() => migrateDatabase(t, 2, (database, transaction, request) => { |
| 76 completePromise = new Promise((resolve, reject) => { |
| 77 transaction.addEventListener('complete', () => { |
| 78 const testStepPromise = new Promise((resolve, reject) => { |
| 79 assert_equals( |
| 80 request.transaction, transaction, |
| 81 "The open request's transaction should be reset after " + |
| 82 'oncomplete'); |
| 83 assert_throws( |
| 84 'InvalidStateError', |
| 85 () => { database.createObjectStore('books2'); }, |
| 86 'createObjectStore exception should reflect that the ' + |
| 87 'transaction is no longer running'); |
| 88 assert_throws( |
| 89 'InvalidStateError', |
| 90 () => { database.deleteObjectStore('books'); }, |
| 91 'deleteObjectStore exception should reflect that the ' + |
| 92 'transaction is no longer running'); |
| 93 resolve(); |
| 94 }); |
| 95 resolve(testStepPromise); |
| 96 }, false); |
| 97 }); |
| 98 })).then(database => { |
| 99 database.close(); |
| 100 return completePromise; |
| 101 }); |
| 102 }, 'while the complete event is fired'); |
| 103 |
| 104 promise_test(t => { |
| 105 let completePromise = null; |
| 106 return createDatabase(t, database => { |
| 107 createBooksStore(t, database); |
| 108 }).then(database => { |
| 109 database.close(); |
| 110 }).then(() => migrateDatabase(t, 2, (database, transaction, request) => { |
| 111 completePromise = new Promise((resolve, reject) => { |
| 112 transaction.addEventListener('complete', () => { |
| 113 const timeoutPromise = new Promise((resolve, reject) => { |
| 114 setTimeout(() => { |
| 115 const testStepPromise = new Promise((resolve, reject) => { |
| 116 assert_equals( |
| 117 request.transaction, null, |
| 118 "The open request's transaction should be reset after " + |
| 119 'oncomplete microtasks'); |
| 120 assert_throws( |
| 121 'InvalidStateError', |
| 122 () => { database.createObjectStore('books2'); }, |
| 123 'createObjectStore exception should reflect that the ' + |
| 124 'transaction is no longer running'); |
| 125 assert_throws( |
| 126 'InvalidStateError', |
| 127 () => { database.deleteObjectStore('books'); }, |
| 128 'deleteObjectStore exception should reflect that the ' + |
| 129 'transaction is no longer running'); |
| 130 resolve(); |
| 131 }); |
| 132 resolve(testStepPromise); |
| 133 }, 0); |
| 134 }); |
| 135 resolve(timeoutPromise); |
| 136 }, false); |
| 137 }); |
| 138 })).then(database => { |
| 139 database.close(); |
| 140 return completePromise; |
| 141 }); |
| 142 }, 'in a setTimeout(0) callback after the complete event is fired'); |
| 143 |
| 144 </script> |
OLD | NEW |