Diff
Modified: trunk/Source/WebCore/ChangeLog (244096 => 244097)
--- trunk/Source/WebCore/ChangeLog 2019-04-09 21:45:03 UTC (rev 244096)
+++ trunk/Source/WebCore/ChangeLog 2019-04-09 23:37:17 UTC (rev 244097)
@@ -1,3 +1,32 @@
+2019-04-09 Youenn Fablet <[email protected]>
+
+ Close service worker database on network process suspension
+ https://bugs.webkit.org/show_bug.cgi?id=196623
+ <rdar://problem/48930869>
+
+ Reviewed by Alex Christensen.
+
+ Add suspend/resume support to SWServer.
+ On suspend, close the service worker database and stop pushing for changes.
+ On resume, push changes if needed.
+
+ * workers/service/server/RegistrationDatabase.cpp:
+ (WebCore::RegistrationDatabase::close):
+ * workers/service/server/RegistrationDatabase.h:
+ (WebCore::RegistrationDatabase::isClosed const): Deleted.
+ * workers/service/server/RegistrationStore.cpp:
+ (WebCore::RegistrationStore::closeDatabase):
+ * workers/service/server/RegistrationStore.cpp:
+ (WebCore::RegistrationStore::pushChangesToDatabase):
+ (WebCore::RegistrationStore::clearAll):
+ (WebCore::RegistrationStore::startSuspension):
+ (WebCore::RegistrationStore::endSuspension):
+ * workers/service/server/RegistrationStore.h:
+ * workers/service/server/SWServer.cpp:
+ (WebCore::SWServer::startSuspension):
+ (WebCore::SWServer::endSuspension):
+ * workers/service/server/SWServer.h:
+
2019-04-09 Justin Fan <[email protected]>
[Web GPU] GPURenderPassEncoder updates: setBlendColor, setViewport, setScissorRect
Modified: trunk/Source/WebCore/workers/service/server/RegistrationDatabase.cpp (244096 => 244097)
--- trunk/Source/WebCore/workers/service/server/RegistrationDatabase.cpp 2019-04-09 21:45:03 UTC (rev 244096)
+++ trunk/Source/WebCore/workers/service/server/RegistrationDatabase.cpp 2019-04-09 23:37:17 UTC (rev 244097)
@@ -118,6 +118,8 @@
void RegistrationDatabase::postTaskToWorkQueue(Function<void()>&& task)
{
+ ASSERT(isMainThread());
+
m_workQueue->dispatch([protectedThis = makeRef(*this), task = WTFMove(task)]() mutable {
task();
});
@@ -283,6 +285,14 @@
});
}
+void RegistrationDatabase::close(CompletionHandler<void()>&& completionHandler)
+{
+ postTaskToWorkQueue([this, completionHandler = WTFMove(completionHandler)]() mutable {
+ m_database = nullptr;
+ callOnMainThread(WTFMove(completionHandler));
+ });
+}
+
void RegistrationDatabase::clearAll(CompletionHandler<void()>&& completionHandler)
{
postTaskToWorkQueue([this, completionHandler = WTFMove(completionHandler)]() mutable {
Modified: trunk/Source/WebCore/workers/service/server/RegistrationDatabase.h (244096 => 244097)
--- trunk/Source/WebCore/workers/service/server/RegistrationDatabase.h 2019-04-09 21:45:03 UTC (rev 244096)
+++ trunk/Source/WebCore/workers/service/server/RegistrationDatabase.h 2019-04-09 23:37:17 UTC (rev 244097)
@@ -52,10 +52,10 @@
~RegistrationDatabase();
- bool isClosed() const { return !m_database; }
void pushChanges(Vector<ServiceWorkerContextData>&&, CompletionHandler<void()>&&);
void clearAll(CompletionHandler<void()>&&);
+ void close(CompletionHandler<void()>&&);
private:
RegistrationDatabase(RegistrationStore&, String&& databaseDirectory);
Modified: trunk/Source/WebCore/workers/service/server/RegistrationStore.cpp (244096 => 244097)
--- trunk/Source/WebCore/workers/service/server/RegistrationStore.cpp 2019-04-09 21:45:03 UTC (rev 244096)
+++ trunk/Source/WebCore/workers/service/server/RegistrationStore.cpp 2019-04-09 23:37:17 UTC (rev 244097)
@@ -52,6 +52,11 @@
void RegistrationStore::pushChangesToDatabase(WTF::CompletionHandler<void()>&& completionHandler)
{
+ if (m_isSuspended) {
+ m_needsPushingChanges = true;
+ return;
+ }
+
Vector<ServiceWorkerContextData> changesToPush;
changesToPush.reserveInitialCapacity(m_updatedRegistrations.size());
for (auto& value : m_updatedRegistrations.values())
@@ -63,6 +68,7 @@
void RegistrationStore::clearAll(WTF::CompletionHandler<void()>&& completionHandler)
{
+ m_needsPushingChanges = false;
m_updatedRegistrations.clear();
m_databasePushTimer.stop();
m_database->clearAll(WTFMove(completionHandler));
@@ -78,6 +84,19 @@
completionHandler();
}
+void RegistrationStore::startSuspension(WTF::CompletionHandler<void()>&& completionHandler)
+{
+ m_isSuspended = true;
+ m_database->close(WTFMove(completionHandler));
+}
+
+void RegistrationStore::endSuspension()
+{
+ m_isSuspended = false;
+ if (m_needsPushingChanges)
+ scheduleDatabasePushIfNecessary();
+}
+
void RegistrationStore::updateRegistration(const ServiceWorkerContextData& data)
{
m_updatedRegistrations.set(data.registration.key, data);
Modified: trunk/Source/WebCore/workers/service/server/RegistrationStore.h (244096 => 244097)
--- trunk/Source/WebCore/workers/service/server/RegistrationStore.h 2019-04-09 21:45:03 UTC (rev 244096)
+++ trunk/Source/WebCore/workers/service/server/RegistrationStore.h 2019-04-09 23:37:17 UTC (rev 244097)
@@ -51,6 +51,9 @@
void clearAll(WTF::CompletionHandler<void()>&&);
void flushChanges(WTF::CompletionHandler<void()>&&);
+ void startSuspension(WTF::CompletionHandler<void()>&&);
+ void endSuspension();
+
// Callbacks from the SWServer
void updateRegistration(const ServiceWorkerContextData&);
void removeRegistration(SWServerRegistration&);
@@ -72,6 +75,9 @@
HashMap<ServiceWorkerRegistrationKey, ServiceWorkerContextData> m_updatedRegistrations;
Timer m_databasePushTimer;
+
+ bool m_isSuspended { false };
+ bool m_needsPushingChanges { false };
};
} // namespace WebCore
Modified: trunk/Source/WebCore/workers/service/server/SWServer.cpp (244096 => 244097)
--- trunk/Source/WebCore/workers/service/server/SWServer.cpp 2019-04-09 21:45:03 UTC (rev 244096)
+++ trunk/Source/WebCore/workers/service/server/SWServer.cpp 2019-04-09 23:37:17 UTC (rev 244097)
@@ -210,6 +210,18 @@
m_registrationStore->clearAll(WTFMove(completionHandler));
}
+void SWServer::startSuspension(CompletionHandler<void()>&& completionHandler)
+{
+ if (m_registrationStore)
+ m_registrationStore->startSuspension(WTFMove(completionHandler));
+}
+
+void SWServer::endSuspension()
+{
+ if (m_registrationStore)
+ m_registrationStore->endSuspension();
+}
+
void SWServer::clear(const SecurityOriginData& securityOrigin, CompletionHandler<void()>&& completionHandler)
{
if (!m_importCompleted) {
Modified: trunk/Source/WebCore/workers/service/server/SWServer.h (244096 => 244097)
--- trunk/Source/WebCore/workers/service/server/SWServer.h 2019-04-09 21:45:03 UTC (rev 244096)
+++ trunk/Source/WebCore/workers/service/server/SWServer.h 2019-04-09 23:37:17 UTC (rev 244097)
@@ -122,6 +122,9 @@
WEBCORE_EXPORT void clearAll(WTF::CompletionHandler<void()>&&);
WEBCORE_EXPORT void clear(const SecurityOriginData&, WTF::CompletionHandler<void()>&&);
+ WEBCORE_EXPORT void startSuspension(CompletionHandler<void()>&&);
+ WEBCORE_EXPORT void endSuspension();
+
SWServerRegistration* getRegistration(const ServiceWorkerRegistrationKey&);
void addRegistration(std::unique_ptr<SWServerRegistration>&&);
void removeRegistration(const ServiceWorkerRegistrationKey&);
Modified: trunk/Source/WebKit/ChangeLog (244096 => 244097)
--- trunk/Source/WebKit/ChangeLog 2019-04-09 21:45:03 UTC (rev 244096)
+++ trunk/Source/WebKit/ChangeLog 2019-04-09 23:37:17 UTC (rev 244097)
@@ -1,3 +1,28 @@
+2019-04-09 Youenn Fablet <[email protected]>
+
+ Close service worker database on network process suspension
+ https://bugs.webkit.org/show_bug.cgi?id=196623
+ <rdar://problem/48930869>
+
+ Reviewed by Alex Christensen.
+
+ Close service worker database when preparing to suspend.
+ On resume, push changes if any is needed.
+
+ * NetworkProcess/NetworkProcess.cpp:
+ (WebKit::NetworkProcess::actualPrepareToSuspend):
+ (WebKit::NetworkProcess::cancelPrepareToSuspend):
+ (WebKit::NetworkProcess::processDidResume):
+ * UIProcess/API/Cocoa/WKProcessPool.mm:
+ (-[WKProcessPool _sendNetworkProcessWillSuspendImminently]):
+ (-[WKProcessPool _sendNetworkProcessDidResume]):
+ * UIProcess/API/Cocoa/WKProcessPoolPrivate.h:
+ * UIProcess/Network/NetworkProcessProxy.h:
+ * UIProcess/WebProcessPool.cpp:
+ (WebKit::WebProcessPool::sendNetworkProcessWillSuspendImminently):
+ (WebKit::WebProcessPool::sendNetworkProcessDidResume):
+ * UIProcess/WebProcessPool.h:
+
2019-04-09 Daniel Bates <[email protected]>
[iPad] Should open popover when the spacebar is pressed
Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp (244096 => 244097)
--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp 2019-04-09 21:45:03 UTC (rev 244096)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp 2019-04-09 23:37:17 UTC (rev 244097)
@@ -1983,6 +1983,9 @@
for (auto& connection : m_webProcessConnections)
connection->cleanupForSuspension([delayedTaskCounter] { });
+
+ for (auto& server : m_swServers.values())
+ server->startSuspension([delayedTaskCounter] { });
}
void NetworkProcess::processWillSuspendImminently(CompletionHandler<void(bool)>&& completionHandler)
@@ -2004,9 +2007,7 @@
// message. And NetworkProcessProxy expects to receive either a NetworkProcessProxy::ProcessReadyToSuspend-
// or NetworkProcessProxy::DidCancelProcessSuspension- message, but not both.
RELEASE_LOG(ProcessSuspension, "%p - NetworkProcess::cancelPrepareToSuspend()", this);
- platformProcessDidResume();
- for (auto& connection : m_webProcessConnections)
- connection->endSuspension();
+ resume();
}
void NetworkProcess::applicationDidEnterBackground()
@@ -2022,9 +2023,17 @@
void NetworkProcess::processDidResume()
{
RELEASE_LOG(ProcessSuspension, "%p - NetworkProcess::processDidResume()", this);
+ resume();
+}
+
+void NetworkProcess::resume()
+{
platformProcessDidResume();
for (auto& connection : m_webProcessConnections)
connection->endSuspension();
+
+ for (auto& server : m_swServers.values())
+ server->endSuspension();
}
void NetworkProcess::prefetchDNS(const String& hostname)
Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.h (244096 => 244097)
--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.h 2019-04-09 21:45:03 UTC (rev 244096)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.h 2019-04-09 23:37:17 UTC (rev 244097)
@@ -181,6 +181,7 @@
void prepareToSuspend();
void cancelPrepareToSuspend();
void processDidResume();
+ void resume();
// Diagnostic messages logging.
void logDiagnosticMessage(uint64_t webPageID, const String& message, const String& description, WebCore::ShouldSample);
Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKProcessPool.mm (244096 => 244097)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKProcessPool.mm 2019-04-09 21:45:03 UTC (rev 244096)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKProcessPool.mm 2019-04-09 23:37:17 UTC (rev 244097)
@@ -425,6 +425,16 @@
_processPool->terminateNetworkProcess();
}
+- (void)_sendNetworkProcessWillSuspendImminently
+{
+ _processPool->sendNetworkProcessWillSuspendImminently();
+}
+
+- (void)_sendNetworkProcessDidResume
+{
+ _processPool->sendNetworkProcessDidResume();
+}
+
- (void)_terminateServiceWorkerProcesses
{
_processPool->terminateServiceWorkerProcesses();
Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKProcessPoolPrivate.h (244096 => 244097)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKProcessPoolPrivate.h 2019-04-09 21:45:03 UTC (rev 244096)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKProcessPoolPrivate.h 2019-04-09 23:37:17 UTC (rev 244097)
@@ -83,7 +83,9 @@
- (_WKDownload *)_resumeDownloadFromData:(NSData *)resumeData path:(NSString *)path originatingWebView:(WKWebView *)webView WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
// Test only. Should be called only while no web content processes are running.
-- (void)_terminateNetworkProcess;
+- (void)_terminateNetworkProcess WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
+- (void)_sendNetworkProcessWillSuspendImminently WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
+- (void)_sendNetworkProcessDidResume WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
- (void)_terminateServiceWorkerProcesses WK_API_AVAILABLE(macos(10.14), ios(12.0));
- (void)_disableServiceWorkerProcessTerminationDelay WK_API_AVAILABLE(macos(10.14), ios(12.0));
Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h (244096 => 244097)
--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h 2019-04-09 21:45:03 UTC (rev 244096)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h 2019-04-09 23:37:17 UTC (rev 244097)
@@ -183,6 +183,10 @@
void createSymLinkForFileUpgrade(const String& indexedDatabaseDirectory);
#endif
+ // ProcessThrottlerClient
+ void sendProcessWillSuspendImminently() final;
+ void sendProcessDidResume() final;
+
private:
// AuxiliaryProcessProxy
void getLaunchOptions(ProcessLauncher::LaunchOptions&) override;
@@ -193,11 +197,9 @@
void clearCallbackStates();
// ProcessThrottlerClient
- void sendProcessWillSuspendImminently() override;
- void sendPrepareToSuspend() override;
- void sendCancelPrepareToSuspend() override;
- void sendProcessDidResume() override;
- void didSetAssertionState(AssertionState) override;
+ void sendPrepareToSuspend() final;
+ void sendCancelPrepareToSuspend() final;
+ void didSetAssertionState(AssertionState) final;
// IPC::Connection::Client
void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.cpp (244096 => 244097)
--- trunk/Source/WebKit/UIProcess/WebProcessPool.cpp 2019-04-09 21:45:03 UTC (rev 244096)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.cpp 2019-04-09 23:37:17 UTC (rev 244097)
@@ -1749,6 +1749,18 @@
m_didNetworkProcessCrash = true;
}
+void WebProcessPool::sendNetworkProcessWillSuspendImminently()
+{
+ if (m_networkProcess)
+ m_networkProcess->sendProcessWillSuspendImminently();
+}
+
+void WebProcessPool::sendNetworkProcessDidResume()
+{
+ if (m_networkProcess)
+ m_networkProcess->sendProcessDidResume();
+}
+
void WebProcessPool::terminateServiceWorkerProcesses()
{
#if ENABLE(SERVICE_WORKER)
Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.h (244096 => 244097)
--- trunk/Source/WebKit/UIProcess/WebProcessPool.h 2019-04-09 21:45:03 UTC (rev 244096)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.h 2019-04-09 23:37:17 UTC (rev 244097)
@@ -295,6 +295,8 @@
void clearCachedCredentials();
void terminateNetworkProcess();
+ void sendNetworkProcessWillSuspendImminently();
+ void sendNetworkProcessDidResume();
void terminateServiceWorkerProcesses();
void disableServiceWorkerProcessTerminationDelay();
Modified: trunk/Tools/ChangeLog (244096 => 244097)
--- trunk/Tools/ChangeLog 2019-04-09 21:45:03 UTC (rev 244096)
+++ trunk/Tools/ChangeLog 2019-04-09 23:37:17 UTC (rev 244097)
@@ -1,3 +1,13 @@
+2019-04-09 Youenn Fablet <[email protected]>
+
+ Close service worker database on network process suspension
+ https://bugs.webkit.org/show_bug.cgi?id=196623
+ <rdar://problem/48930869>
+
+ Reviewed by Alex Christensen.
+
+ * TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm:
+
2019-04-09 Daniel Bates <[email protected]>
[iPad] Should open popover when the spacebar is pressed
Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm (244096 => 244097)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm 2019-04-09 21:45:03 UTC (rev 244096)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm 2019-04-09 23:37:17 UTC (rev 244097)
@@ -1734,3 +1734,61 @@
done = false;
}
}
+
+TEST(ServiceWorkers, SuspendNetworkProcess)
+{
+ [WKWebsiteDataStore _allowWebsiteDataRecordsForAllOrigins];
+
+ // Start with a clean slate data store
+ [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:[WKWebsiteDataStore allWebsiteDataTypes] modifiedSince:[NSDate distantPast] completionHandler:^() {
+ done = true;
+ }];
+ TestWebKitAPI::Util::run(&done);
+ done = false;
+
+ RetainPtr<WKWebViewConfiguration> configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+
+ RetainPtr<SWMessageHandler> messageHandler = adoptNS([[SWMessageHandler alloc] init]);
+ [[configuration userContentController] addScriptMessageHandler:messageHandler.get() name:@"sw"];
+
+ RetainPtr<SWSchemes> handler = adoptNS([[SWSchemes alloc] init]);
+ handler->resources.set("sw://host/main.html", ResourceInfo { @"text/html", mainBytes });
+ handler->resources.set("sw://host/sw.js", ResourceInfo { @"application/_javascript_", scriptBytes });
+ [configuration setURLSchemeHandler:handler.get() forURLScheme:@"SW"];
+
+ RetainPtr<WKWebView> webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
+ [webView.get().configuration.processPool _registerURLSchemeServiceWorkersCanHandle:@"sw"];
+
+ auto delegate = adoptNS([[TestSWAsyncNavigationDelegate alloc] init]);
+ [webView setNavigationDelegate:delegate.get()];
+ [webView setUIDelegate:delegate.get()];
+
+ done = false;
+
+ // Normal load to get SW registered.
+ NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"sw://host/main.html"]];
+ [webView loadRequest:request];
+
+ TestWebKitAPI::Util::run(&done);
+ done = false;
+
+ auto store = [configuration websiteDataStore];
+ auto path = store._serviceWorkerRegistrationDirectory;
+
+ NSURL* directory = [NSURL fileURLWithPath:path isDirectory:YES];
+ NSURL *swDBPath = [directory URLByAppendingPathComponent:@"ServiceWorkerRegistrations-4.sqlite3"];
+
+ EXPECT_TRUE([[NSFileManager defaultManager] fileExistsAtPath:swDBPath.path]);
+
+ [ webView.get().configuration.processPool _sendNetworkProcessWillSuspendImminently];
+
+ EXPECT_TRUE([[NSFileManager defaultManager] fileExistsAtPath:swDBPath.path]);
+
+ [ webView.get().configuration.processPool _sendNetworkProcessDidResume];
+
+ [webView loadRequest:request];
+ TestWebKitAPI::Util::run(&done);
+ done = false;
+
+ EXPECT_TRUE([[NSFileManager defaultManager] fileExistsAtPath:swDBPath.path]);
+}