summaryrefslogtreecommitdiffstats
path: root/third_party/WebKit/LayoutTests/fast/files/blob-close-revoke.html
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>