|
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;version=1.7"> |
|
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.send(event); |
|
25 } |
|
26 |
|
27 function errorHandler(event) { |
|
28 ok(false, "indexedDB error, code " + event.target.errorCcode); |
|
29 finishTest(); |
|
30 } |
|
31 |
|
32 function unexpectedSuccessHandler(event) { |
|
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 testGenerator.close(); |
|
42 window.parent.postMessage("SimpleTest.finish();", "*"); |
|
43 }, 0); |
|
44 }, 0); |
|
45 } |
|
46 |
|
47 window.onerror = function(message, filename, lineno) { |
|
48 is(message, "ConstraintError", "Expect a constraint error"); |
|
49 }; |
|
50 |
|
51 function testSteps() { |
|
52 let request = indexedDB.open(window.location.pathname, 1); |
|
53 request.onsuccess = unexpectedSuccessHandler; |
|
54 request.onerror = grabEventAndContinueHandler; |
|
55 request.onupgradeneeded = grabEventAndContinueHandler; |
|
56 let event = yield undefined; |
|
57 |
|
58 let db = event.target.result; |
|
59 |
|
60 is(db.version, 1, "Correct version"); |
|
61 is(db.objectStoreNames.length, 0, "Correct objectStoreNames length"); |
|
62 |
|
63 let trans = event.target.transaction; |
|
64 |
|
65 trans.oncomplete = unexpectedSuccessHandler; |
|
66 trans.onabort = grabEventAndContinueHandler; |
|
67 |
|
68 let objectStore = db.createObjectStore("foo"); |
|
69 |
|
70 is(db.objectStoreNames.length, 1, "Correct objectStoreNames length"); |
|
71 ok(db.objectStoreNames.contains("foo"), "Has correct objectStore"); |
|
72 |
|
73 let originalRequest = request; |
|
74 request = objectStore.add({}, 1); |
|
75 request.onsuccess = grabEventAndContinueHandler; |
|
76 request.onerror = errorHandler; |
|
77 event = yield undefined; |
|
78 |
|
79 request = objectStore.add({}, 1); |
|
80 request.onsuccess = unexpectedSuccessHandler; |
|
81 request.onerror = function(event) { |
|
82 // Don't do anything! We want this error. |
|
83 } |
|
84 event = yield undefined; |
|
85 |
|
86 is(event.type, "abort", "Got a transaction abort event"); |
|
87 is(db.version, 0, "Correct version"); |
|
88 is(db.objectStoreNames.length, 0, "Correct objectStoreNames length"); |
|
89 is(trans.error.name, "ConstraintError", "Right error"); |
|
90 ok(trans.error === request.error, "Object identity holds"); |
|
91 is(originalRequest.transaction, trans, "request.transaction should still be set"); |
|
92 |
|
93 event = yield undefined; |
|
94 is(event.type, "error", "Got request error event"); |
|
95 is(event.target, originalRequest, "error event has right target"); |
|
96 is(event.target.error.name, "ConstraintError", "Right error"); |
|
97 is(originalRequest.transaction, null, "request.transaction should now be null"); |
|
98 |
|
99 let request = indexedDB.open(window.location.pathname, 1); |
|
100 request.onerror = errorHandler; |
|
101 request.onupgradeneeded = grabEventAndContinueHandler; |
|
102 let event = yield undefined; |
|
103 |
|
104 let db = event.target.result; |
|
105 |
|
106 event.target.transaction.oncomplete = grabEventAndContinueHandler; |
|
107 event.target.transaction.onabort = unexpectedSuccessHandler; |
|
108 |
|
109 is(db.version, "1", "Correct version"); |
|
110 is(db.objectStoreNames.length, 0, "Correct objectStoreNames length"); |
|
111 |
|
112 let objectStore = db.createObjectStore("foo"); |
|
113 |
|
114 is(db.objectStoreNames.length, 1, "Correct objectStoreNames length"); |
|
115 ok(db.objectStoreNames.contains("foo"), "Has correct objectStore"); |
|
116 |
|
117 objectStore.createIndex("baz", "key.path"); |
|
118 objectStore.createIndex("dontDeleteMe", ""); |
|
119 |
|
120 is(objectStore.indexNames.length, 2, "Correct indexNames length"); |
|
121 ok(objectStore.indexNames.contains("baz"), "Has correct index"); |
|
122 ok(objectStore.indexNames.contains("dontDeleteMe"), "Has correct index"); |
|
123 |
|
124 let objectStoreForDeletion = db.createObjectStore("bar"); |
|
125 |
|
126 is(db.objectStoreNames.length, 2, "Correct objectStoreNames length"); |
|
127 ok(db.objectStoreNames.contains("bar"), "Has correct objectStore"); |
|
128 |
|
129 objectStoreForDeletion.createIndex("foo", "key.path"); |
|
130 |
|
131 is(objectStoreForDeletion.indexNames.length, 1, "Correct indexNames length"); |
|
132 ok(objectStoreForDeletion.indexNames.contains("foo"), "Has correct index"); |
|
133 |
|
134 request = objectStore.add({}, 1); |
|
135 request.onsuccess = grabEventAndContinueHandler; |
|
136 request.onerror = errorHandler; |
|
137 event = yield undefined; |
|
138 |
|
139 request = objectStore.add({}, 1); |
|
140 request.onsuccess = unexpectedSuccessHandler; |
|
141 request.onerror = function(event) { |
|
142 // Expected, but prevent the abort. |
|
143 event.preventDefault(); |
|
144 } |
|
145 event = yield undefined; |
|
146 |
|
147 is(event.type, "complete", "Got a transaction complete event"); |
|
148 |
|
149 is(db.version, "1", "Correct version"); |
|
150 is(db.objectStoreNames.length, 2, "Correct objectStoreNames length"); |
|
151 ok(db.objectStoreNames.contains("foo"), "Has correct objectStore"); |
|
152 ok(db.objectStoreNames.contains("bar"), "Has correct objectStore"); |
|
153 |
|
154 db.close(); |
|
155 |
|
156 let request = indexedDB.open(window.location.pathname, 2); |
|
157 request.onerror = errorHandler; |
|
158 request.onupgradeneeded = grabEventAndContinueHandler; |
|
159 let event = yield undefined; |
|
160 |
|
161 let db = event.target.result; |
|
162 |
|
163 let trans = event.target.transaction; |
|
164 trans.oncomplete = unexpectedSuccessHandler; |
|
165 |
|
166 is(db.version, "2", "Correct version"); |
|
167 is(db.objectStoreNames.length, 2, "Correct objectStoreNames length"); |
|
168 ok(db.objectStoreNames.contains("foo"), "Has correct objectStore"); |
|
169 ok(db.objectStoreNames.contains("bar"), "Has correct objectStore"); |
|
170 |
|
171 let createdObjectStore = db.createObjectStore("newlyCreated"); |
|
172 let objectStore = trans.objectStore("foo"); |
|
173 let deletedObjectStore = trans.objectStore("bar"); |
|
174 deletedObjectStore.deleteIndex("foo"); |
|
175 db.deleteObjectStore("bar"); |
|
176 |
|
177 createdObjectStore.createIndex("newIndex", "key.path"); |
|
178 objectStore.createIndex("newIndex", "key.path"); |
|
179 objectStore.deleteIndex("baz"); |
|
180 |
|
181 is(db.objectStoreNames.length, 2, "Correct objectStoreNames length"); |
|
182 ok(db.objectStoreNames.contains("newlyCreated"), "Has correct objectStore"); |
|
183 ok(db.objectStoreNames.contains("foo"), "Has correct objectStore"); |
|
184 |
|
185 is(createdObjectStore.indexNames.length, 1, "Correct indexNames length"); |
|
186 ok(createdObjectStore.indexNames.contains("newIndex"), "Has correct index"); |
|
187 |
|
188 is(objectStore.indexNames.length, 2, "Correct indexNames length"); |
|
189 ok(objectStore.indexNames.contains("dontDeleteMe"), "Has correct index"); |
|
190 ok(objectStore.indexNames.contains("newIndex"), "Has correct index"); |
|
191 |
|
192 objectStore.add({}, 1); |
|
193 trans.onabort = grabEventAndContinueHandler; |
|
194 |
|
195 event = yield undefined; |
|
196 |
|
197 // Test that the world has been restored. |
|
198 is(db.version, "1", "Correct version"); |
|
199 is(db.objectStoreNames.length, 2, "Correct objectStoreNames length"); |
|
200 ok(db.objectStoreNames.contains("foo"), "Has correct objectStore"); |
|
201 ok(db.objectStoreNames.contains("bar"), "Has correct objectStore"); |
|
202 |
|
203 is(objectStore.indexNames.length, 2, "Correct indexNames length"); |
|
204 ok(objectStore.indexNames.contains("dontDeleteMe"), "Has correct index"); |
|
205 ok(objectStore.indexNames.contains("baz"), "Has correct index"); |
|
206 |
|
207 is(createdObjectStore.indexNames.length, 0, "Correct indexNames length"); |
|
208 |
|
209 is(deletedObjectStore.indexNames.length, 1, "Correct indexNames length"); |
|
210 ok(deletedObjectStore.indexNames.contains("foo"), "Has correct index"); |
|
211 |
|
212 request.onerror = grabEventAndContinueHandler; |
|
213 |
|
214 event = yield undefined; |
|
215 |
|
216 finishTest(); |
|
217 yield undefined; |
|
218 } |
|
219 </script> |
|
220 |
|
221 </head> |
|
222 |
|
223 <body onload="testGenerator.next();"></body> |
|
224 |
|
225 </html> |