Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: eab29afc94f6123806de5d36d13f5089b9061767
https://github.com/WebKit/WebKit/commit/eab29afc94f6123806de5d36d13f5089b9061767
Author: Sihui Liu <[email protected]>
Date: 2026-08-13 (Thu, 13 Aug 2026)
Changed paths:
M Source/WebKit/NetworkProcess/Classifier/ResourceLoadStatisticsStore.cpp
M Source/WebKit/NetworkProcess/Classifier/ResourceLoadStatisticsStore.h
M Source/WebKit/NetworkProcess/Classifier/WebResourceLoadStatisticsStore.cpp
M Source/WebKit/NetworkProcess/Classifier/WebResourceLoadStatisticsStore.h
M Source/WebKit/NetworkProcess/NetworkProcess.cpp
M Source/WebKit/NetworkProcess/NetworkProcess.h
M Source/WebKit/NetworkProcess/NetworkProcess.messages.in
M Source/WebKit/Shared/WebsiteData/WebsiteData.cpp
M Source/WebKit/Shared/WebsiteData/WebsiteDataType.h
M Source/WebKit/Shared/WebsiteData/WebsiteDataType.serialization.in
M Source/WebKit/Sources.txt
M Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataRecord.mm
M Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataRecordInternal.h
M Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataRecordPrivate.h
M Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm
M Source/WebKit/UIProcess/BrowsingContextGroup.cpp
M Source/WebKit/UIProcess/WebPageProxy.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 Source/WebKit/UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm
A Source/WebKit/UIProcess/WebsiteData/IsolatedSitePersistence.cpp
A Source/WebKit/UIProcess/WebsiteData/IsolatedSitePersistence.h
M Source/WebKit/UIProcess/WebsiteData/IsolatedSiteStore.cpp
M Source/WebKit/UIProcess/WebsiteData/IsolatedSiteStore.h
M Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp
M Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h
M Source/WebKit/UIProcess/WebsiteData/WebsiteDataStoreConfiguration.cpp
M Source/WebKit/UIProcess/WebsiteData/WebsiteDataStoreConfiguration.h
M Source/WebKit/WebKit.xcodeproj/project.pbxproj
M Tools/TestWebKitAPI/Tests/WebKit/WKWebView/SiteIsolation.mm
M Tools/TestWebKitAPI/Tests/WebKit/WKWebView/WKWebsiteDatastore.mm
Log Message:
-----------
[Site Isolation] Introduce persistent backend for IsolatedSiteStore
https://bugs.webkit.org/show_bug.cgi?id=321572
rdar://184681796
Reviewed by Ryosuke Niwa.
IsolatedSiteStore was per-session and in-memory, so a site promoted by a
first-party visit, a gesture or an autofill was
forgotten at restart. Placement also consulted ITP's hadUserInteraction set on
every shared-process decision, so site
isolation stopped working as soon as tracking prevention was turned off.
To fix these, add a persistent backend for IsolatedSiteStore and remove
dependency on ITP.
- Add IsolatedSitePersistence, a SQLite database per WKWebsiteDataStore holding
each site's registrable domain, its
signals, and when a signal for it was last observed, plus whether the one-time
import from tracking prevention has
happened. The schema is versioned with PRAGMA user_version so a later column is
an added migration step; an
uninterpretable file is recreated, a transient failure such as a full disk is
not.
- IsolatedSiteStore owns one for non-ephemeral sessions and remains the only
read source: it keeps the full set in
memory, since placement needs a synchronous answer, and writes through.
Bring-up is staged — open and read the database,
then, if ITP is enabled, import its user-interaction domains once and record
that as done, so it is never asked again.
An ephemeral session has no database and so never imports. Placement waits for
the import to resolve, since it wants the
seeded entries. Removal and fetching wait only for the database read, so that
asking to inspect or delete this data
cannot cause it to be seeded first. Clearing everything skips a pending import
outright and still records it as done,
which avoids importing entries only to delete them and keeps the same browsing
from returning out of ITP's copy of it.
Narrower removals leave the import alone: clearing an hour, or one site, says
nothing about history predating this store.
- Placement no longer consults ITP at all, since the store now holds that data
itself. sharedProcessForSite drops its
fetchDomainsWithUserInteraction() call, processForSite loses the
isolatedDomains parameter that only that caller used,
and didHaveUserInteractionForSiteIsolation goes away along with the frameID
parameter of
recordUserGestureAuthorizationToken that existed only for it.
- Imported domains are tagged FirstPartyVisit and FirstPartyUserGesture, since
an interaction implies a visit and also
covers autofill and WebAuthn completion, and they carry ITP's own
mostRecentUserInteractionTime rather than the time of
the import, so eviction can tell recent use from old.
FetchWebsitesWithUserInteractions and the store methods behind it
therefore return a timestamp per domain, and return a std::optional so that
"nothing recorded" is distinguishable from
"could not be read": only the former records the import as done, so a failure
retries on a later launch instead of
losing the seeding for good.
- Add WebsiteDataType::IsolatedSiteRecord, scoped to the data store, so this
data can be fetched and removed like any
other website data — whole store, by modification time, or per domain. The
cutoff is rounded down to a day like the
entries themselves, so it over-deletes rather than under-deletes.
Tests: IsolatedSiteStore.PersistsAcrossSessions
IsolatedSiteStore.DataRemoval
IsolatedSiteStore.ImportsWhenTrackingPreventionIsTurnedOnLater
IsolatedSiteStore.PartialDataRemovalAllowsImport
IsolatedSiteStore.DataRemovalDoesNotImport
* Source/WebKit/NetworkProcess/Classifier/ResourceLoadStatisticsStore.cpp:
(WebKit::ResourceLoadStatisticsStore::loadWebsitesWithUserInteraction):
* Source/WebKit/NetworkProcess/Classifier/ResourceLoadStatisticsStore.h:
* Source/WebKit/NetworkProcess/Classifier/WebResourceLoadStatisticsStore.cpp:
(WebKit::WebResourceLoadStatisticsStore::loadWebsitesWithUserInteraction):
* Source/WebKit/NetworkProcess/Classifier/WebResourceLoadStatisticsStore.h:
* Source/WebKit/NetworkProcess/NetworkProcess.cpp:
(WebKit::NetworkProcess::fetchWebsitesWithUserInteractions):
* Source/WebKit/NetworkProcess/NetworkProcess.h:
* Source/WebKit/NetworkProcess/NetworkProcess.messages.in:
* Source/WebKit/Shared/WebsiteData/WebsiteData.cpp:
(WebKit::WebsiteData::ownerProcess):
* Source/WebKit/Shared/WebsiteData/WebsiteDataType.h:
(WebKit::toString):
* Source/WebKit/Shared/WebsiteData/WebsiteDataType.serialization.in:
* Source/WebKit/Sources.txt:
* Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataRecord.mm:
(dataTypesToString):
* Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataRecordInternal.h:
(WebKit::toWebsiteDataType):
(WebKit::toWKWebsiteDataTypes):
* Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataRecordPrivate.h:
* Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm:
(+[WKWebsiteDataStore _allWebsiteDataTypesIncludingPrivate]):
* Source/WebKit/UIProcess/BrowsingContextGroup.cpp:
(WebKit::BrowsingContextGroup::sharedProcessForSite):
* Source/WebKit/UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::launchProcess):
(WebKit::WebPageProxy::sendMouseEvent):
(WebKit::WebPageProxy::sendKeyEvent):
(WebKit::WebPageProxy::sendPreventableTouchEvent):
(WebKit::WebPageProxy::sendUnpreventableTouchEvent):
(WebKit::WebPageProxy::triggerBrowsingContextGroupSwitchForNavigation):
(WebKit::WebPageProxy::triggerProcessSwapForEnhancedSecurity):
* Source/WebKit/UIProcess/WebProcessPool.cpp:
(WebKit::WebProcessPool::processForSite):
(WebKit::WebProcessPool::createWebPage):
(WebKit::WebProcessPool::prepareProcessForNavigation):
(WebKit::WebProcessPool::processForNavigationInternal):
* Source/WebKit/UIProcess/WebProcessPool.h:
* Source/WebKit/UIProcess/WebProcessProxy.cpp:
(WebKit::WebProcessProxy::recordUserGestureAuthorizationToken):
* Source/WebKit/UIProcess/WebProcessProxy.h:
* Source/WebKit/UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm:
(WebKit::WebsiteDataStore::defaultIsolatedSitesDirectory):
* Source/WebKit/UIProcess/WebsiteData/IsolatedSitePersistence.cpp: Added.
(WebKit::IsolatedSitePersistence::IsolatedSitePersistence):
(WebKit::IsolatedSitePersistence::~IsolatedSitePersistence):
(WebKit::IsolatedSitePersistence::reportSQLError):
(WebKit::IsolatedSitePersistence::reportSQLErrorAndClassify):
(WebKit::databasePath):
(WebKit::IsolatedSitePersistence::openDatabase):
(WebKit::IsolatedSitePersistence::openDatabaseAtPath):
(WebKit::IsolatedSitePersistence::closeDatabase):
(WebKit::IsolatedSitePersistence::allSites):
(WebKit::IsolatedSitePersistence::setRecordForSite):
(WebKit::IsolatedSitePersistence::deleteAllSites):
(WebKit::IsolatedSitePersistence::deleteSitesUpdatedSince):
(WebKit::IsolatedSitePersistence::deleteSites):
(WebKit::IsolatedSitePersistence::didImportUserInteractions):
(WebKit::IsolatedSitePersistence::setDidImportUserInteractions):
* Source/WebKit/UIProcess/WebsiteData/IsolatedSitePersistence.h: Copied from
Source/WebKit/UIProcess/WebsiteData/IsolatedSiteStore.h.
* Source/WebKit/UIProcess/WebsiteData/IsolatedSiteStore.cpp:
(WebKit::roundDownToDay):
(WebKit::today):
(WebKit::IsolatedSiteStore::sharedWorkQueueSingleton):
(WebKit::IsolatedSiteStore::create):
(WebKit::IsolatedSiteStore::IsolatedSiteStore):
(WebKit::IsolatedSiteStore::~IsolatedSiteStore):
(WebKit::IsolatedSiteStore::didLoadSites):
(WebKit::IsolatedSiteStore::whenLoaded):
(WebKit::IsolatedSiteStore::skipImport):
(WebKit::IsolatedSiteStore::importUserInteractions):
(WebKit::IsolatedSiteStore::becomeReady):
(WebKit::IsolatedSiteStore::whenReady):
(WebKit::IsolatedSiteStore::saveSite):
(WebKit::IsolatedSiteStore::recordSignals):
(WebKit::IsolatedSiteStore::addSite):
(WebKit::IsolatedSiteStore::allDomains):
(WebKit::IsolatedSiteStore::removeAllSites):
(WebKit::IsolatedSiteStore::removeSitesUpdatedSince):
(WebKit::IsolatedSiteStore::removeSites):
(WebKit::IsolatedSiteStore::reasonsFor const):
(WebKit::IsolatedSiteStore::contains const):
(WebKit::IsolatedSiteStore::containsDomain const):
* Source/WebKit/UIProcess/WebsiteData/IsolatedSiteStore.h:
* Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp:
(WebKit::resolveDirectories):
(WebKit::WebsiteDataStore::fetchDomainsWithUserInteraction):
(WebKit::WebsiteDataStore::fetchDataAndApply):
(WebKit::WebsiteDataStore::removeData):
(WebKit::WebsiteDataStore::isolatedSiteStore):
(WebKit::WebsiteDataStore::isolatedSiteSignalsForTesting):
(WebKit::WebsiteDataStore::defaultIsolatedSitesDirectory):
(WebKit::WebsiteDataStore::didHaveUserInteractionForSiteIsolation): Deleted.
(WebKit::WebsiteDataStore::isolatedSiteSignalsForTesting const): Deleted.
* Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h:
(WebKit::WebsiteDataStore::isolatedSiteStore): Deleted.
* Source/WebKit/UIProcess/WebsiteData/WebsiteDataStoreConfiguration.cpp:
(WebKit::WebsiteDataStoreConfiguration::initializePaths):
(WebKit::WebsiteDataStoreConfiguration::Directories::isolatedCopy const):
(WebKit::WebsiteDataStoreConfiguration::Directories::isolatedCopy):
* Source/WebKit/UIProcess/WebsiteData/WebsiteDataStoreConfiguration.h:
(WebKit::WebsiteDataStoreConfiguration::setIsolatedSitesDirectory):
* Source/WebKit/WebKit.xcodeproj/project.pbxproj:
* Tools/TestWebKitAPI/Tests/WebKit/WKWebView/SiteIsolation.mm:
(TestWebKitAPI::(SiteIsolation, SharedProcessWithResourceLoadStatistics)):
(TestWebKitAPI::(SiteIsolation, SharedProcessAfterClick)):
(TestWebKitAPI::(SiteIsolation, SharedProcessAfterKeyDown)):
* Tools/TestWebKitAPI/Tests/WebKit/WKWebView/WKWebsiteDatastore.mm:
(TestWebKitAPI::(IsolatedSiteStore, PersistsAcrossSessions)):
(TestWebKitAPI::(IsolatedSiteStore, DataRemoval)):
(TestWebKitAPI::(IsolatedSiteStore, PartialDataRemovalAllowsImport)):
(TestWebKitAPI::(IsolatedSiteStore, DataRemovalDoesNotImport)):
(TestWebKitAPI::(IsolatedSiteStore,
ImportsWhenTrackingPreventionIsTurnedOnLater)):
Canonical link: https://commits.webkit.org/319151@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications