Diff
Modified: branches/safari-605-branch/Source/WebKit/ChangeLog (228705 => 228706)
--- branches/safari-605-branch/Source/WebKit/ChangeLog 2018-02-19 20:16:54 UTC (rev 228705)
+++ branches/safari-605-branch/Source/WebKit/ChangeLog 2018-02-19 20:56:38 UTC (rev 228706)
@@ -1,3 +1,37 @@
+2018-02-19 Jason Marcell <jmarc...@apple.com>
+
+ Cherry-pick r228564. rdar://problem/37675352
+
+ 2018-02-16 Chris Dumez <cdu...@apple.com>
+
+ 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 Jason Marcell <jmarc...@apple.com>
Cherry-pick r228551. rdar://problem/37615430
Modified: branches/safari-605-branch/Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.h (228705 => 228706)
--- branches/safari-605-branch/Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.h 2018-02-19 20:16:54 UTC (rev 228705)
+++ branches/safari-605-branch/Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.h 2018-02-19 20:56:38 UTC (rev 228706)
@@ -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: branches/safari-605-branch/Source/WebKit/StorageProcess/StorageProcess.cpp (228705 => 228706)
--- branches/safari-605-branch/Source/WebKit/StorageProcess/StorageProcess.cpp 2018-02-19 20:16:54 UTC (rev 228705)
+++ branches/safari-605-branch/Source/WebKit/StorageProcess/StorageProcess.cpp 2018-02-19 20:56:38 UTC (rev 228706)
@@ -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: branches/safari-605-branch/Source/WebKit/StorageProcess/StorageProcess.h (228705 => 228706)
--- branches/safari-605-branch/Source/WebKit/StorageProcess/StorageProcess.h 2018-02-19 20:16:54 UTC (rev 228705)
+++ branches/safari-605-branch/Source/WebKit/StorageProcess/StorageProcess.h 2018-02-19 20:56:38 UTC (rev 228706)
@@ -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: branches/safari-605-branch/Source/WebKit/StorageProcess/StorageProcess.messages.in (228705 => 228706)
--- branches/safari-605-branch/Source/WebKit/StorageProcess/StorageProcess.messages.in 2018-02-19 20:16:54 UTC (rev 228705)
+++ branches/safari-605-branch/Source/WebKit/StorageProcess/StorageProcess.messages.in 2018-02-19 20:56:38 UTC (rev 228706)
@@ -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: branches/safari-605-branch/Source/WebKit/UIProcess/WebProcessPool.cpp (228705 => 228706)
--- branches/safari-605-branch/Source/WebKit/UIProcess/WebProcessPool.cpp 2018-02-19 20:16:54 UTC (rev 228705)
+++ branches/safari-605-branch/Source/WebKit/UIProcess/WebProcessPool.cpp 2018-02-19 20:56:38 UTC (rev 228706)
@@ -1848,6 +1848,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: branches/safari-605-branch/Source/WebKit/UIProcess/WebProcessPool.h (228705 => 228706)
--- branches/safari-605-branch/Source/WebKit/UIProcess/WebProcessPool.h 2018-02-19 20:16:54 UTC (rev 228705)
+++ branches/safari-605-branch/Source/WebKit/UIProcess/WebProcessPool.h 2018-02-19 20:56:38 UTC (rev 228706)
@@ -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: branches/safari-605-branch/Source/WebKit/UIProcess/WebProcessPool.messages.in (228705 => 228706)
--- branches/safari-605-branch/Source/WebKit/UIProcess/WebProcessPool.messages.in 2018-02-19 20:16:54 UTC (rev 228705)
+++ branches/safari-605-branch/Source/WebKit/UIProcess/WebProcessPool.messages.in 2018-02-19 20:56:38 UTC (rev 228706)
@@ -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: branches/safari-605-branch/Source/WebKit/WebProcess/Storage/WebSWClientConnection.cpp (228705 => 228706)
--- branches/safari-605-branch/Source/WebKit/WebProcess/Storage/WebSWClientConnection.cpp 2018-02-19 20:16:54 UTC (rev 228705)
+++ branches/safari-605-branch/Source/WebKit/WebProcess/Storage/WebSWClientConnection.cpp 2018-02-19 20:56:38 UTC (rev 228706)
@@ -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: branches/safari-605-branch/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp (228705 => 228706)
--- branches/safari-605-branch/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp 2018-02-19 20:16:54 UTC (rev 228705)
+++ branches/safari-605-branch/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp 2018-02-19 20:56:38 UTC (rev 228706)
@@ -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)