error_events_abort_transactions_iframe.html (8824B)
1 <!-- 2 Any copyright is dedicated to the Public Domain. 3 http://creativecommons.org/publicdomain/zero/1.0/ 4 --> 5 <html> 6 <head> 7 <title>Indexed Database Property Test</title> 8 9 <script type="text/javascript"> 10 11 let testGenerator = testSteps(); 12 13 function ok(val, message) { 14 val = val ? "true" : "false"; 15 window.parent.postMessage("SimpleTest.ok(" + val + ", '" + message + 16 "');", "*"); 17 } 18 19 function is(a, b, message) { 20 ok(a == b, message); 21 } 22 23 function grabEventAndContinueHandler(event) { 24 testGenerator.next(event); 25 } 26 27 function errorHandler(event) { 28 ok(false, "indexedDB error, code " + event.target.errorCcode); 29 finishTest(); 30 } 31 32 function unexpectedSuccessHandler() { 33 ok(false, "got success when it was not expected!"); 34 finishTest(); 35 } 36 37 function finishTest() { 38 // Let window.onerror have a chance to fire 39 setTimeout(function() { 40 setTimeout(function() { 41 window.parent.postMessage("SimpleTest.finish();", "*"); 42 }, 0); 43 }, 0); 44 } 45 46 window.onerror = function(message) { 47 is(message, "ConstraintError", "Expect a constraint error"); 48 }; 49 50 function* testSteps() { 51 window.parent.SpecialPowers.addPermission("indexedDB", true, document); 52 53 let request = indexedDB.open(window.location.pathname, 1); 54 request.onsuccess = unexpectedSuccessHandler; 55 request.onerror = grabEventAndContinueHandler; 56 request.onupgradeneeded = grabEventAndContinueHandler; 57 let event = yield undefined; 58 59 let db = event.target.result; 60 db.onversionchange = function(event) { 61 event.target.close(); 62 }; 63 64 is(db.version, 1, "Correct version"); 65 is(db.objectStoreNames.length, 0, "Correct objectStoreNames length"); 66 67 let trans = event.target.transaction; 68 69 trans.oncomplete = unexpectedSuccessHandler; 70 trans.onabort = grabEventAndContinueHandler; 71 72 let objectStore = db.createObjectStore("foo"); 73 74 is(db.objectStoreNames.length, 1, "Correct objectStoreNames length"); 75 ok(db.objectStoreNames.contains("foo"), "Has correct objectStore"); 76 77 let originalRequest = request; 78 request = objectStore.add({}, 1); 79 request.onsuccess = grabEventAndContinueHandler; 80 request.onerror = errorHandler; 81 event = yield undefined; 82 83 request = objectStore.add({}, 1); 84 request.onsuccess = unexpectedSuccessHandler; 85 request.onerror = function() { 86 // Don't do anything! ConstraintError is expected in window.onerror. 87 }; 88 event = yield undefined; 89 90 is(event.type, "abort", "Got a transaction abort event"); 91 is(db.version, 0, "Correct version"); 92 is(db.objectStoreNames.length, 0, "Correct objectStoreNames length"); 93 is(trans.error.name, "ConstraintError", "Right error"); 94 ok(trans.error === request.error, "Object identity holds"); 95 is(originalRequest.transaction, trans, "request.transaction should still be set"); 96 97 event = yield undefined; 98 is(event.type, "error", "Got request error event"); 99 is(event.target, originalRequest, "error event has right target"); 100 is(event.target.error.name, "AbortError", "Right error"); 101 is(originalRequest.transaction, null, "request.transaction should now be null"); 102 // Skip the verification of ConstraintError in window.onerror. 103 event.preventDefault(); 104 105 request = indexedDB.open(window.location.pathname, 1); 106 request.onerror = errorHandler; 107 request.onupgradeneeded = grabEventAndContinueHandler; 108 event = yield undefined; 109 110 db = event.target.result; 111 db.onversionchange = function(event) { 112 event.target.close(); 113 }; 114 115 event.target.transaction.oncomplete = grabEventAndContinueHandler; 116 event.target.transaction.onabort = unexpectedSuccessHandler; 117 118 is(db.version, "1", "Correct version"); 119 is(db.objectStoreNames.length, 0, "Correct objectStoreNames length"); 120 121 objectStore = db.createObjectStore("foo"); 122 123 is(db.objectStoreNames.length, 1, "Correct objectStoreNames length"); 124 ok(db.objectStoreNames.contains("foo"), "Has correct objectStore"); 125 126 objectStore.createIndex("baz", "key.path"); 127 objectStore.createIndex("dontDeleteMe", ""); 128 129 is(objectStore.indexNames.length, 2, "Correct indexNames length"); 130 ok(objectStore.indexNames.contains("baz"), "Has correct index"); 131 ok(objectStore.indexNames.contains("dontDeleteMe"), "Has correct index"); 132 133 let objectStoreForDeletion = db.createObjectStore("bar"); 134 135 is(db.objectStoreNames.length, 2, "Correct objectStoreNames length"); 136 ok(db.objectStoreNames.contains("bar"), "Has correct objectStore"); 137 138 objectStoreForDeletion.createIndex("foo", "key.path"); 139 140 is(objectStoreForDeletion.indexNames.length, 1, "Correct indexNames length"); 141 ok(objectStoreForDeletion.indexNames.contains("foo"), "Has correct index"); 142 143 request = objectStore.add({}, 1); 144 request.onsuccess = grabEventAndContinueHandler; 145 request.onerror = errorHandler; 146 event = yield undefined; 147 148 request = objectStore.add({}, 1); 149 request.onsuccess = unexpectedSuccessHandler; 150 request.onerror = function(event) { 151 // Expected, but prevent the abort. 152 event.preventDefault(); 153 }; 154 event = yield undefined; 155 156 is(event.type, "complete", "Got a transaction complete event"); 157 158 is(db.version, "1", "Correct version"); 159 is(db.objectStoreNames.length, 2, "Correct objectStoreNames length"); 160 ok(db.objectStoreNames.contains("foo"), "Has correct objectStore"); 161 ok(db.objectStoreNames.contains("bar"), "Has correct objectStore"); 162 163 request = indexedDB.open(window.location.pathname, 2); 164 request.onerror = errorHandler; 165 request.onupgradeneeded = grabEventAndContinueHandler; 166 event = yield undefined; 167 168 db = event.target.result; 169 db.onversionchange = function(event) { 170 event.target.close(); 171 }; 172 173 trans = event.target.transaction; 174 trans.oncomplete = unexpectedSuccessHandler; 175 176 is(db.version, "2", "Correct version"); 177 is(db.objectStoreNames.length, 2, "Correct objectStoreNames length"); 178 ok(db.objectStoreNames.contains("foo"), "Has correct objectStore"); 179 ok(db.objectStoreNames.contains("bar"), "Has correct objectStore"); 180 181 let createdObjectStore = db.createObjectStore("newlyCreated"); 182 objectStore = trans.objectStore("foo"); 183 let deletedObjectStore = trans.objectStore("bar"); 184 deletedObjectStore.deleteIndex("foo"); 185 db.deleteObjectStore("bar"); 186 187 createdObjectStore.createIndex("newIndex", "key.path"); 188 objectStore.createIndex("newIndex", "key.path"); 189 objectStore.deleteIndex("baz"); 190 191 is(db.objectStoreNames.length, 2, "Correct objectStoreNames length"); 192 ok(db.objectStoreNames.contains("newlyCreated"), "Has correct objectStore"); 193 ok(db.objectStoreNames.contains("foo"), "Has correct objectStore"); 194 195 is(createdObjectStore.indexNames.length, 1, "Correct indexNames length"); 196 ok(createdObjectStore.indexNames.contains("newIndex"), "Has correct index"); 197 198 is(objectStore.indexNames.length, 2, "Correct indexNames length"); 199 ok(objectStore.indexNames.contains("dontDeleteMe"), "Has correct index"); 200 ok(objectStore.indexNames.contains("newIndex"), "Has correct index"); 201 202 // ConstraintError is expected in window.onerror. 203 objectStore.add({}, 1); 204 trans.onabort = grabEventAndContinueHandler; 205 206 event = yield undefined; 207 208 // Test that the world has been restored. 209 is(db.version, "1", "Correct version"); 210 is(db.objectStoreNames.length, 2, "Correct objectStoreNames length"); 211 ok(db.objectStoreNames.contains("foo"), "Has correct objectStore"); 212 ok(db.objectStoreNames.contains("bar"), "Has correct objectStore"); 213 214 is(objectStore.indexNames.length, 2, "Correct indexNames length"); 215 ok(objectStore.indexNames.contains("dontDeleteMe"), "Has correct index"); 216 ok(objectStore.indexNames.contains("baz"), "Has correct index"); 217 218 is(createdObjectStore.indexNames.length, 0, "Correct indexNames length"); 219 220 is(deletedObjectStore.indexNames.length, 1, "Correct indexNames length"); 221 ok(deletedObjectStore.indexNames.contains("foo"), "Has correct index"); 222 223 request.onerror = grabEventAndContinueHandler; 224 225 event = yield undefined; 226 is(event.type, "error", "Got request error event"); 227 is(event.target.error.name, "AbortError", "Right error"); 228 // Skip the verification of ConstraintError in window.onerror. 229 event.preventDefault(); 230 231 finishTest(); 232 } 233 </script> 234 235 </head> 236 237 <body onload="testGenerator.next();"></body> 238 239 </html>