Title: [228564] trunk/Source/WebKit
Revision
228564
Author
[email protected]
Date
2018-02-16 11:05:07 -0800 (Fri, 16 Feb 2018)

Log Message

ASSERTION FAILED: !m_processes[i] || *m_processes[i] == process in MessagePortChannel::entanglePortWithProcess()
https://bugs.webkit.org/show_bug.cgi?id=182054
<rdar://problem/36871207>

Reviewed by Brady Eidson.

Pipe postMessage messages to and from service workers via the UIProcess instead of going
directly to the StorageProcess. This is temporarily needed to avoid races due to the
MessagePort registry currently living in the UIProcess and postMessage messages potentially
sending MessagePort objects.

This change is covered by tests on the bots that currently flakily crash in debug.

* StorageProcess/ServiceWorker/WebSWServerConnection.h:
* StorageProcess/StorageProcess.cpp:
(WebKit::StorageProcess::postMessageToServiceWorker):
* StorageProcess/StorageProcess.h:
* StorageProcess/StorageProcess.messages.in:
* UIProcess/WebProcessPool.cpp:
(WebKit::WebProcessPool::postMessageToServiceWorkerClient):
(WebKit::WebProcessPool::postMessageToServiceWorker):
* UIProcess/WebProcessPool.h:
* UIProcess/WebProcessPool.messages.in:
* WebProcess/Storage/WebSWClientConnection.cpp:
(WebKit::WebSWClientConnection::postMessageToServiceWorker):
* WebProcess/Storage/WebSWContextManagerConnection.cpp:
(WebKit::WebSWContextManagerConnection::postMessageToServiceWorkerClient):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (228563 => 228564)


--- trunk/Source/WebKit/ChangeLog	2018-02-16 18:52:24 UTC (rev 228563)
+++ trunk/Source/WebKit/ChangeLog	2018-02-16 19:05:07 UTC (rev 228564)
@@ -1,3 +1,33 @@
+2018-02-16  Chris Dumez  <[email protected]>
+
+        ASSERTION FAILED: !m_processes[i] || *m_processes[i] == process in MessagePortChannel::entanglePortWithProcess()
+        https://bugs.webkit.org/show_bug.cgi?id=182054
+        <rdar://problem/36871207>
+
+        Reviewed by Brady Eidson.
+
+        Pipe postMessage messages to and from service workers via the UIProcess instead of going
+        directly to the StorageProcess. This is temporarily needed to avoid races due to the
+        MessagePort registry currently living in the UIProcess and postMessage messages potentially
+        sending MessagePort objects.
+
+        This change is covered by tests on the bots that currently flakily crash in debug.
+
+        * StorageProcess/ServiceWorker/WebSWServerConnection.h:
+        * StorageProcess/StorageProcess.cpp:
+        (WebKit::StorageProcess::postMessageToServiceWorker):
+        * StorageProcess/StorageProcess.h:
+        * StorageProcess/StorageProcess.messages.in:
+        * UIProcess/WebProcessPool.cpp:
+        (WebKit::WebProcessPool::postMessageToServiceWorkerClient):
+        (WebKit::WebProcessPool::postMessageToServiceWorker):
+        * UIProcess/WebProcessPool.h:
+        * UIProcess/WebProcessPool.messages.in:
+        * WebProcess/Storage/WebSWClientConnection.cpp:
+        (WebKit::WebSWClientConnection::postMessageToServiceWorker):
+        * WebProcess/Storage/WebSWContextManagerConnection.cpp:
+        (WebKit::WebSWContextManagerConnection::postMessageToServiceWorkerClient):
+
 2018-02-16  Wenson Hsieh  <[email protected]>
 
         [Extra zoom mode] Add basic support for <input type='date'> using date picker UI

Modified: trunk/Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.h (228563 => 228564)


--- trunk/Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.h	2018-02-16 18:52:24 UTC (rev 228563)
+++ trunk/Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.h	2018-02-16 19:05:07 UTC (rev 228564)
@@ -69,6 +69,7 @@
     void didNotHandleFetch(uint64_t fetchIdentifier);
 
     void postMessageToServiceWorkerClient(WebCore::DocumentIdentifier destinationContextIdentifier, WebCore::MessageWithMessagePorts&&, WebCore::ServiceWorkerIdentifier sourceServiceWorkerIdentifier, const String& sourceOrigin);
+    void postMessageToServiceWorker(WebCore::ServiceWorkerIdentifier destination, WebCore::MessageWithMessagePorts&&, const WebCore::ServiceWorkerOrClientIdentifier& source);
 
 private:
     // Implement SWServer::Connection (Messages to the client WebProcess)
@@ -88,8 +89,6 @@
 
     void startFetch(uint64_t fetchIdentifier, WebCore::ServiceWorkerRegistrationIdentifier, WebCore::ResourceRequest&&, WebCore::FetchOptions&&, IPC::FormDataReference&&, String&& referrer);
 
-    void postMessageToServiceWorker(WebCore::ServiceWorkerIdentifier destination, WebCore::MessageWithMessagePorts&&, const WebCore::ServiceWorkerOrClientIdentifier& source);
-
     void matchRegistration(uint64_t registrationMatchRequestIdentifier, const WebCore::SecurityOriginData& topOrigin, const WebCore::URL& clientURL);
     void getRegistrations(uint64_t registrationMatchRequestIdentifier, const WebCore::SecurityOriginData& topOrigin, const WebCore::URL& clientURL);
 

Modified: trunk/Source/WebKit/StorageProcess/StorageProcess.cpp (228563 => 228564)


--- trunk/Source/WebKit/StorageProcess/StorageProcess.cpp	2018-02-16 18:52:24 UTC (rev 228563)
+++ trunk/Source/WebKit/StorageProcess/StorageProcess.cpp	2018-02-16 19:05:07 UTC (rev 228564)
@@ -484,6 +484,12 @@
         connection->postMessageToServiceWorkerClient(destinationIdentifier.contextIdentifier, WTFMove(message), sourceIdentifier, sourceOrigin);
 }
 
+void StorageProcess::postMessageToServiceWorker(WebCore::ServiceWorkerIdentifier destination, WebCore::MessageWithMessagePorts&& message, const WebCore::ServiceWorkerOrClientIdentifier& source, SWServerConnectionIdentifier connectionIdentifier)
+{
+    if (auto* connection = m_swServerConnections.get(connectionIdentifier))
+        connection->postMessageToServiceWorker(destination, WTFMove(message), source);
+}
+
 void StorageProcess::registerSWServerConnection(WebSWServerConnection& connection)
 {
     ASSERT(!m_swServerConnections.contains(connection.identifier()));

Modified: trunk/Source/WebKit/StorageProcess/StorageProcess.h (228563 => 228564)


--- trunk/Source/WebKit/StorageProcess/StorageProcess.h	2018-02-16 18:52:24 UTC (rev 228563)
+++ trunk/Source/WebKit/StorageProcess/StorageProcess.h	2018-02-16 19:05:07 UTC (rev 228564)
@@ -137,6 +137,8 @@
     void didNotHandleFetch(WebCore::SWServerConnectionIdentifier, uint64_t fetchIdentifier);
 
     void postMessageToServiceWorkerClient(const WebCore::ServiceWorkerClientIdentifier& destinationIdentifier, WebCore::MessageWithMessagePorts&&, WebCore::ServiceWorkerIdentifier sourceIdentifier, const String& sourceOrigin);
+    void postMessageToServiceWorker(WebCore::ServiceWorkerIdentifier destination, WebCore::MessageWithMessagePorts&&, const WebCore::ServiceWorkerOrClientIdentifier& source, WebCore::SWServerConnectionIdentifier);
+
     WebSWOriginStore& swOriginStoreForSession(PAL::SessionID);
     bool needsServerToContextConnection() const;
 #endif

Modified: trunk/Source/WebKit/StorageProcess/StorageProcess.messages.in (228563 => 228564)


--- trunk/Source/WebKit/StorageProcess/StorageProcess.messages.in	2018-02-16 18:52:24 UTC (rev 228563)
+++ trunk/Source/WebKit/StorageProcess/StorageProcess.messages.in	2018-02-16 19:05:07 UTC (rev 228564)
@@ -43,5 +43,7 @@
     DidReceiveFetchFormData(WebCore::SWServerConnectionIdentifier serverConnectionIdentifier, uint64_t fetchIdentifier, IPC::FormDataReference data)
     DidFinishFetch(WebCore::SWServerConnectionIdentifier serverConnectionIdentifier, uint64_t fetchIdentifier)
     PostMessageToServiceWorkerClient(struct WebCore::ServiceWorkerClientIdentifier destinationIdentifier, struct WebCore::MessageWithMessagePorts message, WebCore::ServiceWorkerIdentifier sourceIdentifier, String sourceOrigin)
+
+    PostMessageToServiceWorker(WebCore::ServiceWorkerIdentifier destination, struct WebCore::MessageWithMessagePorts message, WebCore::ServiceWorkerOrClientIdentifier source, WebCore::SWServerConnectionIdentifier connectionIdentifier)
 #endif
 }

Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.cpp (228563 => 228564)


