зеркало из https://github.com/mozilla/gecko-dev.git
99 строки
3.0 KiB
HTML
99 строки
3.0 KiB
HTML
<!--
|
|
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>
|