exceptions_in_events_iframe.html (6006B)
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 src="/tests/SimpleTest/SimpleTest.js"></script> 10 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> 11 12 <script type="text/javascript"> 13 let testGenerator = testSteps(); 14 15 function ok(val, message) { 16 val = val ? "true" : "false"; 17 window.parent.postMessage("SimpleTest.ok(" + val + ", '" + message + 18 "');", "*"); 19 } 20 21 function is(a, b, message) { 22 ok(a == b, message); 23 } 24 25 function grabEventAndContinueHandler(event) { 26 testGenerator.next(event); 27 } 28 29 function errorHandler(event) { 30 ok(false, "indexedDB error, code " + event.target.error.name); 31 finishTest(); 32 } 33 34 function unexpectedSuccessHandler() { 35 ok(false, "got success when it was not expected!"); 36 finishTest(); 37 } 38 39 function finishTest() { 40 // Let window.onerror have a chance to fire 41 setTimeout(function() { 42 setTimeout(function() { 43 testGenerator.return(); 44 window.parent.postMessage("SimpleTest.finish();", "*"); 45 }, 0); 46 }, 0); 47 } 48 49 window.onerror = function() { 50 return false; 51 }; 52 53 function* testSteps() { 54 window.parent.SpecialPowers.addPermission("indexedDB", true, document); 55 56 // Test 1: Throwing an exception in an upgradeneeded handler should 57 // abort the versionchange transaction and fire an error at the request. 58 let request = indexedDB.open(window.location.pathname, 1); 59 request.onerror = errorHandler; 60 request.onsuccess = unexpectedSuccessHandler; 61 request.onupgradeneeded = function() { 62 let transaction = request.transaction; 63 transaction.oncomplete = unexpectedSuccessHandler; 64 transaction.onabort = grabEventAndContinueHandler; 65 throw new Error("STOP"); 66 }; 67 68 let event = yield undefined; 69 is(event.type, "abort", 70 "Throwing during an upgradeneeded event should abort the transaction."); 71 is(event.target.error.name, "AbortError", "Got AbortError object"); 72 73 request.onerror = grabEventAndContinueHandler; 74 event = yield undefined; 75 76 is(event.type, "error", 77 "Throwing during an upgradeneeded event should fire an error."); 78 79 // Test 2: Throwing during a request's success handler should abort the 80 // transaction. 81 request = indexedDB.open(window.location.pathname, 1); 82 request.onerror = errorHandler; 83 request.onblocked = errorHandler; 84 request.onupgradeneeded = grabEventAndContinueHandler; 85 request.onsuccess = unexpectedSuccessHandler; 86 let openrequest = request; 87 event = yield undefined; 88 89 request.onupgradeneeded = unexpectedSuccessHandler; 90 91 let db = event.target.result; 92 db.onerror = function(event) { 93 event.preventDefault(); 94 }; 95 96 event.target.transaction.oncomplete = unexpectedSuccessHandler; 97 event.target.transaction.onabort = grabEventAndContinueHandler; 98 99 is(db.version, 1, "Correct version"); 100 is(db.objectStoreNames.length, 0, "Correct objectStoreNames length"); 101 102 let objectStore = db.createObjectStore("foo"); 103 104 is(db.objectStoreNames.length, 1, "Correct objectStoreNames length"); 105 ok(db.objectStoreNames.contains("foo"), "Has correct objectStore"); 106 107 request = objectStore.add({}, 1); 108 request.onsuccess = function() { 109 throw new Error("foo"); 110 }; 111 112 event = yield undefined; 113 114 is(event.type, "abort", "Got transaction abort event"); 115 is(event.target.error.name, "AbortError", "Got AbortError object"); 116 openrequest.onerror = grabEventAndContinueHandler; 117 118 event = yield undefined; 119 120 is(event.type, "error", "Got IDBOpenDBRequest error event"); 121 is(event.target, openrequest, "Right event target"); 122 is(event.target.error.name, "AbortError", "Right error name"); 123 124 // Test 3: Throwing during a request's error handler should abort the 125 // transaction, even if preventDefault is called on the error event. 126 request = indexedDB.open(window.location.pathname, 1); 127 request.onerror = errorHandler; 128 request.onblocked = errorHandler; 129 request.onupgradeneeded = grabEventAndContinueHandler; 130 request.onsuccess = unexpectedSuccessHandler; 131 openrequest = request; 132 event = yield undefined; 133 134 request.onupgradeneeded = unexpectedSuccessHandler; 135 136 db = event.target.result; 137 db.onerror = function(event) { 138 event.preventDefault(); 139 }; 140 141 event.target.transaction.oncomplete = unexpectedSuccessHandler; 142 event.target.transaction.onabort = grabEventAndContinueHandler; 143 144 is(db.version, 1, "Correct version"); 145 is(db.objectStoreNames.length, 0, "Correct objectStoreNames length"); 146 147 objectStore = db.createObjectStore("foo"); 148 149 is(db.objectStoreNames.length, 1, "Correct objectStoreNames length"); 150 ok(db.objectStoreNames.contains("foo"), "Has correct objectStore"); 151 152 request = objectStore.add({}, 1); 153 request.onerror = errorHandler; 154 request = objectStore.add({}, 1); 155 request.onsuccess = unexpectedSuccessHandler; 156 request.onerror = function(event) { 157 event.preventDefault(); 158 throw new Error("STOP"); 159 }; 160 161 event = yield undefined; 162 163 is(event.type, "abort", "Got transaction abort event"); 164 is(event.target.error.name, "AbortError", "Got AbortError object"); 165 openrequest.onerror = grabEventAndContinueHandler; 166 167 event = yield undefined; 168 169 is(event.type, "error", "Got IDBOpenDBRequest error event"); 170 is(event.target, openrequest, "Right event target"); 171 is(event.target.error.name, "AbortError", "Right error name"); 172 173 finishTest(); 174 yield undefined; 175 } 176 </script> 177 178 </head> 179 180 <body onload="testGenerator.next();"></body> 181 182 </html>