--- trunk/Source/WebKit/UIProcess/WebProcessPool.cpp	2018-02-16 18:52:24 UTC (rev 228563)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.cpp	2018-02-16 19:05:07 UTC (rev 228564)
@@ -1842,6 +1842,18 @@
 #endif
 }
 
+#if ENABLE(SERVICE_WORKER)
+void WebProcessPool::postMessageToServiceWorkerClient(const ServiceWorkerClientIdentifier& destination, MessageWithMessagePorts&& message, ServiceWorkerIdentifier source, const String& sourceOrigin)
+{
+    sendToStorageProcessRelaunchingIfNecessary(Messages::StorageProcess::PostMessageToServiceWorkerClient(destination, WTFMove(message), source, sourceOrigin));
+}
+
+void WebProcessPool::postMessageToServiceWorker(ServiceWorkerIdentifier destination, MessageWithMessagePorts&& message, const ServiceWorkerOrClientIdentifier& source, SWServerConnectionIdentifier connectionIdentifier)
+{
+    sendToStorageProcessRelaunchingIfNecessary(Messages::StorageProcess::PostMessageToServiceWorker(destination, WTFMove(message), source, connectionIdentifier));
+}
+#endif
+
 void WebProcessPool::reinstateNetworkProcessAssertionState(NetworkProcessProxy& newNetworkProcessProxy)
 {
 #if PLATFORM(IOS)

Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.h (228563 => 228564)


--- trunk/Source/WebKit/UIProcess/WebProcessPool.h	2018-02-16 18:52:24 UTC (rev 228563)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.h	2018-02-16 19:05:07 UTC (rev 228564)
@@ -425,6 +425,11 @@
     void setStorageAccessAPIEnabled(bool);
 #endif
 
+#if ENABLE(SERVICE_WORKER)
+    void postMessageToServiceWorkerClient(const WebCore::ServiceWorkerClientIdentifier& destinationIdentifier, WebCore::MessageWithMessagePorts&&, WebCore::ServiceWorkerIdentifier sourceIdentifier, const String& sourceOrigin);
+    void postMessageToServiceWorker(WebCore::ServiceWorkerIdentifier destination, WebCore::MessageWithMessagePorts&&, const WebCore::ServiceWorkerOrClientIdentifier& source, WebCore::SWServerConnectionIdentifier);
+#endif
+
     static uint64_t registerProcessPoolCreationListener(Function<void(WebProcessPool&)>&&);
     static void unregisterProcessPoolCreationListener(uint64_t identifier);
 

Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.messages.in (228563 => 228564)


--- trunk/Source/WebKit/UIProcess/WebProcessPool.messages.in	2018-02-16 18:52:24 UTC (rev 228563)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.messages.in	2018-02-16 19:05:07 UTC (rev 228564)
@@ -36,4 +36,9 @@
     void PlugInDidReceiveUserInteraction(uint32_t hash, PAL::SessionID sessionID)
 
     ReportWebContentCPUTime(Seconds cpuTime, uint64_t activityState)
+
+#if ENABLE(SERVICE_WORKER)
+    PostMessageToServiceWorkerClient(struct WebCore::ServiceWorkerClientIdentifier destinationIdentifier, struct WebCore::MessageWithMessagePorts message, WebCore::ServiceWorkerIdentifier sourceIdentifier, String sourceOrigin)
+    PostMessageToServiceWorker(WebCore::ServiceWorkerIdentifier destination, struct WebCore::MessageWithMessagePorts message, WebCore::ServiceWorkerOrClientIdentifier source, WebCore::SWServerConnectionIdentifier connectionIdentifier)
+#endif
 }

