1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/indexedDB/test/test_blob_simple.html Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,264 @@ 1.4 +<!-- 1.5 + Any copyright is dedicated to the Public Domain. 1.6 + http://creativecommons.org/publicdomain/zero/1.0/ 1.7 +--> 1.8 +<html> 1.9 +<head> 1.10 + <title>Indexed Database Property Test</title> 1.11 + 1.12 + <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> 1.13 + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> 1.14 + 1.15 + <script type="text/javascript;version=1.7"> 1.16 + function testSteps() 1.17 + { 1.18 + info("Setting up test fixtures: create an IndexedDB database and object store."); 1.19 + 1.20 + let request = indexedDB.open(window.location.pathname, 1); 1.21 + request.onerror = errorHandler; 1.22 + request.onupgradeneeded = grabEventAndContinueHandler; 1.23 + request.onsuccess = unexpectedSuccessHandler; 1.24 + let event = yield undefined; 1.25 + 1.26 + let db = event.target.result; 1.27 + db.onerror = errorHandler; 1.28 + 1.29 + let objectStore = db.createObjectStore("foo", { autoIncrement: true }); 1.30 + let index = objectStore.createIndex("foo", "index"); 1.31 + 1.32 + request.onsuccess = grabEventAndContinueHandler; 1.33 + event = yield undefined; 1.34 + 1.35 + 1.36 + info("Let's create a blob and store it in IndexedDB twice."); 1.37 + 1.38 + const BLOB_DATA = ["fun ", "times ", "all ", "around!"]; 1.39 + const INDEX_KEY = 5; 1.40 + let blob = new Blob(BLOB_DATA, { type: "text/plain" }); 1.41 + let data = { blob: blob, index: INDEX_KEY }; 1.42 + 1.43 + objectStore = db.transaction("foo", "readwrite").objectStore("foo"); 1.44 + objectStore.add(data).onsuccess = grabEventAndContinueHandler; 1.45 + event = yield undefined; 1.46 + 1.47 + let key = event.target.result; 1.48 + 1.49 + objectStore.add(data).onsuccess = grabEventAndContinueHandler; 1.50 + event = yield undefined; 1.51 + 1.52 + 1.53 + info("Let's retrieve the blob again and verify the contents is the same."); 1.54 + 1.55 + objectStore = db.transaction("foo").objectStore("foo"); 1.56 + objectStore.get(key).onsuccess = grabEventAndContinueHandler; 1.57 + event = yield undefined; 1.58 + 1.59 + let fileReader = new FileReader(); 1.60 + fileReader.onload = grabEventAndContinueHandler; 1.61 + fileReader.readAsText(event.target.result.blob); 1.62 + event = yield undefined; 1.63 + 1.64 + is(event.target.result, BLOB_DATA.join(""), "Correct text"); 1.65 + 1.66 + 1.67 + info("Let's retrieve it again, create an object URL for the blob, load" + 1.68 + "it via an XMLHttpRequest, and verify the contents is the same."); 1.69 + 1.70 + objectStore = db.transaction("foo").objectStore("foo"); 1.71 + objectStore.get(key).onsuccess = grabEventAndContinueHandler; 1.72 + event = yield undefined; 1.73 + 1.74 + let blobURL = URL.createObjectURL(event.target.result.blob); 1.75 + 1.76 + let xhr = new XMLHttpRequest(); 1.77 + xhr.open("GET", blobURL); 1.78 + xhr.onload = grabEventAndContinueHandler; 1.79 + xhr.send(); 1.80 + yield undefined; 1.81 + 1.82 + URL.revokeObjectURL(blobURL); 1.83 + 1.84 + is(xhr.responseText, BLOB_DATA.join(""), "Correct responseText"); 1.85 + 1.86 + 1.87 + info("Retrieve both blob entries from the database and verify contents."); 1.88 + 1.89 + objectStore = db.transaction("foo").objectStore("foo"); 1.90 + objectStore.mozGetAll().onsuccess = grabEventAndContinueHandler; 1.91 + event = yield undefined; 1.92 + 1.93 + is(event.target.result.length, 2, "Got right number of items"); 1.94 + 1.95 + fileReader = new FileReader(); 1.96 + fileReader.onload = grabEventAndContinueHandler; 1.97 + fileReader.readAsText(event.target.result[0].blob); 1.98 + event = yield undefined; 1.99 + 1.100 + is(event.target.result, BLOB_DATA.join(""), "Correct text"); 1.101 + 1.102 + let cursorResults = []; 1.103 + 1.104 + objectStore = db.transaction("foo").objectStore("foo"); 1.105 + objectStore.openCursor().onsuccess = function(event) { 1.106 + let cursor = event.target.result; 1.107 + if (cursor) { 1.108 + cursorResults.push(cursor.value); 1.109 + cursor.continue(); 1.110 + } 1.111 + else { 1.112 + continueToNextStep(); 1.113 + } 1.114 + }; 1.115 + yield undefined; 1.116 + 1.117 + is(cursorResults.length, 2, "Got right number of items"); 1.118 + 1.119 + fileReader = new FileReader(); 1.120 + fileReader.onload = grabEventAndContinueHandler; 1.121 + fileReader.readAsText(cursorResults[0].blob); 1.122 + event = yield undefined; 1.123 + 1.124 + is(event.target.result, BLOB_DATA.join(""), "Correct text"); 1.125 + 1.126 + 1.127 + info("Retrieve blobs from database via index and verify contents."); 1.128 + 1.129 + let index = db.transaction("foo").objectStore("foo").index("foo"); 1.130 + index.get(INDEX_KEY).onsuccess = grabEventAndContinueHandler; 1.131 + event = yield undefined; 1.132 + 1.133 + fileReader = new FileReader(); 1.134 + fileReader.onload = grabEventAndContinueHandler; 1.135 + fileReader.readAsText(event.target.result.blob); 1.136 + event = yield undefined; 1.137 + 1.138 + is(event.target.result, BLOB_DATA.join(""), "Correct text"); 1.139 + 1.140 + index = db.transaction("foo").objectStore("foo").index("foo"); 1.141 + index.mozGetAll().onsuccess = grabEventAndContinueHandler; 1.142 + event = yield undefined; 1.143 + 1.144 + is(event.target.result.length, 2, "Got right number of items"); 1.145 + 1.146 + fileReader = new FileReader(); 1.147 + fileReader.onload = grabEventAndContinueHandler; 1.148 + fileReader.readAsText(event.target.result[0].blob); 1.149 + event = yield undefined; 1.150 + 1.151 + is(event.target.result, BLOB_DATA.join(""), "Correct text"); 1.152 + 1.153 + cursorResults = []; 1.154 + 1.155 + index = db.transaction("foo").objectStore("foo").index("foo"); 1.156 + index.openCursor().onsuccess = function(event) { 1.157 + let cursor = event.target.result; 1.158 + if (cursor) { 1.159 + cursorResults.push(cursor.value); 1.160 + cursor.continue(); 1.161 + } 1.162 + else { 1.163 + continueToNextStep(); 1.164 + } 1.165 + }; 1.166 + yield undefined; 1.167 + 1.168 + is(cursorResults.length, 2, "Got right number of items"); 1.169 + 1.170 + fileReader = new FileReader(); 1.171 + fileReader.onload = grabEventAndContinueHandler; 1.172 + fileReader.readAsText(cursorResults[0].blob); 1.173 + event = yield undefined; 1.174 + 1.175 + is(event.target.result, BLOB_DATA.join(""), "Correct text"); 1.176 + 1.177 + fileReader = new FileReader(); 1.178 + fileReader.onload = grabEventAndContinueHandler; 1.179 + fileReader.readAsText(cursorResults[1].blob); 1.180 + event = yield undefined; 1.181 + 1.182 + is(event.target.result, BLOB_DATA.join(""), "Correct text"); 1.183 + 1.184 + 1.185 + info("Slice the the retrieved blob and verify its contents."); 1.186 + 1.187 + let slice = cursorResults[1].blob.slice(0, BLOB_DATA[0].length); 1.188 + 1.189 + fileReader = new FileReader(); 1.190 + fileReader.onload = grabEventAndContinueHandler; 1.191 + fileReader.readAsText(slice); 1.192 + event = yield undefined; 1.193 + 1.194 + is(event.target.result, BLOB_DATA[0], "Correct text"); 1.195 + 1.196 + 1.197 + info("Send blob to a worker, read its contents there, and verify results."); 1.198 + 1.199 + function workerScript() { 1.200 + onmessage = function(event) { 1.201 + var reader = new FileReaderSync(); 1.202 + postMessage(reader.readAsText(event.data)); 1.203 + 1.204 + var slice = event.data.slice(1, 2); 1.205 + postMessage(reader.readAsText(slice)); 1.206 + 1.207 + } 1.208 + } 1.209 + 1.210 + let url = 1.211 + URL.createObjectURL(new Blob(["(", workerScript.toSource(), ")()"])); 1.212 + 1.213 + let worker = new Worker(url); 1.214 + worker.postMessage(slice); 1.215 + worker.onmessage = grabEventAndContinueHandler; 1.216 + event = yield undefined; 1.217 + 1.218 + is(event.data, BLOB_DATA[0], "Correct text"); 1.219 + event = yield undefined; 1.220 + 1.221 + is(event.data, BLOB_DATA[0][1], "Correct text"); 1.222 + 1.223 + 1.224 + info("Store a blob back in the database, and keep holding on to the " + 1.225 + "blob, verifying that it still can be read."); 1.226 + 1.227 + objectStore = db.transaction("foo").objectStore("foo"); 1.228 + objectStore.get(key).onsuccess = grabEventAndContinueHandler; 1.229 + event = yield undefined; 1.230 + 1.231 + let blobFromDB = event.target.result.blob; 1.232 + let txn = db.transaction("foo", "readwrite"); 1.233 + txn.objectStore("foo").put(event.target.result, key); 1.234 + txn.oncomplete = grabEventAndContinueHandler; 1.235 + event = yield undefined; 1.236 + 1.237 + let fileReader = new FileReader(); 1.238 + fileReader.onload = grabEventAndContinueHandler; 1.239 + fileReader.readAsText(blobFromDB); 1.240 + event = yield undefined; 1.241 + 1.242 + is(event.target.result, BLOB_DATA.join(""), "Correct text"); 1.243 + 1.244 + let blobURL = URL.createObjectURL(blobFromDB); 1.245 + 1.246 + let xhr = new XMLHttpRequest(); 1.247 + xhr.open("GET", blobURL); 1.248 + xhr.onload = grabEventAndContinueHandler; 1.249 + xhr.send(); 1.250 + yield undefined; 1.251 + 1.252 + URL.revokeObjectURL(blobURL); 1.253 + 1.254 + is(xhr.responseText, BLOB_DATA.join(""), "Correct responseText"); 1.255 + 1.256 + 1.257 + finishTest(); 1.258 + yield undefined; 1.259 + } 1.260 + </script> 1.261 + <script type="text/javascript;version=1.7" src="helpers.js"></script> 1.262 + 1.263 +</head> 1.264 + 1.265 +<body onload="runTest();"></body> 1.266 + 1.267 +</html>