2 * Any copyright is dedicated to the Public Domain.
3 * http://creativecommons.org/publicdomain/zero/1.0/
6 var testGenerator = testSteps();
8 function* testSteps() {
9 function testInvalidStateError(aDb, aTxn) {
11 info("The db shall become invalid after closed.");
12 aDb.transaction("store");
13 ok(false, "InvalidStateError shall be thrown.");
15 ok(e instanceof DOMException, "got a database exception");
16 is(e.name, "InvalidStateError", "correct error");
20 info("The txn shall become invalid after closed.");
21 aTxn.objectStore("store");
22 ok(false, "InvalidStateError shall be thrown.");
24 ok(e instanceof DOMException, "got a database exception");
25 is(e.name, "InvalidStateError", "correct error");
29 const name = this.window
30 ? window.location.pathname
31 : "test_database_onclose.js";
33 info("#1: Verifying IDBDatabase.onclose after cleared by the agent.");
34 let openRequest = indexedDB.open(name, 1);
35 openRequest.onerror = errorHandler;
36 openRequest.onsuccess = unexpectedSuccessHandler;
37 openRequest.onupgradeneeded = grabEventAndContinueHandler;
39 ok(openRequest instanceof IDBOpenDBRequest, "Expect an IDBOpenDBRequest");
41 let event = yield undefined;
43 is(event.type, "upgradeneeded", "Expect an upgradeneeded event");
44 ok(event instanceof IDBVersionChangeEvent, "Expect a versionchange event");
46 let db = event.target.result;
47 db.createObjectStore("store");
49 openRequest.onsuccess = grabEventAndContinueHandler;
51 event = yield undefined;
53 is(event.type, "success", "Expect a success event");
54 is(event.target, openRequest, "Event has right target");
55 ok(event.target.result instanceof IDBDatabase, "Result should be a database");
56 is(db.objectStoreNames.length, 1, "Expect an objectStore here");
58 let txn = db.transaction("store", "readwrite");
59 let objectStore = txn.objectStore("store");
61 clearAllDatabases(continueToNextStep);
63 db.onclose = grabEventAndContinueHandler;
64 event = yield undefined;
65 is(event.type, "close", "Expect a close event");
66 is(event.target, db, "Correct target");
68 info("Wait for callback of clearAllDatabases().");
71 testInvalidStateError(db, txn);
74 "#2: Verifying IDBDatabase.onclose && IDBTransaction.onerror " +
75 "in *write* operation after cleared by the agent."
77 openRequest = indexedDB.open(name, 1);
78 openRequest.onerror = errorHandler;
79 openRequest.onsuccess = unexpectedSuccessHandler;
80 openRequest.onupgradeneeded = grabEventAndContinueHandler;
82 ok(openRequest instanceof IDBOpenDBRequest, "Expect an IDBOpenDBRequest");
84 event = yield undefined;
86 is(event.type, "upgradeneeded", "Expect an upgradeneeded event");
87 ok(event instanceof IDBVersionChangeEvent, "Expect a versionchange event");
89 db = event.target.result;
90 db.createObjectStore("store");
92 openRequest.onsuccess = grabEventAndContinueHandler;
94 event = yield undefined;
96 is(event.type, "success", "Expect a success event");
97 is(event.target, openRequest, "Event has right target");
98 ok(event.target.result instanceof IDBDatabase, "Result should be a database");
99 is(db.objectStoreNames.length, 1, "Expect an objectStore here");
101 txn = db.transaction("store", "readwrite");
102 objectStore = txn.objectStore("store");
106 let addRequest = objectStore.add({ foo: "foo" }, objectId);
107 addRequest.onerror = function(event) {
108 info("addRequest.onerror, objectId: " + objectId);
109 txn.onerror = grabEventAndContinueHandler;
110 testGenerator.next(true);
112 addRequest.onsuccess = function() {
113 testGenerator.next(false);
117 clearAllDatabases(() => {
118 info("clearAllDatabases is done.");
119 continueToNextStep();
125 let aborted = yield undefined;
131 event = yield undefined;
132 is(event.type, "error", "Got an error event");
133 is(event.target.error.name, "AbortError", "Expected AbortError was thrown.");
134 event.preventDefault();
136 txn.onabort = grabEventAndContinueHandler;
137 event = yield undefined;
138 is(event.type, "abort", "Got an abort event");
139 is(event.target.error.name, "AbortError", "Expected AbortError was thrown.");
141 db.onclose = grabEventAndContinueHandler;
142 event = yield undefined;
143 is(event.type, "close", "Expect a close event");
144 is(event.target, db, "Correct target");
145 testInvalidStateError(db, txn);
147 info("Wait for the callback of clearAllDatabases().");
151 "#3: Verifying IDBDatabase.onclose && IDBTransaction.onerror " +
152 "in *read* operation after cleared by the agent."
154 openRequest = indexedDB.open(name, 1);
155 openRequest.onerror = errorHandler;
156 openRequest.onsuccess = unexpectedSuccessHandler;
157 openRequest.onupgradeneeded = grabEventAndContinueHandler;
159 ok(openRequest instanceof IDBOpenDBRequest, "Expect an IDBOpenDBRequest");
161 event = yield undefined;
163 is(event.type, "upgradeneeded", "Expect an upgradeneeded event");
164 ok(event instanceof IDBVersionChangeEvent, "Expect a versionchange event");
166 db = event.target.result;
167 objectStore = db.createObjectStore("store", {
171 // The number of read records varies between 1~2000 before the db is cleared
173 let numberOfObjects = 3000;
176 let addRequest = objectStore.add({ foo: "foo" });
177 addRequest.onsuccess = function() {
179 testGenerator.next(objectId == numberOfObjects);
181 addRequest.onerror = errorHandler;
183 let done = yield undefined;
189 openRequest.onsuccess = grabEventAndContinueHandler;
191 event = yield undefined;
193 is(event.type, "success", "Expect a success event");
194 is(event.target, openRequest, "Event has right target");
195 ok(event.target.result instanceof IDBDatabase, "Result should be a database");
196 is(db.objectStoreNames.length, 1, "Expect an objectStore here");
198 txn = db.transaction("store");
199 objectStore = txn.objectStore("store");
201 let numberOfReadObjects = 0;
202 let readRequest = objectStore.openCursor();
203 readRequest.onerror = function(event) {
204 info("readRequest.onerror, numberOfReadObjects: " + numberOfReadObjects);
205 testGenerator.next(true);
207 readRequest.onsuccess = function(event) {
208 let cursor = event.target.result;
210 numberOfReadObjects++;
211 event.target.result.continue();
213 info("Cursor is invalid, numberOfReadObjects: " + numberOfReadObjects);
214 todo(false, "All records are iterated before database is cleared!");
215 testGenerator.next(false);
219 clearAllDatabases(() => {
220 info("clearAllDatabases is done.");
221 continueToNextStep();
224 let readRequestError = yield undefined;
225 if (readRequestError) {
226 txn.onerror = grabEventAndContinueHandler;
228 event = yield undefined;
229 is(event.type, "error", "Got an error event");
231 event.target.error.name,
233 "Expected AbortError was thrown."
235 event.preventDefault();
237 txn.onabort = grabEventAndContinueHandler;
238 event = yield undefined;
239 is(event.type, "abort", "Got an abort event");
241 event.target.error.name,
243 "Expected AbortError was thrown."
246 db.onclose = grabEventAndContinueHandler;
247 event = yield undefined;
248 is(event.type, "close", "Expect a close event");
249 is(event.target, db, "Correct target");
251 testInvalidStateError(db, txn);
254 info("Wait for the callback of clearAllDatabases().");