Make MessagePortChannel::takeAllMessagesFromRemote asynchronous.
[WebKit-https.git] / Source / WebCore / dom / InProcessMessagePortChannel.h
1 /*
2  * Copyright (C) 2017 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 "MessagePortChannel.h"
29 #include <wtf/MessageQueue.h>
30
31 namespace WebCore {
32
33 class InProcessMessagePortChannel : public MessagePortChannel {
34 public:
35     static void createChannelBetweenPorts(MessagePort&, MessagePort&);
36
37     ~InProcessMessagePortChannel() final;
38
39     void postMessageToRemote(Ref<SerializedScriptValue>&&, std::unique_ptr<MessagePortChannelArray>&&) final;
40     void takeAllMessagesFromRemote(CompletionHandler<void(Deque<std::unique_ptr<EventData>>&&)>&&) final;
41     bool isConnectedTo(const MessagePortIdentifier&) final;
42     bool entangleWithRemoteIfOpen(const MessagePortIdentifier&) final;
43     void disentangle() final;
44     bool hasPendingActivity() final;
45     MessagePort* locallyEntangledPort(const ScriptExecutionContext*) final;
46     void close() final;
47
48 private:
49     // Wrapper for MessageQueue that allows us to do thread safe sharing by two proxies.
50     class MessagePortQueue : public ThreadSafeRefCounted<MessagePortQueue> {
51     public:
52         static Ref<MessagePortQueue> create() { return adoptRef(*new MessagePortQueue()); }
53
54         Deque<std::unique_ptr<MessagePortChannel::EventData>> takeAllMessages()
55         {
56             return m_queue.takeAllMessages();
57         }
58
59         bool appendAndCheckEmpty(std::unique_ptr<MessagePortChannel::EventData>&& message)
60         {
61             return m_queue.appendAndCheckEmpty(WTFMove(message));
62         }
63
64         bool isEmpty()
65         {
66             return m_queue.isEmpty();
67         }
68
69     private:
70         MessagePortQueue() { }
71
72         MessageQueue<MessagePortChannel::EventData> m_queue;
73     };
74
75     static Ref<InProcessMessagePortChannel> create(MessagePortQueue& incoming, MessagePortQueue& outgoing);
76     InProcessMessagePortChannel(MessagePortQueue& incoming, MessagePortQueue& outgoing);
77
78     void setRemotePort(MessagePort*);
79     RefPtr<InProcessMessagePortChannel> takeEntangledChannel();
80
81     Lock m_lock;
82
83     RefPtr<InProcessMessagePortChannel> m_entangledChannel;
84
85     RefPtr<MessagePortQueue> m_incomingQueue;
86     RefPtr<MessagePortQueue> m_outgoingQueue;
87
88     MessagePort* m_remotePort { nullptr };
89 };
90
91 } // namespace WebCore