123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- <!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
- -->
- <html>
- <head>
- <title>Indexed Database Test</title>
- <script type="text/javascript">
- function report(result) {
- var message = { source: "iframe" };
- message.result = result;
- window.parent.postMessage(message, "*");
- }
- function runIndexedDBTest() {
- var db = null;
- // Create the data-store
- function createDatastore() {
- try {
- var request = indexedDB.open(window.location.pathname, 1);
- request.onupgradeneeded = function(event) {
- event.target.result.createObjectStore("foo");
- }
- request.onsuccess = function(event) {
- db = event.target.result;
- createAndStoreBlob();
- }
- }
- catch (e) {
- dump("EXCEPTION IN CREATION: " + e + "\n " + e.stack + "\n");
- report(false);
- }
- }
- function createAndStoreBlob() {
- const BLOB_DATA = ["fun ", "times ", "all ", "around!"];
- var blob = new Blob(BLOB_DATA, { type: "text/plain" });
- var objectStore = db.transaction("foo", "readwrite").objectStore("foo");
- objectStore.add({ blob: blob }, 42).onsuccess = refetchBlob;
- }
- function refetchBlob() {
- var foo = db.transaction("foo").objectStore("foo");
- foo.get(42).onsuccess = fetchedBlobCreateWorkerAndSendBlob;
- }
- function fetchedBlobCreateWorkerAndSendBlob(event) {
- var idbBlob = event.target.result.blob;
- var compositeBlob = new Blob(['I like the following blob: ', idbBlob],
- { type: "text/fancy" });
- function workerScript() {
- onmessage = function(event) {
- // Save the Blob to the worker's global scope.
- self.holdOntoBlob = event.data;
- // Send any message so we can serialize and keep our runtime behaviour
- // consistent.
- postMessage('kung fu death grip established');
- }
- }
- var url =
- URL.createObjectURL(new Blob(["(", workerScript.toSource(), ")()"]));
- // Keep a reference to the worker on the window.
- var worker = window.worker = new Worker(url);
- worker.postMessage(compositeBlob);
- worker.onmessage = workerLatchedBlobDeleteFromDB;
- }
- function workerLatchedBlobDeleteFromDB() {
- // Delete the reference to the Blob from the database leaving the worker
- // thread reference as the only live reference once a GC has cleaned
- // out our references that we sent to the worker. The page that owns
- // us triggers a GC just for that reason.
- var objectStore = db.transaction("foo", "readwrite").objectStore("foo");
- objectStore.delete(42).onsuccess = closeDBTellOwningThread;
- }
- function closeDBTellOwningThread(event) {
- // Now that worker has latched the blob, clean up the database.
- db.close();
- db = null;
- report('ready');
- }
- createDatastore();
- }
- </script>
- </head>
- <body onload="runIndexedDBTest();">
- </body>
- </html>
|