Title: [226343] trunk/Source/WebCore
Revision
226343
Author
beid...@apple.com
Date
2018-01-02 16:51:01 -0800 (Tue, 02 Jan 2018)

Log Message

Make MessagePortChannel::takeAllMessagesFromRemote asynchronous.
https://bugs.webkit.org/show_bug.cgi?id=181205

Reviewed by Alex Christensen.

No new tests (No behavior change)

This is needed for the ongoing WK2 MessagePort work.

For WK1 in-process MessagePorts it is still synchronous; no behavior change.

* dom/InProcessMessagePortChannel.cpp:
(WebCore::InProcessMessagePortChannel::takeAllMessagesFromRemote):
* dom/InProcessMessagePortChannel.h:

* dom/MessagePort.cpp:
(WebCore::MessagePort::dispatchMessages):
* dom/MessagePortChannel.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (226342 => 226343)


--- trunk/Source/WebCore/ChangeLog	2018-01-03 00:20:48 UTC (rev 226342)
+++ trunk/Source/WebCore/ChangeLog	2018-01-03 00:51:01 UTC (rev 226343)
@@ -1,3 +1,24 @@
+2018-01-02  Brady Eidson  <beid...@apple.com>
+
+        Make MessagePortChannel::takeAllMessagesFromRemote asynchronous.
+        https://bugs.webkit.org/show_bug.cgi?id=181205
+
+        Reviewed by Alex Christensen.
+
+        No new tests (No behavior change)
+
+        This is needed for the ongoing WK2 MessagePort work.
+
+        For WK1 in-process MessagePorts it is still synchronous; no behavior change.
+
+        * dom/InProcessMessagePortChannel.cpp:
+        (WebCore::InProcessMessagePortChannel::takeAllMessagesFromRemote):
+        * dom/InProcessMessagePortChannel.h:
+
+        * dom/MessagePort.cpp:
+        (WebCore::MessagePort::dispatchMessages):
+        * dom/MessagePortChannel.h:
+
 2018-01-02  Jiewen Tan  <jiewen_...@apple.com>
 
         Add a WebAuthentication runtime feature flag

Modified: trunk/Source/WebCore/dom/InProcessMessagePortChannel.cpp (226342 => 226343)


--- trunk/Source/WebCore/dom/InProcessMessagePortChannel.cpp	2018-01-03 00:20:48 UTC (rev 226342)
+++ trunk/Source/WebCore/dom/InProcessMessagePortChannel.cpp	2018-01-03 00:51:01 UTC (rev 226343)
@@ -27,6 +27,7 @@
 #include "InProcessMessagePortChannel.h"
 
 #include "MessagePort.h"
+#include <wtf/CompletionHandler.h>
 #include <wtf/Locker.h>
 
 namespace WebCore {
@@ -75,10 +76,15 @@
         m_remotePort->messageAvailable();
 }
 
-Deque<std::unique_ptr<MessagePortChannel::EventData>> InProcessMessagePortChannel::takeAllMessagesFromRemote()
+void InProcessMessagePortChannel::takeAllMessagesFromRemote(CompletionHandler<void(Deque<std::unique_ptr<EventData>>&&)>&& callback)
 {
-    Locker<Lock> locker(m_lock);
-    return m_incomingQueue->takeAllMessages();
+    Deque<std::unique_ptr<EventData>> messages;
+    {
+        Locker<Lock> locker(m_lock);
+        messages = m_incomingQueue->takeAllMessages();
+    }
+
+    callback(WTFMove(messages));
 }
 
 bool InProcessMessagePortChannel::isConnectedTo(const MessagePortIdentifier& identifier)

Modified: trunk/Source/WebCore/dom/InProcessMessagePortChannel.h (226342 => 226343)


--- trunk/Source/WebCore/dom/InProcessMessagePortChannel.h	2018-01-03 00:20:48 UTC (rev 226342)
+++ trunk/Source/WebCore/dom/InProcessMessagePortChannel.h	2018-01-03 00:51:01 UTC (rev 226343)
@@ -37,7 +37,7 @@
     ~InProcessMessagePortChannel() final;
 
     void postMessageToRemote(Ref<SerializedScriptValue>&&, std::unique_ptr<MessagePortChannelArray>&&) final;
-    Deque<std::unique_ptr<EventData>> takeAllMessagesFromRemote() final;
+    void takeAllMessagesFromRemote(CompletionHandler<void(Deque<std::unique_ptr<EventData>>&&)>&&) final;
     bool isConnectedTo(const MessagePortIdentifier&) final;
     bool entangleWithRemoteIfOpen(const MessagePortIdentifier&) final;
     void disentangle() final;

Modified: trunk/Source/WebCore/dom/MessagePort.cpp (226342 => 226343)


--- trunk/Source/WebCore/dom/MessagePort.cpp	2018-01-03 00:20:48 UTC (rev 226342)
+++ trunk/Source/WebCore/dom/MessagePort.cpp	2018-01-03 00:51:01 UTC (rev 226343)
@@ -203,17 +203,19 @@
     if (!m_entangledChannel)
         return;
 
-    bool contextIsWorker = is<WorkerGlobalScope>(*m_scriptExecutionContext);
-
-    auto pendingMessages = m_entangledChannel->takeAllMessagesFromRemote();
-    for (auto& message : pendingMessages) {
-        // close() in Worker onmessage handler should prevent next message from dispatching.
-        if (contextIsWorker && downcast<WorkerGlobalScope>(*m_scriptExecutionContext).isClosing())
+    m_entangledChannel->takeAllMessagesFromRemote([this, protectedThis = makeRef(*this)](Deque<std::unique_ptr<MessagePortChannel::EventData>>&& messages) {
+        if (!m_scriptExecutionContext)
             return;
 
-        auto ports = MessagePort::entanglePorts(*m_scriptExecutionContext, WTFMove(message->channels));
-        dispatchEvent(MessageEvent::create(WTFMove(ports), WTFMove(message->message)));
-    }
+        bool contextIsWorker = is<WorkerGlobalScope>(*m_scriptExecutionContext);
+        for (auto& message : messages) {
+            // close() in Worker onmessage handler should prevent next message from dispatching.
+            if (contextIsWorker && downcast<WorkerGlobalScope>(*m_scriptExecutionContext).isClosing())
+                return;
+            auto ports = MessagePort::entanglePorts(*m_scriptExecutionContext, WTFMove(message->channels));
+            dispatchEvent(MessageEvent::create(WTFMove(ports), WTFMove(message->message)));
+        }
+    });
 }
 
 bool MessagePort::hasPendingActivity() const

Modified: trunk/Source/WebCore/dom/MessagePortChannel.h (226342 => 226343)


--- trunk/Source/WebCore/dom/MessagePortChannel.h	2018-01-03 00:20:48 UTC (rev 226342)
+++ trunk/Source/WebCore/dom/MessagePortChannel.h	2018-01-03 00:51:01 UTC (rev 226343)
@@ -67,7 +67,7 @@
     static void createChannelBetweenPorts(MessagePort&, MessagePort&);
 
     virtual void postMessageToRemote(Ref<SerializedScriptValue>&&, std::unique_ptr<MessagePortChannelArray>&&) = 0;
-    virtual Deque<std::unique_ptr<EventData>> takeAllMessagesFromRemote() = 0;
+    virtual void takeAllMessagesFromRemote(CompletionHandler<void(Deque<std::unique_ptr<EventData>>&&)>&&) = 0;
     virtual bool isConnectedTo(const MessagePortIdentifier&) = 0;
     virtual bool entangleWithRemoteIfOpen(const MessagePortIdentifier&) = 0;
     virtual void disentangle() = 0;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to