Changeset 275487 in webkit


Ignore:
Timestamp:
Apr 5, 2021 9:03:31 PM (3 years ago)
Author:
commit-queue@webkit.org
Message:

REGRESSION(r267763) NetworkProcess never terminates
https://bugs.webkit.org/show_bug.cgi?id=224191
<rdar://problem/76124590>

Patch by Alex Christensen <achristensen@webkit.org> on 2021-04-05
Reviewed by Chris Dumez.

Source/WebKit:

Before r267763, when a WebProcessPool was deallocated, the NetworkProcess it owned was terminated.
Since then, once you start using a NetworkProcess, it will be kept until your app closes or it crashes.
To reclaim these resources in a way similar to how we did before, we now terminate the network process in two situations:

  1. If all WebsiteDataStores associated with it are deallocated. This happens if you have never used the default WKWebsiteDataStore.
  2. If all WebProcessPools are deallocated. This can still happen if you do use the default WKWebsiteDataStore, which is never deallocated.

Covered by API tests.

  • UIProcess/API/Cocoa/WKWebsiteDataStore.mm:

(+[WKWebsiteDataStore _defaultNetworkProcessExists]):

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

(WebKit::NetworkProcessProxy::defaultNetworkProcessExists):
(WebKit::NetworkProcessProxy::removeSession):

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

(WebKit::WebProcessPool::~WebProcessPool):

Tools:

  • TestWebKitAPI/Tests/WebKitCocoa/NetworkProcess.mm:

(TEST):

