test_blob_simple.html (8427B)
1 <!-- 2 Any copyright is dedicated to the Public Domain. 3 http://creativecommons.org/publicdomain/zero/1.0/ 4 --> 5 <html> 6 <head> 7 <title>Indexed Database Property Test</title> 8 9 <script src="/tests/SimpleTest/SimpleTest.js"></script> 10 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> 11 12 <script type="text/javascript"> 13 function* testSteps() 14 { 15 info("Setting up test fixtures: create an IndexedDB database and object store."); 16 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; 22 23 let db = event.target.result; 24 db.onerror = errorHandler; 25 26 let objectStore = db.createObjectStore("foo", { autoIncrement: true }); 27 let index = objectStore.createIndex("foo", "index"); 28 29 request.onsuccess = grabEventAndContinueHandler; 30 event = yield undefined; 31 32 33 info("Let's create a blob and store it in IndexedDB twice."); 34 35 const BLOB_DATA = ["fun ", "times ", "all ", "around!"]; 36 const INDEX_KEY = 5; 37 let blob = new Blob(BLOB_DATA, { type: "text/plain" }); 38 let data = { blob, index: INDEX_KEY }; 39 40 objectStore = db.transaction("foo", "readwrite").objectStore("foo"); 41 objectStore.add(data).onsuccess = grabEventAndContinueHandler; 42 event = yield undefined; 43 44 info("Added blob to database once"); 45 46 let key = event.target.result; 47 48 objectStore.add(data).onsuccess = grabEventAndContinueHandler; 49 event = yield undefined; 50 51 info("Added blob to database twice"); 52 53 info("Let's retrieve the blob again and verify the contents is the same."); 54 55 objectStore = db.transaction("foo").objectStore("foo"); 56 objectStore.get(key).onsuccess = grabEventAndContinueHandler; 57 event = yield undefined; 58 59 info("Got blob from database"); 60 61 let fileReader = new FileReader(); 62 fileReader.onload = grabEventAndContinueHandler; 63 fileReader.readAsText(event.target.result.blob); 64 event = yield undefined; 65 66 is(event.target.result, BLOB_DATA.join(""), "Correct text"); 67 68 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."); 71 72 objectStore = db.transaction("foo").objectStore("foo"); 73 objectStore.get(key).onsuccess = grabEventAndContinueHandler; 74 event = yield undefined; 75 76 info("Got blob from database"); 77 78 let blobURL = URL.createObjectURL(event.target.result.blob); 79 80 let xhr = new XMLHttpRequest(); 81 xhr.open("GET", blobURL); 82 xhr.onload = grabEventAndContinueHandler; 83 xhr.send(); 84 yield undefined; 85 86 URL.revokeObjectURL(blobURL); 87 88 is(xhr.responseText, BLOB_DATA.join(""), "Correct responseText"); 89 90 91 info("Retrieve both blob entries from the database and verify contents."); 92 93 objectStore = db.transaction("foo").objectStore("foo"); 94 objectStore.mozGetAll().onsuccess = grabEventAndContinueHandler; 95 event = yield undefined; 96 97 is(event.target.result.length, 2, "Got right number of items"); 98 99 fileReader = new FileReader(); 100 fileReader.onload = grabEventAndContinueHandler; 101 fileReader.readAsText(event.target.result[0].blob); 102 event = yield undefined; 103 104 is(event.target.result, BLOB_DATA.join(""), "Correct text"); 105 106 let cursorResults = []; 107 108 objectStore = db.transaction("foo").objectStore("foo"); 109 objectStore.openCursor().onsuccess = function(event) { 110 let cursor = event.target.result; 111 if (cursor) { 112 info("Got item from cursor"); 113 cursorResults.push(cursor.value); 114 cursor.continue(); 115 } 116 else { 117 info("Finished cursor"); 118 continueToNextStep(); 119 } 120 }; 121 yield undefined; 122 123 is(cursorResults.length, 2, "Got right number of items"); 124 125 fileReader = new FileReader(); 126 fileReader.onload = grabEventAndContinueHandler; 127 fileReader.readAsText(cursorResults[0].blob); 128 event = yield undefined; 129 130 is(event.target.result, BLOB_DATA.join(""), "Correct text"); 131 132 133 info("Retrieve blobs from database via index and verify contents."); 134 135 index = db.transaction("foo").objectStore("foo").index("foo"); 136 index.get(INDEX_KEY).onsuccess = grabEventAndContinueHandler; 137 event = yield undefined; 138 139 info("Got blob from database"); 140 141 fileReader = new FileReader(); 142 fileReader.onload = grabEventAndContinueHandler; 143 fileReader.readAsText(event.target.result.blob); 144 event = yield undefined; 145 146 is(event.target.result, BLOB_DATA.join(""), "Correct text"); 147 148 index = db.transaction("foo").objectStore("foo").index("foo"); 149 index.mozGetAll().onsuccess = grabEventAndContinueHandler; 150 event = yield undefined; 151 152 is(event.target.result.length, 2, "Got right number of items"); 153 154 fileReader = new FileReader(); 155 fileReader.onload = grabEventAndContinueHandler; 156 fileReader.readAsText(event.target.result[0].blob); 157 event = yield undefined; 158 159 is(event.target.result, BLOB_DATA.join(""), "Correct text"); 160 161 cursorResults = []; 162 163 index = db.transaction("foo").objectStore("foo").index("foo"); 164 index.openCursor().onsuccess = function(event) { 165 let cursor = event.target.result; 166 if (cursor) { 167 info("Got item from cursor"); 168 cursorResults.push(cursor.value); 169 cursor.continue(); 170 } 171 else { 172 info("Finished cursor"); 173 continueToNextStep(); 174 } 175 }; 176 yield undefined; 177 178 is(cursorResults.length, 2, "Got right number of items"); 179 180 fileReader = new FileReader(); 181 fileReader.onload = grabEventAndContinueHandler; 182 fileReader.readAsText(cursorResults[0].blob); 183 event = yield undefined; 184 185 is(event.target.result, BLOB_DATA.join(""), "Correct text"); 186 187 fileReader = new FileReader(); 188 fileReader.onload = grabEventAndContinueHandler; 189 fileReader.readAsText(cursorResults[1].blob); 190 event = yield undefined; 191 192 is(event.target.result, BLOB_DATA.join(""), "Correct text"); 193 194 195 info("Slice the the retrieved blob and verify its contents."); 196 197 let slice = cursorResults[1].blob.slice(0, BLOB_DATA[0].length); 198 199 fileReader = new FileReader(); 200 fileReader.onload = grabEventAndContinueHandler; 201 fileReader.readAsText(slice); 202 event = yield undefined; 203 204 is(event.target.result, BLOB_DATA[0], "Correct text"); 205 206 207 info("Send blob to a worker, read its contents there, and verify results."); 208 209 function workerScript() { 210 /* eslint-env worker */ 211 onmessage = function(event) { 212 var reader = new FileReaderSync(); 213 postMessage(reader.readAsText(event.data)); 214 215 var slice = event.data.slice(1, 2); 216 postMessage(reader.readAsText(slice)); 217 }; 218 } 219 220 let url = 221 URL.createObjectURL(new Blob(["(", workerScript.toString(), ")()"])); 222 223 let worker = new Worker(url); 224 worker.postMessage(slice); 225 worker.onmessage = grabEventAndContinueHandler; 226 event = yield undefined; 227 228 is(event.data, BLOB_DATA[0], "Correct text"); 229 event = yield undefined; 230 231 is(event.data, BLOB_DATA[0][1], "Correct text"); 232 233 234 info("Store a blob back in the database, and keep holding on to the " + 235 "blob, verifying that it still can be read."); 236 237 objectStore = db.transaction("foo").objectStore("foo"); 238 objectStore.get(key).onsuccess = grabEventAndContinueHandler; 239 event = yield undefined; 240 241 let blobFromDB = event.target.result.blob; 242 info("Got blob from database"); 243 244 let txn = db.transaction("foo", "readwrite"); 245 txn.objectStore("foo").put(event.target.result, key); 246 txn.oncomplete = grabEventAndContinueHandler; 247 event = yield undefined; 248 249 info("Stored blob back into database"); 250 251 fileReader = new FileReader(); 252 fileReader.onload = grabEventAndContinueHandler; 253 fileReader.readAsText(blobFromDB); 254 event = yield undefined; 255 256 is(event.target.result, BLOB_DATA.join(""), "Correct text"); 257 258 blobURL = URL.createObjectURL(blobFromDB); 259 260 xhr = new XMLHttpRequest(); 261 xhr.open("GET", blobURL); 262 xhr.onload = grabEventAndContinueHandler; 263 xhr.send(); 264 yield undefined; 265 266 URL.revokeObjectURL(blobURL); 267 268 is(xhr.responseText, BLOB_DATA.join(""), "Correct responseText"); 269 270 271 finishTest(); 272 } 273 </script> 274 <script type="text/javascript" src="helpers.js"></script> 275 276 </head> 277 278 <body onload="runTest();"></body> 279 280 </html>