Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 7d93638aae8d51aacdd521d4311aff523dcdc1b6
https://github.com/WebKit/WebKit/commit/7d93638aae8d51aacdd521d4311aff523dcdc1b6
Author: Ben Nham <[email protected]>
Date: 2026-08-18 (Tue, 18 Aug 2026)
Changed paths:
M Source/WebKit/UIProcess/API/Cocoa/WKProcessPoolPrivate.h
M Source/WebKit/UIProcess/BrowsingContextGroup.cpp
M Source/WebKit/UIProcess/BrowsingContextGroup.h
M Source/WebKit/UIProcess/ProvisionalFrameProxy.cpp
M Source/WebKit/UIProcess/WebPageProxy.cpp
M Source/WebKit/UIProcess/WebPageProxy.h
M Source/WebKit/UIProcess/WebProcessCache.cpp
M Source/WebKit/UIProcess/WebProcessPool.cpp
M Source/WebKit/UIProcess/WebProcessPool.h
M Source/WebKit/UIProcess/WebProcessProxy.cpp
M Source/WebKit/UIProcess/WebProcessProxy.h
M Tools/TestWebKitAPI/Tests/WebKit/WKWebView/SiteIsolation.mm
M
Tools/TestWebKitAPI/Tests/WebKit/WKWebView/WebContentProcessDidTerminate.mm
Log Message:
-----------
Make process count limiter work better with Site Isolation
https://bugs.webkit.org/show_bug.cgi?id=321769
rdar://172301423
Reviewed by Sihui Liu.
The existing process count limiter depends on various codepaths maintaining an
LRU list of all
WebProcesses at navigation time. With Site Isolation enabled, this strategy
doesn't work, since the
LRU list maintenance didn't fan out to remote frame processes, so processes
that should logically be
clustered together in the LRU list ended up spread apart.
This patch replaces the LRU list of WebProcess with an LRU list of
WebPageProxy. LRU in this case
means:
1. Non-visible pages, in order of creation time
2. Visible pages, in order of last visible or focused time
So we upon reaching the process count limit, we first try to kill the page that
was visible the
longest time ago.
This also contains a couple of other drive-by fixes:
1. We arbitrarily raise the process count limit from 400 to 512 when Site
Isolation is enabled.
2. We stop prewarming processes if we're close to the process count limit.
Tests: Tools/TestWebKitAPI/Tests/WebKit/WKWebView/SiteIsolation.mm
Tools/TestWebKitAPI/Tests/WebKit/WKWebView/WebContentProcessDidTerminate.mm
* Source/WebKit/UIProcess/API/Cocoa/WKProcessPoolPrivate.h:
* Source/WebKit/UIProcess/BrowsingContextGroup.cpp:
(WebKit::BrowsingContextGroup::hasVisiblePage const):
* Source/WebKit/UIProcess/BrowsingContextGroup.h:
* Source/WebKit/UIProcess/ProvisionalFrameProxy.cpp:
(WebKit::ProvisionalFrameProxy::ProvisionalFrameProxy):
* Source/WebKit/UIProcess/WebPageProxy.cpp:
(WebKit::leastRecentlyVisiblePages):
(WebKit::leastRecentlyHiddenPages):
(WebKit::m_pageForTesting):
(WebKit::WebPageProxy::close):
(WebKit::WebPageProxy::loadRequestWithNavigationShared):
(WebKit::WebPageProxy::loadFile):
(WebKit::WebPageProxy::loadDataWithNavigationShared):
(WebKit::WebPageProxy::loadSimulatedRequest):
(WebKit::WebPageProxy::loadAlternateHTML):
(WebKit::WebPageProxy::reload):
(WebKit::WebPageProxy::goToBackForwardItem):
(WebKit::WebPageProxy::sendGoToBackForwardItemForFrame):
(WebKit::WebPageProxy::dispatchActivityStateChange):
(WebKit::WebPageProxy::leastRecentlyVisiblePageToUnload):
(WebKit::WebPageProxy::viewIsBecomingVisible):
(WebKit::WebPageProxy::viewIsBecomingInvisible):
* Source/WebKit/UIProcess/WebPageProxy.h:
* Source/WebKit/UIProcess/WebProcessCache.cpp:
(WebKit::WebProcessCache::canCacheProcess const):
* Source/WebKit/UIProcess/WebProcessPool.cpp:
(WebKit::WebProcessPool::prewarmProcess):
(WebKit::WebProcessPool::didReachGoodTimeToPrewarm):
(WebKit::WebProcessPool::reclaimIdleProcesses):
(WebKit::WebProcessPool::handleMemoryPressureWarning):
(WebKit::WebProcessPool::hasAnyProcessPoolUsedSiteIsolation):
(WebKit::WebProcessPool::processForNavigation):
* Source/WebKit/UIProcess/WebProcessPool.h:
* Source/WebKit/UIProcess/WebProcessProxy.cpp:
(WebKit::maxProcessCount):
(WebKit::WebProcessProxy::setProcessCountLimit):
(WebKit::WebProcessProxy::runningProcessCount):
(WebKit::WebProcessProxy::isNearingProcessCountLimit):
(WebKit::WebProcessProxy::hasReachedProcessCountLimit):
(WebKit::WebProcessProxy::didStartRunningProcess):
(WebKit::WebProcessProxy::didStopRunningProcess):
(WebKit::WebProcessProxy::create):
(WebKit::WebProcessProxy::reclaimProcessesIfNeeded):
(WebKit::WebProcessProxy::createForRemoteWorkers):
(WebKit::WebProcessProxy::~WebProcessProxy):
(WebKit::WebProcessProxy::addProvisionalPageProxy):
(WebKit::WebProcessProxy::addRemotePageProxy):
(WebKit::WebProcessProxy::shutDown):
(WebKit::WebProcessProxy::addExistingWebPage):
(WebKit::WebProcessProxy::processDidTerminateOrFailedToLaunch):
(WebKit::WebProcessProxy::didFinishLaunching):
(WebKit::WebProcessProxy::establishRemoteWorkerContext):
(WebKit::liveProcessesLRU): Deleted.
(WebKit::WebProcessProxy::markProcessAsRecentlyUsed): Deleted.
* Source/WebKit/UIProcess/WebProcessProxy.h:
* Tools/TestWebKitAPI/Tests/WebKit/WKWebView/SiteIsolation.mm:
(TestWebKitAPI::(SiteIsolation,
ProcessLimitUnloadsAllProcessesOfLeastRecentlyVisiblePage)):
* Tools/TestWebKitAPI/Tests/WebKit/WKWebView/WebContentProcessDidTerminate.mm:
(TEST(WKNavigation, WebProcessLimit)):
(TEST(WKNavigation, WebProcessLimitPrefersUnloadingNonVisiblePages)):
Canonical link: https://commits.webkit.org/319408@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications