2 Any copyright is dedicated to the Public Domain.
3 http://creativecommons.org/publicdomain/zero/1.0/
7 <title>Indexed Database Property Test
</title>
9 <script src=
"/tests/SimpleTest/SimpleTest.js"></script>
10 <link rel=
"stylesheet" type=
"text/css" href=
"/tests/SimpleTest/test.css"/>
12 <script type=
"text/javascript">
15 info("Setting up test fixtures: create an IndexedDB database and object store.");
17 let request
= indexedDB
.open(window
.location
.pathname
, 1);
18 request
.onerror
= errorHandler
;
19 request
.onupgradeneeded
= grabEventAndContinueHandler
;
20 request
.onsuccess
= unexpectedSuccessHandler
;
21 let event
= yield undefined;
23 let db
= event
.target
.result
;
24 db
.onerror
= errorHandler
;
26 let objectStore
= db
.createObjectStore("foo", { autoIncrement
: true });
27 let index
= objectStore
.createIndex("foo", "index");
29 request
.onsuccess
= grabEventAndContinueHandler
;
30 event
= yield undefined;
33 info("Let's create a blob and store it in IndexedDB twice.");
35 const BLOB_DATA
= ["fun ", "times ", "all ", "around!"];
37 let blob
= new Blob(BLOB_DATA
, { type
: "text/plain" });
38 let data
= { blob
, index
: INDEX_KEY
};
40 objectStore
= db
.transaction("foo", "readwrite").objectStore("foo");
41 objectStore
.add(data
).onsuccess
= grabEventAndContinueHandler
;
42 event
= yield undefined;
44 info("Added blob to database once");
46 let key
= event
.target
.result
;
48 objectStore
.add(data
).onsuccess
= grabEventAndContinueHandler
;
49 event
= yield undefined;
51 info("Added blob to database twice");
53 info("Let's retrieve the blob again and verify the contents is the same.");
55 objectStore
= db
.transaction("foo").objectStore("foo");
56 objectStore
.get(key
).onsuccess
= grabEventAndContinueHandler
;
57 event
= yield undefined;
59 info("Got blob from database");
61 let fileReader
= new FileReader();
62 fileReader
.onload
= grabEventAndContinueHandler
;
63 fileReader
.readAsText(event
.target
.result
.blob
);
64 event
= yield undefined;
66 is(event
.target
.result
, BLOB_DATA
.join(""), "Correct text");
69 info("Let's retrieve it again, create an object URL for the blob, load" +
70 "it via an XMLHttpRequest, and verify the contents is the same.");
72 objectStore
= db
.transaction("foo").objectStore("foo");
73 objectStore
.get(key
).onsuccess
= grabEventAndContinueHandler
;
74 event
= yield undefined;
76 info("Got blob from database");
78 let blobURL
= URL
.createObjectURL(event
.target
.result
.blob
);
80 let xhr
= new XMLHttpRequest();
81 xhr
.open("GET", blobURL
);
82 xhr
.onload
= grabEventAndContinueHandler
;
86 URL
.revokeObjectURL(blobURL
);
88 is(xhr
.responseText
, BLOB_DATA
.join(""), "Correct responseText");
91 info("Retrieve both blob entries from the database and verify contents.");
93 objectStore
= db
.transaction("foo").objectStore("foo");
94 objectStore
.mozGetAll().onsuccess
= grabEventAndContinueHandler
;
95 event
= yield undefined;
97 is(event
.target
.result
.length
, 2, "Got right number of items");
99 fileReader
= new FileReader();
100 fileReader
.onload
= grabEventAndContinueHandler
;
101 fileReader
.readAsText(event
.target
.result
[0].blob
);
102 event
= yield undefined;
104 is(event
.target
.result
, BLOB_DATA
.join(""), "Correct text");
106 let cursorResults
= [];
108 objectStore
= db
.transaction("foo").objectStore("foo");
109 objectStore
.openCursor().onsuccess = function(event
) {
110 let cursor
= event
.target
.result
;
112 info("Got item from cursor");
113 cursorResults
.push(cursor
.value
);
117 info("Finished cursor");
118 continueToNextStep();
123 is(cursorResults
.length
, 2, "Got right number of items");
125 fileReader
= new FileReader();
126 fileReader
.onload
= grabEventAndContinueHandler
;
127 fileReader
.readAsText(cursorResults
[0].blob
);
128 event
= yield undefined;
130 is(event
.target
.result
, BLOB_DATA
.join(""), "Correct text");
133 info("Retrieve blobs from database via index and verify contents.");
135 index
= db
.transaction("foo").objectStore("foo").index("foo");
136 index
.get(INDEX_KEY
).onsuccess
= grabEventAndContinueHandler
;
137 event
= yield undefined;
139 info("Got blob from database");
141 fileReader
= new FileReader();
142 fileReader
.onload
= grabEventAndContinueHandler
;
143 fileReader
.readAsText(event
.target
.result
.blob
);
144 event
= yield undefined;
146 is(event
.target
.result
, BLOB_DATA
.join(""), "Correct text");
148 index
= db
.transaction("foo").objectStore("foo").index("foo");
149 index
.mozGetAll().onsuccess
= grabEventAndContinueHandler
;
150 event
= yield undefined;
152 is(event
.target
.result
.length
, 2, "Got right number of items");
154 fileReader
= new FileReader();
155 fileReader
.onload
= grabEventAndContinueHandler
;
156 fileReader
.readAsText(event
.target
.result
[0].blob
);
157 event
= yield undefined;
159 is(event
.target
.result
, BLOB_DATA
.join(""), "Correct text");
163 index
= db
.transaction("foo").objectStore("foo").index("foo");
164 index
.openCursor().onsuccess = function(event
) {
165 let cursor
= event
.target
.result
;
167 info("Got item from cursor");
168 cursorResults
.push(cursor
.value
);
172 info("Finished cursor");
173 continueToNextStep();
178 is(cursorResults
.length
, 2, "Got right number of items");
180 fileReader
= new FileReader();
181 fileReader
.onload
= grabEventAndContinueHandler
;
182 fileReader
.readAsText(cursorResults
[0].blob
);
183 event
= yield undefined;
185 is(event
.target
.result
, BLOB_DATA
.join(""), "Correct text");
187 fileReader
= new FileReader();
188 fileReader
.onload
= grabEventAndContinueHandler
;
189 fileReader
.readAsText(cursorResults
[1].blob
);
190 event
= yield undefined;
192 is(event
.target
.result
, BLOB_DATA
.join(""), "Correct text");
195 info("Slice the the retrieved blob and verify its contents.");
197 let slice
= cursorResults
[1].blob
.slice(0, BLOB_DATA
[0].length
);
199 fileReader
= new FileReader();
200 fileReader
.onload
= grabEventAndContinueHandler
;
201 fileReader
.readAsText(slice
);
202 event
= yield undefined;
204 is(event
.target
.result
, BLOB_DATA
[0], "Correct text");
207 info("Send blob to a worker, read its contents there, and verify results.");
209 function workerScript() {
210 /* eslint-env worker */
211 onmessage = function(event
) {
212 var reader
= new FileReaderSync();
213 postMessage(reader
.readAsText(event
.data
));
215 var slice
= event
.data
.slice(1, 2);
216 postMessage(reader
.readAsText(slice
));
221 URL
.createObjectURL(new Blob(["(", workerScript
.toString(), ")()"]));
223 let worker
= new Worker(url
);
224 worker
.postMessage(slice
);
225 worker
.onmessage
= grabEventAndContinueHandler
;
226 event
= yield undefined;
228 is(event
.data
, BLOB_DATA
[0], "Correct text");
229 event
= yield undefined;
231 is(event
.data
, BLOB_DATA
[0][1], "Correct text");
234 info("Store a blob back in the database, and keep holding on to the " +
235 "blob, verifying that it still can be read.");
237 objectStore
= db
.transaction("foo").objectStore("foo");
238 objectStore
.get(key
).onsuccess
= grabEventAndContinueHandler
;
239 event
= yield undefined;
241 let blobFromDB
= event
.target
.result
.blob
;
242 info("Got blob from database");
244 let txn
= db
.transaction("foo", "readwrite");
245 txn
.objectStore("foo").put(event
.target
.result
, key
);
246 txn
.oncomplete
= grabEventAndContinueHandler
;
247 event
= yield undefined;
249 info("Stored blob back into database");
251 fileReader
= new FileReader();
252 fileReader
.onload
= grabEventAndContinueHandler
;
253 fileReader
.readAsText(blobFromDB
);
254 event
= yield undefined;
256 is(event
.target
.result
, BLOB_DATA
.join(""), "Correct text");
258 blobURL
= URL
.createObjectURL(blobFromDB
);
260 xhr
= new XMLHttpRequest();
261 xhr
.open("GET", blobURL
);
262 xhr
.onload
= grabEventAndContinueHandler
;
266 URL
.revokeObjectURL(blobURL
);
268 is(xhr
.responseText
, BLOB_DATA
.join(""), "Correct responseText");
274 <script type=
"text/javascript" src=
"helpers.js"></script>
278 <body onload=
"runTest();"></body>