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

Reply via email to