⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 252418 in webkit


Ignore:
Timestamp:
Nov 13, 2019, 11:15:13 AM (7 years ago)
Author:
youenn@apple.com
Message:

Take service worker assertions based on client processes assertion states
https://bugs.webkit.org/show_bug.cgi?id=204119

Reviewed by Chris Dumez.

Source/WebKit:

Compute in network process which processes contain clients for service workers of a given process.
WebSWServerConnection implements it and sends update to UIProcess/WebProcessProxy.
WebProcessProxy keeps for each service worker process a set of client web processes.
WebProcessProxy now computes the service worker process assertion based on this set.

Add some private APIs to set process assertions/get service worker process assertion states.
Covered by new API test.

  • NetworkProcess/ServiceWorker/WebSWServerConnection.cpp:

(WebKit::WebSWServerConnection::registerServiceWorkerClient):
(WebKit::WebSWServerConnection::unregisterServiceWorkerClient):
(WebKit::WebSWServerConnection::contextConnectionCreated):

  • NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp:

(WebKit::WebSWServerToContextConnection::webProcessIdentifier const):

  • NetworkProcess/ServiceWorker/WebSWServerToContextConnection.h:
  • UIProcess/API/Cocoa/WKWebView.mm:

(-[WKWebView _setAssertionStateForTesting:]):
(-[WKWebView _hasServiceWorkerBackgroundActivityForTesting]):
(-[WKWebView _hasServiceWorkerForegroundActivityForTesting]):

  • UIProcess/API/Cocoa/WKWebViewPrivate.h:
  • UIProcess/Network/NetworkProcessProxy.cpp:

(WebKit::NetworkProcessProxy::registerWebProcessToServiceWorkerProcess):
(WebKit::NetworkProcessProxy::unregisterWebProcessToServiceWorkerProcess):

  • UIProcess/Network/NetworkProcessProxy.h:
  • UIProcess/Network/NetworkProcessProxy.messages.in:
  • UIProcess/WebProcessPool.cpp:

(WebKit::WebProcessPool::updateProcessAssertions):
(WebKit::WebProcessPool::hasServiceWorkerForegroundActivityForTesting const):
(WebKit::WebProcessPool::hasServiceWorkerBackgroundActivityForTesting const):

  • UIProcess/WebProcessPool.h:
  • UIProcess/WebProcessProxy.cpp:

(WebKit::WebProcessProxy::updateServiceWorkerProcessAssertion):
(WebKit::WebProcessProxy::registerWebProcessToServiceWorkerProcess):
(WebKit::WebProcessProxy::unregisterWebProcessToServiceWorkerProcess):
(WebKit::WebProcessProxy::hasServiceWorkerForegroundActivityForTesting const):
(WebKit::WebProcessProxy::hasServiceWorkerBackgroundActivityForTesting const):

  • UIProcess/WebProcessProxy.h:

(WebKit::WebProcessProxy::setAssertionStateForTesting):

Tools:

  • TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm:

Add tests checking service worker process assertion state.

