Index: LayoutTests/storage/indexeddb/blob-valid-after-deletion.html |
diff --git a/LayoutTests/storage/indexeddb/blob-valid-after-deletion.html b/LayoutTests/storage/indexeddb/blob-valid-after-deletion.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0532604c5a9ae83ebabc7a499a2d094271919bde |
--- /dev/null |
+++ b/LayoutTests/storage/indexeddb/blob-valid-after-deletion.html |
@@ -0,0 +1,86 @@ |
+<html> |
+<head> |
+<script src="../../resources/js-test.js"></script> |
+<script src="resources/shared.js"></script> |
+</head> |
+<body> |
+<iframe id="frame0"></iframe> |
+<iframe id="frame1"></iframe> |
+<iframe id="frame2"></iframe> |
+<script> |
+ |
+description("Confirm that blobs stay alive after their records are deleted."); |
+ |
+indexedDBTest(prepareDatabase, doRead); |
+function prepareDatabase() |
+{ |
+ db = event.target.result; |
+ event.target.transaction.onabort = unexpectedAbortCallback; |
+ evalAndLog("store = db.createObjectStore('store')"); |
+ blobAContent = "Blob A content"; |
+ blobBContent = "Blob B content"; |
+ var blobA = new Blob([blobAContent], {"type" : "text\/plain"}); |
+ var blobB = new Blob([blobBContent], {"type" : "text\/plain"}); |
+ key = "key" |
+ value = { a0: blobA, a1: blobA, b0: blobB }; |
+ evalAndLog("store.put(value, key)"); |
+ delete value; |
+} |
+ |
+function doRead() |
+{ |
+ preamble(); |
+ evalAndLog("trans = db.transaction('store')"); |
+ evalAndLog("store = trans.objectStore('store')"); |
+ evalAndLog("request = store.get(key)"); |
+ request.onsuccess = didRead; |
+} |
+ |
+function didRead() |
+{ |
+ record = request.result; |
+ trans.oncomplete = doDelete; |
+} |
+ |
+function doDelete() |
+{ |
+ evalAndLog("trans = db.transaction('store', 'readwrite')"); |
+ evalAndLog("store = trans.objectStore('store')"); |
+ evalAndLog("request = store.delete(key)"); |
+ trans.oncomplete = didDelete; |
+} |
+ |
+function didDelete() |
+{ |
+ urlA0 = URL.createObjectURL(record.a0); |
+ urlA1 = URL.createObjectURL(record.a1); |
+ urlB = URL.createObjectURL(record.b0); |
+ document.getElementById('frame0').src = urlA0; |
+ document.getElementById('frame0').onload = verification; |
+ document.getElementById('frame1').src = urlA1; |
+ document.getElementById('frame1').onload = verification; |
+ document.getElementById('frame2').src = urlB; |
+ document.getElementById('frame2').onload = verification; |
+} |
+ |
+var loadCount = 0; |
+function verification() |
+{ |
+ if (++loadCount < 3) |
jsbell
2014/06/02 23:05:06
I wouldn't change this now, but in the future we s
ericu
2014/06/02 23:53:08
Yeah, it'd be nice to pull out all such hacks.
|
+ return; |
+ URL.revokeObjectURL(urlA0); |
+ URL.revokeObjectURL(urlA1); |
+ URL.revokeObjectURL(urlB); |
+ shouldBe("document.getElementById('frame0').contentDocument.body.innerText", |
+ "blobAContent"); |
+ shouldBe("document.getElementById('frame1').contentDocument.body.innerText", |
+ "blobAContent"); |
+ shouldBe("document.getElementById('frame2').contentDocument.body.innerText", |
+ "blobBContent"); |
+ finishJSTest(); |
+} |
+ |
+</script> |
+</body> |
+</html> |
+ |