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

Reply via email to