• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css">
4<script src="../../fast/js/resources/js-test-pre.js"></script>
5<script src="../../fast/js/resources/js-test-post-function.js"></script>
6<script src="resources/shared.js"></script>
7</head>
8<body>
9<p id="description"></p>
10<div id="console"></div>
11<script>
12
13description("Test the basics of IndexedDB's IDBObjectStore.");
14if (window.layoutTestController)
15    layoutTestController.waitUntilDone();
16
17function test()
18{
19    request = evalAndLog("webkitIndexedDB.open('objectstore-basics')");
20    request.onsuccess = openSuccess;
21    request.onerror = unexpectedErrorCallback;
22}
23
24function openSuccess()
25{
26    debug("openSuccess():");
27    window.db = evalAndLog("db = event.target.result");
28
29    request = evalAndLog("db.setVersion('new version')");
30    request.onsuccess = setVersionSuccess;
31    request.onerror = unexpectedErrorCallback;
32}
33
34function setVersionSuccess()
35{
36    debug("setVersionSuccess():");
37    window.trans = evalAndLog("trans = event.target.result");
38    shouldBeTrue("trans !== null");
39    trans.onabort = unexpectedAbortCallback;
40
41    deleteAllObjectStores(db);
42
43    debug("createObjectStore():");
44    window.store = evalAndLog("store = db.createObjectStore('storeName', null)");
45    var storeNames = evalAndLog("storeNames = db.objectStoreNames");
46
47    shouldBeEqualToString("store.name", "storeName");
48    shouldBeNull("store.keyPath");
49    shouldBe("storeNames.contains('storeName')", "true");
50    shouldBe("storeNames.length", "1");
51    // FIXME: test all of object store's methods.
52
53    debug("Ask for an index that doesn't exist:");
54    try {
55        debug("index = store.index('asdf')");
56        index = store.index('asdf');
57        testFailed("Asking for a store that doesn't exist should have thrown.");
58    } catch (err) {
59        testPassed("Exception thrown.");
60        code = err.code;
61        shouldBe("code", "webkitIDBDatabaseException.NOT_FOUND_ERR");
62    }
63
64    createIndex();
65}
66
67function createIndex()
68{
69    debug("createIndex():");
70    var index = evalAndLog("index = store.createIndex('indexName', 'x', {unique: true})"); // true == unique requirement.
71    shouldBeTrue("index !== null");
72    shouldBeTrue("store.indexNames.contains('indexName')");
73    index = evalAndLog("index = store.index('indexName')");
74    shouldBeTrue("index !== null");
75
76    debug("Ask for an index that doesn't exist:");
77    try {
78        debug("index = store.index('asdf')");
79        index = store.index('asdf');
80        testFailed("Asking for a store that doesn't exist should have thrown.");
81    } catch (err) {
82        testPassed("Exception thrown.");
83        code = err.code
84        shouldBe("code", "webkitIDBDatabaseException.NOT_FOUND_ERR");
85    }
86
87    commitAndContinue();
88}
89
90function commitAndContinue()
91{
92    window.setTimeout(testSetVersionAbort, 0);
93}
94
95function testSetVersionAbort()
96{
97    request = evalAndLog('db.setVersion("version fail")');
98    request.onsuccess = createAnotherIndex;
99    request.onerror = unexpectedErrorCallback;
100}
101
102function createAnotherIndex()
103{
104    shouldBeEqualToString("db.version", "version fail");
105
106    var setVersionTrans = evalAndLog("setVersionTrans = event.target.result");
107    shouldBeTrue("setVersionTrans !== null");
108    setVersionTrans.oncomplete = unexpectedCompleteCallback;
109    setVersionTrans.onabort = checkMetadata;
110    window.store = evalAndLog("store = setVersionTrans.objectStore('storeName')");
111    var index = evalAndLog("index = store.createIndex('indexFail', 'x')");
112
113    setVersionTrans.abort();
114}
115
116function checkMetadata()
117{
118    shouldBeEqualToString("db.version", "new version");
119    shouldBe("store.indexNames", "['indexName']");
120    shouldBe("store.indexNames.length", "1");
121    shouldBe("store.indexNames.contains('')", "false");
122    shouldBe("store.indexNames.contains('indexFail')", "false");
123    shouldBe("store.indexNames.contains('indexName')", "true");
124    shouldBeEqualToString("store.indexNames[0]", "indexName");
125    shouldBeNull("store.indexNames[1]");
126    shouldBeNull("store.indexNames[100]");
127    shouldBeNull("store.indexNames.item(1)");
128    shouldBeNull("store.indexNames.item(100)");
129    addData();
130}
131
132var testDate = new Date("August 25, 1991 20:57:08");
133var testDateB = new Date("Wed Jan 05 2011 15:54:49");
134
135function addData()
136{
137    var transaction = evalAndLog("transaction = db.transaction([], webkitIDBTransaction.READ_WRITE)");
138    transaction.onabort = unexpectedAbortCallback;
139    window.store = evalAndLog("store = transaction.objectStore('storeName')");
140
141    debug("Try to insert data with a Date key:");
142    request = evalAndLog("store.add({x: 'foo'}, testDate)");
143    request.onsuccess = addDateSuccess;
144    request.onerror = unexpectedErrorCallback;
145}
146
147function addDateSuccess()
148{
149    debug("Try to insert a value not handled by structured clone:");
150    try {
151        debug("store.add({x: 'bar', y: document.getElementById('console')}, 'bar')");
152        store.add({x: 'bar', y: document.getElementById('console')}, 'bar');
153        testFailed("Passing a DOM node as value should have thrown.");
154    } catch (err) {
155        testPassed("Exception thrown");
156        code = err.code;
157        shouldBe("code", "DOMException.NOT_SUPPORTED_ERR");
158    }
159
160    debug("Try to insert data where key path yields a Date key:");
161    request = evalAndLog("store.add({x: testDateB, y: 'value'}, 'key')");
162    request.onsuccess = addSuccess;
163    request.onerror = unexpectedErrorCallback;
164}
165
166function addSuccess()
167{
168    debug("addSuccess():");
169    shouldBeEqualToString("event.target.result", "key");
170
171    request = evalAndLog("event.target.source.add({x: 'foo'}, 'zzz')");
172    request.onsuccess = unexpectedSuccessCallback;
173    request.addEventListener('error', addAgainFailure, false);
174}
175
176function addAgainFailure()
177{
178    debug("addAgainFailure():");
179    // FIXME: This error code needs to be specced.
180    shouldBe("event.target.errorCode", "webkitIDBDatabaseException.UNKNOWN_ERR");
181
182    evalAndLog("event.preventDefault()");
183
184    transaction = evalAndLog("db.transaction([], webkitIDBTransaction.READ_WRITE)");
185    transaction.onabort = unexpectedErrorCallback;
186    var store = evalAndLog("store = transaction.objectStore('storeName')");
187
188    request = evalAndLog("store.add({x: 'othervalue'}, null)");
189    request.onsuccess = unexpectedSuccessCallback;
190    request.addEventListener('error', addWithNullKeyFailure, true);
191}
192
193function addWithNullKeyFailure()
194{
195    debug("addWithNullKeyFailre():");
196    shouldBe("event.target.errorCode", "webkitIDBDatabaseException.DATA_ERR");
197
198    evalAndLog("event.preventDefault()");
199
200    transaction = evalAndLog("db.transaction([], webkitIDBTransaction.READ_WRITE)");
201    transaction.onabort = unexpectedErrorCallback;
202    var store = evalAndLog("store = transaction.objectStore('storeName')");
203
204    request = evalAndLog("store.add({x: null}, 'validkey')");
205    request.onsuccess = unexpectedSuccessCallback;
206    request.onerror = addWithNullIndexFailure;
207}
208
209function addWithNullIndexFailure()
210{
211    shouldBeTrue("event.cancelable");
212    debug("addWithNullIndexFailure():");
213    shouldBe("event.target.errorCode", "webkitIDBDatabaseException.DATA_ERR");
214
215    evalAndLog("event.preventDefault()");
216
217    transaction = evalAndLog("db.transaction([], webkitIDBTransaction.READ_WRITE)");
218    transaction.onabort = unexpectedErrorCallback;
219    var store = evalAndLog("store = transaction.objectStore('storeName')");
220
221    request = evalAndLog("store.get('key')");
222    request.addEventListener('success', getSuccess, true);
223    request.onerror = unexpectedErrorCallback;
224}
225
226function getSuccess()
227{
228    debug("getSuccess():");
229    shouldBeEqualToString("event.target.result.y", "value");
230
231    var store = evalAndLog("store = event.target.source");
232    request = evalAndLog("store.get(testDate)");
233    request.addEventListener('success', getSuccessDateKey, false);
234    request.onerror = unexpectedErrorCallback;
235}
236
237function getSuccessDateKey()
238{
239    debug("getSuccessDateKey():");
240    shouldBeEqualToString("event.target.result.x", "foo");
241
242    request = evalAndLog("store.delete('key')");
243    request.onsuccess = removeSuccess;
244    request.onerror = unexpectedErrorCallback;
245}
246
247function removeSuccess()
248{
249    debug("removeSuccess():");
250    shouldBeNull("event.target.result");
251    var store = evalAndLog("store = event.target.source");
252
253    try {
254        debug("Passing an invalid key into store.get().");
255        store.get([]);
256        testFailed("No exception thrown");
257    } catch (e) {
258        testPassed("Caught exception: " + e.toString());
259    }
260
261    try {
262        debug("Passing an invalid key into store.delete().");
263        store.delete([]);
264        testFailed("No exception thrown");
265    } catch (e) {
266        testPassed("Caught exception: " + e.toString());
267    }
268
269    try {
270        debug("Passing an invalid key into store.add().");
271        store.add(null, []);
272        testFailed("No exception thrown");
273    } catch (e) {
274        testPassed("Caught exception: " + e.toString());
275    }
276
277    try {
278        debug("Passing an invalid key into store.put().");
279        store.put(null, []);
280        testFailed("No exception thrown");
281    } catch (e) {
282        testPassed("Caught exception: " + e.toString());
283    }
284
285    done();
286}
287
288test();
289
290var successfullyParsed = true;
291
292</script>
293</body>
294</html>
295