Modified: trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.cpp (228563 => 228564)


--- trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.cpp	2018-02-16 18:52:24 UTC (rev 228563)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.cpp	2018-02-16 19:05:07 UTC (rev 228564)
@@ -34,6 +34,8 @@
 #include "ServiceWorkerClientFetch.h"
 #include "StorageToWebProcessConnectionMessages.h"
 #include "WebCoreArgumentCoders.h"
+#include "WebProcess.h"
+#include "WebProcessPoolMessages.h"
 #include "WebSWOriginTable.h"
 #include "WebSWServerConnectionMessages.h"
 #include <WebCore/Document.h>
@@ -85,7 +87,9 @@
 
 void WebSWClientConnection::postMessageToServiceWorker(ServiceWorkerIdentifier destinationIdentifier, MessageWithMessagePorts&& message, const ServiceWorkerOrClientIdentifier& sourceIdentifier)
 {
-    send(Messages::WebSWServerConnection::PostMessageToServiceWorker(destinationIdentifier, WTFMove(message), sourceIdentifier) );
+    // FIXME: Temporarily pipe the SW postMessage messages via the UIProcess since this is where the MessagePort registry lives
+    // and this avoids races.
+    WebProcess::singleton().send(Messages::WebProcessPool::PostMessageToServiceWorker(destinationIdentifier, WTFMove(message), sourceIdentifier, serverConnectionIdentifier()), 0);
 }
 
 void WebSWClientConnection::registerServiceWorkerClient(const SecurityOrigin& topOrigin, const WebCore::ServiceWorkerClientData& data, const std::optional<WebCore::ServiceWorkerIdentifier>& controllingServiceWorkerIdentifier)

Modified: trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp (228563 => 228564)


--- trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp	2018-02-16 18:52:24 UTC (rev 228563)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp	2018-02-16 19:05:07 UTC (rev 228564)
@@ -39,6 +39,7 @@
 #include "WebPreferencesKeys.h"
 #include "WebPreferencesStore.h"
 #include "WebProcess.h"
+#include "WebProcessPoolMessages.h"
 #include "WebSWServerToContextConnectionMessages.h"
 #include "WebServiceWorkerFetchTaskClient.h"
 #include "WebSocketProvider.h"
@@ -219,7 +220,9 @@
 
 void WebSWContextManagerConnection::postMessageToServiceWorkerClient(const ServiceWorkerClientIdentifier& destinationIdentifier, MessageWithMessagePorts&& message, ServiceWorkerIdentifier sourceIdentifier, const String& sourceOrigin)
 {
-    m_connectionToStorageProcess->send(Messages::StorageProcess::PostMessageToServiceWorkerClient(destinationIdentifier, WTFMove(message), sourceIdentifier, sourceOrigin), 0);
+    // FIXME: Temporarily pipe the SW postMessage messages via the UIProcess since this is where the MessagePort registry lives
+    // and this avoids races.
+    WebProcess::singleton().send(Messages::WebProcessPool::PostMessageToServiceWorkerClient(destinationIdentifier, WTFMove(message), sourceIdentifier, sourceOrigin), 0);
 }
 
 void WebSWContextManagerConnection::didFinishInstall(std::optional<ServiceWorkerJobDataIdentifier> jobDataIdentifier, ServiceWorkerIdentifier serviceWorkerIdentifier, bool wasSuccessful)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to