bb0cf6d5d5aadec7db62980045a8937e7715fc7e
[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 createHelloWorldValue()
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 createEmptyValue()
27 {
28     return new ArrayBuffer(0);
29 }
30
31 // Create an ArrayBuffer containing all distinct bytes ("\x00" to "\xFF").
32 function createAllBytesValue()
33 {
34     var array = new Uint8Array(256);
35     for (var i = 0; i < 256; ++i)
36         array[i] = i;
37     return array.buffer;
38 }
39
40 var ws = new WebSocket("ws://127.0.0.1:8880/websocket/tests/hybi/binary-frames");
41 shouldBeEqualToString("ws.binaryType", "blob");
42
43 var closeEvent;
44 var receivedMessages = [];
45 var expectedValues = [createHelloWorldValue(), createEmptyValue(), createAllBytesValue()];
46
47 ws.onmessage = function(event)
48 {
49     receivedMessages.push(event.data);
50 };
51
52 ws.onclose = function(event)
53 {
54     closeEvent = event;
55
56     shouldEvaluateTo("receivedMessages.length", expectedValues.length);
57     check(0);
58 };
59
60 var responseType;
61
62 function check(index)
63 {
64     if (index == expectedValues.length) {
65         finishJSTest();
66         return;
67     }
68
69     debug("Checking message #" + index + ".");
70     responseType = '' + receivedMessages[index];
71     shouldBeEqualToString("responseType", "[object Blob]");
72     var reader = new FileReader();
73     reader.readAsArrayBuffer(receivedMessages[index]);
74     reader.onload = function(event)
75     {
76         checkArrayBuffer(index, reader.result, expectedValues[index]);
77         check(index + 1);
78     };
79     reader.onerror = function(event)
80     {
81         testFailed("Failed to read blob: error code = " + reader.error.code);
82         check(index + 1);
83     };
84 }
85
86 var actualArray;
87 var expectedArray;
88
89 function checkArrayBuffer(testIndex, actual, expected)
90 {
91     actualArray = new Uint8Array(actual);
92     expectedArray = new Uint8Array(expected);
93     shouldEvaluateTo("actualArray.length", expectedArray.length);
94     // Print only the first mismatched byte in order not to flood console.
95     for (var i = 0; i < expectedArray.length; ++i) {
96         if (actualArray[i] != expectedArray[i]) {
97             testFailed("Value mismatch: actualArray[" + i + "] = " + actualArray[i] + ", expectedArray[" + i + "] = " + expectedArray[i]);
98             return;
99         }
100     }
101     testPassed("Passed: Message #" + testIndex + ".");
102 }
103
104 var successfullyParsed = true;
105 </script>
106 <script src="../../../../js-test-resources/js-test-post.js"></script>
107 </body>
108 </html>