Changeset 287084 in webkit
- Timestamp:
- Dec 15, 2021, 10:19:32 AM (5 years ago)
- Location:
- trunk/Source
- Files:
-
- 10 edited
-
WTF/ChangeLog (modified) (1 diff)
-
WTF/wtf/MemoryPressureHandler.h (modified) (1 diff)
-
WebKit/ChangeLog (modified) (1 diff)
-
WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp (modified) (3 diffs)
-
WebKit/NetworkProcess/NetworkProcess.cpp (modified) (28 diffs)
-
WebKit/NetworkProcess/NetworkProcess.h (modified) (6 diffs)
-
WebKit/NetworkProcess/NetworkSession.cpp (modified) (3 diffs)
-
WebKit/NetworkProcess/NetworkSession.h (modified) (5 diffs)
-
WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.cpp (modified) (2 diffs)
-
WebKit/WebProcess/WebPage/WebPage.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WTF/ChangeLog
r287080 r287084 1 2021-12-15 Chris Dumez <cdumez@apple.com> 2 3 Move SWServers from NetworkProcess to NetworkSession 4 https://bugs.webkit.org/show_bug.cgi?id=234179 5 6 Reviewed by Darin Adler. 7 8 * wtf/MemoryPressureHandler.h: 9 Using a bool as underlying type for those enum classes is sufficient. 10 1 11 2021-12-15 Tomoki Imai <tomoki.imai@sony.com> 2 12 -
trunk/Source/WTF/wtf/MemoryPressureHandler.h
r285648 r287084 67 67 }; 68 68 69 enum class Critical : uint8_t{ No, Yes };70 enum class Synchronous : uint8_t{ No, Yes };69 enum class Critical : bool { No, Yes }; 70 enum class Synchronous : bool { No, Yes }; 71 71 72 72 typedef WTF::Function<void(Critical, Synchronous)> LowMemoryHandler; -
trunk/Source/WebKit/ChangeLog
r287073 r287084 1 2021-12-15 Chris Dumez <cdumez@apple.com> 2 3 Move SWServers from NetworkProcess to NetworkSession 4 https://bugs.webkit.org/show_bug.cgi?id=234179 5 6 Reviewed by Darin Adler. 7 8 Move SWServers from NetworkProcess to NetworkSession since they are per session. 9 10 * NetworkProcess/NetworkConnectionToWebProcess.cpp: 11 (WebKit::NetworkConnectionToWebProcess::scheduleResourceLoad): 12 (WebKit::NetworkConnectionToWebProcess::establishSWServerConnection): 13 (WebKit::NetworkConnectionToWebProcess::establishSWContextConnection): 14 * NetworkProcess/NetworkProcess.cpp: 15 (WebKit::NetworkProcess::lowMemoryHandler): 16 (WebKit::NetworkProcess::addWebsiteDataStore): 17 (WebKit::NetworkProcess::destroySession): 18 (WebKit::NetworkProcess::fetchWebsiteData): 19 (WebKit::NetworkProcess::deleteWebsiteData): 20 (WebKit::NetworkProcess::deleteWebsiteDataForOrigins): 21 (WebKit::NetworkProcess::deleteAndRestrictWebsiteDataForRegistrableDomains): 22 (WebKit::NetworkProcess::registrableDomainsWithWebsiteData): 23 (WebKit::NetworkProcess::prepareToSuspend): 24 (WebKit::NetworkProcess::resume): 25 (WebKit::NetworkProcess::processPushMessage): 26 (WebKit::NetworkProcess::forEachSWServer): Deleted. 27 (WebKit::NetworkProcess::swServerForSession): Deleted. 28 (WebKit::NetworkProcess::existingSWOriginStoreForSession const): Deleted. 29 (WebKit::NetworkProcess::registerSWServerConnection): Deleted. 30 (WebKit::NetworkProcess::unregisterSWServerConnection): Deleted. 31 (WebKit::NetworkProcess::addServiceWorkerSession): Deleted. 32 * NetworkProcess/NetworkProcess.h: 33 (WebKit::NetworkProcess::swServerForSessionIfExists): Deleted. 34 * NetworkProcess/NetworkSession.cpp: 35 (WebKit::NetworkSession::lowMemoryHandler): 36 (WebKit::NetworkSession::swOriginStore const): 37 (WebKit::NetworkSession::registerSWServerConnection): 38 (WebKit::NetworkSession::unregisterSWServerConnection): 39 (WebKit::NetworkSession::ensureSWServer): 40 (WebKit::NetworkSession::addServiceWorkerSession): 41 (WebKit::NetworkSession::hasServiceWorkerDatabasePath const): 42 * NetworkProcess/NetworkSession.h: 43 (WebKit::NetworkSession::swServer): 44 * NetworkProcess/ServiceWorker/WebSWServerConnection.cpp: 45 (WebKit::WebSWServerConnection::WebSWServerConnection): 46 (WebKit::WebSWServerConnection::~WebSWServerConnection): 47 * WebProcess/WebPage/WebPage.h: 48 1 49 2021-12-15 Youenn Fablet <youenn@apple.com> 2 50 -
trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp
r286944 r287084 500 500 501 501 #if ENABLE(SERVICE_WORKER) 502 auto& server = m_networkProcess->swServerForSession(m_sessionID); 503 if (!server.isImportCompleted()) { 504 server.whenImportIsCompleted([this, protectedThis = Ref { *this }, loadParameters = WTFMove(loadParameters), existingLoaderToResume]() mutable { 505 if (!m_networkProcess->webProcessConnection(webProcessIdentifier())) 506 return; 507 ASSERT(m_networkProcess->swServerForSession(m_sessionID).isImportCompleted()); 508 scheduleResourceLoad(WTFMove(loadParameters), existingLoaderToResume); 509 }); 510 return; 502 if (auto* session = networkSession()) { 503 if (auto& server = session->ensureSWServer(); !server.isImportCompleted()) { 504 server.whenImportIsCompleted([this, protectedThis = Ref { *this }, loadParameters = WTFMove(loadParameters), existingLoaderToResume]() mutable { 505 if (!m_networkProcess->webProcessConnection(webProcessIdentifier())) 506 return; 507 508 ASSERT(networkSession()); 509 ASSERT(networkSession()->swServer()); 510 ASSERT(networkSession()->swServer()->isImportCompleted()); 511 scheduleResourceLoad(WTFMove(loadParameters), existingLoaderToResume); 512 }); 513 return; 514 } 511 515 } 512 516 #endif … … 1152 1156 return; 1153 1157 1154 auto& server = m_networkProcess->swServerForSession(m_sessionID); 1158 auto* session = networkSession(); 1159 if (!session) 1160 return; 1161 1162 auto& server = session->ensureSWServer(); 1155 1163 auto connection = makeUnique<WebSWServerConnection>(m_networkProcess, server, m_connection.get(), m_webProcessIdentifier); 1156 1164 … … 1161 1169 void NetworkConnectionToWebProcess::establishSWContextConnection(WebPageProxyIdentifier webPageProxyID, RegistrableDomain&& registrableDomain, std::optional<ScriptExecutionContextIdentifier> serviceWorkerPageIdentifier, CompletionHandler<void()>&& completionHandler) 1162 1170 { 1163 if (auto* server = m_networkProcess->swServerForSessionIfExists(m_sessionID)) 1164 m_swContextConnection = makeUnique<WebSWServerToContextConnection>(*this, webPageProxyID, WTFMove(registrableDomain), serviceWorkerPageIdentifier, *server); 1171 auto* session = networkSession(); 1172 if (auto* swServer = session ? session->swServer() : nullptr) 1173 m_swContextConnection = makeUnique<WebSWServerToContextConnection>(*this, webPageProxyID, WTFMove(registrableDomain), serviceWorkerPageIdentifier, *swServer); 1165 1174 completionHandler(); 1166 1175 } -
trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp
r286936 r287084 61 61 #include "WebPushMessage.h" 62 62 #include "WebResourceLoadStatisticsStore.h" 63 #include "WebSWOriginStore.h"64 #include "WebSWServerConnection.h"65 #include "WebSWServerToContextConnection.h"66 63 #include "WebsiteDataFetchOption.h" 67 64 #include "WebsiteDataStore.h" … … 82 79 #include <WebCore/RuntimeApplicationChecks.h> 83 80 #include <WebCore/RuntimeEnabledFeatures.h> 81 #include <WebCore/SWServer.h> 84 82 #include <WebCore/SecurityOrigin.h> 85 83 #include <WebCore/SecurityOriginData.h> … … 117 115 #endif 118 116 119 #if ENABLE(SERVICE_WORKER)120 #include "WebSWServerToContextConnectionMessages.h"121 #endif122 123 117 namespace WebKit { 124 118 using namespace WebCore; … … 310 304 WTF::releaseFastMallocFreeMemory(); 311 305 312 forEachNetworkSession([ ](auto& networkSession) {313 networkSession. clearPrefetchCache();306 forEachNetworkSession([critical](auto& networkSession) { 307 networkSession.lowMemoryHandler(critical); 314 308 }); 315 316 #if ENABLE(SERVICE_WORKER)317 for (auto& swServer : m_swServers.values())318 swServer->handleLowMemoryWarning();319 #endif320 309 321 310 for (auto& manager : m_storageManagers.values()) … … 426 415 addIndexedDatabaseSession(sessionID, parameters.indexedDatabaseDirectory, parameters.indexedDatabaseDirectoryExtensionHandle); 427 416 417 RemoteNetworkingContext::ensureWebsiteDataStoreSession(*this, WTFMove(parameters)); 418 428 419 #if ENABLE(SERVICE_WORKER) 429 addServiceWorkerSession(sessionID, parameters.serviceWorkerProcessTerminationDelayEnabled, WTFMove(parameters.serviceWorkerRegistrationDirectory), parameters.serviceWorkerRegistrationDirectoryExtensionHandle); 430 #endif 431 432 RemoteNetworkingContext::ensureWebsiteDataStoreSession(*this, WTFMove(parameters)); 420 if (auto* session = networkSession(sessionID)) 421 session->addServiceWorkerSession(parameters.serviceWorkerProcessTerminationDelayEnabled, WTFMove(parameters.serviceWorkerRegistrationDirectory), parameters.serviceWorkerRegistrationDirectoryExtensionHandle); 422 #endif 433 423 } 434 424 … … 568 558 m_sessionsControlledByAutomation.remove(sessionID); 569 559 CacheStorage::Engine::destroyEngine(*this, sessionID); 570 571 #if ENABLE(SERVICE_WORKER)572 m_swServers.remove(sessionID);573 m_serviceWorkerInfo.remove(sessionID);574 #endif575 560 576 561 if (auto server = m_webIDBServers.take(sessionID)) … … 1467 1452 1468 1453 auto callbackAggregator = adoptRef(*new CallbackAggregator(WTFMove(completionHandler))); 1454 auto* networkSession = this->networkSession(sessionID); 1469 1455 1470 1456 if (websiteDataTypes.contains(WebsiteDataType::Cookies)) { … … 1504 1490 1505 1491 #if ENABLE(SERVICE_WORKER) 1506 path = m_serviceWorkerInfo.get(sessionID).databasePath; 1507 if (!path.isEmpty() && websiteDataTypes.contains(WebsiteDataType::ServiceWorkerRegistrations)) { 1508 swServerForSession(sessionID).getOriginsWithRegistrations([callbackAggregator](const HashSet<SecurityOriginData>& securityOrigins) mutable { 1492 if (websiteDataTypes.contains(WebsiteDataType::ServiceWorkerRegistrations) && networkSession && networkSession->hasServiceWorkerDatabasePath()) { 1493 networkSession->ensureSWServer().getOriginsWithRegistrations([callbackAggregator](const HashSet<SecurityOriginData>& securityOrigins) mutable { 1509 1494 for (auto& origin : securityOrigins) 1510 1495 callbackAggregator->m_websiteData.entries.append({ origin, WebsiteDataType::ServiceWorkerRegistrations, 0 }); … … 1521 1506 1522 1507 #if HAVE(CFNETWORK_ALTERNATIVE_SERVICE) 1523 if (websiteDataTypes.contains(WebsiteDataType::AlternativeServices)) { 1524 if (auto* session = networkSession(sessionID)) { 1525 for (auto& origin : session->hostNamesWithAlternativeServices()) 1526 callbackAggregator->m_websiteData.entries.append({ origin, WebsiteDataType::AlternativeServices, 0 }); 1527 } 1508 if (websiteDataTypes.contains(WebsiteDataType::AlternativeServices) && networkSession) { 1509 for (auto& origin : networkSession->hostNamesWithAlternativeServices()) 1510 callbackAggregator->m_websiteData.entries.append({ origin, WebsiteDataType::AlternativeServices, 0 }); 1528 1511 } 1529 1512 #endif 1530 1513 1531 1514 #if ENABLE(INTELLIGENT_TRACKING_PREVENTION) 1532 if (websiteDataTypes.contains(WebsiteDataType::ResourceLoadStatistics)) { 1533 if (auto* session = networkSession(sessionID)) { 1534 if (auto* resourceLoadStatistics = session->resourceLoadStatistics()) { 1535 resourceLoadStatistics->registrableDomains([callbackAggregator](auto&& domains) mutable { 1536 while (!domains.isEmpty()) 1537 callbackAggregator->m_websiteData.registrableDomainsWithResourceLoadStatistics.add(domains.takeLast()); 1538 }); 1539 } 1515 if (websiteDataTypes.contains(WebsiteDataType::ResourceLoadStatistics) && networkSession) { 1516 if (auto* resourceLoadStatistics = networkSession->resourceLoadStatistics()) { 1517 resourceLoadStatistics->registrableDomains([callbackAggregator](auto&& domains) mutable { 1518 while (!domains.isEmpty()) 1519 callbackAggregator->m_websiteData.registrableDomainsWithResourceLoadStatistics.add(domains.takeLast()); 1520 }); 1540 1521 } 1541 1522 } … … 1553 1534 void NetworkProcess::deleteWebsiteData(PAL::SessionID sessionID, OptionSet<WebsiteDataType> websiteDataTypes, WallTime modifiedSince, CompletionHandler<void()>&& completionHandler) 1554 1535 { 1536 auto* networkSession = this->networkSession(sessionID); 1537 1555 1538 #if PLATFORM(COCOA) || USE(SOUP) 1556 1539 if (websiteDataTypes.contains(WebsiteDataType::HSTSCache)) … … 1579 1562 #if ENABLE(SERVICE_WORKER) 1580 1563 bool clearServiceWorkers = websiteDataTypes.contains(WebsiteDataType::DOMCache) || websiteDataTypes.contains(WebsiteDataType::ServiceWorkerRegistrations); 1581 if (clearServiceWorkers && !sessionID.isEphemeral() )1582 swServerForSession(sessionID).clearAll([clearTasksHandler] { });1564 if (clearServiceWorkers && !sessionID.isEphemeral() && networkSession) 1565 networkSession->ensureSWServer().clearAll([clearTasksHandler] { }); 1583 1566 #endif 1584 1567 1585 1568 #if ENABLE(INTELLIGENT_TRACKING_PREVENTION) 1586 1569 if (websiteDataTypes.contains(WebsiteDataType::ResourceLoadStatistics)) { 1587 if (auto* networkSession = this->networkSession(sessionID)) { 1588 if (auto* resourceLoadStatistics = networkSession->resourceLoadStatistics()) { 1589 auto deletedTypesRaw = websiteDataTypes.toRaw(); 1590 auto monitoredTypesRaw = WebResourceLoadStatisticsStore::monitoredDataTypes().toRaw(); 1591 1592 // If we are deleting all of the data types that the resource load statistics store monitors 1593 // we do not need to re-grandfather old data. 1594 auto shouldGrandfather = ((monitoredTypesRaw & deletedTypesRaw) == monitoredTypesRaw) ? ShouldGrandfatherStatistics::No : ShouldGrandfatherStatistics::Yes; 1595 1596 resourceLoadStatistics->scheduleClearInMemoryAndPersistent(modifiedSince, shouldGrandfather, [clearTasksHandler] { }); 1597 } 1570 if (auto* resourceLoadStatistics = networkSession ? networkSession->resourceLoadStatistics() : nullptr) { 1571 // If we are deleting all of the data types that the resource load statistics store monitors 1572 // we do not need to re-grandfather old data. 1573 auto shouldGrandfather = websiteDataTypes.containsAll(WebResourceLoadStatisticsStore::monitoredDataTypes()) ? ShouldGrandfatherStatistics::No : ShouldGrandfatherStatistics::Yes; 1574 resourceLoadStatistics->scheduleClearInMemoryAndPersistent(modifiedSince, shouldGrandfather, [clearTasksHandler] { }); 1598 1575 } 1599 1576 } 1600 1577 #endif 1601 1578 1602 if ( auto* networkSession = this->networkSession(sessionID))1579 if (networkSession) 1603 1580 networkSession->removeNetworkWebsiteData(modifiedSince, std::nullopt, [clearTasksHandler] { }); 1604 1581 … … 1606 1583 clearDiskCache(modifiedSince, [clearTasksHandler] { }); 1607 1584 1608 if (websiteDataTypes.contains(WebsiteDataType::PrivateClickMeasurements)) { 1609 if (auto* networkSession = this->networkSession(sessionID)) 1610 networkSession->clearPrivateClickMeasurement([clearTasksHandler] { }); 1611 } 1585 if (websiteDataTypes.contains(WebsiteDataType::PrivateClickMeasurements) && networkSession) 1586 networkSession->clearPrivateClickMeasurement([clearTasksHandler] { }); 1612 1587 1613 1588 #if HAVE(CFNETWORK_ALTERNATIVE_SERVICE) 1614 if (websiteDataTypes.contains(WebsiteDataType::AlternativeServices)) { 1615 if (auto* networkSession = this->networkSession(sessionID)) 1616 networkSession->clearAlternativeServices(modifiedSince); 1617 } 1589 if (websiteDataTypes.contains(WebsiteDataType::AlternativeServices) && networkSession) 1590 networkSession->clearAlternativeServices(modifiedSince); 1618 1591 #endif 1619 1592 … … 1650 1623 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) 1651 1624 { 1625 auto* networkSession = this->networkSession(sessionID); 1626 1652 1627 if (websiteDataTypes.contains(WebsiteDataType::Cookies)) { 1653 1628 if (auto* networkStorageSession = storageSession(sessionID)) … … 1661 1636 1662 1637 #if HAVE(CFNETWORK_ALTERNATIVE_SERVICE) 1663 if (websiteDataTypes.contains(WebsiteDataType::AlternativeServices)) { 1664 if (auto* networkSession = this->networkSession(sessionID)) { 1665 Vector<String> hosts; 1666 hosts.reserveInitialCapacity(originDatas.size()); 1667 for (auto& origin : originDatas) 1668 hosts.uncheckedAppend(origin.host); 1669 networkSession->deleteAlternativeServicesForHostNames(hosts); 1670 } 1638 if (websiteDataTypes.contains(WebsiteDataType::AlternativeServices) && networkSession) { 1639 auto hosts = originDatas.map([](auto& originData) { return originData.host; }); 1640 networkSession->deleteAlternativeServicesForHostNames(hosts); 1671 1641 } 1672 1642 #endif … … 1674 1644 auto clearTasksHandler = WTF::CallbackAggregator::create(WTFMove(completionHandler)); 1675 1645 1676 if (websiteDataTypes.contains(WebsiteDataType::PrivateClickMeasurements)) { 1677 if (auto* networkSession = this->networkSession(sessionID)) { 1678 for (auto& originData : originDatas) 1679 networkSession->clearPrivateClickMeasurementForRegistrableDomain(RegistrableDomain::uncheckedCreateFromHost(originData.host), [clearTasksHandler] { }); 1680 } 1646 if (websiteDataTypes.contains(WebsiteDataType::PrivateClickMeasurements) && networkSession) { 1647 for (auto& originData : originDatas) 1648 networkSession->clearPrivateClickMeasurementForRegistrableDomain(RegistrableDomain::uncheckedCreateFromHost(originData.host), [clearTasksHandler] { }); 1681 1649 } 1682 1650 … … 1691 1659 #if ENABLE(SERVICE_WORKER) 1692 1660 bool clearServiceWorkers = websiteDataTypes.contains(WebsiteDataType::DOMCache) || websiteDataTypes.contains(WebsiteDataType::ServiceWorkerRegistrations); 1693 if (clearServiceWorkers && !sessionID.isEphemeral() ) {1694 auto& server = swServerForSession(sessionID);1661 if (clearServiceWorkers && !sessionID.isEphemeral() && networkSession) { 1662 auto& server = networkSession->ensureSWServer(); 1695 1663 for (auto& originData : originDatas) 1696 1664 server.clear(originData, [clearTasksHandler] { }); … … 1713 1681 1714 1682 #if ENABLE(INTELLIGENT_TRACKING_PREVENTION) 1715 if (websiteDataTypes.contains(WebsiteDataType::ResourceLoadStatistics)) { 1716 if (auto* networkSession = this->networkSession(sessionID)) { 1717 for (auto& domain : registrableDomains) { 1718 if (auto* resourceLoadStatistics = networkSession->resourceLoadStatistics()) 1719 resourceLoadStatistics->removeDataForDomain(domain, [clearTasksHandler] { }); 1720 } 1683 if (websiteDataTypes.contains(WebsiteDataType::ResourceLoadStatistics) && networkSession) { 1684 for (auto& domain : registrableDomains) { 1685 if (auto* resourceLoadStatistics = networkSession->resourceLoadStatistics()) 1686 resourceLoadStatistics->removeDataForDomain(domain, [clearTasksHandler] { }); 1721 1687 } 1722 1688 } … … 1728 1694 } 1729 1695 1730 if ( auto* networkSession = this->networkSession(sessionID)) {1696 if (networkSession) { 1731 1697 HashSet<WebCore::RegistrableDomain> domainsToDeleteNetworkDataFor; 1732 1698 for (auto& originData : originDatas) … … 1782 1748 void NetworkProcess::deleteAndRestrictWebsiteDataForRegistrableDomains(PAL::SessionID sessionID, OptionSet<WebsiteDataType> websiteDataTypes, RegistrableDomainsToDeleteOrRestrictWebsiteDataFor&& domains, bool shouldNotifyPage, CompletionHandler<void(const HashSet<RegistrableDomain>&)>&& completionHandler) 1783 1749 { 1750 auto* networkSession = this->networkSession(sessionID); 1751 1784 1752 OptionSet<WebsiteDataFetchOption> fetchOptions = WebsiteDataFetchOption::DoNotCreateProcesses; 1785 1753 … … 1846 1814 1847 1815 #if HAVE(CFNETWORK_ALTERNATIVE_SERVICE) 1848 if (websiteDataTypes.contains(WebsiteDataType::AlternativeServices)) { 1849 if (auto* networkSession = this->networkSession(sessionID)) { 1850 Vector<String> registrableDomainsToDelete; 1851 registrableDomainsToDelete.reserveInitialCapacity(domainsToDeleteAllNonCookieWebsiteDataFor.size()); 1852 for (auto& domain : domainsToDeleteAllNonCookieWebsiteDataFor) 1853 registrableDomainsToDelete.uncheckedAppend(domain.string()); 1854 networkSession->deleteAlternativeServicesForHostNames(registrableDomainsToDelete); 1855 } 1816 if (websiteDataTypes.contains(WebsiteDataType::AlternativeServices) && networkSession) { 1817 auto registrableDomainsToDelete = domainsToDeleteAllNonCookieWebsiteDataFor.map([](auto& domain) { return domain.string(); }); 1818 networkSession->deleteAlternativeServicesForHostNames(registrableDomainsToDelete); 1856 1819 } 1857 1820 #endif … … 1895 1858 1896 1859 #if ENABLE(SERVICE_WORKER) 1897 path = m_serviceWorkerInfo.get(sessionID).databasePath;1898 1860 bool clearServiceWorkers = websiteDataTypes.contains(WebsiteDataType::DOMCache) || websiteDataTypes.contains(WebsiteDataType::ServiceWorkerRegistrations); 1899 if (clearServiceWorkers && !path.isEmpty()) {1900 swServerForSession(sessionID).getOriginsWithRegistrations([this, sessionID, domainsToDeleteAllNonCookieWebsiteDataFor, callbackAggregator](const HashSet<SecurityOriginData>& securityOrigins) mutable {1861 if (clearServiceWorkers && networkSession && networkSession->hasServiceWorkerDatabasePath()) { 1862 networkSession->ensureSWServer().getOriginsWithRegistrations([domainsToDeleteAllNonCookieWebsiteDataFor, callbackAggregator, networkSession = WeakPtr { *networkSession }](const HashSet<SecurityOriginData>& securityOrigins) mutable { 1901 1863 for (auto& securityOrigin : securityOrigins) { 1902 1864 if (!domainsToDeleteAllNonCookieWebsiteDataFor.contains(RegistrableDomain::uncheckedCreateFromHost(securityOrigin.host))) 1903 1865 continue; 1904 1866 callbackAggregator->m_domains.add(RegistrableDomain::uncheckedCreateFromHost(securityOrigin.host)); 1905 swServerForSession(sessionID).clear(securityOrigin, [callbackAggregator] { }); 1867 if (networkSession) 1868 networkSession->ensureSWServer().clear(securityOrigin, [callbackAggregator] { }); 1906 1869 } 1907 1870 }); … … 1965 1928 void NetworkProcess::registrableDomainsWithWebsiteData(PAL::SessionID sessionID, OptionSet<WebsiteDataType> websiteDataTypes, bool shouldNotifyPage, CompletionHandler<void(HashSet<RegistrableDomain>&&)>&& completionHandler) 1966 1929 { 1930 auto* networkSession = this->networkSession(sessionID); 1931 1967 1932 OptionSet<WebsiteDataFetchOption> fetchOptions = WebsiteDataFetchOption::DoNotCreateProcesses; 1968 1933 … … 2038 2003 2039 2004 #if ENABLE(SERVICE_WORKER) 2040 path = m_serviceWorkerInfo.get(sessionID).databasePath; 2041 if (!path.isEmpty() && websiteDataTypes.contains(WebsiteDataType::ServiceWorkerRegistrations)) { 2042 swServerForSession(sessionID).getOriginsWithRegistrations([callbackAggregator](const HashSet<SecurityOriginData>& securityOrigins) mutable { 2005 if (websiteDataTypes.contains(WebsiteDataType::ServiceWorkerRegistrations) && networkSession && networkSession->hasServiceWorkerDatabasePath()) { 2006 networkSession->ensureSWServer().getOriginsWithRegistrations([callbackAggregator](const HashSet<SecurityOriginData>& securityOrigins) mutable { 2043 2007 for (auto& securityOrigin : securityOrigins) 2044 2008 callbackAggregator->m_websiteData.entries.append({ securityOrigin, WebsiteDataType::ServiceWorkerRegistrations, 0 }); … … 2254 2218 forEachNetworkSession([&] (auto& networkSession) { 2255 2219 platformFlushCookies(networkSession.sessionID(), [callbackAggregator] { }); 2220 #if ENABLE(SERVICE_WORKER) 2221 if (auto* swServer = networkSession.swServer()) 2222 swServer->startSuspension([callbackAggregator] { }); 2223 #endif 2256 2224 }); 2257 2225 … … 2259 2227 connection->cleanupForSuspension([callbackAggregator] { }); 2260 2228 2261 #if ENABLE(SERVICE_WORKER)2262 for (auto& server : m_swServers.values()) {2263 ASSERT(m_swServers.get(server->sessionID()) == server.get());2264 server->startSuspension([callbackAggregator] { });2265 }2266 #endif2267 2268 2229 for (auto& manager : m_storageManagers.values()) 2269 2230 manager->suspend([callbackAggregator] { }); … … 2297 2258 2298 2259 #if ENABLE(SERVICE_WORKER) 2299 for (auto& server : m_swServers.values()) 2300 server->endSuspension(); 2260 forEachNetworkSession([&] (auto& networkSession) { 2261 if (auto swServer = networkSession.swServer()) 2262 swServer->endSuspension(); 2263 }); 2301 2264 #endif 2302 2265 #if PLATFORM(IOS_FAMILY) … … 2446 2409 2447 2410 #if ENABLE(SERVICE_WORKER) 2448 void NetworkProcess::forEachSWServer(const Function<void(SWServer&)>& callback)2449 {2450 for (auto& server : m_swServers.values())2451 callback(*server);2452 }2453 2454 SWServer& NetworkProcess::swServerForSession(PAL::SessionID sessionID)2455 {2456 auto result = m_swServers.ensure(sessionID, [&] {2457 auto info = m_serviceWorkerInfo.get(sessionID);2458 auto path = info.databasePath;2459 // There should already be a registered path for this PAL::SessionID.2460 // If there's not, then where did this PAL::SessionID come from?2461 ASSERT(sessionID.isEphemeral() || !path.isEmpty());2462 2463 #if ENABLE(APP_BOUND_DOMAINS)2464 auto appBoundDomainsCallback = [this, sessionID](auto&& completionHandler) {2465 parentProcessConnection()->sendWithAsyncReply(Messages::NetworkProcessProxy::GetAppBoundDomains { sessionID }, WTFMove(completionHandler), 0);2466 };2467 #else2468 auto appBoundDomainsCallback = [] (auto&& completionHandler) {2469 completionHandler({ });2470 };2471 #endif2472 bool shouldRunServiceWorkersOnMainThreadForTesting = false;2473 if (auto* session = networkSession(sessionID))2474 shouldRunServiceWorkersOnMainThreadForTesting = session->shouldRunServiceWorkersOnMainThreadForTesting();2475 return makeUnique<SWServer>(makeUniqueRef<WebSWOriginStore>(), info.processTerminationDelayEnabled, WTFMove(path), sessionID, shouldRunServiceWorkersOnMainThreadForTesting, parentProcessHasServiceWorkerEntitlement(), [this, sessionID](auto&& jobData, bool shouldRefreshCache, auto&& request, auto&& completionHandler) mutable {2476 ServiceWorkerSoftUpdateLoader::start(networkSession(sessionID), WTFMove(jobData), shouldRefreshCache, WTFMove(request), WTFMove(completionHandler));2477 }, [this, sessionID](auto& registrableDomain, std::optional<ScriptExecutionContextIdentifier> serviceWorkerPageIdentifier, auto&& completionHandler) {2478 ASSERT(!registrableDomain.isEmpty());2479 parentProcessConnection()->sendWithAsyncReply(Messages::NetworkProcessProxy::EstablishWorkerContextConnectionToNetworkProcess { registrableDomain, serviceWorkerPageIdentifier, sessionID }, WTFMove(completionHandler), 0);2480 }, WTFMove(appBoundDomainsCallback));2481 });2482 return *result.iterator->value;2483 }2484 2485 WebSWOriginStore* NetworkProcess::existingSWOriginStoreForSession(PAL::SessionID sessionID) const2486 {2487 auto* swServer = m_swServers.get(sessionID);2488 if (!swServer)2489 return nullptr;2490 return &static_cast<WebSWOriginStore&>(swServer->originStore());2491 }2492 2493 void NetworkProcess::registerSWServerConnection(WebSWServerConnection& connection)2494 {2495 auto* store = existingSWOriginStoreForSession(connection.sessionID());2496 ASSERT(store);2497 if (store)2498 store->registerSWServerConnection(connection);2499 }2500 2501 void NetworkProcess::unregisterSWServerConnection(WebSWServerConnection& connection)2502 {2503 if (auto* store = existingSWOriginStoreForSession(connection.sessionID()))2504 store->unregisterSWServerConnection(connection);2505 }2506 2507 void NetworkProcess::addServiceWorkerSession(PAL::SessionID sessionID, bool processTerminationDelayEnabled, String&& serviceWorkerRegistrationDirectory, const SandboxExtension::Handle& handle)2508 {2509 ServiceWorkerInfo info {2510 WTFMove(serviceWorkerRegistrationDirectory),2511 processTerminationDelayEnabled2512 };2513 auto addResult = m_serviceWorkerInfo.add(sessionID, WTFMove(info));2514 if (addResult.isNewEntry)2515 SandboxExtension::consumePermanently(handle);2516 }2517 2518 2411 void NetworkProcess::getPendingPushMessages(PAL::SessionID sessionID, CompletionHandler<void(const Vector<WebPushMessage>&)>&& callback) 2519 2412 { … … 2529 2422 void NetworkProcess::processPushMessage(PAL::SessionID sessionID, WebPushMessage&& pushMessage, CompletionHandler<void(bool)>&& callback) 2530 2423 { 2531 swServerForSession(sessionID).processPushMessage(WTFMove(pushMessage.pushData), WTFMove(pushMessage.registrationURL), WTFMove(callback)); 2424 if (auto* session = networkSession(sessionID)) 2425 session->ensureSWServer().processPushMessage(WTFMove(pushMessage.pushData), WTFMove(pushMessage.registrationURL), WTFMove(callback)); 2532 2426 } 2533 2427 #endif // ENABLE(SERVICE_WORKER) -
trunk/Source/WebKit/NetworkProcess/NetworkProcess.h
r286936 r287084 86 86 class NetworkStorageSession; 87 87 class ResourceError; 88 class SWServer;89 88 class UserContentURLPattern; 90 89 enum class HTTPCookieAcceptPolicy : uint8_t; … … 109 108 class ProcessAssertion; 110 109 class WebPageNetworkParameters; 111 class WebSWServerConnection;112 class WebSWServerToContextConnection;113 110 enum class CallDownloadDidStart : bool; 114 111 enum class ShouldGrandfatherStatistics : bool; … … 119 116 struct WebPushMessage; 120 117 struct WebsiteDataStoreParameters; 121 122 #if ENABLE(SERVICE_WORKER)123 class WebSWOriginStore;124 #endif125 118 126 119 namespace NetworkCache { … … 309 302 void renameOriginInWebsiteData(PAL::SessionID, const URL&, const URL&, OptionSet<WebsiteDataType>, CompletionHandler<void()>&&); 310 303 311 #if ENABLE(SERVICE_WORKER)312 WebCore::SWServer* swServerForSessionIfExists(PAL::SessionID sessionID) { return m_swServers.get(sessionID); }313 WebCore::SWServer& swServerForSession(PAL::SessionID);314 void registerSWServerConnection(WebSWServerConnection&);315 void unregisterSWServerConnection(WebSWServerConnection&);316 317 void forEachSWServer(const Function<void(WebCore::SWServer&)>&);318 #endif319 320 304 #if PLATFORM(IOS_FAMILY) 321 305 bool parentProcessHasServiceWorkerEntitlement() const; … … 501 485 void suspendIDBServers(bool isSuspensionImminent); 502 486 503 #if ENABLE(SERVICE_WORKER)504 void didCreateWorkerContextProcessConnection(const IPC::Attachment&);505 506 void postMessageToServiceWorker(PAL::SessionID, WebCore::ServiceWorkerIdentifier destination, WebCore::MessageWithMessagePorts&&, const WebCore::ServiceWorkerOrClientIdentifier& source, WebCore::SWServerConnectionIdentifier);507 508 void disableServiceWorkerProcessTerminationDelay();509 510 WebSWOriginStore* existingSWOriginStoreForSession(PAL::SessionID) const;511 512 void addServiceWorkerSession(PAL::SessionID, bool processTerminationDelayEnabled, String&& serviceWorkerRegistrationDirectory, const SandboxExtension::Handle&);513 #endif514 515 487 #if PLATFORM(IOS_FAMILY) 516 488 void setIsHoldingLockedFiles(bool); … … 599 571 uint64_t m_suspensionIdentifier { 0 }; 600 572 601 #if ENABLE(SERVICE_WORKER)602 struct ServiceWorkerInfo {603 String databasePath;604 bool processTerminationDelayEnabled { true };605 };606 HashMap<PAL::SessionID, ServiceWorkerInfo> m_serviceWorkerInfo;607 HashMap<PAL::SessionID, std::unique_ptr<WebCore::SWServer>> m_swServers;608 #endif609 610 573 #if ENABLE(WEB_RTC) 611 574 RefPtr<RTCDataChannelRemoteManagerProxy> m_rtcDataChannelProxy; -
trunk/Source/WebKit/NetworkProcess/NetworkSession.cpp
r286361 r287084 44 44 #include "WebPageProxyMessages.h" 45 45 #include "WebProcessProxy.h" 46 #include "WebSWOriginStore.h" 46 47 #include "WebSocketTask.h" 47 48 #include <WebCore/CookieJar.h> … … 548 549 } 549 550 551 void NetworkSession::lowMemoryHandler(Critical) 552 { 553 clearPrefetchCache(); 554 555 #if ENABLE(SERVICE_WORKER) 556 if (m_swServer) 557 m_swServer->handleLowMemoryWarning(); 558 #endif 559 } 560 550 561 #if ENABLE(SERVICE_WORKER) 551 562 void NetworkSession::addNavigationPreloaderTask(ServiceWorkerFetchTask& task) … … 563 574 return m_navigationPreloaders.get(identifier).get(); 564 575 } 565 #endif 576 577 WebSWOriginStore* NetworkSession::swOriginStore() const 578 { 579 return m_swServer ? &static_cast<WebSWOriginStore&>(m_swServer->originStore()) : nullptr; 580 } 581 582 void NetworkSession::registerSWServerConnection(WebSWServerConnection& connection) 583 { 584 auto* store = swOriginStore(); 585 ASSERT(store); 586 if (store) 587 store->registerSWServerConnection(connection); 588 } 589 590 void NetworkSession::unregisterSWServerConnection(WebSWServerConnection& connection) 591 { 592 if (auto* store = swOriginStore()) 593 store->unregisterSWServerConnection(connection); 594 } 595 596 SWServer& NetworkSession::ensureSWServer() 597 { 598 if (!m_swServer) { 599 auto info = m_serviceWorkerInfo.value_or(ServiceWorkerInfo { }); 600 auto path = info.databasePath; 601 // There should already be a registered path for this PAL::SessionID. 602 // If there's not, then where did this PAL::SessionID come from? 603 ASSERT(m_sessionID.isEphemeral() || !path.isEmpty()); 604 605 #if ENABLE(APP_BOUND_DOMAINS) 606 auto appBoundDomainsCallback = [this](auto&& completionHandler) { 607 m_networkProcess->parentProcessConnection()->sendWithAsyncReply(Messages::NetworkProcessProxy::GetAppBoundDomains { m_sessionID }, WTFMove(completionHandler), 0); 608 }; 609 #else 610 auto appBoundDomainsCallback = [] (auto&& completionHandler) { 611 completionHandler({ }); 612 }; 613 #endif 614 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 { 615 ServiceWorkerSoftUpdateLoader::start(this, WTFMove(jobData), shouldRefreshCache, WTFMove(request), WTFMove(completionHandler)); 616 }, [this](auto& registrableDomain, std::optional<ScriptExecutionContextIdentifier> serviceWorkerPageIdentifier, auto&& completionHandler) { 617 ASSERT(!registrableDomain.isEmpty()); 618 m_networkProcess->parentProcessConnection()->sendWithAsyncReply(Messages::NetworkProcessProxy::EstablishWorkerContextConnectionToNetworkProcess { registrableDomain, serviceWorkerPageIdentifier, m_sessionID }, WTFMove(completionHandler), 0); 619 }, WTFMove(appBoundDomainsCallback)); 620 } 621 return *m_swServer; 622 } 623 624 void NetworkSession::addServiceWorkerSession(bool processTerminationDelayEnabled, String&& serviceWorkerRegistrationDirectory, const SandboxExtension::Handle& handle) 625 { 626 bool hadServiceWorkerInfo = !!m_serviceWorkerInfo; 627 m_serviceWorkerInfo = ServiceWorkerInfo { 628 WTFMove(serviceWorkerRegistrationDirectory), 629 processTerminationDelayEnabled 630 }; 631 if (!hadServiceWorkerInfo) 632 SandboxExtension::consumePermanently(handle); 633 } 634 635 bool NetworkSession::hasServiceWorkerDatabasePath() const 636 { 637 return m_serviceWorkerInfo && !m_serviceWorkerInfo->databasePath.isEmpty(); 638 } 639 640 #endif // ENABLE(SERVICE_WORKER) 566 641 567 642 } // namespace WebKit -
trunk/Source/WebKit/NetworkProcess/NetworkSession.h
r286830 r287084 56 56 class ResourceRequest; 57 57 class ResourceError; 58 class SWServer; 58 59 enum class IncludeHttpOnlyCookies : bool; 59 60 enum class ShouldSample : bool; 60 61 struct SecurityOriginData; 62 } 63 64 namespace WTF { 65 enum class Critical : bool; 61 66 } 62 67 … … 73 78 class WebResourceLoadStatisticsStore; 74 79 class WebSocketTask; 80 class WebSWOriginStore; 81 class WebSWServerConnection; 75 82 struct NetworkSessionCreationParameters; 76 83 struct SessionSet; … … 177 184 bool isStaleWhileRevalidateEnabled() const { return m_isStaleWhileRevalidateEnabled; } 178 185 186 void lowMemoryHandler(WTF::Critical); 187 179 188 #if ENABLE(SERVICE_WORKER) 180 189 void addSoftUpdateLoader(std::unique_ptr<ServiceWorkerSoftUpdateLoader>&& loader) { m_softUpdateLoaders.add(WTFMove(loader)); } … … 183 192 ServiceWorkerFetchTask* navigationPreloaderTaskFromFetchIdentifier(WebCore::FetchIdentifier); 184 193 void removeNavigationPreloaderTask(ServiceWorkerFetchTask&); 194 195 WebCore::SWServer* swServer() { return m_swServer.get(); } 196 WebCore::SWServer& ensureSWServer(); 197 WebSWOriginStore* swOriginStore() const; // FIXME: Can be private? 198 void registerSWServerConnection(WebSWServerConnection&); 199 void unregisterSWServerConnection(WebSWServerConnection&); 200 201 bool hasServiceWorkerDatabasePath() const; 202 203 void addServiceWorkerSession(bool processTerminationDelayEnabled, String&& serviceWorkerRegistrationDirectory, const SandboxExtension::Handle&); 185 204 #endif 186 205 … … 268 287 HashSet<std::unique_ptr<ServiceWorkerSoftUpdateLoader>> m_softUpdateLoaders; 269 288 HashMap<WebCore::FetchIdentifier, WeakPtr<ServiceWorkerFetchTask>> m_navigationPreloaders; 289 290 struct ServiceWorkerInfo { 291 String databasePath; 292 bool processTerminationDelayEnabled { true }; 293 }; 294 std::optional<ServiceWorkerInfo> m_serviceWorkerInfo; 295 std::unique_ptr<WebCore::SWServer> m_swServer; 270 296 #endif 271 297 -
trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.cpp
r286419 r287084 36 36 #include "NetworkProcessProxyMessages.h" 37 37 #include "NetworkResourceLoader.h" 38 #include "NetworkSession.h" 38 39 #include "WebCoreArgumentCoders.h" 39 40 #include "WebProcess.h" … … 70 71 , m_networkProcess(networkProcess) 71 72 { 72 networkProcess.registerSWServerConnection(*this); 73 if (auto* session = this->session()) 74 session->registerSWServerConnection(*this); 73 75 } 74 76 75 77 WebSWServerConnection::~WebSWServerConnection() 76 78 { 77 m_networkProcess->unregisterSWServerConnection(*this); 79 if (auto* session = this->session()) 80 session->unregisterSWServerConnection(*this); 78 81 for (const auto& keyValue : m_clientOrigins) 79 82 server().unregisterServiceWorkerClient(keyValue.value, keyValue.key); -
trunk/Source/WebKit/WebProcess/WebPage/WebPage.h
r287021 r287084 174 174 175 175 namespace WTF { 176 enum class Critical : uint8_t;176 enum class Critical : bool; 177 177 } 178 178
Note:
See TracChangeset
for help on using the changeset viewer.