Location:
trunk
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r275486 r275487  
     12021-04-05  Alex Christensen  <achristensen@webkit.org>
     2
     3        REGRESSION(r267763) NetworkProcess never terminates
     4        https://bugs.webkit.org/show_bug.cgi?id=224191
     5        <rdar://problem/76124590>
     6
     7        Reviewed by Chris Dumez.
     8
     9        Before r267763, when a WebProcessPool was deallocated, the NetworkProcess it owned was terminated.
     10        Since then, once you start using a NetworkProcess, it will be kept until your app closes or it crashes.
     11        To reclaim these resources in a way similar to how we did before, we now terminate the network process in two situations:
     12        1. If all WebsiteDataStores associated with it are deallocated.  This happens if you have never used the default WKWebsiteDataStore.
     13        2. If all WebProcessPools are deallocated.  This can still happen if you do use the default WKWebsiteDataStore, which is never deallocated.
     14
     15        Covered by API tests.
     16
     17        * UIProcess/API/Cocoa/WKWebsiteDataStore.mm:
     18        (+[WKWebsiteDataStore _defaultNetworkProcessExists]):
     19        * UIProcess/API/Cocoa/WKWebsiteDataStorePrivate.h:
     20        * UIProcess/Network/NetworkProcessProxy.cpp:
     21        (WebKit::NetworkProcessProxy::defaultNetworkProcessExists):
     22        (WebKit::NetworkProcessProxy::removeSession):
     23        * UIProcess/Network/NetworkProcessProxy.h:
     24        * UIProcess/WebProcessPool.cpp:
     25        (WebKit::WebProcessPool::~WebProcessPool):
     26
    1272021-04-05  Alex Christensen  <achristensen@webkit.org>
    228
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm

    r275106 r275487  
    3030#import "AuthenticationChallengeDispositionCocoa.h"
    3131#import "CompletionHandlerCallChecker.h"
     32#import "NetworkProcessProxy.h"
    3233#import "ShouldGrandfatherStatistics.h"
    3334#import "WKHTTPCookieStoreInternal.h"
     
    725726}
    726727
     728+ (BOOL)_defaultNetworkProcessExists
     729{
     730    return !!WebKit::NetworkProcessProxy::defaultNetworkProcess();
     731}
     732
    727733@end
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStorePrivate.h

    r275106 r275487  
    9999+ (void)_makeNextNetworkProcessLaunchFailForTesting WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
    100100- (BOOL)_networkProcessExists WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
     101+ (BOOL)_defaultNetworkProcessExists WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
    101102
    102103@end
  • trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp

    r275389 r275487  
    102102}
    103103
    104 static RefPtr<NetworkProcessProxy>& defaultProcess()
     104RefPtr<NetworkProcessProxy>& NetworkProcessProxy::defaultNetworkProcess()
    105105{
    106106    static NeverDestroyed<RefPtr<NetworkProcessProxy>> process;
     
    108108}
    109109
    110 Ref<NetworkProcessProxy> NetworkProcessProxy::defaultNetworkProcess()
    111 {
    112     if (!defaultProcess())
    113         defaultProcess() = NetworkProcessProxy::create();
    114     return *defaultProcess();
     110Ref<NetworkProcessProxy> NetworkProcessProxy::ensureDefaultNetworkProcess()
     111{
     112    if (!defaultNetworkProcess())
     113        defaultNetworkProcess() = NetworkProcessProxy::create();
     114    return *defaultNetworkProcess();
    115115}
    116116
     
    311311    m_uploadActivity = WTF::nullopt;
    312312
    313     if (defaultProcess() == this)
    314         defaultProcess() = nullptr;
     313    if (defaultNetworkProcess() == this)
     314        defaultNetworkProcess() = nullptr;
    315315
    316316    Ref<NetworkProcessProxy> protectedThis(*this);
     
    12801280    if (canSendMessage())
    12811281        send(Messages::NetworkProcess::DestroySession { websiteDataStore.sessionID() }, 0);
     1282
     1283    if (m_websiteDataStores.computesEmpty())
     1284        defaultNetworkProcess() = nullptr;
    12821285}
    12831286
  • trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h

    r275389 r275487  
    109109    using OpenerDomain = WebCore::RegistrableDomain;
    110110
    111     static Ref<NetworkProcessProxy> defaultNetworkProcess();
     111    static Ref<NetworkProcessProxy> ensureDefaultNetworkProcess();
     112    static RefPtr<NetworkProcessProxy>& defaultNetworkProcess();
    112113    static Ref<NetworkProcessProxy> create() { return adoptRef(*new NetworkProcessProxy); }
    113114    ~NetworkProcessProxy();
  • trunk/Source/WebKit/UIProcess/WebProcessPool.cpp

    r275389 r275487  
    377377        process->shutDown();
    378378    }
     379
     380    if (processPools().isEmpty() && !!NetworkProcessProxy::defaultNetworkProcess())
     381        NetworkProcessProxy::defaultNetworkProcess() = nullptr;
    379382}
    380383
  • trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp

    r275389 r275487  
    201201#else
    202202    UNUSED_PARAM(sessionID);
    203     return NetworkProcessProxy::defaultNetworkProcess();
     203    return NetworkProcessProxy::ensureDefaultNetworkProcess();
    204204#endif
    205205}
  • trunk/Tools/ChangeLog

    r275484 r275487  
     12021-04-05  Alex Christensen  <achristensen@webkit.org>
     2
     3        REGRESSION(r267763) NetworkProcess never terminates
     4        https://bugs.webkit.org/show_bug.cgi?id=224191
     5        <rdar://problem/76124590>
     6
     7        Reviewed by Chris Dumez.
     8
     9        * TestWebKitAPI/Tests/WebKitCocoa/NetworkProcess.mm:
     10        (TEST):
     11
    1122021-04-05  Alex Christensen  <achristensen@webkit.org>
    213
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/NetworkProcess.mm

    r275344 r275487  
    3737#import <wtf/Vector.h>
    3838
    39 TEST(WebKit, NetworkProcessEntitlements)
     39TEST(NetworkProcess, Entitlements)
    4040{
    4141    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:adoptNS([[WKWebViewConfiguration alloc] init]).get()]);
     
    8383}
    8484
    85 TEST(WebKit, NetworkProcessLaunchOnlyWhenNecessary)
     85TEST(NetworkProcess, LaunchOnlyWhenNecessary)
    8686{
    8787    auto webView = adoptNS([WKWebView new]);
     
    9292}
    9393
    94 TEST(WebKit, NetworkProcessCrashWhenNotAssociatedWithDataStore)
     94TEST(NetworkProcess, CrashWhenNotAssociatedWithDataStore)
    9595{
    9696    pid_t networkProcessPID = 0;
     
    121121    EXPECT_NE(networkProcessPID, [webView configuration].websiteDataStore._networkProcessIdentifier);
    122122}
     123
     124TEST(NetworkProcess, TerminateWhenUnused)
     125{
     126    RetainPtr<WKProcessPool> retainedPool;
     127    @autoreleasepool {
     128        auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
     129        configuration.get().websiteDataStore = [WKWebsiteDataStore nonPersistentDataStore];
     130        retainedPool = configuration.get().processPool;
     131        auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 0, 0) configuration:configuration.get()]);
     132        [webView synchronouslyLoadTestPageNamed:@"simple"];
     133        EXPECT_TRUE([WKWebsiteDataStore _defaultNetworkProcessExists]);
     134    }
     135    while ([WKWebsiteDataStore _defaultNetworkProcessExists])
     136        TestWebKitAPI::Util::spinRunLoop();
     137   
     138    retainedPool = nil;
     139   
     140    @autoreleasepool {
     141        auto webView = adoptNS([WKWebView new]);
     142        [webView synchronouslyLoadTestPageNamed:@"simple"];
     143        EXPECT_TRUE([WKWebsiteDataStore _defaultNetworkProcessExists]);
     144    }
     145    while ([WKWebsiteDataStore _defaultNetworkProcessExists])
     146        TestWebKitAPI::Util::spinRunLoop();
     147}
Note: See TracChangeset for help on using the changeset viewer.