blob: 5a1f5626dc28f7379963c0ac3f9a0d7a567af994 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
<!doctype html>
<script src="../../resources/js-test.js"></script>
<script src="resources/read-common.js"></script>
<script>
description("Test the Blob.close() method, revoking.");
window.jsTestIsAsync = true;
function base64ToUint8Array(a)
{
var binary = window.atob(a);
var buffer = new Uint8Array(binary.length);
for (var i = 0; i < binary.length; i++)
buffer[i] = binary.charCodeAt(i);
return buffer;
}
var pngBase64 = "iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD/gAIDAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAnklEQVR42u3QMQEAAAgDoGlyo1vBzwciUJlw1ApkyZIlS5YsBbJkyZIlS5YCWbJkyZIlS4EsWbJkyZKlQJYsWbJkyVIgS5YsWbJkKZAlS5YsWbIUyJIlS5YsWQpkyZIlS5YsBbJkyZIlS5YCWbJkyZIlS4EsWbJkyZKlQJYsWbJkyVIgS5YsWbJkKZAlS5YsWbIUyJIlS5YsWQpkyfq2MosBSIeKONMAAAAASUVORK5CYII=";
var blobContents = [base64ToUint8Array(pngBase64)];
var blob;
var blobURL1;
var blobURL2;
var img;
var worker;
var blobURLs = [];
function testRevokeAfterCloseWorkers()
{
debug("Test that dereferencing URLs referring to closed Blobs fail, workers.");
blob = new Blob(["postMessage('FAIL');"], {type: "application/javascript"});
for (var i = 0; i < 10; i++)
blobURLs.push(window.URL.createObjectURL(blob));
// First check that the Blob URL can be used by a Worker,
// then close it and verify that the rest cannot.
function onNonClosedError() {
testFailed("Worker failed to load from Blob.");
blob.close();
testNextWorker();
}
function onNonClosedMessage() {
testPassed("Worker loaded.");
blob.close();
testNextWorker();
}
function onClosedError() {
testPassed("Error triggered on starting Worker from a closed Blob.");
testNextWorker();
}
function onClosedMessage() {
testFailed("Worker loaded.");
testNextWorker();
}
function testNextWorker(onerror, onmessage) {
var u = blobURLs.shift();
if (u) {
worker = new Worker(u);
worker.onerror = onerror ? onerror : onClosedError;
worker.onmessage = onmessage ? onmessage : onClosedMessage;
} else {
runNextTest();
}
}
testNextWorker(onNonClosedError, onNonClosedMessage);
}
function testRevokeAfterClose()
{
debug("Test that dereferencing URLs referring to closed Blobs fail.");
blob = new Blob(blobContents, {type: "image/png"});
img = document.createElement("img");
img.onerror = function (e) {
testPassed("Error triggered on loading image from closed Blob.");
runNextTest();
};
img.onload = function () {
testFailed("Image loaded");
runNextTest();
};
blobURL1 = window.URL.createObjectURL(blob);
// create some more Blob URLs.
for (var i = 0; i < 10; i++)
window.URL.createObjectURL(blob);
// Make them all inaccessible.
blob.close();
img.src = blobURL1;
}
function testCreateAfterClose()
{
debug("Test creating object URLs on closed Blobs");
blob = new Blob(["body{background: green}"], {type: "text/css"});
blob.close();
shouldThrow("window.URL.createObjectURL(blob);");
runNextTest();
}
var tests = [
testRevokeAfterClose,
testRevokeAfterCloseWorkers,
testCreateAfterClose ];
function runNextTest()
{
if (!tests.length) {
finishJSTest();
return;
}
tests.shift()();
}
</script>
<body onload="runNextTest()">
</body>
|