1c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)/*
2c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * Copyright (C) 2013 Google Inc. All rights reserved.
3c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) *
4c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without
5c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * modification, are permitted provided that the following conditions are
6c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * met:
7c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) *
8c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) *     * Redistributions of source code must retain the above copyright
9c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * notice, this list of conditions and the following disclaimer.
10c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) *     * Redistributions in binary form must reproduce the above
11c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
12c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * in the documentation and/or other materials provided with the
13c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * distribution.
14c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
15c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * contributors may be used to endorse or promote products derived from
16c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * this software without specific prior written permission.
17c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) *
18c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) */
30c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
31c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)#ifndef NewWebSocketChannelImpl_h
32c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)#define NewWebSocketChannelImpl_h
33c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
348abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#include "core/dom/ContextLifecycleObserver.h"
35c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)#include "core/fileapi/Blob.h"
369bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#include "core/fileapi/FileError.h"
371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/frame/ConsoleTypes.h"
38c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)#include "modules/websockets/WebSocketChannel.h"
3951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/weborigin/KURL.h"
40c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)#include "public/platform/WebSocketHandle.h"
41c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)#include "public/platform/WebSocketHandleClient.h"
42c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)#include "wtf/ArrayBuffer.h"
43c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)#include "wtf/Deque.h"
44c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)#include "wtf/FastAllocBase.h"
45c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)#include "wtf/OwnPtr.h"
46d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "wtf/PassOwnPtr.h"
47c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)#include "wtf/PassRefPtr.h"
48c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)#include "wtf/RefPtr.h"
49c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)#include "wtf/Vector.h"
50c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)#include "wtf/text/CString.h"
51c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)#include "wtf/text/WTFString.h"
52c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
5351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink {
5451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
55f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)class Document;
56d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)class WebSocketHandshakeRequest;
57e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)class WebSocketHandshakeRequestInfo;
58e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)class WebSocketHandshakeResponseInfo;
59f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
60c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)// This class may replace MainThreadWebSocketChannel.
61e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)class NewWebSocketChannelImpl FINAL : public WebSocketChannel, public WebSocketHandleClient, public ContextLifecycleObserver {
62c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)public:
63c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    // You can specify the source file and the line number information
64c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    // explicitly by passing the last parameter.
65c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    // In the usual case, they are set automatically and you don't have to
66c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    // pass it.
67c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // Specify handle explicitly only in tests.
68e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    static NewWebSocketChannelImpl* create(ExecutionContext* context, WebSocketChannelClient* client, const String& sourceURL = String(), unsigned lineNumber = 0, WebSocketHandle *handle = 0)
69c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    {
70c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return adoptRefCountedGarbageCollected(new NewWebSocketChannelImpl(context, client, sourceURL, lineNumber, handle));
71c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    }
729bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    virtual ~NewWebSocketChannelImpl();
73c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
74c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    // WebSocketChannel functions.
75f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    virtual bool connect(const KURL&, const String& protocol) OVERRIDE;
76c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    virtual void send(const String& message) OVERRIDE;
77c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    virtual void send(const ArrayBuffer&, unsigned byteOffset, unsigned byteLength) OVERRIDE;
78c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    virtual void send(PassRefPtr<BlobDataHandle>) OVERRIDE;
79c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    virtual void send(PassOwnPtr<Vector<char> > data) OVERRIDE;
80c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    // Start closing handshake. Use the CloseEventCodeNotSpecified for the code
81c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    // argument to omit payload.
82c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    virtual void close(int code, const String& reason) OVERRIDE;
83c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    virtual void fail(const String& reason, MessageLevel, const String&, unsigned lineNumber) OVERRIDE;
84c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    virtual void disconnect() OVERRIDE;
85c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
86c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    virtual void suspend() OVERRIDE;
87c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    virtual void resume() OVERRIDE;
88c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
89323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    virtual void trace(Visitor*) OVERRIDE;
90323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
91c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)private:
92c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    enum MessageType {
93c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        MessageTypeText,
94c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        MessageTypeBlob,
95c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        MessageTypeArrayBuffer,
96d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        MessageTypeVector,
97197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        MessageTypeClose,
98c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    };
999bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
100c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    struct Message {
101c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        explicit Message(const String&);
1021e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        explicit Message(PassRefPtr<BlobDataHandle>);
103c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        explicit Message(PassRefPtr<ArrayBuffer>);
104d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        explicit Message(PassOwnPtr<Vector<char> >);
105197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        Message(unsigned short code, const String& reason);
106d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
107c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        MessageType type;
108d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
109c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        CString text;
1101e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        RefPtr<BlobDataHandle> blobDataHandle;
111c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        RefPtr<ArrayBuffer> arrayBuffer;
112d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        OwnPtr<Vector<char> > vectorData;
113197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        unsigned short code;
114197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        String reason;
115c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    };
116c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
117c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    struct ReceivedMessage {
118c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        bool isMessageText;
119c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        Vector<char> data;
120c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    };
121c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
1229bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    class BlobLoader;
1239bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
124e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    NewWebSocketChannelImpl(ExecutionContext*, WebSocketChannelClient*, const String&, unsigned, WebSocketHandle*);
125c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    void sendInternal();
126c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    void flowControlIfNecessary();
127a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    void failAsError(const String& reason) { fail(reason, ErrorMessageLevel, m_sourceURLAtConstruction, m_lineNumberAtConstruction); }
1289bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    void abortAsyncOperations();
12951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    void handleDidClose(bool wasClean, unsigned short code, const String& reason);
130f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    Document* document(); // can be called only when m_identifier > 0.
131c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
132c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    // WebSocketHandleClient functions.
133e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    virtual void didConnect(WebSocketHandle*, bool fail, const WebString& selectedProtocol, const WebString& extensions) OVERRIDE;
134e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    virtual void didStartOpeningHandshake(WebSocketHandle*, const WebSocketHandshakeRequestInfo&) OVERRIDE;
135e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    virtual void didFinishOpeningHandshake(WebSocketHandle*, const WebSocketHandshakeResponseInfo&) OVERRIDE;
136e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    virtual void didFail(WebSocketHandle*, const WebString& message) OVERRIDE;
137e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    virtual void didReceiveData(WebSocketHandle*, bool fin, WebSocketHandle::MessageType, const char* data, size_t /* size */) OVERRIDE;
138e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    virtual void didClose(WebSocketHandle*, bool wasClean, unsigned short code, const WebString& reason) OVERRIDE;
139e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    virtual void didReceiveFlowControl(WebSocketHandle*, int64_t quota) OVERRIDE;
140e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    virtual void didStartClosingHandshake(WebSocketHandle*) OVERRIDE;
141c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
1429bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    // Methods for BlobLoader.
1439bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    void didFinishLoadingBlob(PassRefPtr<ArrayBuffer>);
1449bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    void didFailLoadingBlob(FileError::ErrorCode);
145c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
1468abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    // LifecycleObserver functions.
147197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    virtual void contextDestroyed() OVERRIDE
148197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
149197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        // In oilpan we cannot assume this channel's finalizer has been called
150197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        // before the document it is observing is dead and finalized since there
151197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        // is no eager finalization. Instead the finalization happens at the
152197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        // next GC which could be long enough after the Peer::destroy call for
153197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        // the context (ie. Document) to be dead too. If the context's finalizer
154197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        // is run first this method gets called. Instead we assert the channel
155197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        // has been disconnected which happens in Peer::destroy.
156197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        ASSERT(!m_handle);
157197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        ASSERT(!m_client);
158197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        ASSERT(!m_identifier);
159c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        ContextLifecycleObserver::contextDestroyed();
160197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
1618abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
162c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    // m_handle is a handle of the connection.
163c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    // m_handle == 0 means this channel is closed.
164e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    OwnPtr<WebSocketHandle> m_handle;
165c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
166c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    // m_client can be deleted while this channel is alive, but this class
167c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    // expects that disconnect() is called before the deletion.
168c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    Member<WebSocketChannelClient> m_client;
169c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    KURL m_url;
170f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    // m_identifier > 0 means calling scriptContextExecution() returns a Document.
171f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    unsigned long m_identifier;
172c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    Member<BlobLoader> m_blobLoader;
173d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    Deque<OwnPtr<Message> > m_messages;
174c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    Vector<char> m_receivingMessageData;
175c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
176c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    bool m_receivingMessageTypeIsText;
177c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    int64_t m_sendingQuota;
178c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    int64_t m_receivedDataSizeForFlowControl;
179c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    size_t m_sentSizeOfTopMessage;
180c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
181a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    String m_sourceURLAtConstruction;
182a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    unsigned m_lineNumberAtConstruction;
183d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    RefPtr<WebSocketHandshakeRequest> m_handshakeRequest;
184f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
185c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    static const int64_t receivedDataSizeForFlowControlHighWaterMark = 1 << 15;
186c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)};
187c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
188c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
189c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
190c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)#endif // NewWebSocketChannelImpl_h
191