|
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" src="/tests/SimpleTest/SimpleTest.js"></script> |
|
10 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> |
|
11 |
|
12 <script type="text/javascript;version=1.7"> |
|
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.send(event); |
|
27 } |
|
28 |
|
29 function errorHandler(event) { |
|
30 ok(false, "indexedDB error, code " + event.target.error.name); |
|
31 finishTest(); |
|
32 } |
|
33 |
|
34 function unexpectedSuccessHandler(event) { |
|
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.close(); |
|
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 // Test 1: Throwing an exception in an upgradeneeded handler should |
|
55 // abort the versionchange transaction and fire an error at the request. |
|
56 let request = indexedDB.open(window.location.pathname, 1); |
|
57 request.onerror = errorHandler; |
|
58 request.onsuccess = unexpectedSuccessHandler; |
|
59 request.onupgradeneeded = function () { |
|
60 let transaction = request.transaction; |
|
61 transaction.oncomplete = unexpectedSuccessHandler; |
|
62 transaction.onabort = grabEventAndContinueHandler |
|
63 throw "STOP"; |
|
64 }; |
|
65 |
|
66 let event = yield undefined; |
|
67 is(event.type, "abort", |
|
68 "Throwing during an upgradeneeded event should abort the transaction."); |
|
69 is(event.target.error.name, "AbortError", "Got AbortError object"); |
|
70 |
|
71 request.onerror = grabEventAndContinueHandler; |
|
72 event = yield undefined; |
|
73 |
|
74 is(event.type, "error", |
|
75 "Throwing during an upgradeneeded event should fire an error."); |
|
76 |
|
77 // Test 2: Throwing during a request's success handler should abort the |
|
78 // transaction. |
|
79 let request = indexedDB.open(window.location.pathname, 1); |
|
80 request.onerror = errorHandler; |
|
81 request.onblocked = errorHandler; |
|
82 request.onupgradeneeded = grabEventAndContinueHandler; |
|
83 request.onsuccess = unexpectedSuccessHandler; |
|
84 let openrequest = request; |
|
85 let event = yield undefined; |
|
86 |
|
87 request.onupgradeneeded = unexpectedSuccessHandler; |
|
88 |
|
89 let db = event.target.result; |
|
90 db.onerror = function(event) { |
|
91 event.preventDefault(); |
|
92 }; |
|
93 |
|
94 event.target.transaction.oncomplete = unexpectedSuccessHandler; |
|
95 event.target.transaction.onabort = grabEventAndContinueHandler; |
|
96 |
|
97 is(db.version, 1, "Correct version"); |
|
98 is(db.objectStoreNames.length, 0, "Correct objectStoreNames length"); |
|
99 |
|
100 let objectStore = db.createObjectStore("foo"); |
|
101 |
|
102 is(db.objectStoreNames.length, 1, "Correct objectStoreNames length"); |
|
103 ok(db.objectStoreNames.contains("foo"), "Has correct objectStore"); |
|
104 |
|
105 request = objectStore.add({}, 1); |
|
106 request.onsuccess = function(event) { |
|
107 throw "foo"; |
|
108 }; |
|
109 |
|
110 event = yield undefined; |
|
111 |
|
112 is(event.type, "abort", "Got transaction abort event"); |
|
113 is(event.target.error.name, "AbortError", "Got AbortError object"); |
|
114 openrequest.onerror = grabEventAndContinueHandler; |
|
115 |
|
116 event = yield undefined; |
|
117 |
|
118 is(event.type, "error", "Got IDBOpenDBRequest error event"); |
|
119 is(event.target, openrequest, "Right event target"); |
|
120 is(event.target.error.name, "AbortError", "Right error name"); |
|
121 |
|
122 // Test 3: Throwing during a request's error handler should abort the |
|
123 // transaction, even if preventDefault is called on the error event. |
|
124 let request = indexedDB.open(window.location.pathname, 1); |
|
125 request.onerror = errorHandler; |
|
126 request.onblocked = errorHandler; |
|
127 request.onupgradeneeded = grabEventAndContinueHandler; |
|
128 request.onsuccess = unexpectedSuccessHandler; |
|
129 let openrequest = request; |
|
130 let event = yield undefined; |
|
131 |
|
132 request.onupgradeneeded = unexpectedSuccessHandler; |
|
133 |
|
134 let db = event.target.result; |
|
135 db.onerror = function(event) { |
|
136 event.preventDefault(); |
|
137 }; |
|
138 |
|
139 event.target.transaction.oncomplete = unexpectedSuccessHandler; |
|
140 event.target.transaction.onabort = grabEventAndContinueHandler; |
|
141 |
|
142 is(db.version, 1, "Correct version"); |
|
143 is(db.objectStoreNames.length, 0, "Correct objectStoreNames length"); |
|
144 |
|
145 let objectStore = db.createObjectStore("foo"); |
|
146 |
|
147 is(db.objectStoreNames.length, 1, "Correct objectStoreNames length"); |
|
148 ok(db.objectStoreNames.contains("foo"), "Has correct objectStore"); |
|
149 |
|
150 request = objectStore.add({}, 1); |
|
151 request.onerror = errorHandler; |
|
152 request = objectStore.add({}, 1); |
|
153 request.onsuccess = unexpectedSuccessHandler; |
|
154 request.onerror = function (event) { |
|
155 event.preventDefault(); |
|
156 throw "STOP"; |
|
157 }; |
|
158 |
|
159 event = yield undefined; |
|
160 |
|
161 is(event.type, "abort", "Got transaction abort event"); |
|
162 is(event.target.error.name, "AbortError", "Got AbortError object"); |
|
163 openrequest.onerror = grabEventAndContinueHandler; |
|
164 |
|
165 event = yield undefined; |
|
166 |
|
167 is(event.type, "error", "Got IDBOpenDBRequest error event"); |
|
168 is(event.target, openrequest, "Right event target"); |
|
169 is(event.target.error.name, "AbortError", "Right error name"); |
|
170 |
|
171 finishTest(); |
|
172 yield undefined; |
|
173 } |
|
174 </script> |
|
175 |
|
176 </head> |
|
177 |
|
178 <body onload="testGenerator.next();"></body> |
|
179 |
|
180 </html> |