Diff
Modified: trunk/Source/WTF/ChangeLog (287083 => 287084)
--- trunk/Source/WTF/ChangeLog 2021-12-15 18:09:48 UTC (rev 287083)
+++ trunk/Source/WTF/ChangeLog 2021-12-15 18:19:32 UTC (rev 287084)
@@ -1,3 +1,13 @@
+2021-12-15 Chris Dumez <cdu...@apple.com>
+
+ Move SWServers from NetworkProcess to NetworkSession
+ https://bugs.webkit.org/show_bug.cgi?id=234179
+
+ Reviewed by Darin Adler.
+
+ * wtf/MemoryPressureHandler.h:
+ Using a bool as underlying type for those enum classes is sufficient.
+
2021-12-15 Tomoki Imai <tomoki.i...@sony.com>
[PlayStation] Use FileSystem instead of FileSystemPlayStation except several unsupported APIs
Modified: trunk/Source/WTF/wtf/MemoryPressureHandler.h (287083 => 287084)
--- trunk/Source/WTF/wtf/MemoryPressureHandler.h 2021-12-15 18:09:48 UTC (rev 287083)
+++ trunk/Source/WTF/wtf/MemoryPressureHandler.h 2021-12-15 18:19:32 UTC (rev 287084)
@@ -66,8 +66,8 @@
Inactive,
};
-enum class Critical : uint8_t { No, Yes };
-enum class Synchronous : uint8_t { No, Yes };
+enum class Critical : bool { No, Yes };
+enum class Synchronous : bool { No, Yes };
typedef WTF::Function<void(Critical, Synchronous)> LowMemoryHandler;
Modified: trunk/Source/WebKit/ChangeLog (287083 => 287084)
--- trunk/Source/WebKit/ChangeLog 2021-12-15 18:09:48 UTC (rev 287083)
+++ trunk/Source/WebKit/ChangeLog 2021-12-15 18:19:32 UTC (rev 287084)
@@ -1,3 +1,51 @@
+2021-12-15 Chris Dumez <cdu...@apple.com>
+
+ Move SWServers from NetworkProcess to NetworkSession
+ https://bugs.webkit.org/show_bug.cgi?id=234179
+
+ Reviewed by Darin Adler.
+
+ Move SWServers from NetworkProcess to NetworkSession since they are per session.
+
+ * NetworkProcess/NetworkConnectionToWebProcess.cpp:
+ (WebKit::NetworkConnectionToWebProcess::scheduleResourceLoad):
+ (WebKit::NetworkConnectionToWebProcess::establishSWServerConnection):
+ (WebKit::NetworkConnectionToWebProcess::establishSWContextConnection):
+ * NetworkProcess/NetworkProcess.cpp:
+ (WebKit::NetworkProcess::lowMemoryHandler):
+ (WebKit::NetworkProcess::addWebsiteDataStore):
+ (WebKit::NetworkProcess::destroySession):
+ (WebKit::NetworkProcess::fetchWebsiteData):
+ (WebKit::NetworkProcess::deleteWebsiteData):
+ (WebKit::NetworkProcess::deleteWebsiteDataForOrigins):
+ (WebKit::NetworkProcess::deleteAndRestrictWebsiteDataForRegistrableDomains):
+ (WebKit::NetworkProcess::registrableDomainsWithWebsiteData):
+ (WebKit::NetworkProcess::prepareToSuspend):
+ (WebKit::NetworkProcess::resume):
+ (WebKit::NetworkProcess::processPushMessage):
+ (WebKit::NetworkProcess::forEachSWServer): Deleted.
+ (WebKit::NetworkProcess::swServerForSession): Deleted.
+ (WebKit::NetworkProcess::existingSWOriginStoreForSession const): Deleted.
+ (WebKit::NetworkProcess::registerSWServerConnection): Deleted.
+ (WebKit::NetworkProcess::unregisterSWServerConnection): Deleted.
+ (WebKit::NetworkProcess::addServiceWorkerSession): Deleted.
+ * NetworkProcess/NetworkProcess.h:
+ (WebKit::NetworkProcess::swServerForSessionIfExists): Deleted.
+ * NetworkProcess/NetworkSession.cpp:
+ (WebKit::NetworkSession::lowMemoryHandler):
+ (WebKit::NetworkSession::swOriginStore const):
+ (WebKit::NetworkSession::registerSWServerConnection):
+ (WebKit::NetworkSession::unregisterSWServerConnection):
+ (WebKit::NetworkSession::ensureSWServer):
+ (WebKit::NetworkSession::addServiceWorkerSession):
+ (WebKit::NetworkSession::hasServiceWorkerDatabasePath const):
+ * NetworkProcess/NetworkSession.h:
+ (WebKit::NetworkSession::swServer):
+ * NetworkProcess/ServiceWorker/WebSWServerConnection.cpp:
+ (WebKit::WebSWServerConnection::WebSWServerConnection):
+ (WebKit::WebSWServerConnection::~WebSWServerConnection):
+ * WebProcess/WebPage/WebPage.h:
+
2021-12-15 Youenn Fablet <you...@apple.com>
RemoteAudioMediaStreamTrackRendererInternalUnitManager::Unit should only reset once
Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp (287083 => 287084)
--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp 2021-12-15 18:09:48 UTC (rev 287083)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp 2021-12-15 18:19:32 UTC (rev 287084)
@@ -499,15 +499,19 @@
CONNECTION_RELEASE_LOG(Loading, "scheduleResourceLoad: (parentPID=%d, pageProxyID=%" PRIu64 ", webPageID=%" PRIu64 ", frameID=%" PRIu64 ", resourceID=%" PRIu64 ", existingLoaderToResume=%" PRIu64 ")", loadParameters.parentPID, loadParameters.webPageProxyID.toUInt64(), loadParameters.webPageID.toUInt64(), loadParameters.webFrameID.toUInt64(), loadParameters.identifier.toUInt64(), existingLoaderToResume.value_or(NetworkResourceLoadIdentifier { }).toUInt64());
#if ENABLE(SERVICE_WORKER)
- auto& server = m_networkProcess->swServerForSession(m_sessionID);
- if (!server.isImportCompleted()) {
- server.whenImportIsCompleted([this, protectedThis = Ref { *this }, loadParameters = WTFMove(loadParameters), existingLoaderToResume]() mutable {
- if (!m_networkProcess->webProcessConnection(webProcessIdentifier()))
- return;
- ASSERT(m_networkProcess->swServerForSession(m_sessionID).isImportCompleted());
- scheduleResourceLoad(WTFMove(loadParameters), existingLoaderToResume);
- });
- return;
+ if (auto* session = networkSession()) {
+ if (auto& server = session->ensureSWServer(); !server.isImportCompleted()) {
+ server.whenImportIsCompleted([this, protectedThis = Ref { *this }, loadParameters = WTFMove(loadParameters), existingLoaderToResume]() mutable {
+ if (!m_networkProcess->webProcessConnection(webProcessIdentifier()))
+ return;
+
+ ASSERT(networkSession());
+ ASSERT(networkSession()->swServer());
+ ASSERT(networkSession()->swServer()->isImportCompleted());
+ scheduleResourceLoad(WTFMove(loadParameters), existingLoaderToResume);
+ });
+ return;
+ }
}
#endif
@@ -1151,7 +1155,11 @@
if (m_swConnection)
return;
- auto& server = m_networkProcess->swServerForSession(m_sessionID);
+ auto* session = networkSession();
+ if (!session)
+ return;
+
+ auto& server = session->ensureSWServer();
auto connection = makeUnique<WebSWServerConnection>(m_networkProcess, server, m_connection.get(), m_webProcessIdentifier);
m_swConnection = *connection;
@@ -1160,8 +1168,9 @@
void NetworkConnectionToWebProcess::establishSWContextConnection(WebPageProxyIdentifier webPageProxyID, RegistrableDomain&& registrableDomain, std::optional<ScriptExecutionContextIdentifier> serviceWorkerPageIdentifier, CompletionHandler<void()>&& completionHandler)
{
- if (auto* server = m_networkProcess->swServerForSessionIfExists(m_sessionID))
- m_swContextConnection = makeUnique<WebSWServerToContextConnection>(*this, webPageProxyID, WTFMove(registrableDomain), serviceWorkerPageIdentifier, *server);
+ auto* session = networkSession();
+ if (auto* swServer = session ? session->swServer() : nullptr)
+ m_swContextConnection = makeUnique<WebSWServerToContextConnection>(*this, webPageProxyID, WTFMove(registrableDomain), serviceWorkerPageIdentifier, *swServer);
completionHandler();
}
Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp (287083 => 287084)
--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp 2021-12-15 18:09:48 UTC (rev 287083)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp 2021-12-15 18:19:32 UTC (rev 287084)
@@ -60,9 +60,6 @@
#include "WebProcessPoolMessages.h"
#include "WebPushMessage.h"
#include "WebResourceLoadStatisticsStore.h"
-#include "WebSWOriginStore.h"
-#include "WebSWServerConnection.h"
-#include "WebSWServerToContextConnection.h"
#include "WebsiteDataFetchOption.h"
#include "WebsiteDataStore.h"
#include "WebsiteDataStoreParameters.h"
@@ -81,6 +78,7 @@
#include <WebCore/ResourceRequest.h>
#include <WebCore/RuntimeApplicationChecks.h>
#include <WebCore/RuntimeEnabledFeatures.h>
+#include <WebCore/SWServer.h>
#include <WebCore/SecurityOrigin.h>
#include <WebCore/SecurityOriginData.h>
#include <WebCore/StorageQuotaManager.h>
@@ -116,10 +114,6 @@
#include <WebCore/CurlContext.h>
#endif
-#if ENABLE(SERVICE_WORKER)
-#include "WebSWServerToContextConnectionMessages.h"
-#endif
-
namespace WebKit {
using namespace WebCore;
@@ -309,15 +303,10 @@
WTF::releaseFastMallocFreeMemory();
- forEachNetworkSession([](auto& networkSession) {
- networkSession.clearPrefetchCache();
+ forEachNetworkSession([critical](auto& networkSession) {
+ networkSession.lowMemoryHandler(critical);
});
-#if ENABLE(SERVICE_WORKER)
- for (auto& swServer : m_swServers.values())
- swServer->handleLowMemoryWarning();
-#endif
-
for (auto& manager : m_storageManagers.values())
manager->handleLowMemoryWarning();
}
@@ -425,11 +414,12 @@
addIndexedDatabaseSession(sessionID, parameters.indexedDatabaseDirectory, parameters.indexedDatabaseDirectoryExtensionHandle);
+ RemoteNetworkingContext::ensureWebsiteDataStoreSession(*this, WTFMove(parameters));
+
#if ENABLE(SERVICE_WORKER)
- addServiceWorkerSession(sessionID, parameters.serviceWorkerProcessTerminationDelayEnabled, WTFMove(parameters.serviceWorkerRegistrationDirectory), parameters.serviceWorkerRegistrationDirectoryExtensionHandle);
+ if (auto* session = networkSession(sessionID))
+ session->addServiceWorkerSession(parameters.serviceWorkerProcessTerminationDelayEnabled, WTFMove(parameters.serviceWorkerRegistrationDirectory), parameters.serviceWorkerRegistrationDirectoryExtensionHandle);
#endif
-
- RemoteNetworkingContext::ensureWebsiteDataStoreSession(*this, WTFMove(parameters));
}
void NetworkProcess::addSessionStorageQuotaManager(PAL::SessionID sessionID, uint64_t defaultQuota, uint64_t defaultThirdPartyQuota, const String& cacheRootPath, SandboxExtension::Handle& cacheRootPathHandle)
@@ -568,11 +558,6 @@
m_sessionsControlledByAutomation.remove(sessionID);
CacheStorage::Engine::destroyEngine(*this, sessionID);
-#if ENABLE(SERVICE_WORKER)
- m_swServers.remove(sessionID);
- m_serviceWorkerInfo.remove(sessionID);
-#endif
-
if (auto server = m_webIDBServers.take(sessionID))
server->close();
removeStorageManagerForSession(sessionID);
@@ -1466,6 +1451,7 @@
};
auto callbackAggregator = adoptRef(*new CallbackAggregator(WTFMove(completionHandler)));
+ auto* networkSession = this->networkSession(sessionID);
if (websiteDataTypes.contains(WebsiteDataType::Cookies)) {
if (auto* networkStorageSession = storageSession(sessionID))
@@ -1503,9 +1489,8 @@
}
#if ENABLE(SERVICE_WORKER)
- path = m_serviceWorkerInfo.get(sessionID).databasePath;
- if (!path.isEmpty() && websiteDataTypes.contains(WebsiteDataType::ServiceWorkerRegistrations)) {
- swServerForSession(sessionID).getOriginsWithRegistrations([callbackAggregator](const HashSet<SecurityOriginData>& securityOrigins) mutable {
+ if (websiteDataTypes.contains(WebsiteDataType::ServiceWorkerRegistrations) && networkSession && networkSession->hasServiceWorkerDatabasePath()) {
+ networkSession->ensureSWServer().getOriginsWithRegistrations([callbackAggregator](const HashSet<SecurityOriginData>& securityOrigins) mutable {
for (auto& origin : securityOrigins)
callbackAggregator->m_websiteData.entries.append({ origin, WebsiteDataType::ServiceWorkerRegistrations, 0 });
});
@@ -1520,23 +1505,19 @@
}
#if HAVE(CFNETWORK_ALTERNATIVE_SERVICE)
- if (websiteDataTypes.contains(WebsiteDataType::AlternativeServices)) {
- if (auto* session = networkSession(sessionID)) {
- for (auto& origin : session->hostNamesWithAlternativeServices())
- callbackAggregator->m_websiteData.entries.append({ origin, WebsiteDataType::AlternativeServices, 0 });
- }
+ if (websiteDataTypes.contains(WebsiteDataType::AlternativeServices) && networkSession) {
+ for (auto& origin : networkSession->hostNamesWithAlternativeServices())
+ callbackAggregator->m_websiteData.entries.append({ origin, WebsiteDataType::AlternativeServices, 0 });
}
#endif
#if ENABLE(INTELLIGENT_TRACKING_PREVENTION)
- if (websiteDataTypes.contains(WebsiteDataType::ResourceLoadStatistics)) {
- if (auto* session = networkSession(sessionID)) {
- if (auto* resourceLoadStatistics = session->resourceLoadStatistics()) {
- resourceLoadStatistics->registrableDomains([callbackAggregator](auto&& domains) mutable {
- while (!domains.isEmpty())
- callbackAggregator->m_websiteData.registrableDomainsWithResourceLoadStatistics.add(domains.takeLast());
- });
- }
+ if (websiteDataTypes.contains(WebsiteDataType::ResourceLoadStatistics) && networkSession) {
+ if (auto* resourceLoadStatistics = networkSession->resourceLoadStatistics()) {
+ resourceLoadStatistics->registrableDomains([callbackAggregator](auto&& domains) mutable {
+ while (!domains.isEmpty())
+ callbackAggregator->m_websiteData.registrableDomainsWithResourceLoadStatistics.add(domains.takeLast());
+ });
}
}
#endif
@@ -1552,6 +1533,8 @@
void NetworkProcess::deleteWebsiteData(PAL::SessionID sessionID, OptionSet<WebsiteDataType> websiteDataTypes, WallTime modifiedSince, CompletionHandler<void()>&& completionHandler)
{
+ auto* networkSession = this->networkSession(sessionID);
+
#if PLATFORM(COCOA) || USE(SOUP)
if (websiteDataTypes.contains(WebsiteDataType::HSTSCache))
clearHSTSCache(sessionID, modifiedSince);
@@ -1578,43 +1561,33 @@
#if ENABLE(SERVICE_WORKER)
bool clearServiceWorkers = websiteDataTypes.contains(WebsiteDataType::DOMCache) || websiteDataTypes.contains(WebsiteDataType::ServiceWorkerRegistrations);
- if (clearServiceWorkers && !sessionID.isEphemeral())
- swServerForSession(sessionID).clearAll([clearTasksHandler] { });
+ if (clearServiceWorkers && !sessionID.isEphemeral() && networkSession)
+ networkSession->ensureSWServer().clearAll([clearTasksHandler] { });
#endif
#if ENABLE(INTELLIGENT_TRACKING_PREVENTION)
if (websiteDataTypes.contains(WebsiteDataType::ResourceLoadStatistics)) {
- if (auto* networkSession = this->networkSession(sessionID)) {
- if (auto* resourceLoadStatistics = networkSession->resourceLoadStatistics()) {
- auto deletedTypesRaw = websiteDataTypes.toRaw();
- auto monitoredTypesRaw = WebResourceLoadStatisticsStore::monitoredDataTypes().toRaw();
-
- // If we are deleting all of the data types that the resource load statistics store monitors
- // we do not need to re-grandfather old data.
- auto shouldGrandfather = ((monitoredTypesRaw & deletedTypesRaw) == monitoredTypesRaw) ? ShouldGrandfatherStatistics::No : ShouldGrandfatherStatistics::Yes;
-
- resourceLoadStatistics->scheduleClearInMemoryAndPersistent(modifiedSince, shouldGrandfather, [clearTasksHandler] { });
- }
+ if (auto* resourceLoadStatistics = networkSession ? networkSession->resourceLoadStatistics() : nullptr) {
+ // If we are deleting all of the data types that the resource load statistics store monitors
+ // we do not need to re-grandfather old data.
+ auto shouldGrandfather = websiteDataTypes.containsAll(WebResourceLoadStatisticsStore::monitoredDataTypes()) ? ShouldGrandfatherStatistics::No : ShouldGrandfatherStatistics::Yes;
+ resourceLoadStatistics->scheduleClearInMemoryAndPersistent(modifiedSince, shouldGrandfather, [clearTasksHandler] { });
}
}
#endif
- if (auto* networkSession = this->networkSession(sessionID))
+ if (networkSession)
networkSession->removeNetworkWebsiteData(modifiedSince, std::nullopt, [clearTasksHandler] { });
if (websiteDataTypes.contains(WebsiteDataType::DiskCache) && !sessionID.isEphemeral())
clearDiskCache(modifiedSince, [clearTasksHandler] { });
- if (websiteDataTypes.contains(WebsiteDataType::PrivateClickMeasurements)) {
- if (auto* networkSession = this->networkSession(sessionID))
- networkSession->clearPrivateClickMeasurement([clearTasksHandler] { });
- }
+ if (websiteDataTypes.contains(WebsiteDataType::PrivateClickMeasurements) && networkSession)
+ networkSession->clearPrivateClickMeasurement([clearTasksHandler] { });
#if HAVE(CFNETWORK_ALTERNATIVE_SERVICE)
- if (websiteDataTypes.contains(WebsiteDataType::AlternativeServices)) {
- if (auto* networkSession = this->networkSession(sessionID))
- networkSession->clearAlternativeServices(modifiedSince);
- }
+ if (websiteDataTypes.contains(WebsiteDataType::AlternativeServices) && networkSession)
+ networkSession->clearAlternativeServices(modifiedSince);
#endif
if (NetworkStorageManager::canHandleTypes(websiteDataTypes)) {
@@ -1649,6 +1622,8 @@
void NetworkProcess::deleteWebsiteDataForOrigins(PAL::SessionID sessionID, OptionSet<WebsiteDataType> websiteDataTypes, const Vector<SecurityOriginData>& originDatas, const Vector<String>& cookieHostNames, const Vector<String>& HSTSCacheHostNames, const Vector<RegistrableDomain>& registrableDomains, CompletionHandler<void()>&& completionHandler)
{
+ auto* networkSession = this->networkSession(sessionID);
+
if (websiteDataTypes.contains(WebsiteDataType::Cookies)) {
if (auto* networkStorageSession = storageSession(sessionID))
networkStorageSession->deleteCookiesForHostnames(cookieHostNames);
@@ -1660,24 +1635,17 @@
#endif
#if HAVE(CFNETWORK_ALTERNATIVE_SERVICE)
- if (websiteDataTypes.contains(WebsiteDataType::AlternativeServices)) {
- if (auto* networkSession = this->networkSession(sessionID)) {
- Vector<String> hosts;
- hosts.reserveInitialCapacity(originDatas.size());
- for (auto& origin : originDatas)
- hosts.uncheckedAppend(origin.host);
- networkSession->deleteAlternativeServicesForHostNames(hosts);
- }
+ if (websiteDataTypes.contains(WebsiteDataType::AlternativeServices) && networkSession) {
+ auto hosts = originDatas.map([](auto& originData) { return originData.host; });
+ networkSession->deleteAlternativeServicesForHostNames(hosts);
}
#endif
auto clearTasksHandler = WTF::CallbackAggregator::create(WTFMove(completionHandler));
- if (websiteDataTypes.contains(WebsiteDataType::PrivateClickMeasurements)) {
- if (auto* networkSession = this->networkSession(sessionID)) {
- for (auto& originData : originDatas)
- networkSession->clearPrivateClickMeasurementForRegistrableDomain(RegistrableDomain::uncheckedCreateFromHost(originData.host), [clearTasksHandler] { });
- }
+ if (websiteDataTypes.contains(WebsiteDataType::PrivateClickMeasurements) && networkSession) {
+ for (auto& originData : originDatas)
+ networkSession->clearPrivateClickMeasurementForRegistrableDomain(RegistrableDomain::uncheckedCreateFromHost(originData.host), [clearTasksHandler] { });
}
if (websiteDataTypes.contains(WebsiteDataType::DOMCache)) {
@@ -1690,8 +1658,8 @@
#if ENABLE(SERVICE_WORKER)
bool clearServiceWorkers = websiteDataTypes.contains(WebsiteDataType::DOMCache) || websiteDataTypes.contains(WebsiteDataType::ServiceWorkerRegistrations);
- if (clearServiceWorkers && !sessionID.isEphemeral()) {
- auto& server = swServerForSession(sessionID);
+ if (clearServiceWorkers && !sessionID.isEphemeral() && networkSession) {
+ auto& server = networkSession->ensureSWServer();
for (auto& originData : originDatas)
server.clear(originData, [clearTasksHandler] { });
}
@@ -1712,12 +1680,10 @@
}
#if ENABLE(INTELLIGENT_TRACKING_PREVENTION)
- if (websiteDataTypes.contains(WebsiteDataType::ResourceLoadStatistics)) {
- if (auto* networkSession = this->networkSession(sessionID)) {
- for (auto& domain : registrableDomains) {
- if (auto* resourceLoadStatistics = networkSession->resourceLoadStatistics())
- resourceLoadStatistics->removeDataForDomain(domain, [clearTasksHandler] { });
- }
+ if (websiteDataTypes.contains(WebsiteDataType::ResourceLoadStatistics) && networkSession) {
+ for (auto& domain : registrableDomains) {
+ if (auto* resourceLoadStatistics = networkSession->resourceLoadStatistics())
+ resourceLoadStatistics->removeDataForDomain(domain, [clearTasksHandler] { });
}
}
#endif
@@ -1727,7 +1693,7 @@
iterator->value->deleteData(websiteDataTypes, originDatas, [clearTasksHandler] { });
}
- if (auto* networkSession = this->networkSession(sessionID)) {
+ if (networkSession) {
HashSet<WebCore::RegistrableDomain> domainsToDeleteNetworkDataFor;
for (auto& originData : originDatas)
domainsToDeleteNetworkDataFor.add(WebCore::RegistrableDomain::uncheckedCreateFromHost(originData.host));
@@ -1781,6 +1747,8 @@
void NetworkProcess::deleteAndRestrictWebsiteDataForRegistrableDomains(PAL::SessionID sessionID, OptionSet<WebsiteDataType> websiteDataTypes, RegistrableDomainsToDeleteOrRestrictWebsiteDataFor&& domains, bool shouldNotifyPage, CompletionHandler<void(const HashSet<RegistrableDomain>&)>&& completionHandler)
{
+ auto* networkSession = this->networkSession(sessionID);
+
OptionSet<WebsiteDataFetchOption> fetchOptions = WebsiteDataFetchOption::DoNotCreateProcesses;
struct CallbackAggregator final : public ThreadSafeRefCounted<CallbackAggregator> {
@@ -1845,14 +1813,9 @@
#endif
#if HAVE(CFNETWORK_ALTERNATIVE_SERVICE)
- if (websiteDataTypes.contains(WebsiteDataType::AlternativeServices)) {
- if (auto* networkSession = this->networkSession(sessionID)) {
- Vector<String> registrableDomainsToDelete;
- registrableDomainsToDelete.reserveInitialCapacity(domainsToDeleteAllNonCookieWebsiteDataFor.size());
- for (auto& domain : domainsToDeleteAllNonCookieWebsiteDataFor)
- registrableDomainsToDelete.uncheckedAppend(domain.string());
- networkSession->deleteAlternativeServicesForHostNames(registrableDomainsToDelete);
- }
+ if (websiteDataTypes.contains(WebsiteDataType::AlternativeServices) && networkSession) {
+ auto registrableDomainsToDelete = domainsToDeleteAllNonCookieWebsiteDataFor.map([](auto& domain) { return domain.string(); });
+ networkSession->deleteAlternativeServicesForHostNames(registrableDomainsToDelete);
}
#endif
@@ -1894,15 +1857,15 @@
}
#if ENABLE(SERVICE_WORKER)
- path = m_serviceWorkerInfo.get(sessionID).databasePath;
bool clearServiceWorkers = websiteDataTypes.contains(WebsiteDataType::DOMCache) || websiteDataTypes.contains(WebsiteDataType::ServiceWorkerRegistrations);
- if (clearServiceWorkers && !path.isEmpty()) {
- swServerForSession(sessionID).getOriginsWithRegistrations([this, sessionID, domainsToDeleteAllNonCookieWebsiteDataFor, callbackAggregator](const HashSet<SecurityOriginData>& securityOrigins) mutable {
+ if (clearServiceWorkers && networkSession && networkSession->hasServiceWorkerDatabasePath()) {
+ networkSession->ensureSWServer().getOriginsWithRegistrations([domainsToDeleteAllNonCookieWebsiteDataFor, callbackAggregator, networkSession = WeakPtr { *networkSession }](const HashSet<SecurityOriginData>& securityOrigins) mutable {
for (auto& securityOrigin : securityOrigins) {
if (!domainsToDeleteAllNonCookieWebsiteDataFor.contains(RegistrableDomain::uncheckedCreateFromHost(securityOrigin.host)))
continue;
callbackAggregator->m_domains.add(RegistrableDomain::uncheckedCreateFromHost(securityOrigin.host));
- swServerForSession(sessionID).clear(securityOrigin, [callbackAggregator] { });
+ if (networkSession)
+ networkSession->ensureSWServer().clear(securityOrigin, [callbackAggregator] { });
}
});
}
@@ -1964,6 +1927,8 @@
void NetworkProcess::registrableDomainsWithWebsiteData(PAL::SessionID sessionID, OptionSet<WebsiteDataType> websiteDataTypes, bool shouldNotifyPage, CompletionHandler<void(HashSet<RegistrableDomain>&&)>&& completionHandler)
{
+ auto* networkSession = this->networkSession(sessionID);
+
OptionSet<WebsiteDataFetchOption> fetchOptions = WebsiteDataFetchOption::DoNotCreateProcesses;
struct CallbackAggregator final : public ThreadSafeRefCounted<CallbackAggregator> {
@@ -2037,9 +2002,8 @@
}
#if ENABLE(SERVICE_WORKER)
- path = m_serviceWorkerInfo.get(sessionID).databasePath;
- if (!path.isEmpty() && websiteDataTypes.contains(WebsiteDataType::ServiceWorkerRegistrations)) {
- swServerForSession(sessionID).getOriginsWithRegistrations([callbackAggregator](const HashSet<SecurityOriginData>& securityOrigins) mutable {
+ if (websiteDataTypes.contains(WebsiteDataType::ServiceWorkerRegistrations) && networkSession && networkSession->hasServiceWorkerDatabasePath()) {
+ networkSession->ensureSWServer().getOriginsWithRegistrations([callbackAggregator](const HashSet<SecurityOriginData>& securityOrigins) mutable {
for (auto& securityOrigin : securityOrigins)
callbackAggregator->m_websiteData.entries.append({ securityOrigin, WebsiteDataType::ServiceWorkerRegistrations, 0 });
});
@@ -2253,18 +2217,15 @@
forEachNetworkSession([&] (auto& networkSession) {
platformFlushCookies(networkSession.sessionID(), [callbackAggregator] { });
+#if ENABLE(SERVICE_WORKER)
+ if (auto* swServer = networkSession.swServer())
+ swServer->startSuspension([callbackAggregator] { });
+#endif
});
for (auto& connection : m_webProcessConnections.values())
connection->cleanupForSuspension([callbackAggregator] { });
-#if ENABLE(SERVICE_WORKER)
- for (auto& server : m_swServers.values()) {
- ASSERT(m_swServers.get(server->sessionID()) == server.get());
- server->startSuspension([callbackAggregator] { });
- }
-#endif
-
for (auto& manager : m_storageManagers.values())
manager->suspend([callbackAggregator] { });
}
@@ -2296,8 +2257,10 @@
PCM::Store::processDidResume();
#if ENABLE(SERVICE_WORKER)
- for (auto& server : m_swServers.values())
- server->endSuspension();
+ forEachNetworkSession([&] (auto& networkSession) {
+ if (auto swServer = networkSession.swServer())
+ swServer->endSuspension();
+ });
#endif
#if PLATFORM(IOS_FAMILY)
for (auto& server : m_webIDBServers.values())
@@ -2445,76 +2408,6 @@
}
#if ENABLE(SERVICE_WORKER)
-void NetworkProcess::forEachSWServer(const Function<void(SWServer&)>& callback)
-{
- for (auto& server : m_swServers.values())
- callback(*server);
-}
-
-SWServer& NetworkProcess::swServerForSession(PAL::SessionID sessionID)
-{
- auto result = m_swServers.ensure(sessionID, [&] {
- auto info = m_serviceWorkerInfo.get(sessionID);
- auto path = info.databasePath;
- // There should already be a registered path for this PAL::SessionID.
- // If there's not, then where did this PAL::SessionID come from?
- ASSERT(sessionID.isEphemeral() || !path.isEmpty());
-
-#if ENABLE(APP_BOUND_DOMAINS)
- auto appBoundDomainsCallback = [this, sessionID](auto&& completionHandler) {
- parentProcessConnection()->sendWithAsyncReply(Messages::NetworkProcessProxy::GetAppBoundDomains { sessionID }, WTFMove(completionHandler), 0);
- };
-#else
- auto appBoundDomainsCallback = [] (auto&& completionHandler) {
- completionHandler({ });
- };
-#endif
- bool shouldRunServiceWorkersOnMainThreadForTesting = false;
- if (auto* session = networkSession(sessionID))
- shouldRunServiceWorkersOnMainThreadForTesting = session->shouldRunServiceWorkersOnMainThreadForTesting();
- return makeUnique<SWServer>(makeUniqueRef<WebSWOriginStore>(), info.processTerminationDelayEnabled, WTFMove(path), sessionID, shouldRunServiceWorkersOnMainThreadForTesting, parentProcessHasServiceWorkerEntitlement(), [this, sessionID](auto&& jobData, bool shouldRefreshCache, auto&& request, auto&& completionHandler) mutable {
- ServiceWorkerSoftUpdateLoader::start(networkSession(sessionID), WTFMove(jobData), shouldRefreshCache, WTFMove(request), WTFMove(completionHandler));
- }, [this, sessionID](auto& registrableDomain, std::optional<ScriptExecutionContextIdentifier> serviceWorkerPageIdentifier, auto&& completionHandler) {
- ASSERT(!registrableDomain.isEmpty());
- parentProcessConnection()->sendWithAsyncReply(Messages::NetworkProcessProxy::EstablishWorkerContextConnectionToNetworkProcess { registrableDomain, serviceWorkerPageIdentifier, sessionID }, WTFMove(completionHandler), 0);
- }, WTFMove(appBoundDomainsCallback));
- });
- return *result.iterator->value;
-}
-
-WebSWOriginStore* NetworkProcess::existingSWOriginStoreForSession(PAL::SessionID sessionID) const
-{
- auto* swServer = m_swServers.get(sessionID);
- if (!swServer)
- return nullptr;
- return &static_cast<WebSWOriginStore&>(swServer->originStore());
-}
-
-void NetworkProcess::registerSWServerConnection(WebSWServerConnection& connection)
-{
- auto* store = existingSWOriginStoreForSession(connection.sessionID());
- ASSERT(store);
- if (store)
- store->registerSWServerConnection(connection);
-}
-
-void NetworkProcess::unregisterSWServerConnection(WebSWServerConnection& connection)
-{
- if (auto* store = existingSWOriginStoreForSession(connection.sessionID()))
- store->unregisterSWServerConnection(connection);
-}
-
-void NetworkProcess::addServiceWorkerSession(PAL::SessionID sessionID, bool processTerminationDelayEnabled, String&& serviceWorkerRegistrationDirectory, const SandboxExtension::Handle& handle)
-{
- ServiceWorkerInfo info {
- WTFMove(serviceWorkerRegistrationDirectory),
- processTerminationDelayEnabled
- };
- auto addResult = m_serviceWorkerInfo.add(sessionID, WTFMove(info));
- if (addResult.isNewEntry)
- SandboxExtension::consumePermanently(handle);
-}
-
void NetworkProcess::getPendingPushMessages(PAL::SessionID sessionID, CompletionHandler<void(const Vector<WebPushMessage>&)>&& callback)
{
#if ENABLE(BUILT_IN_NOTIFICATIONS)
@@ -2528,7 +2421,8 @@
void NetworkProcess::processPushMessage(PAL::SessionID sessionID, WebPushMessage&& pushMessage, CompletionHandler<void(bool)>&& callback)
{
- swServerForSession(sessionID).processPushMessage(WTFMove(pushMessage.pushData), WTFMove(pushMessage.registrationURL), WTFMove(callback));
+ if (auto* session = networkSession(sessionID))
+ session->ensureSWServer().processPushMessage(WTFMove(pushMessage.pushData), WTFMove(pushMessage.registrationURL), WTFMove(callback));
}
#endif // ENABLE(SERVICE_WORKER)
Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.h (287083 => 287084)
--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.h 2021-12-15 18:09:48 UTC (rev 287083)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.h 2021-12-15 18:19:32 UTC (rev 287084)
@@ -85,7 +85,6 @@
class StorageQuotaManager;
class NetworkStorageSession;
class ResourceError;
-class SWServer;
class UserContentURLPattern;
enum class HTTPCookieAcceptPolicy : uint8_t;
enum class IncludeHttpOnlyCookies : bool;
@@ -108,8 +107,6 @@
class NetworkStorageManager;
class ProcessAssertion;
class WebPageNetworkParameters;
-class WebSWServerConnection;
-class WebSWServerToContextConnection;
enum class CallDownloadDidStart : bool;
enum class ShouldGrandfatherStatistics : bool;
enum class StorageAccessStatus : uint8_t;
@@ -119,10 +116,6 @@
struct WebPushMessage;
struct WebsiteDataStoreParameters;
-#if ENABLE(SERVICE_WORKER)
-class WebSWOriginStore;
-#endif
-
namespace NetworkCache {
enum class CacheOption : uint8_t;
}
@@ -308,15 +301,6 @@
void clearStorage(PAL::SessionID, CompletionHandler<void()>&&);
void renameOriginInWebsiteData(PAL::SessionID, const URL&, const URL&, OptionSet<WebsiteDataType>, CompletionHandler<void()>&&);
-#if ENABLE(SERVICE_WORKER)
- WebCore::SWServer* swServerForSessionIfExists(PAL::SessionID sessionID) { return m_swServers.get(sessionID); }
- WebCore::SWServer& swServerForSession(PAL::SessionID);
- void registerSWServerConnection(WebSWServerConnection&);
- void unregisterSWServerConnection(WebSWServerConnection&);
-
- void forEachSWServer(const Function<void(WebCore::SWServer&)>&);
-#endif
-
#if PLATFORM(IOS_FAMILY)
bool parentProcessHasServiceWorkerEntitlement() const;
void disableServiceWorkerEntitlement();
@@ -500,18 +484,6 @@
void removeWebIDBServerIfPossible(PAL::SessionID);
void suspendIDBServers(bool isSuspensionImminent);
-#if ENABLE(SERVICE_WORKER)
- void didCreateWorkerContextProcessConnection(const IPC::Attachment&);
-
- void postMessageToServiceWorker(PAL::SessionID, WebCore::ServiceWorkerIdentifier destination, WebCore::MessageWithMessagePorts&&, const WebCore::ServiceWorkerOrClientIdentifier& source, WebCore::SWServerConnectionIdentifier);
-
- void disableServiceWorkerProcessTerminationDelay();
-
- WebSWOriginStore* existingSWOriginStoreForSession(PAL::SessionID) const;
-
- void addServiceWorkerSession(PAL::SessionID, bool processTerminationDelayEnabled, String&& serviceWorkerRegistrationDirectory, const SandboxExtension::Handle&);
-#endif
-
#if PLATFORM(IOS_FAMILY)
void setIsHoldingLockedFiles(bool);
#endif
@@ -598,15 +570,6 @@
bool m_shouldSuspendIDBServers { false };
uint64_t m_suspensionIdentifier { 0 };
-#if ENABLE(SERVICE_WORKER)
- struct ServiceWorkerInfo {
- String databasePath;
- bool processTerminationDelayEnabled { true };
- };
- HashMap<PAL::SessionID, ServiceWorkerInfo> m_serviceWorkerInfo;
- HashMap<PAL::SessionID, std::unique_ptr<WebCore::SWServer>> m_swServers;
-#endif
-
#if ENABLE(WEB_RTC)
RefPtr<RTCDataChannelRemoteManagerProxy> m_rtcDataChannelProxy;
#endif
Modified: trunk/Source/WebKit/NetworkProcess/NetworkSession.cpp (287083 => 287084)
--- trunk/Source/WebKit/NetworkProcess/NetworkSession.cpp 2021-12-15 18:09:48 UTC (rev 287083)
+++ trunk/Source/WebKit/NetworkProcess/NetworkSession.cpp 2021-12-15 18:19:32 UTC (rev 287084)
@@ -43,6 +43,7 @@
#include "WebPageProxy.h"
#include "WebPageProxyMessages.h"
#include "WebProcessProxy.h"
+#include "WebSWOriginStore.h"
#include "WebSocketTask.h"
#include <WebCore/CookieJar.h>
#include <WebCore/ResourceRequest.h>
@@ -547,7 +548,17 @@
return m_attributedBundleIdentifierFromPageIdentifiers.get(identifier);
}
+void NetworkSession::lowMemoryHandler(Critical)
+{
+ clearPrefetchCache();
+
#if ENABLE(SERVICE_WORKER)
+ if (m_swServer)
+ m_swServer->handleLowMemoryWarning();
+#endif
+}
+
+#if ENABLE(SERVICE_WORKER)
void NetworkSession::addNavigationPreloaderTask(ServiceWorkerFetchTask& task)
{
m_navigationPreloaders.add(task.fetchIdentifier(), task);
@@ -562,6 +573,70 @@
{
return m_navigationPreloaders.get(identifier).get();
}
+
+WebSWOriginStore* NetworkSession::swOriginStore() const
+{
+ return m_swServer ? &static_cast<WebSWOriginStore&>(m_swServer->originStore()) : nullptr;
+}
+
+void NetworkSession::registerSWServerConnection(WebSWServerConnection& connection)
+{
+ auto* store = swOriginStore();
+ ASSERT(store);
+ if (store)
+ store->registerSWServerConnection(connection);
+}
+
+void NetworkSession::unregisterSWServerConnection(WebSWServerConnection& connection)
+{
+ if (auto* store = swOriginStore())
+ store->unregisterSWServerConnection(connection);
+}
+
+SWServer& NetworkSession::ensureSWServer()
+{
+ if (!m_swServer) {
+ auto info = m_serviceWorkerInfo.value_or(ServiceWorkerInfo { });
+ auto path = info.databasePath;
+ // There should already be a registered path for this PAL::SessionID.
+ // If there's not, then where did this PAL::SessionID come from?
+ ASSERT(m_sessionID.isEphemeral() || !path.isEmpty());
+
+#if ENABLE(APP_BOUND_DOMAINS)
+ auto appBoundDomainsCallback = [this](auto&& completionHandler) {
+ m_networkProcess->parentProcessConnection()->sendWithAsyncReply(Messages::NetworkProcessProxy::GetAppBoundDomains { m_sessionID }, WTFMove(completionHandler), 0);
+ };
+#else
+ auto appBoundDomainsCallback = [] (auto&& completionHandler) {
+ completionHandler({ });
+ };
#endif
+ m_swServer = makeUnique<SWServer>(makeUniqueRef<WebSWOriginStore>(), info.processTerminationDelayEnabled, WTFMove(path), m_sessionID, shouldRunServiceWorkersOnMainThreadForTesting(), m_networkProcess->parentProcessHasServiceWorkerEntitlement(), [this](auto&& jobData, bool shouldRefreshCache, auto&& request, auto&& completionHandler) mutable {
+ ServiceWorkerSoftUpdateLoader::start(this, WTFMove(jobData), shouldRefreshCache, WTFMove(request), WTFMove(completionHandler));
+ }, [this](auto& registrableDomain, std::optional<ScriptExecutionContextIdentifier> serviceWorkerPageIdentifier, auto&& completionHandler) {
+ ASSERT(!registrableDomain.isEmpty());
+ m_networkProcess->parentProcessConnection()->sendWithAsyncReply(Messages::NetworkProcessProxy::EstablishWorkerContextConnectionToNetworkProcess { registrableDomain, serviceWorkerPageIdentifier, m_sessionID }, WTFMove(completionHandler), 0);
+ }, WTFMove(appBoundDomainsCallback));
+ }
+ return *m_swServer;
+}
+void NetworkSession::addServiceWorkerSession(bool processTerminationDelayEnabled, String&& serviceWorkerRegistrationDirectory, const SandboxExtension::Handle& handle)
+{
+ bool hadServiceWorkerInfo = !!m_serviceWorkerInfo;
+ m_serviceWorkerInfo = ServiceWorkerInfo {
+ WTFMove(serviceWorkerRegistrationDirectory),
+ processTerminationDelayEnabled
+ };
+ if (!hadServiceWorkerInfo)
+ SandboxExtension::consumePermanently(handle);
+}
+
+bool NetworkSession::hasServiceWorkerDatabasePath() const
+{
+ return m_serviceWorkerInfo && !m_serviceWorkerInfo->databasePath.isEmpty();
+}
+
+#endif // ENABLE(SERVICE_WORKER)
+
} // namespace WebKit
Modified: trunk/Source/WebKit/NetworkProcess/NetworkSession.h (287083 => 287084)
--- trunk/Source/WebKit/NetworkProcess/NetworkSession.h 2021-12-15 18:09:48 UTC (rev 287083)
+++ trunk/Source/WebKit/NetworkProcess/NetworkSession.h 2021-12-15 18:19:32 UTC (rev 287084)
@@ -55,11 +55,16 @@
class NetworkStorageSession;
class ResourceRequest;
class ResourceError;
+class SWServer;
enum class IncludeHttpOnlyCookies : bool;
enum class ShouldSample : bool;
struct SecurityOriginData;
}
+namespace WTF {
+enum class Critical : bool;
+}
+
namespace WebKit {
class NetworkDataTask;
@@ -72,6 +77,8 @@
class WebPageNetworkParameters;
class WebResourceLoadStatisticsStore;
class WebSocketTask;
+class WebSWOriginStore;
+class WebSWServerConnection;
struct NetworkSessionCreationParameters;
struct SessionSet;
@@ -176,6 +183,8 @@
bool isStaleWhileRevalidateEnabled() const { return m_isStaleWhileRevalidateEnabled; }
+ void lowMemoryHandler(WTF::Critical);
+
#if ENABLE(SERVICE_WORKER)
void addSoftUpdateLoader(std::unique_ptr<ServiceWorkerSoftUpdateLoader>&& loader) { m_softUpdateLoaders.add(WTFMove(loader)); }
void removeSoftUpdateLoader(ServiceWorkerSoftUpdateLoader* loader) { m_softUpdateLoaders.remove(loader); }
@@ -182,6 +191,16 @@
void addNavigationPreloaderTask(ServiceWorkerFetchTask&);
ServiceWorkerFetchTask* navigationPreloaderTaskFromFetchIdentifier(WebCore::FetchIdentifier);
void removeNavigationPreloaderTask(ServiceWorkerFetchTask&);
+
+ WebCore::SWServer* swServer() { return m_swServer.get(); }
+ WebCore::SWServer& ensureSWServer();
+ WebSWOriginStore* swOriginStore() const; // FIXME: Can be private?
+ void registerSWServerConnection(WebSWServerConnection&);
+ void unregisterSWServerConnection(WebSWServerConnection&);
+
+ bool hasServiceWorkerDatabasePath() const;
+
+ void addServiceWorkerSession(bool processTerminationDelayEnabled, String&& serviceWorkerRegistrationDirectory, const SandboxExtension::Handle&);
#endif
NetworkLoadScheduler& networkLoadScheduler();
@@ -267,6 +286,13 @@
#if ENABLE(SERVICE_WORKER)
HashSet<std::unique_ptr<ServiceWorkerSoftUpdateLoader>> m_softUpdateLoaders;
HashMap<WebCore::FetchIdentifier, WeakPtr<ServiceWorkerFetchTask>> m_navigationPreloaders;
+
+ struct ServiceWorkerInfo {
+ String databasePath;
+ bool processTerminationDelayEnabled { true };
+ };
+ std::optional<ServiceWorkerInfo> m_serviceWorkerInfo;
+ std::unique_ptr<WebCore::SWServer> m_swServer;
#endif
#if PLATFORM(COCOA)
Modified: trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.cpp (287083 => 287084)
--- trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.cpp 2021-12-15 18:09:48 UTC (rev 287083)
+++ trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.cpp 2021-12-15 18:19:32 UTC (rev 287084)
@@ -35,6 +35,7 @@
#include "NetworkProcess.h"
#include "NetworkProcessProxyMessages.h"
#include "NetworkResourceLoader.h"
+#include "NetworkSession.h"
#include "WebCoreArgumentCoders.h"
#include "WebProcess.h"
#include "WebProcessMessages.h"
@@ -69,12 +70,14 @@
, m_contentConnection(connection)
, m_networkProcess(networkProcess)
{
- networkProcess.registerSWServerConnection(*this);
+ if (auto* session = this->session())
+ session->registerSWServerConnection(*this);
}
WebSWServerConnection::~WebSWServerConnection()
{
- m_networkProcess->unregisterSWServerConnection(*this);
+ if (auto* session = this->session())
+ session->unregisterSWServerConnection(*this);
for (const auto& keyValue : m_clientOrigins)
server().unregisterServiceWorkerClient(keyValue.value, keyValue.key);
for (auto& completionHandler : m_unregisterJobs.values())
Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.h (287083 => 287084)
--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h 2021-12-15 18:09:48 UTC (rev 287083)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h 2021-12-15 18:19:32 UTC (rev 287084)
@@ -173,7 +173,7 @@
#define ENABLE_VIEWPORT_RESIZING PLATFORM(IOS_FAMILY)
namespace WTF {
-enum class Critical : uint8_t;
+enum class Critical : bool;
}
namespace API {