3 <script src="../../fast/js/resources/js-test-pre.js"></script>
4 <script src="resources/shared.js"></script>
7 <p id="description"></p>
8 <div id="console"></div>
11 description("Test the basics of IndexedDB's IDBObjectStore.");
12 if (window.layoutTestController)
13 layoutTestController.waitUntilDone();
17 request = evalAndLog("webkitIndexedDB.open('objectstore-basics')");
18 request.onsuccess = openSuccess;
19 request.onerror = unexpectedErrorCallback;
22 function openSuccess()
24 debug("openSuccess():");
25 window.db = evalAndLog("db = event.target.result");
27 request = evalAndLog("db.setVersion('new version')");
28 request.onsuccess = setVersionSuccess;
29 request.onerror = unexpectedErrorCallback;
32 function setVersionSuccess()
34 debug("setVersionSuccess():");
35 window.trans = evalAndLog("trans = event.target.result");
36 shouldBeTrue("trans !== null");
37 trans.onabort = unexpectedAbortCallback;
39 deleteAllObjectStores(db);
41 debug("createObjectStore():");
42 window.store = evalAndLog("store = db.createObjectStore('storeName', null)");
43 var storeNames = evalAndLog("storeNames = db.objectStoreNames");
45 shouldBeEqualToString("store.name", "storeName");
46 shouldBeNull("store.keyPath");
47 shouldBe("storeNames.contains('storeName')", "true");
48 shouldBe("storeNames.length", "1");
49 // FIXME: test all of object store's methods.
51 debug("Ask for an index that doesn't exist:");
53 debug("index = store.index('asdf')");
54 index = store.index('asdf');
55 testFailed("Asking for a store that doesn't exist should have thrown.");
57 testPassed("Exception thrown.");
59 shouldBe("code", "webkitIDBDatabaseException.NOT_FOUND_ERR");
65 function createIndex()
67 debug("createIndex():");
68 var index = evalAndLog("index = store.createIndex('indexName', 'x', {unique: true})"); // true == unique requirement.
69 shouldBeTrue("index !== null");
70 shouldBeTrue("store.indexNames.contains('indexName')");
71 index = evalAndLog("index = store.index('indexName')");
72 shouldBeTrue("index !== null");
74 debug("Ask for an index that doesn't exist:");
76 debug("index = store.index('asdf')");
77 index = store.index('asdf');
78 testFailed("Asking for a store that doesn't exist should have thrown.");
80 testPassed("Exception thrown.");
82 shouldBe("code", "webkitIDBDatabaseException.NOT_FOUND_ERR");
88 function commitAndContinue()
90 window.setTimeout(testSetVersionAbort, 0);
93 function testSetVersionAbort()
95 request = evalAndLog('db.setVersion("version fail")');
96 request.onsuccess = createAnotherIndex;
97 request.onerror = unexpectedErrorCallback;
100 function createAnotherIndex()
102 shouldBeEqualToString("db.version", "version fail");
104 var setVersionTrans = evalAndLog("setVersionTrans = event.target.result");
105 shouldBeTrue("setVersionTrans !== null");
106 setVersionTrans.oncomplete = unexpectedCompleteCallback;
107 setVersionTrans.onabort = checkMetadata;
108 window.store = evalAndLog("store = setVersionTrans.objectStore('storeName')");
109 var index = evalAndLog("index = store.createIndex('indexFail', 'x')");
111 setVersionTrans.abort();
114 function checkMetadata()
116 shouldBeEqualToString("db.version", "new version");
117 shouldBe("store.transaction", "setVersionTrans");
118 shouldBe("store.indexNames", "['indexName']");
119 shouldBe("store.indexNames.length", "1");
120 shouldBe("store.indexNames.contains('')", "false");
121 shouldBe("store.indexNames.contains('indexFail')", "false");
122 shouldBe("store.indexNames.contains('indexName')", "true");
123 shouldBeEqualToString("store.indexNames[0]", "indexName");
124 shouldBeNull("store.indexNames[1]");
125 shouldBeNull("store.indexNames[100]");
126 shouldBeNull("store.indexNames.item(1)");
127 shouldBeNull("store.indexNames.item(100)");
131 var testDate = new Date("August 25, 1991 20:57:08");
132 var testDateB = new Date("Wed Jan 05 2011 15:54:49");
136 var transaction = evalAndLog("transaction = db.transaction(['storeName'], webkitIDBTransaction.READ_WRITE)");
137 transaction.onabort = unexpectedAbortCallback;
138 window.store = evalAndLog("store = transaction.objectStore('storeName')");
140 debug("Try to insert data with a Date key:");
141 request = evalAndLog("store.add({x: 'foo'}, testDate)");
142 request.onsuccess = addDateSuccess;
143 request.onerror = unexpectedErrorCallback;
146 function addDateSuccess()
148 debug("Try to insert a value not handled by structured clone:");
150 debug("store.add({x: 'bar', y: document.getElementById('console')}, 'bar')");
151 store.add({x: 'bar', y: document.getElementById('console')}, 'bar');
152 testFailed("Passing a DOM node as value should have thrown.");
154 testPassed("Exception thrown");
156 shouldBe("code", "DOMException.DATA_CLONE_ERR");
159 debug("Try to insert data where key path yields a Date key:");
160 request = evalAndLog("store.add({x: testDateB, y: 'value'}, 'key')");
161 request.onsuccess = addSuccess;
162 request.onerror = unexpectedErrorCallback;
165 function addSuccess()
167 debug("addSuccess():");
168 shouldBeEqualToString("event.target.result", "key");
170 request = evalAndLog("event.target.source.add({x: 'foo'}, 'zzz')");
171 request.onsuccess = unexpectedSuccessCallback;
172 request.addEventListener('error', addAgainFailure, false);
175 function addAgainFailure()
177 debug("addAgainFailure():");
178 shouldBe("event.target.errorCode", "webkitIDBDatabaseException.CONSTRAINT_ERR");
180 evalAndLog("event.preventDefault()");
182 transaction = evalAndLog("db.transaction(['storeName'], webkitIDBTransaction.READ_WRITE)");
183 transaction.onabort = unexpectedErrorCallback;
184 var store = evalAndLog("store = transaction.objectStore('storeName')");
186 evalAndLog("store.add({x: 'somevalue'}, 'somekey')");
187 evalAndExpectException("store.add({x: 'othervalue'}, null)", "webkitIDBDatabaseException.DATA_ERR");
189 transaction = evalAndLog("db.transaction(['storeName'], webkitIDBTransaction.READ_WRITE)");
190 transaction.onabort = unexpectedErrorCallback;
191 var store = evalAndLog("store = transaction.objectStore('storeName')");
193 request = evalAndLog("store.add({x: null}, 'validkey')");
194 request.onsuccess = unexpectedSuccessCallback;
195 request.onerror = addWithNullIndexFailure;
198 function addWithNullIndexFailure()
200 shouldBeTrue("event.cancelable");
201 debug("addWithNullIndexFailure():");
202 shouldBe("event.target.errorCode", "webkitIDBDatabaseException.DATA_ERR");
204 evalAndLog("event.preventDefault()");
206 transaction = evalAndLog("db.transaction(['storeName'], webkitIDBTransaction.READ_WRITE)");
207 transaction.onabort = unexpectedErrorCallback;
208 var store = evalAndLog("store = transaction.objectStore('storeName')");
210 request = evalAndLog("store.get('key')");
211 request.addEventListener('success', getSuccess, true);
212 request.onerror = unexpectedErrorCallback;
215 function getSuccess()
217 debug("getSuccess():");
218 shouldBeEqualToString("event.target.result.y", "value");
220 var store = evalAndLog("store = event.target.source");
221 request = evalAndLog("store.get(testDate)");
222 request.addEventListener('success', getSuccessDateKey, false);
223 request.onerror = unexpectedErrorCallback;
226 function getSuccessDateKey()
228 debug("getSuccessDateKey():");
229 shouldBeEqualToString("event.target.result.x", "foo");
231 request = evalAndLog("store.delete('key')");
232 request.onsuccess = removeSuccess;
233 request.onerror = unexpectedErrorCallback;
236 function removeSuccess()
238 debug("removeSuccess():");
239 shouldBe("event.target.result", "true");
241 request = evalAndLog("store.delete('key')");
242 request.onsuccess = removeSuccessButFalse;
243 request.onerror = unexpectedErrorCallback;
246 function removeSuccessButFalse()
248 debug("removeSuccessButFalse():");
249 shouldBe("event.target.result", "false");
250 var store = evalAndLog("store = event.target.source");
252 debug("Passing an invalid key into store.get().");
253 evalAndExpectException("store.get({})", "webkitIDBDatabaseException.DATA_ERR");
255 debug("Passing an invalid key into store.delete().");
256 evalAndExpectException("store.delete({})", "webkitIDBDatabaseException.DATA_ERR");
258 debug("Passing an invalid key into store.add().");
259 evalAndExpectException("store.add(null, {})", "webkitIDBDatabaseException.DATA_ERR");
261 debug("Passing an invalid key into store.put().");
262 evalAndExpectException("store.put(null, {})", "webkitIDBDatabaseException.DATA_ERR");