15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011, 2012 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
32f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebSocketImpl.h"
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h"
351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/frame/ConsoleTypes.h"
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/websockets/MainThreadWebSocketChannel.h"
3709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "modules/websockets/NewWebSocketChannelImpl.h"
3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/websockets/WebSocketChannel.h"
3976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "platform/RuntimeEnabledFeatures.h"
400019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch#include "public/platform/WebArrayBuffer.h"
415267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebString.h"
425267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebURL.h"
43f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebDocument.h"
44c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "web/WebSocketChannelClientProxy.h"
45521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "wtf/ArrayBuffer.h"
4676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "wtf/text/CString.h"
47f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#include "wtf/text/WTFString.h"
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink {
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebSocketImpl::WebSocketImpl(const WebDocument& document, WebSocketClient* client)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : m_client(client)
53c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    , m_channelProxy(WebSocketChannelClientProxy::create(this))
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_binaryType(BinaryTypeBlob)
5576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    , m_isClosingOrClosed(false)
5676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    , m_bufferedAmount(0)
5776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    , m_bufferedAmountAfterClose(0)
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
59323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    RefPtrWillBeRawPtr<Document> coreDocument = PassRefPtrWillBeRawPtr<Document>(document);
6009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (RuntimeEnabledFeatures::experimentalWebSocketEnabled()) {
61c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        m_private = NewWebSocketChannelImpl::create(coreDocument.get(), m_channelProxy.get());
6209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    } else {
63c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        m_private = MainThreadWebSocketChannel::create(coreDocument.get(), m_channelProxy.get());
6409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebSocketImpl::~WebSocketImpl()
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_private->disconnect();
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebSocket::BinaryType WebSocketImpl::binaryType() const
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_binaryType;
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebSocketImpl::setBinaryType(BinaryType binaryType)
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (binaryType > BinaryTypeArrayBuffer)
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_binaryType = binaryType;
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebSocketImpl::connect(const WebURL& url, const WebString& protocol)
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_private->connect(url, protocol);
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebString WebSocketImpl::subprotocol()
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
925d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return m_subprotocol;
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebString WebSocketImpl::extensions()
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
975d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return m_extensions;
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebSocketImpl::sendText(const WebString& message)
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    size_t size = message.utf8().length();
10376c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    m_bufferedAmount += size;
10476c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    if (m_isClosingOrClosed)
10576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        m_bufferedAmountAfterClose += size;
10676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
10776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    // FIXME: Deprecate this call.
10876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    m_client->didUpdateBufferedAmount(m_bufferedAmount);
10976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
11076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    if (m_isClosingOrClosed)
11176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        return true;
11276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
113c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    m_private->send(message);
114c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return true;
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebSocketImpl::sendArrayBuffer(const WebArrayBuffer& webArrayBuffer)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    size_t size = webArrayBuffer.byteLength();
12076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    m_bufferedAmount += size;
12176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    if (m_isClosingOrClosed)
12276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        m_bufferedAmountAfterClose += size;
12376c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
12476c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    // FIXME: Deprecate this call.
12576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    m_client->didUpdateBufferedAmount(m_bufferedAmount);
12676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
12776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    if (m_isClosingOrClosed)
12876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        return true;
12976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
130c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    m_private->send(*PassRefPtr<ArrayBuffer>(webArrayBuffer), 0, webArrayBuffer.byteLength());
131c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return true;
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned long WebSocketImpl::bufferedAmount() const
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    return m_bufferedAmount;
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebSocketImpl::close(int code, const WebString& reason)
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    m_isClosingOrClosed = true;
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_private->close(code, reason);
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebSocketImpl::fail(const WebString& reason)
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
147f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    m_private->fail(reason, ErrorMessageLevel, String(), 0);
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebSocketImpl::disconnect()
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_private->disconnect();
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_client = 0;
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1565d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void WebSocketImpl::didConnect(const String& subprotocol, const String& extensions)
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    m_client->didConnect(subprotocol, extensions);
15976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
16076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    // FIXME: Deprecate these statements.
1615d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    m_subprotocol = subprotocol;
1625d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    m_extensions = extensions;
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_client->didConnect();
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebSocketImpl::didReceiveMessage(const String& message)
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_client->didReceiveMessage(WebString(message));
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebSocketImpl::didReceiveBinaryData(PassOwnPtr<Vector<char> > binaryData)
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (m_binaryType) {
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case BinaryTypeBlob:
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // FIXME: Handle Blob after supporting WebBlob.
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case BinaryTypeArrayBuffer:
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_client->didReceiveArrayBuffer(WebArrayBuffer(ArrayBuffer::create(binaryData->data(), binaryData->size())));
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebSocketImpl::didReceiveMessageError()
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_client->didReceiveMessageError();
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)void WebSocketImpl::didConsumeBufferedAmount(unsigned long consumed)
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    m_client->didConsumeBufferedAmount(consumed);
19176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
19276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    // FIXME: Deprecate the following statements.
19376c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    m_bufferedAmount -= consumed;
19476c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    m_client->didUpdateBufferedAmount(m_bufferedAmount);
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebSocketImpl::didStartClosingHandshake()
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_client->didStartClosingHandshake();
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
202c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void WebSocketImpl::didClose(WebSocketChannelClient::ClosingHandshakeCompletionStatus status, unsigned short code, const String& reason)
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
20476c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    m_isClosingOrClosed = true;
20576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    m_client->didClose(static_cast<WebSocketClient::ClosingHandshakeCompletionStatus>(status), code, WebString(reason));
20676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
20776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    // FIXME: Deprecate this call.
20876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    m_client->didClose(m_bufferedAmount - m_bufferedAmountAfterClose, static_cast<WebSocketClient::ClosingHandshakeCompletionStatus>(status), code, WebString(reason));
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} // namespace blink
212