Diff
Modified: trunk/Source/WebKit/ChangeLog (254705 => 254706)
--- trunk/Source/WebKit/ChangeLog 2020-01-16 21:31:59 UTC (rev 254705)
+++ trunk/Source/WebKit/ChangeLog 2020-01-16 21:45:50 UTC (rev 254706)
@@ -1,3 +1,19 @@
+2020-01-16 Alex Christensen <[email protected]>
+
+ Add finite timeout when synchronously terminating a service worker
+ https://bugs.webkit.org/show_bug.cgi?id=206325
+ <rdar://problem/58183380>
+
+ Reviewed by Youenn Fablet.
+
+ When this message reply is never received, it hangs everything.
+ If we haven't received verification that a service worker was terminated in 10 seconds, unhang everything
+ and tell the UI process to terminate the hanging service worker process. Continue handling messages during
+ these 10 seconds to hopefully turn a bad hang into no perceptible hang.
+
+ * NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp:
+ (WebKit::WebSWServerToContextConnection::syncTerminateWorker):
+
2020-01-16 Brady Eidson <[email protected]>
Make the callAsyncJavaScriptFunction function actually be async (so await works).
Modified: trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp (254705 => 254706)
--- trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp 2020-01-16 21:31:59 UTC (rev 254705)
+++ trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp 2020-01-16 21:45:50 UTC (rev 254706)
@@ -32,6 +32,7 @@
#include "Logging.h"
#include "NetworkConnectionToWebProcess.h"
#include "NetworkProcess.h"
+#include "NetworkProcessProxyMessages.h"
#include "ServiceWorkerFetchTask.h"
#include "ServiceWorkerFetchTaskMessages.h"
#include "WebCoreArgumentCoders.h"
@@ -107,7 +108,8 @@
void WebSWServerToContextConnection::syncTerminateWorker(ServiceWorkerIdentifier serviceWorkerIdentifier)
{
- sendSync(Messages::WebSWContextManagerConnection::SyncTerminateWorker(serviceWorkerIdentifier), Messages::WebSWContextManagerConnection::SyncTerminateWorker::Reply());
+ if (!sendSync(Messages::WebSWContextManagerConnection::SyncTerminateWorker(serviceWorkerIdentifier), Messages::WebSWContextManagerConnection::SyncTerminateWorker::Reply(), 0, 10_s, IPC::SendSyncOption::ForceDispatchWhenDestinationIsWaitingForUnboundedSyncReply))
+ m_connection.networkProcess().parentProcessConnection()->send(Messages::NetworkProcessProxy::TerminateUnresponsiveServiceWorkerProcesses(registrableDomain(), m_connection.sessionID()), 0);
}
void WebSWServerToContextConnection::findClientByIdentifierCompleted(uint64_t requestIdentifier, const Optional<ServiceWorkerClientData>& data, bool hasSecurityError)
Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp (254705 => 254706)
--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp 2020-01-16 21:31:59 UTC (rev 254705)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp 2020-01-16 21:45:50 UTC (rev 254706)
@@ -425,6 +425,12 @@
page->logDiagnosticMessage(message, description, shouldSample);
}
+void NetworkProcessProxy::terminateUnresponsiveServiceWorkerProcesses(WebCore::RegistrableDomain&& domain, PAL::SessionID sessionID)
+{
+ for (auto* processPool : WebProcessPool::allProcessPools())
+ processPool->terminateServiceWorkerProcess(domain, sessionID);
+}
+
void NetworkProcessProxy::logDiagnosticMessageWithResult(WebPageProxyIdentifier pageID, const String& message, const String& description, uint32_t result, WebCore::ShouldSample shouldSample)
{
WebPageProxy* page = WebProcessProxy::webPage(pageID);
Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h (254705 => 254706)
--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h 2020-01-16 21:31:59 UTC (rev 254705)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h 2020-01-16 21:45:50 UTC (rev 254706)
@@ -174,6 +174,7 @@
void didSyncAllCookies();
void testProcessIncomingSyncMessagesWhenWaitingForSyncReply(WebPageProxyIdentifier, Messages::NetworkProcessProxy::TestProcessIncomingSyncMessagesWhenWaitingForSyncReplyDelayedReply&&);
+ void terminateUnresponsiveServiceWorkerProcesses(WebCore::RegistrableDomain&&, PAL::SessionID);
ProcessThrottler& throttler() { return m_throttler; }
void updateProcessAssertion();
Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.messages.in (254705 => 254706)
--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.messages.in 2020-01-16 21:31:59 UTC (rev 254705)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.messages.in 2020-01-16 21:45:50 UTC (rev 254706)
@@ -30,6 +30,7 @@
DidSyncAllCookies()
TestProcessIncomingSyncMessagesWhenWaitingForSyncReply(WebKit::WebPageProxyIdentifier pageID) -> (bool handled) Synchronous
+ TerminateUnresponsiveServiceWorkerProcesses(WebCore::RegistrableDomain domain, PAL::SessionID sessionId)
SetIsHoldingLockedFiles(bool isHoldingLockedFiles)
Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.cpp (254705 => 254706)
--- trunk/Source/WebKit/UIProcess/WebProcessPool.cpp 2020-01-16 21:31:59 UTC (rev 254705)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.cpp 2020-01-16 21:45:50 UTC (rev 254706)
@@ -1783,6 +1783,17 @@
#endif
}
+void WebProcessPool::terminateServiceWorkerProcess(const WebCore::RegistrableDomain& domain, const PAL::SessionID& sessionID)
+{
+#if ENABLE(SERVICE_WORKER)
+ auto protectedThis = makeRef(*this);
+ if (auto process = m_serviceWorkerProcesses.get({ domain, sessionID })) {
+ process->disableServiceWorkers();
+ process->requestTermination(ProcessTerminationReason::ExceededCPULimit);
+ }
+#endif
+}
+
void WebProcessPool::syncNetworkProcessCookies()
{
ensureNetworkProcess().syncAllCookies();
Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.h (254705 => 254706)
--- trunk/Source/WebKit/UIProcess/WebProcessPool.h 2020-01-16 21:31:59 UTC (rev 254705)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.h 2020-01-16 21:45:50 UTC (rev 254706)
@@ -326,6 +326,7 @@
void sendNetworkProcessWillSuspendImminentlyForTesting();
void sendNetworkProcessDidResume();
void terminateServiceWorkers();
+ void terminateServiceWorkerProcess(const WebCore::RegistrableDomain&, const PAL::SessionID&);
void syncNetworkProcessCookies();
void syncLocalStorage(CompletionHandler<void()>&& callback);