Diff
Modified: trunk/Source/WebCore/ChangeLog (249800 => 249801)
--- trunk/Source/WebCore/ChangeLog 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebCore/ChangeLog 2019-09-12 08:18:15 UTC (rev 249801)
@@ -1,3 +1,23 @@
+2019-09-12 Youenn Fablet <you...@apple.com>
+
+ Use WebProcess processIdentifier to identify Service Worker connections
+ https://bugs.webkit.org/show_bug.cgi?id=201459
+
+ Reviewed by Chris Dumez.
+
+ No observable change of behavior.
+
+ * workers/service/ServiceWorkerClient.cpp:
+ (WebCore::ServiceWorkerClient::postMessage):
+ Pass sessionID to ease NetworkProcess selection of the client process connection.
+ * workers/service/ServiceWorkerTypes.h:
+ Mark server connection identifier be process identifier based.
+ * workers/service/context/SWContextManager.h:
+ * workers/service/server/SWServer.cpp:
+ (WebCore::SWServer::Connection::Connection):
+ * workers/service/server/SWServer.h:
+ Let connection identifier be set in constructor instead of generated.
+
2019-09-11 Youenn Fablet <you...@apple.com>
Disable DTLS1.0
Modified: trunk/Source/WebCore/PAL/ChangeLog (249800 => 249801)
--- trunk/Source/WebCore/PAL/ChangeLog 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebCore/PAL/ChangeLog 2019-09-12 08:18:15 UTC (rev 249801)
@@ -1,3 +1,13 @@
+2019-09-12 Youenn Fablet <you...@apple.com>
+
+ Use WebProcess processIdentifier to identify Service Worker connections
+ https://bugs.webkit.org/show_bug.cgi?id=201459
+
+ Reviewed by Chris Dumez.
+
+ * pal/SessionID.h:
+ (PAL::SessionID::SessionID):
+
2019-09-09 Alex Christensen <achristen...@webkit.org>
Disable TLS 1.0 and 1.1 in WebSockets
Modified: trunk/Source/WebCore/PAL/pal/SessionID.h (249800 => 249801)
--- trunk/Source/WebCore/PAL/pal/SessionID.h 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebCore/PAL/pal/SessionID.h 2019-09-12 08:18:15 UTC (rev 249801)
@@ -55,6 +55,11 @@
{
}
+ explicit SessionID(uint64_t identifier)
+ : m_identifier(identifier)
+ {
+ }
+
PAL_EXPORT static SessionID generateEphemeralSessionID();
PAL_EXPORT static SessionID generatePersistentSessionID();
PAL_EXPORT static void enableGenerationProtection();
@@ -76,11 +81,6 @@
explicit operator bool() const { return m_identifier; }
private:
- explicit SessionID(uint64_t identifier)
- : m_identifier(identifier)
- {
- }
-
static bool isValidSessionIDValue(uint64_t sessionID) { return sessionID != HashTableEmptyValueID && sessionID != HashTableDeletedValueID; }
uint64_t m_identifier;
Modified: trunk/Source/WebCore/workers/service/ServiceWorkerClient.cpp (249800 => 249801)
--- trunk/Source/WebCore/workers/service/ServiceWorkerClient.cpp 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerClient.cpp 2019-09-12 08:18:15 UTC (rev 249801)
@@ -99,9 +99,9 @@
MessageWithMessagePorts message = { messageData.releaseReturnValue(), portsOrException.releaseReturnValue() };
auto sourceIdentifier = downcast<ServiceWorkerGlobalScope>(context).thread().identifier();
- callOnMainThread([message = WTFMove(message), destinationIdentifier = identifier(), sourceIdentifier, sourceOrigin = context.origin().isolatedCopy()] () mutable {
+ callOnMainThread([sessionID = context.sessionID(), message = WTFMove(message), destinationIdentifier = identifier(), sourceIdentifier, sourceOrigin = context.origin().isolatedCopy()] () mutable {
if (auto* connection = SWContextManager::singleton().connection())
- connection->postMessageToServiceWorkerClient(destinationIdentifier, WTFMove(message), sourceIdentifier, sourceOrigin);
+ connection->postMessageToServiceWorkerClient(sessionID, destinationIdentifier, message, sourceIdentifier, sourceOrigin);
});
return { };
Modified: trunk/Source/WebCore/workers/service/ServiceWorkerTypes.h (249800 => 249801)
--- trunk/Source/WebCore/workers/service/ServiceWorkerTypes.h 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerTypes.h 2019-09-12 08:18:15 UTC (rev 249801)
@@ -28,6 +28,7 @@
#if ENABLE(SERVICE_WORKER)
#include "DocumentIdentifier.h"
+#include "ProcessIdentifier.h"
#include "ServiceWorkerIdentifier.h"
#include <wtf/ObjectIdentifier.h>
#include <wtf/Variant.h>
@@ -70,7 +71,7 @@
enum SWServerToContextConnectionIdentifierType { };
using SWServerToContextConnectionIdentifier = ObjectIdentifier<SWServerToContextConnectionIdentifierType>;
-enum SWServerConnectionIdentifierType { };
+using SWServerConnectionIdentifierType = ProcessIdentifierType;
using SWServerConnectionIdentifier = ObjectIdentifier<SWServerConnectionIdentifierType>;
using DocumentOrWorkerIdentifier = Variant<DocumentIdentifier, ServiceWorkerIdentifier>;
Modified: trunk/Source/WebCore/workers/service/context/SWContextManager.h (249800 => 249801)
--- trunk/Source/WebCore/workers/service/context/SWContextManager.h 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebCore/workers/service/context/SWContextManager.h 2019-09-12 08:18:15 UTC (rev 249801)
@@ -49,7 +49,7 @@
public:
virtual ~Connection() { }
- virtual void postMessageToServiceWorkerClient(const ServiceWorkerClientIdentifier& destinationIdentifier, MessageWithMessagePorts&&, ServiceWorkerIdentifier source, const String& sourceOrigin) = 0;
+ virtual void postMessageToServiceWorkerClient(PAL::SessionID, const ServiceWorkerClientIdentifier& destinationIdentifier, const MessageWithMessagePorts&, ServiceWorkerIdentifier source, const String& sourceOrigin) = 0;
virtual void serviceWorkerStarted(Optional<ServiceWorkerJobDataIdentifier>, ServiceWorkerIdentifier, bool doesHandleFetch) = 0;
virtual void serviceWorkerFailedToStart(Optional<ServiceWorkerJobDataIdentifier>, ServiceWorkerIdentifier, const String& message) = 0;
virtual void didFinishInstall(Optional<ServiceWorkerJobDataIdentifier>, ServiceWorkerIdentifier, bool wasSuccessful) = 0;
Modified: trunk/Source/WebCore/workers/service/server/SWServer.cpp (249800 => 249801)
--- trunk/Source/WebCore/workers/service/server/SWServer.cpp 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebCore/workers/service/server/SWServer.cpp 2019-09-12 08:18:15 UTC (rev 249801)
@@ -50,9 +50,9 @@
static Seconds terminationDelay { 10_s };
-SWServer::Connection::Connection(SWServer& server)
+SWServer::Connection::Connection(SWServer& server, Identifier identifier)
: m_server(server)
- , m_identifier(SWServerConnectionIdentifier::generate())
+ , m_identifier(identifier)
{
}
Modified: trunk/Source/WebCore/workers/service/server/SWServer.h (249800 => 249801)
--- trunk/Source/WebCore/workers/service/server/SWServer.h 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebCore/workers/service/server/SWServer.h 2019-09-12 08:18:15 UTC (rev 249801)
@@ -56,6 +56,7 @@
enum class ServiceWorkerRegistrationState : uint8_t;
enum class ServiceWorkerState : uint8_t;
struct ExceptionData;
+struct MessageWithMessagePorts;
struct ServiceWorkerClientQueryOptions;
struct ServiceWorkerContextData;
struct ServiceWorkerFetchResult;
@@ -86,6 +87,7 @@
virtual void setRegistrationUpdateViaCache(ServiceWorkerRegistrationIdentifier, ServiceWorkerUpdateViaCache) = 0;
virtual void notifyClientsOfControllerChange(const HashSet<DocumentIdentifier>& contextIdentifiers, const ServiceWorkerData& newController) = 0;
virtual void registrationReady(uint64_t registrationReadyRequestIdentifier, ServiceWorkerRegistrationData&&) = 0;
+ virtual void postMessageToServiceWorkerClient(DocumentIdentifier, const MessageWithMessagePorts&, ServiceWorkerIdentifier, const String& sourceOrigin) = 0;
virtual void serverToContextConnectionCreated(SWServerToContextConnection&) = 0;
@@ -93,7 +95,7 @@
const SWServer& server() const { return m_server; }
protected:
- WEBCORE_EXPORT explicit Connection(SWServer&);
+ WEBCORE_EXPORT Connection(SWServer&, Identifier);
WEBCORE_EXPORT void finishFetchingScriptInServer(const ServiceWorkerFetchResult&);
WEBCORE_EXPORT void addServiceWorkerRegistrationInServer(ServiceWorkerRegistrationIdentifier);
Modified: trunk/Source/WebKit/ChangeLog (249800 => 249801)
--- trunk/Source/WebKit/ChangeLog 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebKit/ChangeLog 2019-09-12 08:18:15 UTC (rev 249801)
@@ -1,3 +1,110 @@
+2019-09-12 Youenn Fablet <you...@apple.com>
+
+ Use WebProcess processIdentifier to identify Service Worker connections
+ https://bugs.webkit.org/show_bug.cgi?id=201459
+
+ Reviewed by Chris Dumez.
+
+ Make WebSWServerConnection be stored in NetworkConnectionToWebProcess.
+ They are now keyed by session IDs hence why WebSWClientConnection is using the session ID as message connection ID.
+ Creation no longer requires a sync IPC since the connection is uniquely identified by its session ID and its process ID.
+ These IDs are stable over network process crash.
+ Within NetworkProcess, a server connection is managed by a SWServer which is session ID specific.
+ In that case, the process identifier uniquely identifies the connection.
+
+ Move WebSWServerToContextConnection be owned by NetworkConnectionToWebProcess.
+ Instead of creating it when webprocess is connecting to network process, use a dedicated IPC message.
+ This is similar to WebSWServerConnection once WebProcess asks to create it.
+ This will allow existing WebProcess, in cache or running pages, to run service workers as well.
+ A context connection map is kept in Network Process to reuse context connections since these connections are not sessionID specific.
+
+ Migrate from a single boolean to a HashSet to track whether some connections are in the process of being created.
+ Previously if two requests to create connections were done shortly one after the other on different registrable
+ domains, the second request would not be processed.
+
+ * NetworkProcess/NetworkConnectionToWebProcess.cpp:
+ (WebKit::NetworkConnectionToWebProcess::didReceiveMessage):
+ (WebKit::NetworkConnectionToWebProcess::didReceiveSyncMessage):
+ (WebKit::NetworkConnectionToWebProcess::didClose):
+ (WebKit::NetworkConnectionToWebProcess::establishSWServerConnection):
+ (WebKit::NetworkConnectionToWebProcess::establishSWContextConnection):
+ * NetworkProcess/NetworkConnectionToWebProcess.h:
+ * NetworkProcess/NetworkConnectionToWebProcess.messages.in:
+ * NetworkProcess/NetworkProcess.cpp:
+ (WebKit::NetworkProcess::didReceiveMessage):
+ (WebKit::NetworkProcess::createNetworkConnectionToWebProcess):
+ (WebKit::NetworkProcess::forEachSWServer):
+ (WebKit::NetworkProcess::needsServerToContextConnectionForRegistrableDomain const):
+ (WebKit::NetworkProcess::createServerToContextConnection):
+ (WebKit::NetworkProcess::postMessageToServiceWorkerClient):
+ (WebKit::NetworkProcess::registerSWServerConnection):
+ (WebKit::NetworkProcess::unregisterSWServerConnection):
+ (WebKit::NetworkProcess::registerSWContextConnection):
+ (WebKit::NetworkProcess::unregisterSWContextConnection):
+ * NetworkProcess/NetworkProcess.h:
+ * NetworkProcess/NetworkProcess.messages.in:
+ * NetworkProcess/ServiceWorker/WebSWServerConnection.cpp:
+ (WebKit::WebSWServerConnection::WebSWServerConnection):
+ (WebKit::WebSWServerConnection::postMessageToServiceWorkerClient):
+ * NetworkProcess/ServiceWorker/WebSWServerConnection.h:
+ * NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp:
+ (WebKit::WebSWServerToContextConnection::WebSWServerToContextConnection):
+ (WebKit::WebSWServerToContextConnection::~WebSWServerToContextConnection):
+ (WebKit::WebSWServerToContextConnection::postMessageToServiceWorkerClient):
+ (WebKit::WebSWServerToContextConnection::connectionMayNoLongerBeNeeded):
+ * NetworkProcess/ServiceWorker/WebSWServerToContextConnection.h:
+ * NetworkProcess/ServiceWorker/WebSWServerToContextConnection.messages.in:
+ * UIProcess/Network/NetworkProcessProxy.cpp:
+ (WebKit::NetworkProcessProxy::openNetworkProcessConnection):
+ (WebKit::NetworkProcessProxy::establishWorkerContextConnectionToNetworkProcess):
+ * UIProcess/Network/NetworkProcessProxy.h:
+ * UIProcess/Network/NetworkProcessProxy.messages.in:
+ * UIProcess/WebProcessPool.cpp:
+ (WebKit::WebProcessPool::establishWorkerContextConnectionToNetworkProcess):
+ * UIProcess/WebProcessPool.h:
+ * UIProcess/WebProcessProxy.cpp:
+ (WebKit::WebProcessProxy::establishServiceWorkerContext):
+ * UIProcess/WebProcessProxy.h:
+ * WebProcess/Network/NetworkProcessConnection.cpp:
+ (WebKit::NetworkProcessConnection::didReceiveMessage):
+ (WebKit::NetworkProcessConnection::didClose):
+ (WebKit::NetworkProcessConnection::serviceWorkerConnectionForSession):
+ * WebProcess/Network/NetworkProcessConnection.h:
+ * WebProcess/Storage/WebSWClientConnection.cpp:
+ (WebKit::WebSWClientConnection::WebSWClientConnection):
+ (WebKit::WebSWClientConnection::~WebSWClientConnection):
+ (WebKit::WebSWClientConnection::messageSenderConnection const):
+ (WebKit::WebSWClientConnection::scheduleJobInServer):
+ (WebKit::WebSWClientConnection::finishFetchingScriptInServer):
+ (WebKit::WebSWClientConnection::addServiceWorkerRegistrationInServer):
+ (WebKit::WebSWClientConnection::removeServiceWorkerRegistrationInServer):
+ (WebKit::WebSWClientConnection::postMessageToServiceWorker):
+ (WebKit::WebSWClientConnection::registerServiceWorkerClient):
+ (WebKit::WebSWClientConnection::unregisterServiceWorkerClient):
+ (WebKit::WebSWClientConnection::didResolveRegistrationPromise):
+ (WebKit::WebSWClientConnection::matchRegistration):
+ (WebKit::WebSWClientConnection::runOrDelayTaskForImport):
+ (WebKit::WebSWClientConnection::whenRegistrationReady):
+ (WebKit::WebSWClientConnection::getRegistrations):
+ (WebKit::WebSWClientConnection::startFetch):
+ (WebKit::WebSWClientConnection::cancelFetch):
+ (WebKit::WebSWClientConnection::continueDidReceiveFetchResponse):
+ (WebKit::WebSWClientConnection::connectionToServerLost):
+ (WebKit::WebSWClientConnection::clear):
+ (WebKit::WebSWClientConnection::syncTerminateWorker):
+ (WebKit::WebSWClientConnection::updateThrottleState):
+ (WebKit::WebSWClientConnection::storeRegistrationsOnDiskForTesting):
+ * WebProcess/Storage/WebSWClientConnection.h:
+ * WebProcess/Storage/WebSWContextManagerConnection.cpp:
+ (WebKit::WebSWContextManagerConnection::WebSWContextManagerConnection):
+ (WebKit::m_userAgent):
+ (WebKit::WebSWContextManagerConnection::postMessageToServiceWorkerClient):
+ * WebProcess/Storage/WebSWContextManagerConnection.h:
+ * WebProcess/WebProcess.cpp:
+ (WebKit::WebProcess::establishWorkerContextConnectionToNetworkProcess):
+ * WebProcess/WebProcess.h:
+ * WebProcess/WebProcess.messages.in:
+
2019-09-11 Keith Rollin <krol...@apple.com>
Log timeoutValue passed on to CFNetwork
Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp (249800 => 249801)
--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp 2019-09-12 08:18:15 UTC (rev 249801)
@@ -213,21 +213,22 @@
#if ENABLE(SERVICE_WORKER)
if (decoder.messageReceiverName() == Messages::WebSWServerConnection::messageReceiverName()) {
- if (auto swConnection = m_swConnections.get(makeObjectIdentifier<SWServerConnectionIdentifierType>(decoder.destinationID())))
+ if (auto swConnection = m_swConnections.get(PAL::SessionID { decoder.destinationID() }))
swConnection->didReceiveMessage(connection, decoder);
return;
}
-
if (decoder.messageReceiverName() == Messages::WebSWServerToContextConnection::messageReceiverName()) {
- if (auto* contextConnection = m_networkProcess->connectionToContextProcessFromIPCConnection(connection)) {
- contextConnection->didReceiveMessage(connection, decoder);
+ ASSERT(m_swContextConnection);
+ if (m_swContextConnection) {
+ m_swContextConnection->didReceiveMessage(connection, decoder);
return;
}
}
if (decoder.messageReceiverName() == Messages::ServiceWorkerFetchTask::messageReceiverName()) {
- if (auto* contextConnection = m_networkProcess->connectionToContextProcessFromIPCConnection(connection)) {
- contextConnection->didReceiveFetchTaskMessage(connection, decoder);
+ ASSERT(m_swContextConnection);
+ if (m_swContextConnection) {
+ m_swContextConnection->didReceiveFetchTaskMessage(connection, decoder);
return;
}
}
@@ -268,7 +269,7 @@
#if ENABLE(SERVICE_WORKER)
if (decoder.messageReceiverName() == Messages::WebSWServerConnection::messageReceiverName()) {
- if (auto swConnection = m_swConnections.get(makeObjectIdentifier<SWServerConnectionIdentifierType>(decoder.destinationID())))
+ if (auto swConnection = m_swConnections.get(PAL::SessionID { decoder.destinationID() }))
swConnection->didReceiveSyncMessage(connection, decoder, reply);
return;
}
@@ -285,10 +286,19 @@
void NetworkConnectionToWebProcess::didClose(IPC::Connection& connection)
{
#if ENABLE(SERVICE_WORKER)
- if (RefPtr<WebSWServerToContextConnection> serverToContextConnection = m_networkProcess->connectionToContextProcessFromIPCConnection(connection)) {
- // Service Worker process exited.
- m_networkProcess->connectionToContextProcessWasClosed(serverToContextConnection.releaseNonNull());
- return;
+ if (m_swContextConnection) {
+ auto& registrableDomain = m_swContextConnection->registrableDomain();
+
+ m_swContextConnection->connectionClosed();
+
+ Optional<PAL::SessionID> sessionID;
+ m_networkProcess->forEachSWServer([&](auto& server) {
+ server.markAllWorkersForRegistrableDomainAsTerminated(registrableDomain);
+ if (server.needsServerToContextConnectionForRegistrableDomain(registrableDomain))
+ sessionID = server.sessionID();
+ });
+ if (sessionID)
+ m_networkProcess->createServerToContextConnection(registrableDomain, *sessionID);
}
#else
UNUSED_PARAM(connection);
@@ -868,19 +878,24 @@
}
}
-void NetworkConnectionToWebProcess::establishSWServerConnection(PAL::SessionID sessionID, CompletionHandler<void(WebCore::SWServerConnectionIdentifier&&)>&& completionHandler)
+void NetworkConnectionToWebProcess::establishSWServerConnection(PAL::SessionID sessionID)
{
auto& server = m_networkProcess->swServerForSession(sessionID);
- auto connection = makeUnique<WebSWServerConnection>(m_networkProcess, server, m_connection.get(), sessionID);
-
- SWServerConnectionIdentifier serverConnectionIdentifier = connection->identifier();
- LOG(ServiceWorker, "NetworkConnectionToWebProcess::establishSWServerConnection - %s", serverConnectionIdentifier.loggingString().utf8().data());
+ auto connection = makeUnique<WebSWServerConnection>(m_networkProcess, server, m_connection.get(), m_webProcessIdentifier, sessionID);
- ASSERT(!m_swConnections.contains(serverConnectionIdentifier));
- m_swConnections.add(serverConnectionIdentifier, makeWeakPtr(*connection));
+ ASSERT(!m_swConnections.contains(sessionID));
+ m_swConnections.add(sessionID, makeWeakPtr(*connection));
server.addConnection(WTFMove(connection));
- completionHandler(WTFMove(serverConnectionIdentifier));
}
+
+void NetworkConnectionToWebProcess::establishSWContextConnection(RegistrableDomain&& registrableDomain)
+{
+ m_swContextConnection = WebSWServerToContextConnection::create(m_networkProcess, registrableDomain, m_connection.get());
+
+ m_networkProcess->forEachSWServer([&](auto& server) {
+ server.serverToContextConnectionCreated(*m_swContextConnection);
+ });
+}
#endif
void NetworkConnectionToWebProcess::createNewMessagePortChannel(const MessagePortIdentifier& port1, const MessagePortIdentifier& port2)
Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h (249800 => 249801)
--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h 2019-09-12 08:18:15 UTC (rev 249801)
@@ -68,6 +68,7 @@
class NetworkSocketStream;
class WebIDBConnectionToClient;
class WebSWServerConnection;
+class WebSWServerToContextConnection;
typedef uint64_t ResourceLoadIdentifier;
namespace NetworkCache {
@@ -208,7 +209,8 @@
#endif
#if ENABLE(SERVICE_WORKER)
- void establishSWServerConnection(PAL::SessionID, CompletionHandler<void(WebCore::SWServerConnectionIdentifier&&)>&&);
+ void establishSWServerConnection(PAL::SessionID);
+ void establishSWContextConnection(WebCore::RegistrableDomain&&);
void unregisterSWConnections();
#endif
@@ -319,7 +321,8 @@
#endif
#if ENABLE(SERVICE_WORKER)
- HashMap<WebCore::SWServerConnectionIdentifier, WeakPtr<WebSWServerConnection>> m_swConnections;
+ HashMap<PAL::SessionID, WeakPtr<WebSWServerConnection>> m_swConnections;
+ RefPtr<WebSWServerToContextConnection> m_swContextConnection;
#endif
#if ENABLE(APPLE_PAY_REMOTE_UI)
Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in (249800 => 249801)
--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in 2019-09-12 08:18:15 UTC (rev 249801)
@@ -81,7 +81,8 @@
#endif
#if ENABLE(SERVICE_WORKER)
- EstablishSWServerConnection(PAL::SessionID sessionID) -> (WebCore::SWServerConnectionIdentifier serverConnectionIdentifier) Synchronous
+ EstablishSWServerConnection(PAL::SessionID sessionID)
+ EstablishSWContextConnection(WebCore::RegistrableDomain domain)
#endif
CreateNewMessagePortChannel(struct WebCore::MessagePortIdentifier port1, struct WebCore::MessagePortIdentifier port2)
Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp (249800 => 249801)
--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp 2019-09-12 08:18:15 UTC (rev 249801)
@@ -228,17 +228,6 @@
}
#endif
-#if ENABLE(SERVICE_WORKER)
- if (decoder.messageReceiverName() == Messages::WebSWServerToContextConnection::messageReceiverName()) {
- ASSERT(parentProcessHasServiceWorkerEntitlement());
- if (!parentProcessHasServiceWorkerEntitlement())
- return;
- if (auto* webSWConnection = connectionToContextProcessFromIPCConnection(connection)) {
- webSWConnection->didReceiveMessage(connection, decoder);
- return;
- }
- }
-#endif
didReceiveNetworkProcessMessage(connection, decoder);
}
@@ -429,7 +418,7 @@
#endif
}
-void NetworkProcess::createNetworkConnectionToWebProcess(ProcessIdentifier identifier, bool isServiceWorkerProcess, WebCore::RegistrableDomain&& registrableDomain, CompletionHandler<void(Optional<IPC::Attachment>&&)>&& completionHandler)
+void NetworkProcess::createNetworkConnectionToWebProcess(ProcessIdentifier identifier, CompletionHandler<void(Optional<IPC::Attachment>&&)>&& completionHandler)
{
auto ipcConnection = createIPCConnectionToWebProcess();
if (!ipcConnection) {
@@ -446,25 +435,7 @@
completionHandler(WTFMove(ipcConnection->second));
connection.setOnLineState(NetworkStateNotifier::singleton().onLine());
-
-#if ENABLE(SERVICE_WORKER)
- if (isServiceWorkerProcess) {
- ASSERT(parentProcessHasServiceWorkerEntitlement());
- ASSERT(m_waitingForServerToContextProcessConnection);
- auto contextConnection = WebSWServerToContextConnection::create(*this, registrableDomain, connection.connection());
- auto addResult = m_serverToContextConnections.add(WTFMove(registrableDomain), contextConnection.copyRef());
- ASSERT_UNUSED(addResult, addResult.isNewEntry);
- m_waitingForServerToContextProcessConnection = false;
-
- for (auto* server : SWServer::allServers())
- server->serverToContextConnectionCreated(contextConnection);
- }
-#else
- UNUSED_PARAM(isServiceWorkerProcess);
- UNUSED_PARAM(registrableDomain);
-#endif
-
m_storageManagerSet->addConnection(connection.connection());
}
@@ -2401,38 +2372,12 @@
#endif // ENABLE(SANDBOX_EXTENSIONS)
#if ENABLE(SERVICE_WORKER)
-WebSWServerToContextConnection* NetworkProcess::connectionToContextProcessFromIPCConnection(IPC::Connection& connection)
+void NetworkProcess::forEachSWServer(const Function<void(SWServer&)>& callback)
{
- for (auto& serverToContextConnection : m_serverToContextConnections.values()) {
- if (serverToContextConnection->ipcConnection() == &connection)
- return serverToContextConnection.get();
- }
- return nullptr;
+ for (auto& server : m_swServers.values())
+ callback(*server);
}
-void NetworkProcess::connectionToContextProcessWasClosed(Ref<WebSWServerToContextConnection>&& serverToContextConnection)
-{
- auto& registrableDomain = serverToContextConnection->registrableDomain();
-
- serverToContextConnection->connectionClosed();
- m_serverToContextConnections.remove(registrableDomain);
-
- for (auto& swServer : m_swServers.values())
- swServer->markAllWorkersForRegistrableDomainAsTerminated(registrableDomain);
-
- if (needsServerToContextConnectionForRegistrableDomain(registrableDomain)) {
- RELEASE_LOG(ServiceWorker, "Connection to service worker process was closed but is still needed, relaunching it");
- createServerToContextConnection(registrableDomain, WTF::nullopt);
- }
-}
-
-bool NetworkProcess::needsServerToContextConnectionForRegistrableDomain(const RegistrableDomain& registrableDomain) const
-{
- return WTF::anyOf(m_swServers.values(), [&](auto& swServer) {
- return swServer->needsServerToContextConnectionForRegistrableDomain(registrableDomain);
- });
-}
-
SWServer& NetworkProcess::swServerForSession(PAL::SessionID sessionID)
{
auto result = m_swServers.ensure(sessionID, [&] {
@@ -2458,40 +2403,36 @@
return &static_cast<WebSWOriginStore&>(swServer->originStore());
}
+bool NetworkProcess::needsServerToContextConnectionForRegistrableDomain(const RegistrableDomain& registrableDomain) const
+{
+ return WTF::anyOf(m_swServers.values(), [&](auto& swServer) {
+ return swServer->needsServerToContextConnectionForRegistrableDomain(registrableDomain);
+ });
+}
+
WebSWServerToContextConnection* NetworkProcess::serverToContextConnectionForRegistrableDomain(const RegistrableDomain& registrableDomain)
{
return m_serverToContextConnections.get(registrableDomain);
}
-void NetworkProcess::createServerToContextConnection(const RegistrableDomain& registrableDomain, Optional<PAL::SessionID> sessionID)
+void NetworkProcess::createServerToContextConnection(const RegistrableDomain& registrableDomain, PAL::SessionID sessionID)
{
- if (m_waitingForServerToContextProcessConnection)
+ if (m_pendingConnectionDomains.contains(registrableDomain))
return;
-
- m_waitingForServerToContextProcessConnection = true;
- if (sessionID)
- parentProcessConnection()->send(Messages::NetworkProcessProxy::EstablishWorkerContextConnectionToNetworkProcessForExplicitSession(registrableDomain, *sessionID), 0);
- else
- parentProcessConnection()->send(Messages::NetworkProcessProxy::EstablishWorkerContextConnectionToNetworkProcess(registrableDomain), 0);
+
+ m_pendingConnectionDomains.add(registrableDomain);
+ parentProcessConnection()->send(Messages::NetworkProcessProxy::EstablishWorkerContextConnectionToNetworkProcess { registrableDomain, sessionID }, 0);
}
-void NetworkProcess::postMessageToServiceWorkerClient(const ServiceWorkerClientIdentifier& destinationIdentifier, MessageWithMessagePorts&& message, ServiceWorkerIdentifier sourceIdentifier, const String& sourceOrigin)
+void NetworkProcess::postMessageToServiceWorkerClient(PAL::SessionID sessionID, const ServiceWorkerClientIdentifier& destinationIdentifier, MessageWithMessagePorts&& message, ServiceWorkerIdentifier sourceIdentifier, const String& sourceOrigin)
{
- if (auto connection = m_swServerConnections.get(destinationIdentifier.serverConnectionIdentifier))
+ if (auto* connection = swServerForSession(sessionID).connection(destinationIdentifier.serverConnectionIdentifier))
connection->postMessageToServiceWorkerClient(destinationIdentifier.contextIdentifier, WTFMove(message), sourceIdentifier, sourceOrigin);
}
-void NetworkProcess::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 NetworkProcess::registerSWServerConnection(WebSWServerConnection& connection)
{
ASSERT(parentProcessHasServiceWorkerEntitlement());
- ASSERT(!m_swServerConnections.contains(connection.identifier()));
- m_swServerConnections.add(connection.identifier(), makeWeakPtr(connection));
auto* store = existingSWOriginStoreForSession(connection.sessionID());
ASSERT(store);
if (store)
@@ -2500,28 +2441,23 @@
void NetworkProcess::unregisterSWServerConnection(WebSWServerConnection& connection)
{
- ASSERT(m_swServerConnections.get(connection.identifier()).get() == &connection);
- m_swServerConnections.remove(connection.identifier());
if (auto* store = existingSWOriginStoreForSession(connection.sessionID()))
store->unregisterSWServerConnection(connection);
}
-void NetworkProcess::swContextConnectionMayNoLongerBeNeeded(WebSWServerToContextConnection& serverToContextConnection)
+void NetworkProcess::registerSWContextConnection(WebSWServerToContextConnection& connection)
{
- auto& registrableDomain = serverToContextConnection.registrableDomain();
- if (needsServerToContextConnectionForRegistrableDomain(registrableDomain))
- return;
-
- RELEASE_LOG(ServiceWorker, "Service worker process is no longer needed, terminating it");
- serverToContextConnection.terminate();
-
- for (auto& swServer : m_swServers.values())
- swServer->markAllWorkersForRegistrableDomainAsTerminated(registrableDomain);
-
- serverToContextConnection.connectionClosed();
- m_serverToContextConnections.remove(registrableDomain);
+ ASSERT(!m_serverToContextConnections.contains(connection.registrableDomain()));
+ m_pendingConnectionDomains.remove(connection.registrableDomain());
+ m_serverToContextConnections.add(connection.registrableDomain(), &connection);
}
+void NetworkProcess::unregisterSWContextConnection(WebSWServerToContextConnection& connection)
+{
+ ASSERT(m_serverToContextConnections.get(connection.registrableDomain()) == &connection);
+ m_serverToContextConnections.remove(connection.registrableDomain());
+}
+
void NetworkProcess::disableServiceWorkerProcessTerminationDelay()
{
if (m_shouldDisableServiceWorkerProcessTerminationDelay)
Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.h (249800 => 249801)
--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.h 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.h 2019-09-12 08:18:15 UTC (rev 249801)
@@ -298,16 +298,17 @@
#if ENABLE(SERVICE_WORKER)
WebSWServerToContextConnection* serverToContextConnectionForRegistrableDomain(const WebCore::RegistrableDomain&);
- void createServerToContextConnection(const WebCore::RegistrableDomain&, Optional<PAL::SessionID>);
+ void createServerToContextConnection(const WebCore::RegistrableDomain&, PAL::SessionID);
WebCore::SWServer& swServerForSession(PAL::SessionID);
void registerSWServerConnection(WebSWServerConnection&);
void unregisterSWServerConnection(WebSWServerConnection&);
- void swContextConnectionMayNoLongerBeNeeded(WebSWServerToContextConnection&);
-
- WebSWServerToContextConnection* connectionToContextProcessFromIPCConnection(IPC::Connection&);
- void connectionToContextProcessWasClosed(Ref<WebSWServerToContextConnection>&&);
+ void registerSWContextConnection(WebSWServerToContextConnection&);
+ void unregisterSWContextConnection(WebSWServerToContextConnection&);
+
+ bool needsServerToContextConnectionForRegistrableDomain(const WebCore::RegistrableDomain&) const;
+ void forEachSWServer(const Function<void(WebCore::SWServer&)>&);
#endif
#if PLATFORM(IOS_FAMILY)
@@ -393,7 +394,7 @@
// Message Handlers
void didReceiveSyncNetworkProcessMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&);
void initializeNetworkProcess(NetworkProcessCreationParameters&&);
- void createNetworkConnectionToWebProcess(WebCore::ProcessIdentifier, bool isServiceWorkerProcess, WebCore::RegistrableDomain&&, CompletionHandler<void(Optional<IPC::Attachment>&&)>&&);
+ void createNetworkConnectionToWebProcess(WebCore::ProcessIdentifier, CompletionHandler<void(Optional<IPC::Attachment>&&)>&&);
void fetchWebsiteData(PAL::SessionID, OptionSet<WebsiteDataType>, OptionSet<WebsiteDataFetchOption>, uint64_t callbackID);
void deleteWebsiteData(PAL::SessionID, OptionSet<WebsiteDataType>, WallTime modifiedSince, uint64_t callbackID);
@@ -462,13 +463,12 @@
#if ENABLE(SERVICE_WORKER)
void didCreateWorkerContextProcessConnection(const IPC::Attachment&);
- 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);
+ void postMessageToServiceWorkerClient(PAL::SessionID, const WebCore::ServiceWorkerClientIdentifier& destinationIdentifier, WebCore::MessageWithMessagePorts&&, WebCore::ServiceWorkerIdentifier sourceIdentifier, const String& sourceOrigin);
+ void postMessageToServiceWorker(PAL::SessionID, WebCore::ServiceWorkerIdentifier destination, WebCore::MessageWithMessagePorts&&, const WebCore::ServiceWorkerOrClientIdentifier& source, WebCore::SWServerConnectionIdentifier);
void disableServiceWorkerProcessTerminationDelay();
WebSWOriginStore* existingSWOriginStoreForSession(PAL::SessionID) const;
- bool needsServerToContextConnectionForRegistrableDomain(const WebCore::RegistrableDomain&) const;
void addServiceWorkerSession(PAL::SessionID, String& serviceWorkerRegistrationDirectory, const SandboxExtension::Handle&);
#endif
@@ -539,12 +539,11 @@
Lock m_storageTaskMutex;
#if ENABLE(SERVICE_WORKER)
- HashMap<WebCore::RegistrableDomain, RefPtr<WebSWServerToContextConnection>> m_serverToContextConnections;
- bool m_waitingForServerToContextProcessConnection { false };
+ HashMap<WebCore::RegistrableDomain, WebSWServerToContextConnection*> m_serverToContextConnections;
bool m_shouldDisableServiceWorkerProcessTerminationDelay { false };
HashMap<PAL::SessionID, String> m_swDatabasePaths;
HashMap<PAL::SessionID, std::unique_ptr<WebCore::SWServer>> m_swServers;
- HashMap<WebCore::SWServerConnectionIdentifier, WeakPtr<WebSWServerConnection>> m_swServerConnections;
+ HashSet<WebCore::RegistrableDomain> m_pendingConnectionDomains;
#endif
#if PLATFORM(COCOA)
Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in (249800 => 249801)
--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in 2019-09-12 08:18:15 UTC (rev 249801)
@@ -25,7 +25,7 @@
InitializeNetworkProcess(struct WebKit::NetworkProcessCreationParameters processCreationParameters)
# Creates a connection for communication with a WebProcess
- CreateNetworkConnectionToWebProcess(WebCore::ProcessIdentifier processIdentifier, bool isServiceWorkerProcess, WebCore::RegistrableDomain registrableDomain) -> (Optional<IPC::Attachment> connectionIdentifier) Async
+ CreateNetworkConnectionToWebProcess(WebCore::ProcessIdentifier processIdentifier) -> (Optional<IPC::Attachment> connectionIdentifier) Async
#if USE(SOUP)
SetIgnoreTLSErrors(bool ignoreTLSErrors)
@@ -151,10 +151,7 @@
SetCacheStorageParameters(PAL::SessionID sessionID, String cacheStorageDirectory, WebKit::SandboxExtension::Handle handle);
#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)
-
+ PostMessageToServiceWorkerClient(PAL::SessionID sessionID, struct WebCore::ServiceWorkerClientIdentifier destinationIdentifier, struct WebCore::MessageWithMessagePorts message, WebCore::ServiceWorkerIdentifier sourceIdentifier, String sourceOrigin)
DisableServiceWorkerProcessTerminationDelay()
#endif
Modified: trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.cpp (249800 => 249801)
--- trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.cpp 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.cpp 2019-09-12 08:18:15 UTC (rev 249801)
@@ -61,8 +61,8 @@
#define SWSERVERCONNECTION_RELEASE_LOG_IF_ALLOWED(fmt, ...) RELEASE_LOG_IF(m_sessionID.isAlwaysOnLoggingAllowed(), ServiceWorker, "%p - WebSWServerConnection::" fmt, this, ##__VA_ARGS__)
#define SWSERVERCONNECTION_RELEASE_LOG_ERROR_IF_ALLOWED(fmt, ...) RELEASE_LOG_ERROR_IF(m_sessionID.isAlwaysOnLoggingAllowed(), ServiceWorker, "%p - WebSWServerConnection::" fmt, this, ##__VA_ARGS__)
-WebSWServerConnection::WebSWServerConnection(NetworkProcess& networkProcess, SWServer& server, IPC::Connection& connection, SessionID sessionID)
- : SWServer::Connection(server)
+WebSWServerConnection::WebSWServerConnection(NetworkProcess& networkProcess, SWServer& server, IPC::Connection& connection, ProcessIdentifier processIdentifier, SessionID sessionID)
+ : SWServer::Connection(server, processIdentifier)
, m_sessionID(sessionID)
, m_contentConnection(connection)
, m_networkProcess(networkProcess)
@@ -253,13 +253,13 @@
server().scheduleJob(WTFMove(jobData));
}
-void WebSWServerConnection::postMessageToServiceWorkerClient(DocumentIdentifier destinationContextIdentifier, MessageWithMessagePorts&& message, ServiceWorkerIdentifier sourceIdentifier, const String& sourceOrigin)
+void WebSWServerConnection::postMessageToServiceWorkerClient(DocumentIdentifier destinationContextIdentifier, const MessageWithMessagePorts& message, ServiceWorkerIdentifier sourceIdentifier, const String& sourceOrigin)
{
auto* sourceServiceWorker = server().workerByID(sourceIdentifier);
if (!sourceServiceWorker)
return;
- send(Messages::WebSWClientConnection::PostMessageToServiceWorkerClient { destinationContextIdentifier, WTFMove(message), sourceServiceWorker->data(), sourceOrigin });
+ send(Messages::WebSWClientConnection::PostMessageToServiceWorkerClient { destinationContextIdentifier, message, sourceServiceWorker->data(), sourceOrigin });
}
void WebSWServerConnection::matchRegistration(uint64_t registrationMatchRequestIdentifier, const SecurityOriginData& topOrigin, const URL& clientURL)
Modified: trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.h (249800 => 249801)
--- trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.h 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.h 2019-09-12 08:18:15 UTC (rev 249801)
@@ -31,6 +31,7 @@
#include "MessageSender.h"
#include "ServiceWorkerFetchTask.h"
#include <WebCore/FetchIdentifier.h>
+#include <WebCore/ProcessIdentifier.h>
#include <WebCore/SWServer.h>
#include <pal/SessionID.h>
#include <wtf/HashMap.h>
@@ -53,7 +54,7 @@
class WebSWServerConnection : public WebCore::SWServer::Connection, public IPC::MessageSender, public IPC::MessageReceiver {
public:
- WebSWServerConnection(NetworkProcess&, WebCore::SWServer&, IPC::Connection&, PAL::SessionID);
+ WebSWServerConnection(NetworkProcess&, WebCore::SWServer&, IPC::Connection&, WebCore::ProcessIdentifier, PAL::SessionID);
WebSWServerConnection(const WebSWServerConnection&) = delete;
~WebSWServerConnection() final;
@@ -64,9 +65,6 @@
PAL::SessionID sessionID() const { return m_sessionID; }
- 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)
void rejectJobInClient(WebCore::ServiceWorkerJobIdentifier, const WebCore::ExceptionData&) final;
@@ -94,6 +92,8 @@
void unregisterServiceWorkerClient(const WebCore::ServiceWorkerClientIdentifier&);
void syncTerminateWorkerFromClient(WebCore::ServiceWorkerIdentifier&&, CompletionHandler<void()>&&);
+ void postMessageToServiceWorkerClient(WebCore::DocumentIdentifier destinationContextIdentifier, const WebCore::MessageWithMessagePorts&, WebCore::ServiceWorkerIdentifier sourceServiceWorkerIdentifier, const String& sourceOrigin) final;
+
void serverToContextConnectionCreated(WebCore::SWServerToContextConnection&) final;
bool isThrottleable() const { return m_isThrottleable; }
@@ -102,8 +102,10 @@
void setThrottleState(bool isThrottleable);
void updateThrottleState();
+ void postMessageToServiceWorker(WebCore::ServiceWorkerIdentifier destination, WebCore::MessageWithMessagePorts&&, const WebCore::ServiceWorkerOrClientIdentifier& source);
+
IPC::Connection* messageSenderConnection() const final { return m_contentConnection.ptr(); }
- uint64_t messageSenderDestinationID() const final { return identifier().toUInt64(); }
+ uint64_t messageSenderDestinationID() const final { return m_sessionID.toUInt64(); }
template<typename U> static void sendToContextProcess(WebCore::SWServerToContextConnection&, U&& message);
Modified: trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp (249800 => 249801)
--- trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp 2019-09-12 08:18:15 UTC (rev 249801)
@@ -29,11 +29,13 @@
#if ENABLE(SERVICE_WORKER)
#include "FormDataReference.h"
+#include "Logging.h"
#include "NetworkProcess.h"
#include "ServiceWorkerFetchTask.h"
#include "ServiceWorkerFetchTaskMessages.h"
#include "WebCoreArgumentCoders.h"
#include "WebSWContextManagerConnectionMessages.h"
+#include <WebCore/SWServer.h>
#include <WebCore/ServiceWorkerContextData.h>
namespace WebKit {
@@ -44,9 +46,13 @@
, m_ipcConnection(WTFMove(connection))
, m_networkProcess(networkProcess)
{
+ m_networkProcess->registerSWContextConnection(*this);
}
-WebSWServerToContextConnection::~WebSWServerToContextConnection() = default;
+WebSWServerToContextConnection::~WebSWServerToContextConnection()
+{
+ m_networkProcess->unregisterSWContextConnection(*this);
+}
IPC::Connection* WebSWServerToContextConnection::messageSenderConnection() const
{
@@ -65,6 +71,12 @@
fetch->fail(ResourceError { errorDomainWebKitInternal, 0, { }, "Service Worker context closed"_s });
}
+void WebSWServerToContextConnection::postMessageToServiceWorkerClient(PAL::SessionID sessionID, const ServiceWorkerClientIdentifier& destinationIdentifier, const MessageWithMessagePorts& message, ServiceWorkerIdentifier sourceIdentifier, const String& sourceOrigin)
+{
+ if (auto* connection = m_networkProcess->swServerForSession(sessionID).connection(destinationIdentifier.serverConnectionIdentifier))
+ connection->postMessageToServiceWorkerClient(destinationIdentifier.contextIdentifier, message, sourceIdentifier, sourceOrigin);
+}
+
void WebSWServerToContextConnection::installServiceWorkerContext(const ServiceWorkerContextData& data, PAL::SessionID sessionID, const String& userAgent)
{
send(Messages::WebSWContextManagerConnection::InstallServiceWorker { data, sessionID, userAgent });
@@ -117,7 +129,17 @@
void WebSWServerToContextConnection::connectionMayNoLongerBeNeeded()
{
- m_networkProcess->swContextConnectionMayNoLongerBeNeeded(*this);
+ if (m_networkProcess->needsServerToContextConnectionForRegistrableDomain(registrableDomain()))
+ return;
+
+ RELEASE_LOG(ServiceWorker, "Service worker process is no longer needed, terminating it");
+ terminate();
+
+ m_networkProcess->forEachSWServer([&](auto& server) {
+ server.markAllWorkersForRegistrableDomainAsTerminated(registrableDomain());
+ });
+
+ connectionClosed();
}
void WebSWServerToContextConnection::setThrottleState(bool isThrottleable)
Modified: trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.h (249800 => 249801)
--- trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.h 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.h 2019-09-12 08:18:15 UTC (rev 249801)
@@ -34,6 +34,7 @@
namespace WebCore {
struct FetchOptions;
+struct MessageWithMessagePorts;
class ResourceRequest;
}
@@ -82,6 +83,8 @@
IPC::Connection* messageSenderConnection() const final;
uint64_t messageSenderDestinationID() const final;
+ void postMessageToServiceWorkerClient(PAL::SessionID, const WebCore::ServiceWorkerClientIdentifier& destinationIdentifier, const WebCore::MessageWithMessagePorts&, WebCore::ServiceWorkerIdentifier sourceIdentifier, const String& sourceOrigin);
+
// Messages to the SW host WebProcess
void installServiceWorkerContext(const WebCore::ServiceWorkerContextData&, PAL::SessionID, const String& userAgent) final;
void fireInstallEvent(WebCore::ServiceWorkerIdentifier) final;
Modified: trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.messages.in (249800 => 249801)
--- trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.messages.in 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.messages.in 2019-09-12 08:18:15 UTC (rev 249801)
@@ -36,6 +36,7 @@
MatchAll(uint64_t matchAllRequestIdentifier, WebCore::ServiceWorkerIdentifier serviceWorkerIdentifier, struct WebCore::ServiceWorkerClientQueryOptions options);
Claim(uint64_t claimRequestIdentifier, WebCore::ServiceWorkerIdentifier serviceWorkerIdentifier);
SetScriptResource(WebCore::ServiceWorkerIdentifier identifier, URL scriptURL, String script, URL responseURL, String mimeType);
+ PostMessageToServiceWorkerClient(PAL::SessionID sessionID, struct WebCore::ServiceWorkerClientIdentifier destination, struct WebCore::MessageWithMessagePorts message, WebCore::ServiceWorkerIdentifier source, String sourceOrigin)
}
#endif // ENABLE(SERVICE_WORKER)
Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp (249800 => 249801)
--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp 2019-09-12 08:18:15 UTC (rev 249801)
@@ -142,16 +142,7 @@
void NetworkProcessProxy::openNetworkProcessConnection(uint64_t connectionRequestIdentifier, WebProcessProxy& webProcessProxy)
{
- bool isServiceWorkerProcess = false;
- RegistrableDomain registrableDomain;
-#if ENABLE(SERVICE_WORKER)
- if (webProcessProxy.isRunningServiceWorkers()) {
- isServiceWorkerProcess = true;
- registrableDomain = webProcessProxy.registrableDomain();
- }
-#endif
-
- connection()->sendWithAsyncReply(Messages::NetworkProcess::CreateNetworkConnectionToWebProcess { webProcessProxy.coreProcessIdentifier(), isServiceWorkerProcess, registrableDomain }, [this, weakThis = makeWeakPtr(this), webProcessProxy = makeWeakPtr(webProcessProxy), connectionRequestIdentifier](auto&& connectionIdentifier) mutable {
+ connection()->sendWithAsyncReply(Messages::NetworkProcess::CreateNetworkConnectionToWebProcess { webProcessProxy.coreProcessIdentifier() }, [this, weakThis = makeWeakPtr(this), webProcessProxy = makeWeakPtr(webProcessProxy), connectionRequestIdentifier](auto&& connectionIdentifier) mutable {
if (!weakThis)
return;
@@ -1209,13 +1200,8 @@
#endif
#if ENABLE(SERVICE_WORKER)
-void NetworkProcessProxy::establishWorkerContextConnectionToNetworkProcess(RegistrableDomain&& registrableDomain)
+void NetworkProcessProxy::establishWorkerContextConnectionToNetworkProcess(RegistrableDomain&& registrableDomain, PAL::SessionID sessionID)
{
- m_processPool.establishWorkerContextConnectionToNetworkProcess(*this, WTFMove(registrableDomain), WTF::nullopt);
-}
-
-void NetworkProcessProxy::establishWorkerContextConnectionToNetworkProcessForExplicitSession(RegistrableDomain&& registrableDomain, PAL::SessionID sessionID)
-{
m_processPool.establishWorkerContextConnectionToNetworkProcess(*this, WTFMove(registrableDomain), sessionID);
}
#endif
Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h (249800 => 249801)
--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h 2019-09-12 08:18:15 UTC (rev 249801)
@@ -238,8 +238,7 @@
#endif
#if ENABLE(SERVICE_WORKER)
- void establishWorkerContextConnectionToNetworkProcess(WebCore::RegistrableDomain&&);
- void establishWorkerContextConnectionToNetworkProcessForExplicitSession(WebCore::RegistrableDomain&&, PAL::SessionID);
+ void establishWorkerContextConnectionToNetworkProcess(WebCore::RegistrableDomain&&, PAL::SessionID);
#endif
void requestStorageSpace(PAL::SessionID, const WebCore::ClientOrigin&, uint64_t quota, uint64_t currentSize, uint64_t spaceRequired, CompletionHandler<void(Optional<uint64_t> quota)>&&);
Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.messages.in (249800 => 249801)
--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.messages.in 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.messages.in 2019-09-12 08:18:15 UTC (rev 249801)
@@ -61,8 +61,7 @@
#endif
#if ENABLE(SERVICE_WORKER)
- EstablishWorkerContextConnectionToNetworkProcess(WebCore::RegistrableDomain registrableDomain)
- EstablishWorkerContextConnectionToNetworkProcessForExplicitSession(WebCore::RegistrableDomain registrableDomain, PAL::SessionID explicitSession)
+ EstablishWorkerContextConnectionToNetworkProcess(WebCore::RegistrableDomain registrableDomain, PAL::SessionID sessionID)
#endif
RequestStorageSpace(PAL::SessionID sessionID, struct WebCore::ClientOrigin origin, uint64_t quota, uint64_t currentSize, uint64_t spaceRequired) -> (Optional<uint64_t> newQuota) Async
Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.cpp (249800 => 249801)
--- trunk/Source/WebKit/UIProcess/WebProcessPool.cpp 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.cpp 2019-09-12 08:18:15 UTC (rev 249801)
@@ -687,18 +687,13 @@
}
#if ENABLE(SERVICE_WORKER)
-void WebProcessPool::establishWorkerContextConnectionToNetworkProcess(NetworkProcessProxy& proxy, RegistrableDomain&& registrableDomain, Optional<PAL::SessionID> sessionID)
+void WebProcessPool::establishWorkerContextConnectionToNetworkProcess(NetworkProcessProxy& proxy, RegistrableDomain&& registrableDomain, PAL::SessionID sessionID)
{
ASSERT_UNUSED(proxy, &proxy == m_networkProcess.get());
- if (m_serviceWorkerProcesses.contains(registrableDomain))
- return;
-
m_mayHaveRegisteredServiceWorkers.clear();
- WebsiteDataStore* websiteDataStore = nullptr;
- if (sessionID)
- websiteDataStore = WebsiteDataStore::existingNonDefaultDataStoreForSessionID(*sessionID);
+ auto* websiteDataStore = WebsiteDataStore::existingNonDefaultDataStoreForSessionID(sessionID);
if (!websiteDataStore) {
if (!m_websiteDataStore)
@@ -706,6 +701,9 @@
websiteDataStore = &m_websiteDataStore->websiteDataStore();
}
+ if (m_serviceWorkerProcesses.contains(registrableDomain))
+ return;
+
if (m_serviceWorkerProcesses.isEmpty())
sendToAllProcesses(Messages::WebProcess::RegisterServiceWorkerClients { });
@@ -718,7 +716,7 @@
auto* serviceWorkerProcessProxyPtr = serviceWorkerProcessProxy.ptr();
m_processes.append(WTFMove(serviceWorkerProcessProxy));
- serviceWorkerProcessProxyPtr->establishServiceWorkerContext(m_serviceWorkerPreferences ? m_serviceWorkerPreferences.value() : m_defaultPageGroup->preferences().store(), sessionID.valueOr(PAL::SessionID::defaultSessionID()));
+ serviceWorkerProcessProxyPtr->establishServiceWorkerContext(m_serviceWorkerPreferences ? m_serviceWorkerPreferences.value() : m_defaultPageGroup->preferences().store());
if (!m_serviceWorkerUserAgent.isNull())
serviceWorkerProcessProxyPtr->setServiceWorkerUserAgent(m_serviceWorkerUserAgent);
}
Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.h (249800 => 249801)
--- trunk/Source/WebKit/UIProcess/WebProcessPool.h 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.h 2019-09-12 08:18:15 UTC (rev 249801)
@@ -381,7 +381,7 @@
bool isServiceWorkerPageID(WebPageProxyIdentifier) const;
#if ENABLE(SERVICE_WORKER)
- void establishWorkerContextConnectionToNetworkProcess(NetworkProcessProxy&, WebCore::RegistrableDomain&&, Optional<PAL::SessionID>);
+ void establishWorkerContextConnectionToNetworkProcess(NetworkProcessProxy&, WebCore::RegistrableDomain&&, PAL::SessionID);
const HashMap<WebCore::RegistrableDomain, WebProcessProxy*>& serviceWorkerProxies() const { return m_serviceWorkerProcesses; }
void setAllowsAnySSLCertificateForServiceWorker(bool allows) { m_allowsAnySSLCertificateForServiceWorker = allows; }
bool allowsAnySSLCertificateForServiceWorker() const { return m_allowsAnySSLCertificateForServiceWorker; }
Modified: trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp (249800 => 249801)
--- trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp 2019-09-12 08:18:15 UTC (rev 249801)
@@ -1493,9 +1493,9 @@
#endif
#if ENABLE(SERVICE_WORKER)
-void WebProcessProxy::establishServiceWorkerContext(const WebPreferencesStore& store, PAL::SessionID sessionID)
+void WebProcessProxy::establishServiceWorkerContext(const WebPreferencesStore& store)
{
- send(Messages::WebProcess::EstablishWorkerContextConnectionToNetworkProcess { processPool().defaultPageGroup().pageGroupID(), m_serviceWorkerInformation->serviceWorkerPageProxyID, m_serviceWorkerInformation->serviceWorkerPageID, store, sessionID }, 0);
+ send(Messages::WebProcess::EstablishWorkerContextConnectionToNetworkProcess { processPool().defaultPageGroup().pageGroupID(), m_serviceWorkerInformation->serviceWorkerPageProxyID, m_serviceWorkerInformation->serviceWorkerPageID, store, *m_registrableDomain, m_websiteDataStore->sessionID() }, 0);
}
void WebProcessProxy::setServiceWorkerUserAgent(const String& userAgent)
Modified: trunk/Source/WebKit/UIProcess/WebProcessProxy.h (249800 => 249801)
--- trunk/Source/WebKit/UIProcess/WebProcessProxy.h 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebKit/UIProcess/WebProcessProxy.h 2019-09-12 08:18:15 UTC (rev 249801)
@@ -313,8 +313,7 @@
void deref() final { ThreadSafeRefCounted::deref(); }
#if ENABLE(SERVICE_WORKER)
- void establishServiceWorkerContext(const WebPreferencesStore&, PAL::SessionID);
- void startForServiceWorkers(const WebPreferencesStore&, PAL::SessionID);
+ void establishServiceWorkerContext(const WebPreferencesStore&);
void setServiceWorkerUserAgent(const String&);
void updateServiceWorkerPreferencesStore(const WebPreferencesStore&);
bool hasServiceWorkerPageProxy(WebPageProxyIdentifier pageProxyID) { return m_serviceWorkerInformation && m_serviceWorkerInformation->serviceWorkerPageProxyID == pageProxyID; }
Modified: trunk/Source/WebKit/WebProcess/Network/NetworkProcessConnection.cpp (249800 => 249801)
--- trunk/Source/WebKit/WebProcess/Network/NetworkProcessConnection.cpp 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebKit/WebProcess/Network/NetworkProcessConnection.cpp 2019-09-12 08:18:15 UTC (rev 249801)
@@ -137,7 +137,7 @@
#if ENABLE(SERVICE_WORKER)
if (decoder.messageReceiverName() == Messages::WebSWClientConnection::messageReceiverName()) {
- auto serviceWorkerConnection = m_swConnectionsByIdentifier.get(makeObjectIdentifier<SWServerConnectionIdentifierType>(decoder.destinationID()));
+ auto serviceWorkerConnection = m_swConnectionsBySession.get(PAL::SessionID { decoder.destinationID() });
if (serviceWorkerConnection)
serviceWorkerConnection->didReceiveMessage(connection, decoder);
return;
@@ -200,7 +200,7 @@
#endif
#if ENABLE(SERVICE_WORKER)
- auto swConnections = std::exchange(m_swConnectionsByIdentifier, { });
+ auto swConnections = std::exchange(m_swConnectionsBySession, { });
for (auto& connection : swConnections.values())
connection->connectionToServerLost();
#endif
@@ -264,25 +264,6 @@
return WebSWClientConnection::create(sessionID);
}).iterator->value;
}
-
-void NetworkProcessConnection::removeSWClientConnection(WebSWClientConnection& connection)
-{
- ASSERT(m_swConnectionsByIdentifier.contains(connection.serverConnectionIdentifier()));
- m_swConnectionsByIdentifier.remove(connection.serverConnectionIdentifier());
-}
-
-SWServerConnectionIdentifier NetworkProcessConnection::initializeSWClientConnection(WebSWClientConnection& connection)
-{
- ASSERT(connection.sessionID().isValid());
- SWServerConnectionIdentifier identifier;
- bool result = m_connection->sendSync(Messages::NetworkConnectionToWebProcess::EstablishSWServerConnection(connection.sessionID()), Messages::NetworkConnectionToWebProcess::EstablishSWServerConnection::Reply(identifier), 0);
- ASSERT_UNUSED(result, result);
-
- ASSERT(!m_swConnectionsByIdentifier.contains(identifier));
- m_swConnectionsByIdentifier.add(identifier, &connection);
-
- return identifier;
-}
#endif
void NetworkProcessConnection::messagesAvailableForPort(const WebCore::MessagePortIdentifier& messagePortIdentifier)
Modified: trunk/Source/WebKit/WebProcess/Network/NetworkProcessConnection.h (249800 => 249801)
--- trunk/Source/WebKit/WebProcess/Network/NetworkProcessConnection.h 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebKit/WebProcess/Network/NetworkProcessConnection.h 2019-09-12 08:18:15 UTC (rev 249801)
@@ -78,9 +78,6 @@
#if ENABLE(SERVICE_WORKER)
WebSWClientConnection* existingServiceWorkerConnectionForSession(PAL::SessionID sessionID) { return m_swConnectionsBySession.get(sessionID); }
WebSWClientConnection& serviceWorkerConnectionForSession(PAL::SessionID);
-
- WebCore::SWServerConnectionIdentifier initializeSWClientConnection(WebSWClientConnection&);
- void removeSWClientConnection(WebSWClientConnection&);
#endif
private:
@@ -113,7 +110,6 @@
#if ENABLE(SERVICE_WORKER)
HashMap<PAL::SessionID, RefPtr<WebSWClientConnection>> m_swConnectionsBySession;
- HashMap<WebCore::SWServerConnectionIdentifier, WebSWClientConnection*> m_swConnectionsByIdentifier;
#endif
};
Modified: trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.cpp (249800 => 249801)
--- trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.cpp 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.cpp 2019-09-12 08:18:15 UTC (rev 249801)
@@ -31,6 +31,7 @@
#include "DataReference.h"
#include "FormDataReference.h"
#include "Logging.h"
+#include "NetworkConnectionToWebProcessMessages.h"
#include "NetworkProcessConnection.h"
#include "NetworkProcessMessages.h"
#include "ServiceWorkerClientFetch.h"
@@ -40,6 +41,7 @@
#include "WebSWOriginTable.h"
#include "WebSWServerConnectionMessages.h"
#include <WebCore/Document.h>
+#include <WebCore/ProcessIdentifier.h>
#include <WebCore/SecurityOrigin.h>
#include <WebCore/SerializedScriptValue.h>
#include <WebCore/ServiceWorkerClientData.h>
@@ -55,77 +57,61 @@
WebSWClientConnection::WebSWClientConnection(SessionID sessionID)
: m_sessionID(sessionID)
+ , m_identifier(Process::identifier())
, m_swOriginTable(makeUniqueRef<WebSWOriginTable>())
{
ASSERT(m_sessionID.isValid());
- initializeConnectionIfNeeded();
+ send(Messages::NetworkConnectionToWebProcess::EstablishSWServerConnection { sessionID });
}
WebSWClientConnection::~WebSWClientConnection()
{
- if (m_connection)
- WebProcess::singleton().ensureNetworkProcessConnection().removeSWClientConnection(*this);
+ clear();
}
-void WebSWClientConnection::initializeConnectionIfNeeded()
+IPC::Connection* WebSWClientConnection::messageSenderConnection() const
{
- if (m_connection)
- return;
-
- auto& networkProcessConnection = WebProcess::singleton().ensureNetworkProcessConnection();
-
- m_connection = &networkProcessConnection.connection();
- m_identifier = networkProcessConnection.initializeSWClientConnection(*this);
-
- updateThrottleState();
+ return &WebProcess::singleton().ensureNetworkProcessConnection().connection();
}
-template<typename U>
-void WebSWClientConnection::ensureConnectionAndSend(const U& message)
-{
- initializeConnectionIfNeeded();
- if (m_connection)
- send(message);
-}
-
void WebSWClientConnection::scheduleJobInServer(const ServiceWorkerJobData& jobData)
{
- ensureConnectionAndSend(Messages::WebSWServerConnection::ScheduleJobInServer(jobData));
+ send(Messages::WebSWServerConnection::ScheduleJobInServer { jobData });
}
void WebSWClientConnection::finishFetchingScriptInServer(const ServiceWorkerFetchResult& result)
{
- ensureConnectionAndSend(Messages::WebSWServerConnection::FinishFetchingScriptInServer(result));
+ send(Messages::WebSWServerConnection::FinishFetchingScriptInServer { result });
}
void WebSWClientConnection::addServiceWorkerRegistrationInServer(ServiceWorkerRegistrationIdentifier identifier)
{
- ensureConnectionAndSend(Messages::WebSWServerConnection::AddServiceWorkerRegistrationInServer(identifier));
+ send(Messages::WebSWServerConnection::AddServiceWorkerRegistrationInServer { identifier });
}
void WebSWClientConnection::removeServiceWorkerRegistrationInServer(ServiceWorkerRegistrationIdentifier identifier)
{
- ensureConnectionAndSend(Messages::WebSWServerConnection::RemoveServiceWorkerRegistrationInServer(identifier));
+ send(Messages::WebSWServerConnection::RemoveServiceWorkerRegistrationInServer { identifier });
}
void WebSWClientConnection::postMessageToServiceWorker(ServiceWorkerIdentifier destinationIdentifier, MessageWithMessagePorts&& message, const ServiceWorkerOrClientIdentifier& sourceIdentifier)
{
- WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkProcess::PostMessageToServiceWorker { destinationIdentifier, WTFMove(message), sourceIdentifier, serverConnectionIdentifier() }, 0);
+ send(Messages::WebSWServerConnection::PostMessageToServiceWorker { destinationIdentifier, WTFMove(message), sourceIdentifier });
}
void WebSWClientConnection::registerServiceWorkerClient(const SecurityOrigin& topOrigin, const WebCore::ServiceWorkerClientData& data, const Optional<WebCore::ServiceWorkerRegistrationIdentifier>& controllingServiceWorkerRegistrationIdentifier, const String& userAgent)
{
- ensureConnectionAndSend(Messages::WebSWServerConnection::RegisterServiceWorkerClient { topOrigin.data(), data, controllingServiceWorkerRegistrationIdentifier, userAgent });
+ send(Messages::WebSWServerConnection::RegisterServiceWorkerClient { topOrigin.data(), data, controllingServiceWorkerRegistrationIdentifier, userAgent });
}
void WebSWClientConnection::unregisterServiceWorkerClient(DocumentIdentifier contextIdentifier)
{
- ensureConnectionAndSend(Messages::WebSWServerConnection::UnregisterServiceWorkerClient { ServiceWorkerClientIdentifier { serverConnectionIdentifier(), contextIdentifier } });
+ send(Messages::WebSWServerConnection::UnregisterServiceWorkerClient { ServiceWorkerClientIdentifier { serverConnectionIdentifier(), contextIdentifier } });
}
void WebSWClientConnection::didResolveRegistrationPromise(const ServiceWorkerRegistrationKey& key)
{
- ensureConnectionAndSend(Messages::WebSWServerConnection::DidResolveRegistrationPromise(key));
+ send(Messages::WebSWServerConnection::DidResolveRegistrationPromise { key });
}
bool WebSWClientConnection::mayHaveServiceWorkerRegisteredForOrigin(const SecurityOriginData& origin) const
@@ -176,11 +162,11 @@
runOrDelayTaskForImport([this, callback = WTFMove(callback), topOrigin = WTFMove(topOrigin), clientURL]() mutable {
uint64_t callbackID = ++m_previousCallbackIdentifier;
m_ongoingMatchRegistrationTasks.add(callbackID, WTFMove(callback));
- ensureConnectionAndSend(Messages::WebSWServerConnection::MatchRegistration(callbackID, topOrigin, clientURL));
+ send(Messages::WebSWServerConnection::MatchRegistration(callbackID, topOrigin, clientURL));
});
}
-void WebSWClientConnection::runOrDelayTaskForImport(WTF::Function<void()>&& task)
+void WebSWClientConnection::runOrDelayTaskForImport(Function<void()>&& task)
{
if (m_swOriginTable->isImported()) {
task();
@@ -187,7 +173,6 @@
return;
}
m_tasksPendingOriginImport.append(WTFMove(task));
- initializeConnectionIfNeeded();
}
void WebSWClientConnection::whenRegistrationReady(const SecurityOriginData& topOrigin, const URL& clientURL, WhenRegistrationReadyCallback&& callback)
@@ -194,7 +179,7 @@
{
uint64_t callbackID = ++m_previousCallbackIdentifier;
m_ongoingRegistrationReadyTasks.add(callbackID, WTFMove(callback));
- ensureConnectionAndSend(Messages::WebSWServerConnection::WhenRegistrationReady(callbackID, topOrigin, clientURL));
+ send(Messages::WebSWServerConnection::WhenRegistrationReady(callbackID, topOrigin, clientURL));
}
void WebSWClientConnection::registrationReady(uint64_t callbackID, WebCore::ServiceWorkerRegistrationData&& registrationData)
@@ -216,29 +201,32 @@
runOrDelayTaskForImport([this, callback = WTFMove(callback), topOrigin = WTFMove(topOrigin), clientURL]() mutable {
uint64_t callbackID = ++m_previousCallbackIdentifier;
m_ongoingGetRegistrationsTasks.add(callbackID, WTFMove(callback));
- ensureConnectionAndSend(Messages::WebSWServerConnection::GetRegistrations(callbackID, topOrigin, clientURL));
+ send(Messages::WebSWServerConnection::GetRegistrations { callbackID, topOrigin, clientURL });
});
}
void WebSWClientConnection::startFetch(FetchIdentifier fetchIdentifier, ServiceWorkerRegistrationIdentifier serviceWorkerRegistrationIdentifier, const ResourceRequest& request, const FetchOptions& options, const String& referrer)
{
- ensureConnectionAndSend(Messages::WebSWServerConnection::StartFetch { serviceWorkerRegistrationIdentifier, fetchIdentifier, request, options, IPC::FormDataReference { request.httpBody() }, referrer });
+ send(Messages::WebSWServerConnection::StartFetch { serviceWorkerRegistrationIdentifier, fetchIdentifier, request, options, IPC::FormDataReference { request.httpBody() }, referrer });
}
void WebSWClientConnection::cancelFetch(FetchIdentifier fetchIdentifier, ServiceWorkerRegistrationIdentifier serviceWorkerRegistrationIdentifier)
{
- ensureConnectionAndSend(Messages::WebSWServerConnection::CancelFetch { serviceWorkerRegistrationIdentifier, fetchIdentifier });
+ send(Messages::WebSWServerConnection::CancelFetch { serviceWorkerRegistrationIdentifier, fetchIdentifier });
}
void WebSWClientConnection::continueDidReceiveFetchResponse(FetchIdentifier fetchIdentifier, ServiceWorkerRegistrationIdentifier serviceWorkerRegistrationIdentifier)
{
- ensureConnectionAndSend(Messages::WebSWServerConnection::ContinueDidReceiveFetchResponse { serviceWorkerRegistrationIdentifier, fetchIdentifier });
+ send(Messages::WebSWServerConnection::ContinueDidReceiveFetchResponse { serviceWorkerRegistrationIdentifier, fetchIdentifier });
}
void WebSWClientConnection::connectionToServerLost()
{
- m_connection = nullptr;
+ clear();
+}
+void WebSWClientConnection::clear()
+{
auto registrationTasks = WTFMove(m_ongoingMatchRegistrationTasks);
for (auto& callback : registrationTasks.values())
callback(WTF::nullopt);
@@ -247,31 +235,26 @@
for (auto& callback : getRegistrationTasks.values())
callback({ });
+ auto registrationReadyTasks = WTFMove(m_ongoingRegistrationReadyTasks);
+ for (auto& callback : registrationReadyTasks.values())
+ callback({ });
+
clearPendingJobs();
}
void WebSWClientConnection::syncTerminateWorker(ServiceWorkerIdentifier identifier)
{
- initializeConnectionIfNeeded();
-
- sendSync(Messages::WebSWServerConnection::SyncTerminateWorkerFromClient(identifier), Messages::WebSWServerConnection::SyncTerminateWorkerFromClient::Reply());
+ sendSync(Messages::WebSWServerConnection::SyncTerminateWorkerFromClient { identifier }, Messages::WebSWServerConnection::SyncTerminateWorkerFromClient::Reply());
}
-WebCore::SWServerConnectionIdentifier WebSWClientConnection::serverConnectionIdentifier() const
-{
- const_cast<WebSWClientConnection*>(this)->initializeConnectionIfNeeded();
- return m_identifier;
-}
-
void WebSWClientConnection::updateThrottleState()
{
m_isThrottleable = WebProcess::singleton().areAllPagesThrottleable();
- ensureConnectionAndSend(Messages::WebSWServerConnection::SetThrottleState { m_isThrottleable });
+ send(Messages::WebSWServerConnection::SetThrottleState { m_isThrottleable });
}
void WebSWClientConnection::storeRegistrationsOnDiskForTesting(CompletionHandler<void()>&& callback)
{
- initializeConnectionIfNeeded();
sendWithAsyncReply(Messages::WebSWServerConnection::StoreRegistrationsOnDisk { }, WTFMove(callback));
}
Modified: trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.h (249800 => 249801)
--- trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.h 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.h 2019-09-12 08:18:15 UTC (rev 249801)
@@ -52,7 +52,7 @@
static Ref<WebSWClientConnection> create(PAL::SessionID sessionID) { return adoptRef(*new WebSWClientConnection { sessionID }); }
~WebSWClientConnection();
- WebCore::SWServerConnectionIdentifier serverConnectionIdentifier() const final;
+ WebCore::SWServerConnectionIdentifier serverConnectionIdentifier() const final { return m_identifier; }
void addServiceWorkerRegistrationInServer(WebCore::ServiceWorkerRegistrationIdentifier) final;
void removeServiceWorkerRegistrationInServer(WebCore::ServiceWorkerRegistrationIdentifier) final;
@@ -74,8 +74,6 @@
private:
explicit WebSWClientConnection(PAL::SessionID);
- void initializeConnectionIfNeeded();
-
void scheduleJobInServer(const WebCore::ServiceWorkerJobData&) final;
void finishFetchingScriptInServer(const WebCore::ServiceWorkerFetchResult&) final;
void postMessageToServiceWorker(WebCore::ServiceWorkerIdentifier destinationIdentifier, WebCore::MessageWithMessagePorts&&, const WebCore::ServiceWorkerOrClientIdentifier& source) final;
@@ -97,20 +95,19 @@
void scheduleStorageJob(const WebCore::ServiceWorkerJobData&);
- void runOrDelayTaskForImport(WTF::Function<void()>&& task);
+ void runOrDelayTaskForImport(Function<void()>&& task);
- IPC::Connection* messageSenderConnection() const final { return m_connection.get(); }
- uint64_t messageSenderDestinationID() const final { return m_identifier.toUInt64(); }
+ IPC::Connection* messageSenderConnection() const final;
+ uint64_t messageSenderDestinationID() const final { return m_sessionID.toUInt64(); }
void setSWOriginTableSharedMemory(const SharedMemory::Handle&);
void setSWOriginTableIsImported();
- template<typename U> void ensureConnectionAndSend(const U& message);
+ void clear();
PAL::SessionID m_sessionID;
WebCore::SWServerConnectionIdentifier m_identifier;
- RefPtr<IPC::Connection> m_connection;
UniqueRef<WebSWOriginTable> m_swOriginTable;
uint64_t m_previousCallbackIdentifier { 0 };
@@ -117,7 +114,7 @@
HashMap<uint64_t, RegistrationCallback> m_ongoingMatchRegistrationTasks;
HashMap<uint64_t, GetRegistrationsCallback> m_ongoingGetRegistrationsTasks;
HashMap<uint64_t, WhenRegistrationReadyCallback> m_ongoingRegistrationReadyTasks;
- Deque<WTF::Function<void()>> m_tasksPendingOriginImport;
+ Deque<Function<void()>> m_tasksPendingOriginImport;
bool m_isThrottleable { true };
}; // class WebSWServerConnection
Modified: trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp (249800 => 249801)
--- trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp 2019-09-12 08:18:15 UTC (rev 249801)
@@ -31,6 +31,7 @@
#include "DataReference.h"
#include "FormDataReference.h"
#include "Logging.h"
+#include "NetworkConnectionToWebProcessMessages.h"
#include "NetworkProcessMessages.h"
#include "ServiceWorkerFetchTaskMessages.h"
#include "WebCacheStorageProvider.h"
@@ -86,8 +87,9 @@
return WebDocumentLoader::create(request, substituteData);
}
-WebSWContextManagerConnection::WebSWContextManagerConnection(Ref<IPC::Connection>&& connection, uint64_t pageGroupID, WebPageProxyIdentifier webPageProxyID, PageIdentifier pageID, const WebPreferencesStore& store)
+WebSWContextManagerConnection::WebSWContextManagerConnection(Ref<IPC::Connection>&& connection, WebCore::RegistrableDomain&& registrableDomain, uint64_t pageGroupID, WebPageProxyIdentifier webPageProxyID, PageIdentifier pageID, const WebPreferencesStore& store)
: m_connectionToNetworkProcess(WTFMove(connection))
+ , m_registrableDomain(WTFMove(registrableDomain))
, m_pageGroupID(pageGroupID)
, m_webPageProxyID(webPageProxyID)
, m_pageID(pageID)
@@ -98,6 +100,7 @@
#endif
{
updatePreferencesStore(store);
+ m_connectionToNetworkProcess->send(Messages::NetworkConnectionToWebProcess::EstablishSWContextConnection { m_registrableDomain }, 0);
}
WebSWContextManagerConnection::~WebSWContextManagerConnection() = default;
@@ -260,9 +263,9 @@
SWContextManager::singleton().terminateWorker(identifier, syncWorkerTerminationTimeout, WTFMove(reply));
}
-void WebSWContextManagerConnection::postMessageToServiceWorkerClient(const ServiceWorkerClientIdentifier& destinationIdentifier, MessageWithMessagePorts&& message, ServiceWorkerIdentifier sourceIdentifier, const String& sourceOrigin)
+void WebSWContextManagerConnection::postMessageToServiceWorkerClient(PAL::SessionID sessionID, const ServiceWorkerClientIdentifier& destinationIdentifier, const MessageWithMessagePorts& message, ServiceWorkerIdentifier sourceIdentifier, const String& sourceOrigin)
{
- m_connectionToNetworkProcess->send(Messages::NetworkProcess::PostMessageToServiceWorkerClient(destinationIdentifier, WTFMove(message), sourceIdentifier, sourceOrigin), 0);
+ m_connectionToNetworkProcess->send(Messages::WebSWServerToContextConnection::PostMessageToServiceWorkerClient(sessionID, destinationIdentifier, message, sourceIdentifier, sourceOrigin), 0);
}
void WebSWContextManagerConnection::didFinishInstall(Optional<ServiceWorkerJobDataIdentifier> jobDataIdentifier, ServiceWorkerIdentifier serviceWorkerIdentifier, bool wasSuccessful)
Modified: trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.h (249800 => 249801)
--- trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.h 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.h 2019-09-12 08:18:15 UTC (rev 249801)
@@ -53,7 +53,7 @@
class WebSWContextManagerConnection final : public WebCore::SWContextManager::Connection, public IPC::MessageReceiver {
public:
- WebSWContextManagerConnection(Ref<IPC::Connection>&&, uint64_t pageGroupID, WebPageProxyIdentifier, WebCore::PageIdentifier, const WebPreferencesStore&);
+ WebSWContextManagerConnection(Ref<IPC::Connection>&&, WebCore::RegistrableDomain&&, uint64_t pageGroupID, WebPageProxyIdentifier, WebCore::PageIdentifier, const WebPreferencesStore&);
~WebSWContextManagerConnection();
void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;
@@ -65,7 +65,7 @@
void updatePreferencesStore(const WebPreferencesStore&);
// WebCore::SWContextManager::Connection.
- void postMessageToServiceWorkerClient(const WebCore::ServiceWorkerClientIdentifier& destinationIdentifier, WebCore::MessageWithMessagePorts&&, WebCore::ServiceWorkerIdentifier sourceIdentifier, const String& sourceOrigin) final;
+ void postMessageToServiceWorkerClient(PAL::SessionID, const WebCore::ServiceWorkerClientIdentifier& destinationIdentifier, const WebCore::MessageWithMessagePorts&, WebCore::ServiceWorkerIdentifier sourceIdentifier, const String& sourceOrigin) final;
void didFinishInstall(Optional<WebCore::ServiceWorkerJobDataIdentifier>, WebCore::ServiceWorkerIdentifier, bool wasSuccessful) final;
void didFinishActivation(WebCore::ServiceWorkerIdentifier) final;
void setServiceWorkerHasPendingEvents(WebCore::ServiceWorkerIdentifier, bool) final;
@@ -99,6 +99,7 @@
void setThrottleState(bool isThrottleable);
Ref<IPC::Connection> m_connectionToNetworkProcess;
+ WebCore::RegistrableDomain m_registrableDomain;
uint64_t m_pageGroupID;
WebPageProxyIdentifier m_webPageProxyID;
WebCore::PageIdentifier m_pageID;
Modified: trunk/Source/WebKit/WebProcess/WebProcess.cpp (249800 => 249801)
--- trunk/Source/WebKit/WebProcess/WebProcess.cpp 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebKit/WebProcess/WebProcess.cpp 2019-09-12 08:18:15 UTC (rev 249801)
@@ -1811,13 +1811,13 @@
}
#if ENABLE(SERVICE_WORKER)
-void WebProcess::establishWorkerContextConnectionToNetworkProcess(uint64_t pageGroupID, WebPageProxyIdentifier webPageProxyID, PageIdentifier pageID, const WebPreferencesStore& store, PAL::SessionID initialSessionID)
+void WebProcess::establishWorkerContextConnectionToNetworkProcess(uint64_t pageGroupID, WebPageProxyIdentifier webPageProxyID, PageIdentifier pageID, const WebPreferencesStore& store, RegistrableDomain&& registrableDomain, PAL::SessionID initialSessionID)
{
// We are in the Service Worker context process and the call below establishes our connection to the Network Process
// by calling ensureNetworkProcessConnection. SWContextManager needs to use the same underlying IPC::Connection as the
// NetworkProcessConnection for synchronization purposes.
auto& ipcConnection = ensureNetworkProcessConnection().connection();
- SWContextManager::singleton().setConnection(makeUnique<WebSWContextManagerConnection>(ipcConnection, pageGroupID, webPageProxyID, pageID, store));
+ SWContextManager::singleton().setConnection(makeUnique<WebSWContextManagerConnection>(ipcConnection, WTFMove(registrableDomain), pageGroupID, webPageProxyID, pageID, store));
}
void WebProcess::registerServiceWorkerClients()
Modified: trunk/Source/WebKit/WebProcess/WebProcess.h (249800 => 249801)
--- trunk/Source/WebKit/WebProcess/WebProcess.h 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebKit/WebProcess/WebProcess.h 2019-09-12 08:18:15 UTC (rev 249801)
@@ -365,7 +365,7 @@
#endif
#if ENABLE(SERVICE_WORKER)
- void establishWorkerContextConnectionToNetworkProcess(uint64_t pageGroupID, WebPageProxyIdentifier, WebCore::PageIdentifier, const WebPreferencesStore&, PAL::SessionID);
+ void establishWorkerContextConnectionToNetworkProcess(uint64_t pageGroupID, WebPageProxyIdentifier, WebCore::PageIdentifier, const WebPreferencesStore&, WebCore::RegistrableDomain&&, PAL::SessionID);
void registerServiceWorkerClients();
#endif
Modified: trunk/Source/WebKit/WebProcess/WebProcess.messages.in (249800 => 249801)
--- trunk/Source/WebKit/WebProcess/WebProcess.messages.in 2019-09-12 07:50:18 UTC (rev 249800)
+++ trunk/Source/WebKit/WebProcess/WebProcess.messages.in 2019-09-12 08:18:15 UTC (rev 249801)
@@ -111,7 +111,7 @@
#endif
#if ENABLE(SERVICE_WORKER)
- EstablishWorkerContextConnectionToNetworkProcess(uint64_t pageGroupID, WebKit::WebPageProxyIdentifier webPageProxyID, WebCore::PageIdentifier pageID, struct WebKit::WebPreferencesStore store, PAL::SessionID initialSessionID)
+ EstablishWorkerContextConnectionToNetworkProcess(uint64_t pageGroupID, WebKit::WebPageProxyIdentifier webPageProxyID, WebCore::PageIdentifier pageID, struct WebKit::WebPreferencesStore store, WebCore::RegistrableDomain domain, PAL::SessionID initialSessionID)
RegisterServiceWorkerClients()
#endif