1/*
2 * Copyright (C) 2019 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#pragma once
27
28#include "MessageReceiver.h"
29#include "MessageSender.h"
30#include <WebCore/ThreadableWebSocketChannel.h>
31#include <pal/SessionID.h>
32#include <wtf/Deque.h>
33#include <wtf/Identified.h>
34#include <wtf/WeakPtr.h>
35
36namespace IPC {
37class Connection;
38class Decoder;
39class DataReference;
40}
41
42namespace WebKit {
43
44class WebSocketChannel : public IPC::MessageSender, public IPC::MessageReceiver, public WebCore::ThreadableWebSocketChannel, public RefCounted<WebSocketChannel>, public Identified<WebSocketChannel> {
45public:
46 static Ref<WebSocketChannel> create(WebCore::Document&, WebCore::WebSocketChannelClient&);
47 ~WebSocketChannel();
48
49 void didReceiveMessage(IPC::Connection&, IPC::Decoder&);
50
51 void networkProcessCrashed();
52 void didFail();
53
54 using RefCounted<WebSocketChannel>::ref;
55 using RefCounted<WebSocketChannel>::deref;
56
57private:
58 WebSocketChannel(WebCore::Document&, WebCore::WebSocketChannelClient&);
59
60 // ThreadableWebSocketChannel
61 ConnectStatus connect(const URL&, const String& protocol) final;
62 String subprotocol() final;
63 String extensions() final;
64 SendResult send(const String& message) final;
65 SendResult send(const JSC::ArrayBuffer&, unsigned byteOffset, unsigned byteLength) final;
66 SendResult send(WebCore::Blob&) final;
67 unsigned bufferedAmount() const final;
68 void close(int code, const String& reason) final;
69 void fail(const String& reason) final;
70 void disconnect() final;
71 void suspend() final;
72 void resume() final;
73 void refThreadableWebSocketChannel() final { ref(); }
74 void derefThreadableWebSocketChannel() final { deref(); }
75
76 // Message receivers
77 void didConnect();
78 void didReceiveText(const String&);
79 void didReceiveBinaryData(const IPC::DataReference&);
80 void didClose(unsigned short code, const String&);
81
82 // MessageSender
83 IPC::Connection* messageSenderConnection() const final;
84 uint64_t messageSenderDestinationID() const final;
85
86 void enqueueTask(Function<void()>&&);
87
88 WeakPtr<WebCore::Document> m_document;
89 WeakPtr<WebCore::WebSocketChannelClient> m_client;
90 size_t m_bufferedAmount { 0 };
91 bool m_isClosing { false };
92 bool m_isSuspended { false };
93 Deque<Function<void()>> m_pendingTasks;
94};
95
96} // namespace WebKit
97