<!DOCTYPE html>
<html>
<head>
<script src="../../../../js-test-resources/js-test-pre.js"></script>
</head>
<body>
<div id="description"></div>
<div id="console"></div>
<script type="text/javascript">
description("WebSocket: Send ArrayBufferViews.");

window.jsTestIsAsync = true;

function startsWith(target, prefix)
{
    return target.indexOf(prefix) === 0;
}

function createArrayBufferViewContainingHelloWorld()
{
    var hello = "Hello, world!";
    var array = new Uint8Array(hello.length);
    for (var i = 0; i < hello.length; ++i)
        array[i] = hello.charCodeAt(i);
    return array;
}

function createEmptyArrayBufferView()
{
    return new Uint8Array(0);
}

function createArrayBufferViewContainingAllDistinctBytes()
{
    // Return a slice of ArrayBuffer.
    var buffer = new ArrayBuffer(1000);
    var array = new Uint8Array(buffer, 123, 256);
    for (var i = 0; i < 256; ++i)
        array[i] = i;
    return array;
}

var url = "ws://127.0.0.1:8880/websocket/tests/hybi/check-binary-messages";
var ws = new WebSocket(url);
var closeEvent;

ws.onopen = function()
{
    ws.send(createArrayBufferViewContainingHelloWorld());
    ws.send(createEmptyArrayBufferView());
    ws.send(createArrayBufferViewContainingAllDistinctBytes());
};

ws.onmessage = function(event)
{
    var message = event.data;
    if (startsWith(message, "PASS"))
        testPassed(message);
    else
        testFailed(message);
};

ws.onclose = function(event)
{
    closeEvent = event;
    shouldBeTrue("closeEvent.wasClean");
    finishJSTest();
};

</script>
<script src="../../../../js-test-resources/js-test-post.js"></script>
</body>
</html>
