Changeset 275487 in webkit
- Timestamp:
- Apr 5, 2021 9:03:31 PM (3 years ago)
- Location:
- trunk
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r275486 r275487 1 2021-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 1 27 2021-04-05 Alex Christensen <achristensen@webkit.org> 2 28 -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm
r275106 r275487 30 30 #import "AuthenticationChallengeDispositionCocoa.h" 31 31 #import "CompletionHandlerCallChecker.h" 32 #import "NetworkProcessProxy.h" 32 33 #import "ShouldGrandfatherStatistics.h" 33 34 #import "WKHTTPCookieStoreInternal.h" … … 725 726 } 726 727 728 + (BOOL)_defaultNetworkProcessExists 729 { 730 return !!WebKit::NetworkProcessProxy::defaultNetworkProcess(); 731 } 732 727 733 @end -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStorePrivate.h
r275106 r275487 99 99 + (void)_makeNextNetworkProcessLaunchFailForTesting WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA)); 100 100 - (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)); 101 102 102 103 @end -
trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp
r275389 r275487 102 102 } 103 103 104 static RefPtr<NetworkProcessProxy>& defaultProcess()104 RefPtr<NetworkProcessProxy>& NetworkProcessProxy::defaultNetworkProcess() 105 105 { 106 106 static NeverDestroyed<RefPtr<NetworkProcessProxy>> process; … … 108 108 } 109 109 110 Ref<NetworkProcessProxy> NetworkProcessProxy:: defaultNetworkProcess()111 { 112 if (!default Process())113 default Process() = NetworkProcessProxy::create();114 return *default Process();110 Ref<NetworkProcessProxy> NetworkProcessProxy::ensureDefaultNetworkProcess() 111 { 112 if (!defaultNetworkProcess()) 113 defaultNetworkProcess() = NetworkProcessProxy::create(); 114 return *defaultNetworkProcess(); 115 115 } 116 116 … … 311 311 m_uploadActivity = WTF::nullopt; 312 312 313 if (default Process() == this)314 default Process() = nullptr;313 if (defaultNetworkProcess() == this) 314 defaultNetworkProcess() = nullptr; 315 315 316 316 Ref<NetworkProcessProxy> protectedThis(*this); … … 1280 1280 if (canSendMessage()) 1281 1281 send(Messages::NetworkProcess::DestroySession { websiteDataStore.sessionID() }, 0); 1282 1283 if (m_websiteDataStores.computesEmpty()) 1284 defaultNetworkProcess() = nullptr; 1282 1285 } 1283 1286 -
trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h
r275389 r275487 109 109 using OpenerDomain = WebCore::RegistrableDomain; 110 110 111 static Ref<NetworkProcessProxy> defaultNetworkProcess(); 111 static Ref<NetworkProcessProxy> ensureDefaultNetworkProcess(); 112 static RefPtr<NetworkProcessProxy>& defaultNetworkProcess(); 112 113 static Ref<NetworkProcessProxy> create() { return adoptRef(*new NetworkProcessProxy); } 113 114 ~NetworkProcessProxy(); -
trunk/Source/WebKit/UIProcess/WebProcessPool.cpp
r275389 r275487 377 377 process->shutDown(); 378 378 } 379 380 if (processPools().isEmpty() && !!NetworkProcessProxy::defaultNetworkProcess()) 381 NetworkProcessProxy::defaultNetworkProcess() = nullptr; 379 382 } 380 383 -
trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp
r275389 r275487 201 201 #else 202 202 UNUSED_PARAM(sessionID); 203 return NetworkProcessProxy:: defaultNetworkProcess();203 return NetworkProcessProxy::ensureDefaultNetworkProcess(); 204 204 #endif 205 205 } -
trunk/Tools/ChangeLog
r275484 r275487 1 2021-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 1 12 2021-04-05 Alex Christensen <achristensen@webkit.org> 2 13 -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/NetworkProcess.mm
r275344 r275487 37 37 #import <wtf/Vector.h> 38 38 39 TEST( WebKit, NetworkProcessEntitlements)39 TEST(NetworkProcess, Entitlements) 40 40 { 41 41 auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:adoptNS([[WKWebViewConfiguration alloc] init]).get()]); … … 83 83 } 84 84 85 TEST( WebKit, NetworkProcessLaunchOnlyWhenNecessary)85 TEST(NetworkProcess, LaunchOnlyWhenNecessary) 86 86 { 87 87 auto webView = adoptNS([WKWebView new]); … … 92 92 } 93 93 94 TEST( WebKit, NetworkProcessCrashWhenNotAssociatedWithDataStore)94 TEST(NetworkProcess, CrashWhenNotAssociatedWithDataStore) 95 95 { 96 96 pid_t networkProcessPID = 0; … … 121 121 EXPECT_NE(networkProcessPID, [webView configuration].websiteDataStore._networkProcessIdentifier); 122 122 } 123 124 TEST(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.