Diff
Modified: branches/safari-609-branch/Source/WebKit/ChangeLog (255019 => 255020)
--- branches/safari-609-branch/Source/WebKit/ChangeLog 2020-01-23 21:44:04 UTC (rev 255019)
+++ branches/safari-609-branch/Source/WebKit/ChangeLog 2020-01-23 21:44:07 UTC (rev 255020)
@@ -1,5 +1,42 @@
2020-01-23 Russell Epstein <[email protected]>
+ Cherry-pick r254706. rdar://problem/58811361
+
+ Add finite timeout when synchronously terminating a service worker
+ https://bugs.webkit.org/show_bug.cgi?id=206325
+ <rdar://problem/58183380>
+
+ Patch by Alex Christensen <[email protected]> on 2020-01-16
+ 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):
+
+ git-svn-id: https://svn.webkit.org/repository/webkit/trunk@254706 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+ 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-23 Russell Epstein <[email protected]>
+
Cherry-pick r254552. rdar://problem/58812968
REGRESSION (r253394): After swiping back during a navigation, WKWebView gets stuck with the forward content, stops repainting
Modified: branches/safari-609-branch/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp (255019 => 255020)
--- branches/safari-609-branch/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp 2020-01-23 21:44:04 UTC (rev 255019)
+++ branches/safari-609-branch/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp 2020-01-23 21:44:07 UTC (rev 255020)
@@ -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: branches/safari-609-branch/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp (255019 => 255020)
--- branches/safari-609-branch/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp 2020-01-23 21:44:04 UTC (rev 255019)
+++ branches/safari-609-branch/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp 2020-01-23 21:44:07 UTC (rev 255020)
@@ -424,6 +424,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: branches/safari-609-branch/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h (255019 => 255020)
--- branches/safari-609-branch/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h 2020-01-23 21:44:04 UTC (rev 255019)
+++ branches/safari-609-branch/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h 2020-01-23 21:44:07 UTC (rev 255020)
@@ -171,6 +171,7 @@
void didSyncAllCookies();
void testProcessIncomingSyncMessagesWhenWaitingForSyncReply(WebPageProxyIdentifier, Messages::NetworkProcessProxy::TestProcessIncomingSyncMessagesWhenWaitingForSyncReplyDelayedReply&&);
+ void terminateUnresponsiveServiceWorkerProcesses(WebCore::RegistrableDomain&&, PAL::SessionID);
ProcessThrottler& throttler() { return m_throttler; }
void updateProcessAssertion();
Modified: branches/safari-609-branch/Source/WebKit/UIProcess/Network/NetworkProcessProxy.messages.in (255019 => 255020)
--- branches/safari-609-branch/Source/WebKit/UIProcess/Network/NetworkProcessProxy.messages.in 2020-01-23 21:44:04 UTC (rev 255019)
+++ branches/safari-609-branch/Source/WebKit/UIProcess/Network/NetworkProcessProxy.messages.in 2020-01-23 21:44:07 UTC (rev 255020)
@@ -30,6 +30,7 @@
DidSyncAllCookies()
TestProcessIncomingSyncMessagesWhenWaitingForSyncReply(WebKit::WebPageProxyIdentifier pageID) -> (bool handled) Synchronous
+ TerminateUnresponsiveServiceWorkerProcesses(WebCore::RegistrableDomain domain, PAL::SessionID sessionId)
SetIsHoldingLockedFiles(bool isHoldingLockedFiles)
Modified: branches/safari-609-branch/Source/WebKit/UIProcess/WebProcessPool.cpp (255019 => 255020)
--- branches/safari-609-branch/Source/WebKit/UIProcess/WebProcessPool.cpp 2020-01-23 21:44:04 UTC (rev 255019)
+++ branches/safari-609-branch/Source/WebKit/UIProcess/WebProcessPool.cpp 2020-01-23 21:44:07 UTC (rev 255020)
@@ -1779,6 +1779,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: branches/safari-609-branch/Source/WebKit/UIProcess/WebProcessPool.h (255019 => 255020)
--- branches/safari-609-branch/Source/WebKit/UIProcess/WebProcessPool.h 2020-01-23 21:44:04 UTC (rev 255019)
+++ branches/safari-609-branch/Source/WebKit/UIProcess/WebProcessPool.h 2020-01-23 21:44:07 UTC (rev 255020)
@@ -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);