Changeset 252418 in webkit
- Timestamp:
- Nov 13, 2019, 11:15:13 AM (7 years ago)
- Location:
- trunk
- Files:
-
- 15 edited
-
Source/WebKit/ChangeLog (modified) (1 diff)
-
Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.cpp (modified) (5 diffs)
-
Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp (modified) (1 diff)
-
Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.h (modified) (1 diff)
-
Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm (modified) (1 diff)
-
Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h (modified) (1 diff)
-
Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp (modified) (1 diff)
-
Source/WebKit/UIProcess/Network/NetworkProcessProxy.h (modified) (1 diff)
-
Source/WebKit/UIProcess/Network/NetworkProcessProxy.messages.in (modified) (1 diff)
-
Source/WebKit/UIProcess/WebProcessPool.cpp (modified) (2 diffs)
-
Source/WebKit/UIProcess/WebProcessPool.h (modified) (1 diff)
-
Source/WebKit/UIProcess/WebProcessProxy.cpp (modified) (3 diffs)
-
Source/WebKit/UIProcess/WebProcessProxy.h (modified) (3 diffs)
-
Tools/ChangeLog (modified) (1 diff)
-
Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r252417 r252418 1 2019-11-13 Youenn Fablet <youenn@apple.com> 2 3 Take service worker assertions based on client processes assertion states 4 https://bugs.webkit.org/show_bug.cgi?id=204119 5 6 Reviewed by Chris Dumez. 7 8 Compute in network process which processes contain clients for service workers of a given process. 9 WebSWServerConnection implements it and sends update to UIProcess/WebProcessProxy. 10 WebProcessProxy keeps for each service worker process a set of client web processes. 11 WebProcessProxy now computes the service worker process assertion based on this set. 12 13 Add some private APIs to set process assertions/get service worker process assertion states. 14 Covered by new API test. 15 16 * NetworkProcess/ServiceWorker/WebSWServerConnection.cpp: 17 (WebKit::WebSWServerConnection::registerServiceWorkerClient): 18 (WebKit::WebSWServerConnection::unregisterServiceWorkerClient): 19 (WebKit::WebSWServerConnection::contextConnectionCreated): 20 * NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp: 21 (WebKit::WebSWServerToContextConnection::webProcessIdentifier const): 22 * NetworkProcess/ServiceWorker/WebSWServerToContextConnection.h: 23 * UIProcess/API/Cocoa/WKWebView.mm: 24 (-[WKWebView _setAssertionStateForTesting:]): 25 (-[WKWebView _hasServiceWorkerBackgroundActivityForTesting]): 26 (-[WKWebView _hasServiceWorkerForegroundActivityForTesting]): 27 * UIProcess/API/Cocoa/WKWebViewPrivate.h: 28 * UIProcess/Network/NetworkProcessProxy.cpp: 29 (WebKit::NetworkProcessProxy::registerWebProcessToServiceWorkerProcess): 30 (WebKit::NetworkProcessProxy::unregisterWebProcessToServiceWorkerProcess): 31 * UIProcess/Network/NetworkProcessProxy.h: 32 * UIProcess/Network/NetworkProcessProxy.messages.in: 33 * UIProcess/WebProcessPool.cpp: 34 (WebKit::WebProcessPool::updateProcessAssertions): 35 (WebKit::WebProcessPool::hasServiceWorkerForegroundActivityForTesting const): 36 (WebKit::WebProcessPool::hasServiceWorkerBackgroundActivityForTesting const): 37 * UIProcess/WebProcessPool.h: 38 * UIProcess/WebProcessProxy.cpp: 39 (WebKit::WebProcessProxy::updateServiceWorkerProcessAssertion): 40 (WebKit::WebProcessProxy::registerWebProcessToServiceWorkerProcess): 41 (WebKit::WebProcessProxy::unregisterWebProcessToServiceWorkerProcess): 42 (WebKit::WebProcessProxy::hasServiceWorkerForegroundActivityForTesting const): 43 (WebKit::WebProcessProxy::hasServiceWorkerBackgroundActivityForTesting const): 44 * UIProcess/WebProcessProxy.h: 45 (WebKit::WebProcessProxy::setAssertionStateForTesting): 46 1 47 2019-11-13 Andres Gonzalez <andresg_22@apple.com> 2 48 -
trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.cpp
r251433 r252418 34 34 #include "NetworkConnectionToWebProcessMessages.h" 35 35 #include "NetworkProcess.h" 36 #include "NetworkProcessProxyMessages.h" 36 37 #include "NetworkResourceLoader.h" 37 38 #include "WebCoreArgumentCoders.h" … … 308 309 void WebSWServerConnection::registerServiceWorkerClient(SecurityOriginData&& topOrigin, ServiceWorkerClientData&& data, const Optional<ServiceWorkerRegistrationIdentifier>& controllingServiceWorkerRegistrationIdentifier, String&& userAgent) 309 310 { 310 auto clientOrigin = ClientOrigin { WTFMove(topOrigin), SecurityOriginData::fromURL(data.url) }; 311 auto contextOrigin = SecurityOriginData::fromURL(data.url); 312 bool isNewOrigin = WTF::allOf(m_clientOrigins.values(), [&contextOrigin](auto& origin) { 313 return contextOrigin != origin.clientOrigin; 314 }); 315 316 auto clientOrigin = ClientOrigin { WTFMove(topOrigin), WTFMove(contextOrigin) }; 311 317 m_clientOrigins.add(data.identifier, clientOrigin); 312 318 server().registerServiceWorkerClient(WTFMove(clientOrigin), WTFMove(data), controllingServiceWorkerRegistrationIdentifier, WTFMove(userAgent)); … … 314 320 if (!m_isThrottleable) 315 321 updateThrottleState(); 322 323 if (isNewOrigin) { 324 if (auto* contextConnection = server().contextConnectionForRegistrableDomain(RegistrableDomain { contextOrigin })) { 325 auto& connection = static_cast<WebSWServerToContextConnection&>(*contextConnection); 326 m_networkProcess->parentProcessConnection()->send(Messages::NetworkProcessProxy::RegisterServiceWorkerClientProcess { identifier(), connection.webProcessIdentifier() }, 0); 327 } 328 } 316 329 } 317 330 … … 322 335 return; 323 336 324 server().unregisterServiceWorkerClient(iterator->value, clientIdentifier); 337 auto clientOrigin = iterator->value; 338 339 server().unregisterServiceWorkerClient(clientOrigin, clientIdentifier); 325 340 m_clientOrigins.remove(iterator); 326 341 327 342 if (!m_isThrottleable) 328 343 updateThrottleState(); 344 345 bool isDeletedOrigin = WTF::allOf(m_clientOrigins.values(), [&clientOrigin](auto& origin) { 346 return clientOrigin.clientOrigin != origin.clientOrigin; 347 }); 348 349 if (isDeletedOrigin) { 350 if (auto* contextConnection = server().contextConnectionForRegistrableDomain(RegistrableDomain { clientOrigin.clientOrigin })) { 351 auto& connection = static_cast<WebSWServerToContextConnection&>(*contextConnection); 352 m_networkProcess->parentProcessConnection()->send(Messages::NetworkProcessProxy::UnregisterServiceWorkerClientProcess { identifier(), connection.webProcessIdentifier() }, 0); 353 } 354 } 329 355 } 330 356 … … 374 400 auto& connection = static_cast<WebSWServerToContextConnection&>(contextConnection); 375 401 connection.setThrottleState(computeThrottleState(connection.registrableDomain())); 402 403 if (hasMatchingClient(connection.registrableDomain())) 404 m_networkProcess->parentProcessConnection()->send(Messages::NetworkProcessProxy::RegisterServiceWorkerClientProcess { identifier(), connection.webProcessIdentifier() }, 0); 376 405 } 377 406 -
trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp
r251434 r252418 199 199 } 200 200 201 WebCore::ProcessIdentifier WebSWServerToContextConnection::webProcessIdentifier() const 202 { 203 return m_connection.webProcessIdentifier(); 204 } 205 201 206 } // namespace WebKit 202 207 -
trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.h
r251124 r252418 76 76 void unregisterFetch(ServiceWorkerFetchTask&); 77 77 78 WebCore::ProcessIdentifier webProcessIdentifier() const; 79 78 80 private: 79 81 // IPC::MessageSender -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm
r252377 r252418 7706 7706 } 7707 7707 7708 - (void)_setAssertionStateForTesting:(int)value 7709 { 7710 if (!_page) 7711 return; 7712 7713 _page->process().setAssertionStateForTesting(static_cast<WebKit::AssertionState>(value)); 7714 } 7715 7716 - (BOOL)_hasServiceWorkerBackgroundActivityForTesting 7717 { 7718 #if ENABLE(SERVICE_WORKER) 7719 return _page ? _page->process().processPool().hasServiceWorkerBackgroundActivityForTesting() : false; 7720 #else 7721 return false; 7722 #endif 7723 } 7724 7725 - (BOOL)_hasServiceWorkerForegroundActivityForTesting 7726 { 7727 #if ENABLE(SERVICE_WORKER) 7728 return _page ? _page->process().processPool().hasServiceWorkerForegroundActivityForTesting() : false; 7729 #else 7730 return false; 7731 #endif 7732 } 7733 7708 7734 - (void)_denyNextUserMediaRequest 7709 7735 { -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h
r252377 r252418 583 583 - (void)_processWillSuspendImminentlyForTesting; 584 584 - (void)_processDidResumeForTesting; 585 @property (nonatomic, readonly) BOOL _hasServiceWorkerBackgroundActivityForTesting WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA)); 586 @property (nonatomic, readonly) BOOL _hasServiceWorkerForegroundActivityForTesting WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA)); 587 - (void)_setAssertionStateForTesting:(int)state WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA)); 585 588 586 589 @end -
trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp
r252011 r252418 1229 1229 process->disableServiceWorkers(); 1230 1230 } 1231 1232 void NetworkProcessProxy::registerServiceWorkerClientProcess(WebCore::ProcessIdentifier webProcessIdentifier, WebCore::ProcessIdentifier serviceWorkerProcessIdentifier) 1233 { 1234 auto* webProcess = WebProcessProxy::processForIdentifier(webProcessIdentifier); 1235 auto* serviceWorkerProcess = WebProcessProxy::processForIdentifier(serviceWorkerProcessIdentifier); 1236 if (!webProcess || !serviceWorkerProcess) 1237 return; 1238 1239 serviceWorkerProcess->registerServiceWorkerClientProcess(*webProcess); 1240 } 1241 1242 void NetworkProcessProxy::unregisterServiceWorkerClientProcess(WebCore::ProcessIdentifier webProcessIdentifier, WebCore::ProcessIdentifier serviceWorkerProcessIdentifier) 1243 { 1244 auto* webProcess = WebProcessProxy::processForIdentifier(webProcessIdentifier); 1245 auto* serviceWorkerProcess = WebProcessProxy::processForIdentifier(webProcessIdentifier); 1246 if (!webProcess || !serviceWorkerProcess) 1247 return; 1248 1249 serviceWorkerProcess->unregisterServiceWorkerClientProcess(*webProcess); 1250 } 1231 1251 #endif 1232 1252 -
trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h
r252011 r252418 247 247 void establishWorkerContextConnectionToNetworkProcess(WebCore::RegistrableDomain&&, PAL::SessionID); 248 248 void workerContextConnectionNoLongerNeeded(WebCore::ProcessIdentifier); 249 void registerServiceWorkerClientProcess(WebCore::ProcessIdentifier webProcessIdentifier, WebCore::ProcessIdentifier serviceWorkerProcessIdentifier); 250 void unregisterServiceWorkerClientProcess(WebCore::ProcessIdentifier webProcessIdentifier, WebCore::ProcessIdentifier serviceWorkerProcessIdentifier); 249 251 #endif 250 252 -
trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.messages.in
r251599 r252418 63 63 EstablishWorkerContextConnectionToNetworkProcess(WebCore::RegistrableDomain registrableDomain, PAL::SessionID sessionID) 64 64 WorkerContextConnectionNoLongerNeeded(WebCore::ProcessIdentifier identifier) 65 RegisterServiceWorkerClientProcess(WebCore::ProcessIdentifier webProcessIdentifier, WebCore::ProcessIdentifier serviceWorkerProcessIdentifier) 66 UnregisterServiceWorkerClientProcess(WebCore::ProcessIdentifier webProcessIdentifier, WebCore::ProcessIdentifier serviceWorkerProcessIdentifier) 65 67 #endif 66 68 -
trunk/Source/WebKit/UIProcess/WebProcessPool.cpp
r252259 r252418 2047 2047 void WebProcessPool::updateProcessAssertions() 2048 2048 { 2049 ensureNetworkProcess().updateProcessAssertion(); 2050 // Check on next run loop since the web process proxy tokens are probably being updated. 2051 callOnMainRunLoop([this, weakThis = makeWeakPtr(this)] { 2052 if (!weakThis) 2053 return; 2049 2054 #if ENABLE(SERVICE_WORKER) 2050 for (auto* serviceWorkerProcess : m_serviceWorkerProcesses.values())2051 serviceWorkerProcess->updateServiceWorkerProcessAssertion();2052 #endif 2053 ensureNetworkProcess().updateProcessAssertion();2055 for (auto* serviceWorkerProcess : m_serviceWorkerProcesses.values()) 2056 serviceWorkerProcess->updateServiceWorkerProcessAssertion(); 2057 #endif 2058 }); 2054 2059 } 2055 2060 … … 2398 2403 } 2399 2404 2405 #if ENABLE(SERVICE_WORKER) 2406 bool WebProcessPool::hasServiceWorkerForegroundActivityForTesting() const 2407 { 2408 return WTF::anyOf(m_serviceWorkerProcesses.values(), [](auto& process) { 2409 return process->hasServiceWorkerForegroundActivityForTesting(); 2410 }); 2411 } 2412 2413 bool WebProcessPool::hasServiceWorkerBackgroundActivityForTesting() const 2414 { 2415 return WTF::anyOf(m_serviceWorkerProcesses.values(), [](auto& process) { 2416 return process->hasServiceWorkerBackgroundActivityForTesting(); 2417 }); 2418 } 2419 #endif 2420 2400 2421 } // namespace WebKit -
trunk/Source/WebKit/UIProcess/WebProcessPool.h
r252259 r252418 397 397 void updateServiceWorkerUserAgent(const String& userAgent); 398 398 const Optional<UserContentControllerIdentifier>& userContentControllerIdentifierForServiceWorkers() const { return m_userContentControllerIDForServiceWorker; } 399 bool hasServiceWorkerForegroundActivityForTesting() const; 400 bool hasServiceWorkerBackgroundActivityForTesting() const; 399 401 #endif 400 402 -
trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp
r252400 r252418 1566 1566 return; 1567 1567 1568 // FIXME: We could do better if we knew which WebContent processes needed this service worker process. 1569 if (processPool().hasForegroundWebProcesses()) { 1568 bool shouldTakeForegroundActivity = WTF::anyOf(m_serviceWorkerInformation->clientProcesses, [](auto& process) { 1569 return !!process.m_foregroundToken; 1570 }); 1571 if (shouldTakeForegroundActivity) { 1570 1572 if (!ProcessThrottler::isValidForegroundActivity(m_serviceWorkerInformation->activity)) 1571 1573 m_serviceWorkerInformation->activity = m_throttler.foregroundActivity("Service Worker for foreground view(s)"_s); 1572 1574 return; 1573 1575 } 1574 if (processPool().hasBackgroundWebProcesses()) { 1576 1577 bool shouldTakeBackgroundActivity = WTF::anyOf(m_serviceWorkerInformation->clientProcesses, [](auto& process) { 1578 return !!process.m_backgroundToken; 1579 }); 1580 if (shouldTakeBackgroundActivity) { 1575 1581 if (!ProcessThrottler::isValidBackgroundActivity(m_serviceWorkerInformation->activity)) 1576 1582 m_serviceWorkerInformation->activity = m_throttler.backgroundActivity("Service Worker for background view(s)"_s); … … 1578 1584 } 1579 1585 m_serviceWorkerInformation->activity = nullptr; 1586 } 1587 1588 void WebProcessProxy::registerServiceWorkerClientProcess(WebProcessProxy& proxy) 1589 { 1590 if (!m_serviceWorkerInformation) 1591 return; 1592 1593 m_serviceWorkerInformation->clientProcesses.add(proxy); 1594 updateServiceWorkerProcessAssertion(); 1595 } 1596 1597 void WebProcessProxy::unregisterServiceWorkerClientProcess(WebProcessProxy& proxy) 1598 { 1599 if (!m_serviceWorkerInformation) 1600 return; 1601 1602 m_serviceWorkerInformation->clientProcesses.remove(proxy); 1603 updateServiceWorkerProcessAssertion(); 1604 } 1605 1606 bool WebProcessProxy::hasServiceWorkerForegroundActivityForTesting() const 1607 { 1608 return m_serviceWorkerInformation ? ProcessThrottler::isValidForegroundActivity(m_serviceWorkerInformation->activity) : false; 1609 } 1610 1611 bool WebProcessProxy::hasServiceWorkerBackgroundActivityForTesting() const 1612 { 1613 return m_serviceWorkerInformation ? ProcessThrottler::isValidBackgroundActivity(m_serviceWorkerInformation->activity) : false; 1580 1614 } 1581 1615 #endif // ENABLE(SERVICE_WORKER) … … 1628 1662 }, 1629 1663 nullptr, 1664 { } 1630 1665 }; 1631 1666 #if ENABLE(SERVICE_WORKER) -
trunk/Source/WebKit/UIProcess/WebProcessProxy.h
r252011 r252418 54 54 #include <wtf/RefCounted.h> 55 55 #include <wtf/RefPtr.h> 56 #include <wtf/WeakHashSet.h> 56 57 57 58 namespace API { … … 340 341 bool hasServiceWorkerPageProxy(WebPageProxyIdentifier pageProxyID) { return m_serviceWorkerInformation && m_serviceWorkerInformation->serviceWorkerPageProxyID == pageProxyID; } 341 342 void updateServiceWorkerProcessAssertion(); 342 #endif 343 void registerServiceWorkerClientProcess(WebProcessProxy&); 344 void unregisterServiceWorkerClientProcess(WebProcessProxy&); 345 bool hasServiceWorkerForegroundActivityForTesting() const; 346 bool hasServiceWorkerBackgroundActivityForTesting() const; 347 #endif 348 void setAssertionStateForTesting(AssertionState state) { didSetAssertionState(state); } 343 349 344 350 protected: … … 528 534 ServiceWorkerInitializationData initializationData; 529 535 ProcessThrottler::ActivityVariant activity; 536 WeakHashSet<WebProcessProxy> clientProcesses; 530 537 }; 531 538 Optional<ServiceWorkerInformation> m_serviceWorkerInformation; -
trunk/Tools/ChangeLog
r252411 r252418 1 2019-11-13 Youenn Fablet <youenn@apple.com> 2 3 Take service worker assertions based on client processes assertion states 4 https://bugs.webkit.org/show_bug.cgi?id=204119 5 6 Reviewed by Chris Dumez. 7 8 * TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm: 9 Add tests checking service worker process assertion state. 10 1 11 2019-11-13 Aakash Jain <aakash_jain@apple.com> 2 12 -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm
r252405 r252418 1615 1615 } 1616 1616 1617 void waitUntilServiceWorkerProcessForegroundActivityState(WKWebView *page, bool shouldHaveActivity) 1618 { 1619 do { 1620 if (page._hasServiceWorkerForegroundActivityForTesting == shouldHaveActivity) 1621 return; 1622 TestWebKitAPI::Util::spinRunLoop(1); 1623 } while (true); 1624 } 1625 1626 void waitUntilServiceWorkerProcessBackgroundActivityState(WKWebView *page, bool shouldHaveActivity) 1627 { 1628 do { 1629 if (page._hasServiceWorkerBackgroundActivityForTesting == shouldHaveActivity) 1630 return; 1631 TestWebKitAPI::Util::spinRunLoop(1); 1632 } while (true); 1633 } 1634 1635 void testSuspendServiceWorkerProcessBasedOnClientProcesses(bool useSeparateServiceWorkerProcess) 1636 { 1637 [WKWebsiteDataStore _allowWebsiteDataRecordsForAllOrigins]; 1638 1639 // Start with a clean slate data store 1640 [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:[WKWebsiteDataStore allWebsiteDataTypes] modifiedSince:[NSDate distantPast] completionHandler:^() { 1641 done = true; 1642 }]; 1643 TestWebKitAPI::Util::run(&done); 1644 done = false; 1645 1646 auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]); 1647 1648 auto messageHandler = adoptNS([[SWMessageHandler alloc] init]); 1649 [[configuration userContentController] addScriptMessageHandler:messageHandler.get() name:@"sw"]; 1650 1651 ServiceWorkerTCPServer server({ 1652 { "text/html", mainBytes }, 1653 { "application/javascript", scriptBytes }, 1654 }); 1655 1656 auto *processPool = configuration.get().processPool; 1657 [processPool _setUseSeparateServiceWorkerProcess: useSeparateServiceWorkerProcess]; 1658 1659 auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]); 1660 1661 [webView loadRequest:server.request()]; 1662 1663 waitUntilServiceWorkerProcessCount(processPool, 1); 1664 1665 [webView _setAssertionStateForTesting: 1]; 1666 waitUntilServiceWorkerProcessForegroundActivityState(webView.get(), false); 1667 waitUntilServiceWorkerProcessBackgroundActivityState(webView.get(), true); 1668 1669 [webView _setAssertionStateForTesting: 3]; 1670 waitUntilServiceWorkerProcessForegroundActivityState(webView.get(), true); 1671 waitUntilServiceWorkerProcessBackgroundActivityState(webView.get(), false); 1672 1673 [webView _setAssertionStateForTesting: 0]; 1674 waitUntilServiceWorkerProcessBackgroundActivityState(webView.get(), false); 1675 waitUntilServiceWorkerProcessForegroundActivityState(webView.get(), false); 1676 } 1677 1678 TEST(ServiceWorkers, SuspendServiceWorkerProcessBasedOnClientProcesses) 1679 { 1680 bool useSeparateServiceWorkerProcess = false; 1681 testSuspendServiceWorkerProcessBasedOnClientProcesses(useSeparateServiceWorkerProcess); 1682 1683 useSeparateServiceWorkerProcess = true; 1684 testSuspendServiceWorkerProcessBasedOnClientProcesses(useSeparateServiceWorkerProcess); 1685 } 1686 1687 1617 1688 TEST(ServiceWorkers, DISABLED_ThrottleCrash) 1618 1689 {
Note:
See TracChangeset
for help on using the changeset viewer.