WebSocket: Receive binary message as ArrayBuffer
[WebKit-https.git] / LayoutTests / http / tests / websocket / tests / hybi / receive-blob.html
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <link rel="stylesheet" href="../../../../js-test-resources/js-test-style.css">
5 <script src="../../../../js-test-resources/js-test-pre.js"></script>
6 </head>
7 <body>
8 <div id="description"></div>
9 <div id="console"></div>
10 <script>
11 description("WebSocket: Receive Blobs.");
12
13 window.jsTestIsAsync = true;
14 if (window.layoutTestController)
15     layoutTestController.overridePreference("WebKitHixie76WebSocketProtocolEnabled", 0);
16
17 function createArrayBufferContainingHelloWorld()
18 {
19     var hello = "Hello, world!";
20     var array = new Uint8Array(hello.length);
21     for (var i = 0; i < hello.length; ++i)
22         array[i] = hello.charCodeAt(i);
23     return array.buffer;
24 }
25
26 function createEmptyArrayBuffer()
27 {
28     return new ArrayBuffer(0);
29 }
30
31 function createArrayBufferContainingAllDistinctBytes()
32 {
33     var array = new Uint8Array(256);
34     for (var i = 0; i < 256; ++i)
35         array[i] = i;
36     return array.buffer;
37 }
38
39 var ws = new WebSocket("ws://127.0.0.1:8880/websocket/tests/hybi/binary-frames");
40 shouldBeEqualToString("ws.binaryType", "blob");
41
42 var closeEvent;
43 var receivedMessages = [];
44 var expectedValues = [createArrayBufferContainingHelloWorld(), createEmptyArrayBuffer(), createArrayBufferContainingAllDistinctBytes()];
45
46 ws.onmessage = function(event)
47 {
48     receivedMessages.push(event.data);
49 };
50
51 ws.onclose = function(event)
52 {
53     closeEvent = event;
54
55     shouldEvaluateTo("receivedMessages.length", expectedValues.length);
56     check(0);
57 };
58
59 var responseType;
60
61 function check(index)
62 {
63     if (index == expectedValues.length) {
64         finishJSTest();
65         return;
66     }
67
68     debug("Checking message #" + index + ".");
69     responseType = '' + receivedMessages[index];
70     shouldBeEqualToString("responseType", "[object Blob]");
71     var reader = new FileReader();
72     reader.readAsArrayBuffer(receivedMessages[index]);
73     reader.onload = function(event)
74     {
75         checkArrayBuffer(index, reader.result, expectedValues[index]);
76         check(index + 1);
77     };
78     reader.onerror = function(event)
79     {
80         testFailed("Failed to read blob: error code = " + reader.error.code);
81         check(index + 1);
82     };
83 }
84
85 var actualArray;
86 var expectedArray;
87
88 function checkArrayBuffer(testIndex, actual, expected)
89 {
90     actualArray = new Uint8Array(actual);
91     expectedArray = new Uint8Array(expected);
92     shouldEvaluateTo("actualArray.length", expectedArray.length);
93     // Print only the first mismatched byte in order not to flood console.
94     for (var i = 0; i < expectedArray.length; ++i) {
95         if (actualArray[i] != expectedArray[i]) {
96             testFailed("Value mismatch: actualArray[" + i + "] = " + actualArray[i] + ", expectedArray[" + i + "] = " + expectedArray[i]);
97             return;
98         }
99     }
100     testPassed("Passed: Message #" + testIndex + ".");
101 }
102
103 var successfullyParsed = true;
104 </script>
105 <script src="../../../../js-test-resources/js-test-post.js"></script>
106 </body>
107 </html>