Location:
trunk
Files:
15 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r252417 r252418  
     12019-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
    1472019-11-13  Andres Gonzalez  <andresg_22@apple.com>
    248
  • trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.cpp

    r251433 r252418  
    3434#include "NetworkConnectionToWebProcessMessages.h"
    3535#include "NetworkProcess.h"
     36#include "NetworkProcessProxyMessages.h"
    3637#include "NetworkResourceLoader.h"
    3738#include "WebCoreArgumentCoders.h"
     
    308309void WebSWServerConnection::registerServiceWorkerClient(SecurityOriginData&& topOrigin, ServiceWorkerClientData&& data, const Optional<ServiceWorkerRegistrationIdentifier>& controllingServiceWorkerRegistrationIdentifier, String&& userAgent)
    309310{
    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) };
    311317    m_clientOrigins.add(data.identifier, clientOrigin);
    312318    server().registerServiceWorkerClient(WTFMove(clientOrigin), WTFMove(data), controllingServiceWorkerRegistrationIdentifier, WTFMove(userAgent));
     
    314320    if (!m_isThrottleable)
    315321        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    }
    316329}
    317330
     
    322335        return;
    323336
    324     server().unregisterServiceWorkerClient(iterator->value, clientIdentifier);
     337    auto clientOrigin = iterator->value;
     338
     339    server().unregisterServiceWorkerClient(clientOrigin, clientIdentifier);
    325340    m_clientOrigins.remove(iterator);
    326341
    327342    if (!m_isThrottleable)
    328343        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    }
    329355}
    330356
     
    374400    auto& connection =  static_cast<WebSWServerToContextConnection&>(contextConnection);
    375401    connection.setThrottleState(computeThrottleState(connection.registrableDomain()));
     402
     403    if (hasMatchingClient(connection.registrableDomain()))
     404        m_networkProcess->parentProcessConnection()->send(Messages::NetworkProcessProxy::RegisterServiceWorkerClientProcess { identifier(), connection.webProcessIdentifier() }, 0);
    376405}
    377406
  • trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp

    r251434 r252418  
    199199}
    200200
     201WebCore::ProcessIdentifier WebSWServerToContextConnection::webProcessIdentifier() const
     202{
     203    return m_connection.webProcessIdentifier();
     204}
     205
    201206} // namespace WebKit
    202207
  • trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.h

    r251124 r252418  
    7676    void unregisterFetch(ServiceWorkerFetchTask&);
    7777
     78    WebCore::ProcessIdentifier webProcessIdentifier() const;
     79
    7880private:
    7981    // IPC::MessageSender
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm

    r252377 r252418  
    77067706}
    77077707
     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
    77087734- (void)_denyNextUserMediaRequest
    77097735{
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h

    r252377 r252418  
    583583- (void)_processWillSuspendImminentlyForTesting;
    584584- (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));
    585588
    586589@end
  • trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp

    r252011 r252418  
    12291229        process->disableServiceWorkers();
    12301230}
     1231
     1232void 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
     1242void 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}
    12311251#endif
    12321252
  • trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h

    r252011 r252418  
    247247    void establishWorkerContextConnectionToNetworkProcess(WebCore::RegistrableDomain&&, PAL::SessionID);
    248248    void workerContextConnectionNoLongerNeeded(WebCore::ProcessIdentifier);
     249    void registerServiceWorkerClientProcess(WebCore::ProcessIdentifier webProcessIdentifier, WebCore::ProcessIdentifier serviceWorkerProcessIdentifier);
     250    void unregisterServiceWorkerClientProcess(WebCore::ProcessIdentifier webProcessIdentifier, WebCore::ProcessIdentifier serviceWorkerProcessIdentifier);
    249251#endif
    250252
  • trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.messages.in

    r251599 r252418  
    6363    EstablishWorkerContextConnectionToNetworkProcess(WebCore::RegistrableDomain registrableDomain, PAL::SessionID sessionID)
    6464    WorkerContextConnectionNoLongerNeeded(WebCore::ProcessIdentifier identifier)
     65    RegisterServiceWorkerClientProcess(WebCore::ProcessIdentifier webProcessIdentifier, WebCore::ProcessIdentifier serviceWorkerProcessIdentifier)
     66    UnregisterServiceWorkerClientProcess(WebCore::ProcessIdentifier webProcessIdentifier, WebCore::ProcessIdentifier serviceWorkerProcessIdentifier)
    6567#endif
    6668
  • trunk/Source/WebKit/UIProcess/WebProcessPool.cpp

    r252259 r252418  
    20472047void WebProcessPool::updateProcessAssertions()
    20482048{
     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;
    20492054#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    });
    20542059}
    20552060
     
    23982403}
    23992404
     2405#if ENABLE(SERVICE_WORKER)
     2406bool WebProcessPool::hasServiceWorkerForegroundActivityForTesting() const
     2407{
     2408    return WTF::anyOf(m_serviceWorkerProcesses.values(), [](auto& process) {
     2409        return process->hasServiceWorkerForegroundActivityForTesting();
     2410    });
     2411}
     2412
     2413bool WebProcessPool::hasServiceWorkerBackgroundActivityForTesting() const
     2414{
     2415    return WTF::anyOf(m_serviceWorkerProcesses.values(), [](auto& process) {
     2416        return process->hasServiceWorkerBackgroundActivityForTesting();
     2417    });
     2418}
     2419#endif
     2420
    24002421} // namespace WebKit
  • trunk/Source/WebKit/UIProcess/WebProcessPool.h

    r252259 r252418  
    397397    void updateServiceWorkerUserAgent(const String& userAgent);
    398398    const Optional<UserContentControllerIdentifier>& userContentControllerIdentifierForServiceWorkers() const { return m_userContentControllerIDForServiceWorker; }
     399    bool hasServiceWorkerForegroundActivityForTesting() const;
     400    bool hasServiceWorkerBackgroundActivityForTesting() const;
    399401#endif
    400402
  • trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp

    r252400 r252418  
    15661566        return;
    15671567
    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) {
    15701572        if (!ProcessThrottler::isValidForegroundActivity(m_serviceWorkerInformation->activity))
    15711573            m_serviceWorkerInformation->activity = m_throttler.foregroundActivity("Service Worker for foreground view(s)"_s);
    15721574        return;
    15731575    }
    1574     if (processPool().hasBackgroundWebProcesses()) {
     1576
     1577    bool shouldTakeBackgroundActivity = WTF::anyOf(m_serviceWorkerInformation->clientProcesses, [](auto& process) {
     1578        return !!process.m_backgroundToken;
     1579    });
     1580    if (shouldTakeBackgroundActivity) {
    15751581        if (!ProcessThrottler::isValidBackgroundActivity(m_serviceWorkerInformation->activity))
    15761582            m_serviceWorkerInformation->activity = m_throttler.backgroundActivity("Service Worker for background view(s)"_s);
     
    15781584    }
    15791585    m_serviceWorkerInformation->activity = nullptr;
     1586}
     1587
     1588void WebProcessProxy::registerServiceWorkerClientProcess(WebProcessProxy& proxy)
     1589{
     1590    if (!m_serviceWorkerInformation)
     1591        return;
     1592
     1593    m_serviceWorkerInformation->clientProcesses.add(proxy);
     1594    updateServiceWorkerProcessAssertion();
     1595}
     1596
     1597void WebProcessProxy::unregisterServiceWorkerClientProcess(WebProcessProxy& proxy)
     1598{
     1599    if (!m_serviceWorkerInformation)
     1600        return;
     1601
     1602    m_serviceWorkerInformation->clientProcesses.remove(proxy);
     1603    updateServiceWorkerProcessAssertion();
     1604}
     1605
     1606bool WebProcessProxy::hasServiceWorkerForegroundActivityForTesting() const
     1607{
     1608    return m_serviceWorkerInformation ? ProcessThrottler::isValidForegroundActivity(m_serviceWorkerInformation->activity) : false;
     1609}
     1610
     1611bool WebProcessProxy::hasServiceWorkerBackgroundActivityForTesting() const
     1612{
     1613    return m_serviceWorkerInformation ? ProcessThrottler::isValidBackgroundActivity(m_serviceWorkerInformation->activity) : false;
    15801614}
    15811615#endif // ENABLE(SERVICE_WORKER)
     
    16281662        },
    16291663        nullptr,
     1664        { }
    16301665    };
    16311666#if ENABLE(SERVICE_WORKER)
  • trunk/Source/WebKit/UIProcess/WebProcessProxy.h

    r252011 r252418  
    5454#include <wtf/RefCounted.h>
    5555#include <wtf/RefPtr.h>
     56#include <wtf/WeakHashSet.h>
    5657
    5758namespace API {
     
    340341    bool hasServiceWorkerPageProxy(WebPageProxyIdentifier pageProxyID) { return m_serviceWorkerInformation && m_serviceWorkerInformation->serviceWorkerPageProxyID == pageProxyID; }
    341342    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); }
    343349
    344350protected:
     
    528534        ServiceWorkerInitializationData initializationData;
    529535        ProcessThrottler::ActivityVariant activity;
     536        WeakHashSet<WebProcessProxy> clientProcesses;
    530537    };
    531538    Optional<ServiceWorkerInformation> m_serviceWorkerInformation;
  • trunk/Tools/ChangeLog

    r252411 r252418  
     12019-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
    1112019-11-13  Aakash Jain  <aakash_jain@apple.com>
    212
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm

    r252405 r252418  
    16151615}
    16161616
     1617void 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
     1626void 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
     1635void 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
     1678TEST(ServiceWorkers, SuspendServiceWorkerProcessBasedOnClientProcesses)
     1679{
     1680    bool useSeparateServiceWorkerProcess = false;
     1681    testSuspendServiceWorkerProcessBasedOnClientProcesses(useSeparateServiceWorkerProcess);
     1682
     1683    useSeparateServiceWorkerProcess = true;
     1684    testSuspendServiceWorkerProcessBasedOnClientProcesses(useSeparateServiceWorkerProcess);
     1685}
     1686
     1687
    16171688TEST(ServiceWorkers, DISABLED_ThrottleCrash)
    16181689{
Note: See TracChangeset for help on using the changeset viewer.