1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef WebSocketChannelClientProxy_h
6#define WebSocketChannelClientProxy_h
7
8#include "modules/websockets/WebSocketChannelClient.h"
9#include "platform/heap/Handle.h"
10#include "web/WebSocketImpl.h"
11#include "wtf/PassOwnPtr.h"
12#include "wtf/Vector.h"
13#include "wtf/text/WTFString.h"
14
15namespace blink {
16
17// Ideally we want to simply make WebSocketImpl inherit from
18// WebSocketChannelClient, but we cannot do that because WebSocketChannelClient
19// needs to be on Oilpan's heap whereas WebSocketImpl cannot be on Oilpan's
20// heap. Thus we need to introduce a proxy class to decouple WebSocketImpl
21// from WebSocketChannelClient.
22class WebSocketChannelClientProxy FINAL : public GarbageCollectedFinalized<WebSocketChannelClientProxy>, public WebSocketChannelClient {
23    USING_GARBAGE_COLLECTED_MIXIN(WebSocketChannelClientProxy)
24public:
25    static WebSocketChannelClientProxy* create(WebSocketImpl* impl)
26    {
27        return new WebSocketChannelClientProxy(impl);
28    }
29
30    virtual void didConnect(const String& subprotocol, const String& extensions) OVERRIDE
31    {
32        m_impl->didConnect(subprotocol, extensions);
33    }
34    virtual void didReceiveMessage(const String& message) OVERRIDE
35    {
36        m_impl->didReceiveMessage(message);
37    }
38    virtual void didReceiveBinaryData(PassOwnPtr<Vector<char> > binaryData) OVERRIDE
39    {
40        m_impl->didReceiveBinaryData(binaryData);
41    }
42    virtual void didReceiveMessageError() OVERRIDE
43    {
44        m_impl->didReceiveMessageError();
45    }
46    virtual void didConsumeBufferedAmount(unsigned long consumed) OVERRIDE
47    {
48        m_impl->didConsumeBufferedAmount(consumed);
49    }
50    virtual void didStartClosingHandshake() OVERRIDE
51    {
52        m_impl->didStartClosingHandshake();
53    }
54    virtual void didClose(ClosingHandshakeCompletionStatus status, unsigned short code, const String& reason) OVERRIDE
55    {
56        WebSocketImpl* impl = m_impl;
57        m_impl = nullptr;
58        impl->didClose(status, code, reason);
59    }
60
61private:
62    explicit WebSocketChannelClientProxy(WebSocketImpl* impl)
63        : m_impl(impl)
64    {
65    }
66
67    WebSocketImpl* m_impl;
68};
69
70} // namespace blink
71
72#endif // WebSocketChannelClientProxy_h
73