<!DOCTYPE html>
<html>
<head>
    <title>W3C WebSocket API - Send null data - Secure WebSocket</title>
    <script type="text/javascript" src="/resources/testharness.js"></script>
    <script type="text/javascript" src="/resources/testharnessreport.js"></script>
    <script type="text/javascript" src="websocket.js?pipe=sub"></script>
</head>
<body>
    <div id="log"></div>
    <script type="text/javascript">

        var testOpen = async_test("W3C WebSocket API - Send null data on a Secure WebSocket - Connection should be opened");
        var testMessage = async_test("W3C WebSocket API - Send null data on a Secure WebSocket - Message should be received");
        var testClose = async_test("W3C WebSocket API - Send null data on a Secure WebSocket - Connection should be closed");

        var data = null;
        var nullReturned = false;
        var wsocket = CreateWebSocket(true, false, false);
        var isOpenCalled = false;

        wsocket.addEventListener('open', testOpen.step_func(function (evt) {
            wsocket.send(data);
            isOpenCalled = true;
            testOpen.done();
        }), true);

        wsocket.addEventListener('message', testMessage.step_func(function (evt) {
            if ("null" == evt.data || "" == evt.data)
                nullReturned = true;
            assert_true(nullReturned);
            wsocket.close();
            testMessage.done();
        }), true);

        wsocket.addEventListener('close', testClose.step_func(function (evt) {
            assert_true(isOpenCalled, "WebSocket connection should be open");
            assert_equals(evt.wasClean, true, "wasClean should be true");
            testClose.done();
        }), true);
    </script>
</body>
</html>
