tizen beta release
[framework/web/webkit-efl.git] / LayoutTests / storage / indexeddb / objectstore-basics.html
1 <html>
2 <head>
3 <script src="../../fast/js/resources/js-test-pre.js"></script>
4 <script src="resources/shared.js"></script>
5 </head>
6 <body>
7 <p id="description"></p>
8 <div id="console"></div>
9 <script>
10
11 description("Test the basics of IndexedDB's IDBObjectStore.");
12 if (window.layoutTestController) 
13     layoutTestController.waitUntilDone();
14
15 function test()
16 {
17     request = evalAndLog("webkitIndexedDB.open('objectstore-basics')");
18     request.onsuccess = openSuccess;
19     request.onerror = unexpectedErrorCallback;
20 }
21
22 function openSuccess()
23 {
24     debug("openSuccess():");
25     window.db = evalAndLog("db = event.target.result");
26
27     request = evalAndLog("db.setVersion('new version')");
28     request.onsuccess = setVersionSuccess;
29     request.onerror = unexpectedErrorCallback;
30 }
31
32 function setVersionSuccess()
33 {
34     debug("setVersionSuccess():");
35     window.trans = evalAndLog("trans = event.target.result");
36     shouldBeTrue("trans !== null");
37     trans.onabort = unexpectedAbortCallback;
38
39     deleteAllObjectStores(db);
40
41     debug("createObjectStore():");
42     window.store = evalAndLog("store = db.createObjectStore('storeName', null)");
43     var storeNames = evalAndLog("storeNames = db.objectStoreNames");
44
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.
50
51     debug("Ask for an index that doesn't exist:");
52     try {
53         debug("index = store.index('asdf')");
54         index = store.index('asdf');
55         testFailed("Asking for a store that doesn't exist should have thrown.");
56     } catch (err) {
57         testPassed("Exception thrown.");
58         code = err.code;
59         shouldBe("code", "webkitIDBDatabaseException.NOT_FOUND_ERR");
60     }
61
62     createIndex();
63 }
64
65 function createIndex()
66 {
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");
73  
74     debug("Ask for an index that doesn't exist:");
75     try {
76         debug("index = store.index('asdf')");
77         index = store.index('asdf');
78         testFailed("Asking for a store that doesn't exist should have thrown.");
79     } catch (err) {
80         testPassed("Exception thrown.");
81         code = err.code
82         shouldBe("code", "webkitIDBDatabaseException.NOT_FOUND_ERR");
83     }
84
85     commitAndContinue();    
86 }
87
88 function commitAndContinue()
89 {
90     window.setTimeout(testSetVersionAbort, 0);
91 }
92
93 function testSetVersionAbort()
94 {
95     request = evalAndLog('db.setVersion("version fail")');
96     request.onsuccess = createAnotherIndex;
97     request.onerror = unexpectedErrorCallback;
98 }
99
100 function createAnotherIndex()
101 {
102     shouldBeEqualToString("db.version", "version fail");
103
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')");
110
111     setVersionTrans.abort();
112 }
113
114 function checkMetadata()
115 {
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)");
128     addData();
129 }
130
131 var testDate = new Date("August 25, 1991 20:57:08");
132 var testDateB = new Date("Wed Jan 05 2011 15:54:49");
133
134 function addData()
135 {
136     var transaction = evalAndLog("transaction = db.transaction(['storeName'], webkitIDBTransaction.READ_WRITE)");
137     transaction.onabort = unexpectedAbortCallback;
138     window.store = evalAndLog("store = transaction.objectStore('storeName')");
139
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;
144 }
145
146 function addDateSuccess()
147 {
148     debug("Try to insert a value not handled by structured clone:");
149     try {
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.");
153     } catch (err) {
154         testPassed("Exception thrown");
155         code = err.code;
156         shouldBe("code", "DOMException.DATA_CLONE_ERR");
157     }
158
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;
163 }
164
165 function addSuccess()
166 {
167     debug("addSuccess():");
168     shouldBeEqualToString("event.target.result", "key");
169
170     request = evalAndLog("event.target.source.add({x: 'foo'}, 'zzz')");
171     request.onsuccess = unexpectedSuccessCallback;
172     request.addEventListener('error', addAgainFailure, false);
173 }
174
175 function addAgainFailure()
176 {
177     debug("addAgainFailure():");
178     shouldBe("event.target.errorCode", "webkitIDBDatabaseException.CONSTRAINT_ERR");
179
180     evalAndLog("event.preventDefault()");
181
182     transaction = evalAndLog("db.transaction(['storeName'], webkitIDBTransaction.READ_WRITE)");
183     transaction.onabort = unexpectedErrorCallback;
184     var store = evalAndLog("store = transaction.objectStore('storeName')");
185
186     evalAndLog("store.add({x: 'somevalue'}, 'somekey')");
187     evalAndExpectException("store.add({x: 'othervalue'}, null)", "webkitIDBDatabaseException.DATA_ERR");
188
189     transaction = evalAndLog("db.transaction(['storeName'], webkitIDBTransaction.READ_WRITE)");
190     transaction.onabort = unexpectedErrorCallback;
191     var store = evalAndLog("store = transaction.objectStore('storeName')");
192
193     request = evalAndLog("store.add({x: null}, 'validkey')");
194     request.onsuccess = unexpectedSuccessCallback;
195     request.onerror = addWithNullIndexFailure;
196 }
197
198 function addWithNullIndexFailure()
199 {
200     shouldBeTrue("event.cancelable");
201     debug("addWithNullIndexFailure():");
202     shouldBe("event.target.errorCode", "webkitIDBDatabaseException.DATA_ERR");
203
204     evalAndLog("event.preventDefault()");
205
206     transaction = evalAndLog("db.transaction(['storeName'], webkitIDBTransaction.READ_WRITE)");
207     transaction.onabort = unexpectedErrorCallback;
208     var store = evalAndLog("store = transaction.objectStore('storeName')");
209
210     request = evalAndLog("store.get('key')");
211     request.addEventListener('success', getSuccess, true);
212     request.onerror = unexpectedErrorCallback;
213 }
214
215 function getSuccess()
216 {
217     debug("getSuccess():");
218     shouldBeEqualToString("event.target.result.y", "value");
219
220     var store = evalAndLog("store = event.target.source");
221     request = evalAndLog("store.get(testDate)");
222     request.addEventListener('success', getSuccessDateKey, false);
223     request.onerror = unexpectedErrorCallback;
224 }
225
226 function getSuccessDateKey()
227 {
228     debug("getSuccessDateKey():");
229     shouldBeEqualToString("event.target.result.x", "foo");
230
231     request = evalAndLog("store.delete('key')");
232     request.onsuccess = removeSuccess;
233     request.onerror = unexpectedErrorCallback;
234 }
235
236 function removeSuccess()
237 {
238     debug("removeSuccess():");
239     shouldBe("event.target.result", "true");
240
241     request = evalAndLog("store.delete('key')");
242     request.onsuccess = removeSuccessButFalse;
243     request.onerror = unexpectedErrorCallback;
244 }
245
246 function removeSuccessButFalse()
247 {
248     debug("removeSuccessButFalse():");
249     shouldBe("event.target.result", "false");
250     var store = evalAndLog("store = event.target.source");
251
252     debug("Passing an invalid key into store.get().");
253     evalAndExpectException("store.get({})", "webkitIDBDatabaseException.DATA_ERR");
254
255     debug("Passing an invalid key into store.delete().");
256     evalAndExpectException("store.delete({})", "webkitIDBDatabaseException.DATA_ERR");
257
258     debug("Passing an invalid key into store.add().");
259     evalAndExpectException("store.add(null, {})", "webkitIDBDatabaseException.DATA_ERR");
260
261     debug("Passing an invalid key into store.put().");
262     evalAndExpectException("store.put(null, {})", "webkitIDBDatabaseException.DATA_ERR");
263
264     done();
265 }
266
267 test();
268
269
270 </script>
271 </body>
272 </html>