Diff
Modified: trunk/Source/WebCore/ChangeLog (286300 => 286301)
--- trunk/Source/WebCore/ChangeLog 2021-11-30 16:32:15 UTC (rev 286300)
+++ trunk/Source/WebCore/ChangeLog 2021-11-30 16:44:18 UTC (rev 286301)
@@ -1,5 +1,22 @@
2021-11-30 Youenn Fablet <[email protected]>
+ Migrate some WebSWClientConnection messages to async replies
+ https://bugs.webkit.org/show_bug.cgi?id=233627
+
+ Reviewed by Chris Dumez.
+
+ Migrate whenRegistrationReady to use a callback.
+ Use completion handler for whenRegistrationReady as AsyncReply uses CompletionHandler
+ and use optional to mark that the registration will never be resolved.
+ Covered by existing tests.
+
+ * workers/service/server/SWServer.cpp:
+ (WebCore::SWServer::Connection::whenRegistrationReady):
+ (WebCore::SWServer::Connection::resolveRegistrationReadyRequests):
+ * workers/service/server/SWServer.h:
+
+2021-11-30 Youenn Fablet <[email protected]>
+
Move TransformStreamAPIEnabled flag to Settings
https://bugs.webkit.org/show_bug.cgi?id=233524
Modified: trunk/Source/WebCore/workers/service/server/SWServer.cpp (286300 => 286301)
--- trunk/Source/WebCore/workers/service/server/SWServer.cpp 2021-11-30 16:32:15 UTC (rev 286300)
+++ trunk/Source/WebCore/workers/service/server/SWServer.cpp 2021-11-30 16:44:18 UTC (rev 286301)
@@ -57,6 +57,12 @@
{
}
+SWServer::Connection::~Connection()
+{
+ for (auto& request : std::exchange(m_registrationReadyRequests, { }))
+ request.callback({ });
+}
+
HashSet<SWServer*>& SWServer::allServers()
{
static NeverDestroyed<HashSet<SWServer*>> servers;
@@ -1058,15 +1064,15 @@
connection->resolveRegistrationReadyRequests(registration);
}
-void SWServer::Connection::whenRegistrationReady(uint64_t registrationReadyRequestIdentifier, const SecurityOriginData& topOrigin, const URL& clientURL)
+void SWServer::Connection::whenRegistrationReady(const SecurityOriginData& topOrigin, const URL& clientURL, CompletionHandler<void(std::optional<ServiceWorkerRegistrationData>&&)>&& callback)
{
if (auto* registration = doRegistrationMatching(topOrigin, clientURL)) {
if (registration->activeWorker()) {
- registrationReady(registrationReadyRequestIdentifier, registration->data());
+ callback(registration->data());
return;
}
}
- m_registrationReadyRequests.append({ topOrigin, clientURL, registrationReadyRequestIdentifier });
+ m_registrationReadyRequests.append({ topOrigin, clientURL, WTFMove(callback) });
}
void SWServer::Connection::storeRegistrationsOnDisk(CompletionHandler<void()>&& callback)
@@ -1084,7 +1090,7 @@
if (!registration.key().isMatching(request.topOrigin, request.clientURL))
return false;
- this->registrationReady(request.identifier, registration.data());
+ request.callback(registration.data());
return true;
});
}
Modified: trunk/Source/WebCore/workers/service/server/SWServer.h (286300 => 286301)
--- trunk/Source/WebCore/workers/service/server/SWServer.h 2021-11-30 16:32:15 UTC (rev 286300)
+++ trunk/Source/WebCore/workers/service/server/SWServer.h 2021-11-30 16:44:18 UTC (rev 286301)
@@ -74,7 +74,7 @@
WTF_MAKE_FAST_ALLOCATED;
friend class SWServer;
public:
- virtual ~Connection() = default;
+ WEBCORE_EXPORT virtual ~Connection();
using Identifier = SWServerConnectionIdentifier;
Identifier identifier() const { return m_identifier; }
@@ -90,7 +90,6 @@
virtual void setRegistrationLastUpdateTime(ServiceWorkerRegistrationIdentifier, WallTime) = 0;
virtual void setRegistrationUpdateViaCache(ServiceWorkerRegistrationIdentifier, ServiceWorkerUpdateViaCache) = 0;
virtual void notifyClientsOfControllerChange(const HashSet<ScriptExecutionContextIdentifier>& contextIdentifiers, const ServiceWorkerData& newController) = 0;
- virtual void registrationReady(uint64_t registrationReadyRequestIdentifier, ServiceWorkerRegistrationData&&) = 0;
virtual void postMessageToServiceWorkerClient(ScriptExecutionContextIdentifier, const MessageWithMessagePorts&, ServiceWorkerIdentifier, const String& sourceOrigin) = 0;
virtual void contextConnectionCreated(SWServerToContextConnection&) = 0;
@@ -104,7 +103,7 @@
WEBCORE_EXPORT void finishFetchingScriptInServer(const ServiceWorkerFetchResult&);
WEBCORE_EXPORT void addServiceWorkerRegistrationInServer(ServiceWorkerRegistrationIdentifier);
WEBCORE_EXPORT void removeServiceWorkerRegistrationInServer(ServiceWorkerRegistrationIdentifier);
- WEBCORE_EXPORT void whenRegistrationReady(uint64_t registrationReadyRequestIdentifier, const SecurityOriginData& topOrigin, const URL& clientURL);
+ WEBCORE_EXPORT void whenRegistrationReady(const SecurityOriginData& topOrigin, const URL& clientURL, CompletionHandler<void(std::optional<ServiceWorkerRegistrationData>&&)>&&);
WEBCORE_EXPORT void storeRegistrationsOnDisk(CompletionHandler<void()>&&);
@@ -118,7 +117,7 @@
struct RegistrationReadyRequest {
SecurityOriginData topOrigin;
URL clientURL;
- uint64_t identifier;
+ CompletionHandler<void(std::optional<ServiceWorkerRegistrationData>&&)> callback;
};
SWServer& m_server;
Modified: trunk/Source/WebKit/ChangeLog (286300 => 286301)
--- trunk/Source/WebKit/ChangeLog 2021-11-30 16:32:15 UTC (rev 286300)
+++ trunk/Source/WebKit/ChangeLog 2021-11-30 16:44:18 UTC (rev 286301)
@@ -1,5 +1,31 @@
2021-11-30 Youenn Fablet <[email protected]>
+ Migrate some WebSWClientConnection messages to async replies
+ https://bugs.webkit.org/show_bug.cgi?id=233627
+
+ Reviewed by Chris Dumez.
+
+ Migrate didMatchRegistration, didGetRegistrations and registrationReady to async replies.
+ This is easier to understand and is more robust to connection closure.
+
+ * NetworkProcess/ServiceWorker/WebSWServerConnection.cpp:
+ (WebKit::WebSWServerConnection::matchRegistration):
+ (WebKit::WebSWServerConnection::getRegistrations):
+ * NetworkProcess/ServiceWorker/WebSWServerConnection.h:
+ * NetworkProcess/ServiceWorker/WebSWServerConnection.messages.in:
+ * WebProcess/Storage/WebSWClientConnection.cpp:
+ (WebKit::WebSWClientConnection::matchRegistration):
+ (WebKit::WebSWClientConnection::whenRegistrationReady):
+ (WebKit::WebSWClientConnection::getRegistrations):
+ (WebKit::WebSWClientConnection::clear):
+ (WebKit::WebSWClientConnection::didMatchRegistration): Deleted.
+ (WebKit::WebSWClientConnection::didGetRegistrations): Deleted.
+ (WebKit::WebSWClientConnection::registrationReady): Deleted.
+ * WebProcess/Storage/WebSWClientConnection.h:
+ * WebProcess/Storage/WebSWClientConnection.messages.in:
+
+2021-11-30 Youenn Fablet <[email protected]>
+
ServiceWorkerContainer does not respond well to network process crash
https://bugs.webkit.org/show_bug.cgi?id=233626
Modified: trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.cpp (286300 => 286301)
--- trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.cpp 2021-11-30 16:32:15 UTC (rev 286300)
+++ trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.cpp 2021-11-30 16:44:18 UTC (rev 286301)
@@ -337,26 +337,20 @@
send(Messages::WebSWClientConnection::PostMessageToServiceWorkerClient { destinationContextIdentifier, message, sourceServiceWorker->data(), sourceOrigin });
}
-void WebSWServerConnection::matchRegistration(uint64_t registrationMatchRequestIdentifier, const SecurityOriginData& topOrigin, const URL& clientURL)
+void WebSWServerConnection::matchRegistration(const SecurityOriginData& topOrigin, const URL& clientURL, CompletionHandler<void(std::optional<ServiceWorkerRegistrationData>&&)>&& callback)
{
if (auto* registration = doRegistrationMatching(topOrigin, clientURL)) {
- send(Messages::WebSWClientConnection::DidMatchRegistration { registrationMatchRequestIdentifier, registration->data() });
+ callback(registration->data());
return;
}
- send(Messages::WebSWClientConnection::DidMatchRegistration { registrationMatchRequestIdentifier, std::nullopt });
+ callback({ });
}
-void WebSWServerConnection::registrationReady(uint64_t registrationReadyRequestIdentifier, ServiceWorkerRegistrationData&& registrationData)
+void WebSWServerConnection::getRegistrations(const SecurityOriginData& topOrigin, const URL& clientURL, CompletionHandler<void(const Vector<ServiceWorkerRegistrationData>&)>&& callback)
{
- send(Messages::WebSWClientConnection::RegistrationReady { registrationReadyRequestIdentifier, WTFMove(registrationData) });
+ callback(server().getRegistrations(topOrigin, clientURL));
}
-void WebSWServerConnection::getRegistrations(uint64_t registrationMatchRequestIdentifier, const SecurityOriginData& topOrigin, const URL& clientURL)
-{
- auto registrations = server().getRegistrations(topOrigin, clientURL);
- send(Messages::WebSWClientConnection::DidGetRegistrations { registrationMatchRequestIdentifier, registrations });
-}
-
void WebSWServerConnection::registerServiceWorkerClient(SecurityOriginData&& topOrigin, ServiceWorkerClientData&& data, const std::optional<ServiceWorkerRegistrationIdentifier>& controllingServiceWorkerRegistrationIdentifier, String&& userAgent)
{
auto contextOrigin = SecurityOriginData::fromURL(data.url);
Modified: trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.h (286300 => 286301)
--- trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.h 2021-11-30 16:32:15 UTC (rev 286300)
+++ trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.h 2021-11-30 16:44:18 UTC (rev 286301)
@@ -94,7 +94,6 @@
void setRegistrationLastUpdateTime(WebCore::ServiceWorkerRegistrationIdentifier, WallTime) final;
void setRegistrationUpdateViaCache(WebCore::ServiceWorkerRegistrationIdentifier, WebCore::ServiceWorkerUpdateViaCache) final;
void notifyClientsOfControllerChange(const HashSet<WebCore::ScriptExecutionContextIdentifier>& contextIdentifiers, const WebCore::ServiceWorkerData& newController);
- void registrationReady(uint64_t registrationReadyRequestIdentifier, WebCore::ServiceWorkerRegistrationData&&) final;
void scheduleJobInServer(WebCore::ServiceWorkerJobData&&);
@@ -103,8 +102,8 @@
void startFetch(ServiceWorkerFetchTask&, WebCore::SWServerWorker&);
- void matchRegistration(uint64_t registrationMatchRequestIdentifier, const WebCore::SecurityOriginData& topOrigin, const URL& clientURL);
- void getRegistrations(uint64_t registrationMatchRequestIdentifier, const WebCore::SecurityOriginData& topOrigin, const URL& clientURL);
+ void matchRegistration(const WebCore::SecurityOriginData& topOrigin, const URL& clientURL, CompletionHandler<void(std::optional<WebCore::ServiceWorkerRegistrationData>&&)>&&);
+ void getRegistrations(const WebCore::SecurityOriginData& topOrigin, const URL& clientURL, CompletionHandler<void(const Vector<WebCore::ServiceWorkerRegistrationData>&)>&&);
void registerServiceWorkerClient(WebCore::SecurityOriginData&& topOrigin, WebCore::ServiceWorkerClientData&&, const std::optional<WebCore::ServiceWorkerRegistrationIdentifier>&, String&& userAgent);
void unregisterServiceWorkerClient(const WebCore::ScriptExecutionContextIdentifier&);
Modified: trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.messages.in (286300 => 286301)
--- trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.messages.in 2021-11-30 16:32:15 UTC (rev 286300)
+++ trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.messages.in 2021-11-30 16:44:18 UTC (rev 286301)
@@ -1,4 +1,4 @@
-# Copyright (C) 2017 Apple Inc. All rights reserved.
+# Copyright (C) 2017-2021 Apple Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -35,9 +35,9 @@
DidResolveRegistrationPromise(WebCore::ServiceWorkerRegistrationKey key)
- MatchRegistration(uint64_t serviceRegistrationMatchRequestIdentifier, struct WebCore::SecurityOriginData topOrigin, URL clientURL)
- WhenRegistrationReady(uint64_t serviceRegistrationMatchRequestIdentifier, struct WebCore::SecurityOriginData topOrigin, URL clientURL)
- GetRegistrations(uint64_t serviceRegistrationMatchRequestIdentifier, struct WebCore::SecurityOriginData topOrigin, URL clientURL)
+ MatchRegistration(struct WebCore::SecurityOriginData topOrigin, URL clientURL) -> (std::optional<WebCore::ServiceWorkerRegistrationData> registration) Async
+ WhenRegistrationReady(struct WebCore::SecurityOriginData topOrigin, URL clientURL) -> (std::optional<WebCore::ServiceWorkerRegistrationData> registration) Async
+ GetRegistrations(struct WebCore::SecurityOriginData topOrigin, URL clientURL) -> (Vector<WebCore::ServiceWorkerRegistrationData> registrations) Async
RegisterServiceWorkerClient(struct WebCore::SecurityOriginData topOrigin, struct WebCore::ServiceWorkerClientData data, std::optional<WebCore::ServiceWorkerRegistrationIdentifier> controllingServiceWorkerRegistrationIdentifier, String userAgent)
UnregisterServiceWorkerClient(WebCore::ScriptExecutionContextIdentifier identifier)
Modified: trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.cpp (286300 => 286301)
--- trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.cpp 2021-11-30 16:32:15 UTC (rev 286300)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.cpp 2021-11-30 16:44:18 UTC (rev 286301)
@@ -145,22 +145,6 @@
m_tasksPendingOriginImport.takeFirst()();
}
-void WebSWClientConnection::didMatchRegistration(uint64_t matchingRequest, std::optional<ServiceWorkerRegistrationData>&& result)
-{
- ASSERT(isMainRunLoop());
-
- if (auto completionHandler = m_ongoingMatchRegistrationTasks.take(matchingRequest))
- completionHandler(WTFMove(result));
-}
-
-void WebSWClientConnection::didGetRegistrations(uint64_t matchingRequest, Vector<ServiceWorkerRegistrationData>&& registrations)
-{
- ASSERT(isMainRunLoop());
-
- if (auto completionHandler = m_ongoingGetRegistrationsTasks.take(matchingRequest))
- completionHandler(WTFMove(registrations));
-}
-
void WebSWClientConnection::matchRegistration(SecurityOriginData&& topOrigin, const URL& clientURL, RegistrationCallback&& callback)
{
ASSERT(isMainRunLoop());
@@ -171,9 +155,7 @@
}
runOrDelayTaskForImport([this, callback = WTFMove(callback), topOrigin = WTFMove(topOrigin), clientURL]() mutable {
- uint64_t callbackID = ++m_previousCallbackIdentifier;
- m_ongoingMatchRegistrationTasks.add(callbackID, WTFMove(callback));
- send(Messages::WebSWServerConnection::MatchRegistration(callbackID, topOrigin, clientURL));
+ sendWithAsyncReply(Messages::WebSWServerConnection::MatchRegistration { topOrigin, clientURL }, WTFMove(callback));
});
}
@@ -188,18 +170,12 @@
void WebSWClientConnection::whenRegistrationReady(const SecurityOriginData& topOrigin, const URL& clientURL, WhenRegistrationReadyCallback&& callback)
{
- uint64_t callbackID = ++m_previousCallbackIdentifier;
- m_ongoingRegistrationReadyTasks.add(callbackID, WTFMove(callback));
- send(Messages::WebSWServerConnection::WhenRegistrationReady(callbackID, topOrigin, clientURL));
+ sendWithAsyncReply(Messages::WebSWServerConnection::WhenRegistrationReady { topOrigin, clientURL }, [callback = WTFMove(callback)](auto result) mutable {
+ if (result)
+ callback(*WTFMove(result));
+ });
}
-void WebSWClientConnection::registrationReady(uint64_t callbackID, ServiceWorkerRegistrationData&& registrationData)
-{
- ASSERT(registrationData.activeWorker);
- if (auto callback = m_ongoingRegistrationReadyTasks.take(callbackID))
- callback(WTFMove(registrationData));
-}
-
void WebSWClientConnection::setDocumentIsControlled(ScriptExecutionContextIdentifier documentIdentifier, ServiceWorkerRegistrationData&& data, CompletionHandler<void(bool)>&& completionHandler)
{
auto* documentLoader = DocumentLoader::fromTemporaryDocumentIdentifier(documentIdentifier);
@@ -217,9 +193,7 @@
}
runOrDelayTaskForImport([this, callback = WTFMove(callback), topOrigin = WTFMove(topOrigin), clientURL]() mutable {
- uint64_t callbackID = ++m_previousCallbackIdentifier;
- m_ongoingGetRegistrationsTasks.add(callbackID, WTFMove(callback));
- send(Messages::WebSWServerConnection::GetRegistrations { callbackID, topOrigin, clientURL });
+ sendWithAsyncReply(Messages::WebSWServerConnection::GetRegistrations { topOrigin, clientURL }, WTFMove(callback));
});
}
@@ -231,16 +205,6 @@
void WebSWClientConnection::clear()
{
- auto registrationTasks = WTFMove(m_ongoingMatchRegistrationTasks);
- for (auto& callback : registrationTasks.values())
- callback(std::nullopt);
-
- auto getRegistrationTasks = WTFMove(m_ongoingGetRegistrationsTasks);
- for (auto& callback : getRegistrationTasks.values())
- callback({ });
-
- m_ongoingRegistrationReadyTasks.clear();
-
clearPendingJobs();
}
Modified: trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.h (286300 => 286301)
--- trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.h 2021-11-30 16:32:15 UTC (rev 286300)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.h 2021-11-30 16:44:18 UTC (rev 286301)
@@ -81,7 +81,6 @@
void didMatchRegistration(uint64_t matchRequestIdentifier, std::optional<WebCore::ServiceWorkerRegistrationData>&&);
void didGetRegistrations(uint64_t matchRequestIdentifier, Vector<WebCore::ServiceWorkerRegistrationData>&&);
void whenRegistrationReady(const WebCore::SecurityOriginData& topOrigin, const URL& clientURL, WhenRegistrationReadyCallback&&) final;
- void registrationReady(uint64_t callbackID, WebCore::ServiceWorkerRegistrationData&&);
void setDocumentIsControlled(WebCore::ScriptExecutionContextIdentifier, WebCore::ServiceWorkerRegistrationData&&, CompletionHandler<void(bool)>&&);
@@ -112,10 +111,6 @@
UniqueRef<WebSWOriginTable> m_swOriginTable;
- uint64_t m_previousCallbackIdentifier { 0 };
- HashMap<uint64_t, RegistrationCallback> m_ongoingMatchRegistrationTasks;
- HashMap<uint64_t, GetRegistrationsCallback> m_ongoingGetRegistrationsTasks;
- HashMap<uint64_t, WhenRegistrationReadyCallback> m_ongoingRegistrationReadyTasks;
Deque<Function<void()>> m_tasksPendingOriginImport;
bool m_isThrottleable { true };
}; // class WebSWServerConnection
Modified: trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.messages.in (286300 => 286301)
--- trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.messages.in 2021-11-30 16:32:15 UTC (rev 286300)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.messages.in 2021-11-30 16:44:18 UTC (rev 286301)
@@ -38,10 +38,6 @@
SetSWOriginTableSharedMemory(WebKit::SharedMemory::IPCHandle handle)
PostMessageToServiceWorkerClient(WebCore::ScriptExecutionContextIdentifier destinationContextIdentifier, struct WebCore::MessageWithMessagePorts message, struct WebCore::ServiceWorkerData source, String sourceOrigin)
- DidMatchRegistration(uint64_t matchRequestIdentifier, std::optional<WebCore::ServiceWorkerRegistrationData> data)
- DidGetRegistrations(uint64_t matchRequestIdentifier, Vector<WebCore::ServiceWorkerRegistrationData> registrations)
- RegistrationReady(uint64_t registrationReadyRequestIdentifier, struct WebCore::ServiceWorkerRegistrationData data)
-
SetDocumentIsControlled(WebCore::ScriptExecutionContextIdentifier temporaryDocumentIdentifier, struct WebCore::ServiceWorkerRegistrationData data) -> (bool isSuccess) Async
}