Changeset 245540 in webkit


Ignore:
Timestamp:
May 20, 2019 5:07:39 PM (5 years ago)
Author:
sihui_liu@apple.com
Message:

Move Web Storage to Network Process
https://bugs.webkit.org/show_bug.cgi?id=197636
Source/WebKit:

Reviewed by Youenn Fablet.

  • CMakeLists.txt:
  • DerivedSources.make:
  • NetworkProcess/NetworkConnectionToWebProcess.cpp:

(WebKit::NetworkConnectionToWebProcess::didReceiveMessage):
(WebKit::NetworkConnectionToWebProcess::didReceiveSyncMessage):
(WebKit::NetworkConnectionToWebProcess::didClose):
(WebKit::NetworkConnectionToWebProcess::webPageWasAdded):
(WebKit::NetworkConnectionToWebProcess::webPageWasRemoved):
(WebKit::NetworkConnectionToWebProcess::webProcessSessionChanged):

  • NetworkProcess/NetworkConnectionToWebProcess.h:
  • NetworkProcess/NetworkConnectionToWebProcess.messages.in:
  • NetworkProcess/NetworkProcess.cpp:

(WebKit::NetworkProcess::networkSessionByConnection const):
(WebKit::NetworkProcess::hasLocalStorage):
(WebKit::NetworkProcess::fetchWebsiteData):
(WebKit::NetworkProcess::deleteWebsiteData):
(WebKit::NetworkProcess::deleteWebsiteDataForOrigins):
(WebKit::filterForRegistrableDomains):
(WebKit::NetworkProcess::deleteWebsiteDataForRegistrableDomains):
(WebKit::NetworkProcess::webPageWasAdded):
(WebKit::NetworkProcess::webPageWasRemoved):
(WebKit::NetworkProcess::webProcessWasDisconnected):
(WebKit::NetworkProcess::webProcessSessionChanged):
(WebKit::NetworkProcess::getLocalStorageOriginDetails):

  • NetworkProcess/NetworkProcess.h:
  • NetworkProcess/NetworkProcess.messages.in:
  • NetworkProcess/NetworkSession.cpp:

(WebKit::NetworkSession::NetworkSession):
(WebKit::NetworkSession::~NetworkSession):

  • NetworkProcess/NetworkSession.h:

(WebKit::NetworkSession::storageManager):

  • NetworkProcess/NetworkSessionCreationParameters.cpp:

(WebKit::NetworkSessionCreationParameters::privateSessionParameters):
(WebKit::NetworkSessionCreationParameters::encode const):
(WebKit::NetworkSessionCreationParameters::decode):

  • NetworkProcess/NetworkSessionCreationParameters.h:
  • NetworkProcess/WebStorage/LocalStorageDatabase.cpp: Renamed from Source/WebKit/UIProcess/WebStorage/LocalStorageDatabase.cpp.

(WebKit::LocalStorageDatabase::create):
(WebKit::LocalStorageDatabase::LocalStorageDatabase):
(WebKit::LocalStorageDatabase::~LocalStorageDatabase):
(WebKit::LocalStorageDatabase::openDatabase):
(WebKit::LocalStorageDatabase::tryToOpenDatabase):
(WebKit::LocalStorageDatabase::migrateItemTableIfNeeded):
(WebKit::LocalStorageDatabase::importItems):
(WebKit::LocalStorageDatabase::setItem):
(WebKit::LocalStorageDatabase::removeItem):
(WebKit::LocalStorageDatabase::clear):
(WebKit::LocalStorageDatabase::close):
(WebKit::LocalStorageDatabase::itemDidChange):
(WebKit::LocalStorageDatabase::scheduleDatabaseUpdate):
(WebKit::LocalStorageDatabase::updateDatabase):
(WebKit::LocalStorageDatabase::updateDatabaseWithChangedItems):
(WebKit::LocalStorageDatabase::databaseIsEmpty):

  • NetworkProcess/WebStorage/LocalStorageDatabase.h: Renamed from Source/WebKit/UIProcess/WebStorage/LocalStorageDatabase.h.
  • NetworkProcess/WebStorage/LocalStorageDatabaseTracker.cpp: Renamed from Source/WebKit/UIProcess/WebStorage/LocalStorageDatabaseTracker.cpp.

(WebKit::LocalStorageDatabaseTracker::create):
(WebKit::LocalStorageDatabaseTracker::LocalStorageDatabaseTracker):
(WebKit::LocalStorageDatabaseTracker::~LocalStorageDatabaseTracker):
(WebKit::LocalStorageDatabaseTracker::databasePath const):
(WebKit::LocalStorageDatabaseTracker::didOpenDatabaseWithOrigin):
(WebKit::LocalStorageDatabaseTracker::deleteDatabaseWithOrigin):
(WebKit::LocalStorageDatabaseTracker::deleteAllDatabases):
(WebKit::LocalStorageDatabaseTracker::databasesModifiedSince):
(WebKit::LocalStorageDatabaseTracker::origins const):
(WebKit::LocalStorageDatabaseTracker::originDetails):

  • NetworkProcess/WebStorage/LocalStorageDatabaseTracker.h: Renamed from Source/WebKit/UIProcess/WebStorage/LocalStorageDatabaseTracker.h.
  • NetworkProcess/WebStorage/StorageManager.cpp: Renamed from Source/WebKit/UIProcess/WebStorage/StorageManager.cpp.

(WebKit::StorageManager::StorageArea::securityOrigin const):
(WebKit::StorageManager::StorageArea::isSessionStorage const):
(WebKit::StorageManager::LocalStorageNamespace::storageManager const):
(WebKit::StorageManager::TransientLocalStorageNamespace::create):
(WebKit::StorageManager::TransientLocalStorageNamespace::~TransientLocalStorageNamespace):
(WebKit::StorageManager::TransientLocalStorageNamespace::getOrCreateStorageArea):
(WebKit::StorageManager::TransientLocalStorageNamespace::origins const):
(WebKit::StorageManager::TransientLocalStorageNamespace::clearStorageAreasMatchingOrigin):
(WebKit::StorageManager::TransientLocalStorageNamespace::clearAllStorageAreas):
(WebKit::StorageManager::TransientLocalStorageNamespace::TransientLocalStorageNamespace):
(WebKit::StorageManager::StorageArea::create):
(WebKit::StorageManager::StorageArea::StorageArea):
(WebKit::StorageManager::StorageArea::~StorageArea):
(WebKit::StorageManager::StorageArea::addListener):
(WebKit::StorageManager::StorageArea::removeListener):
(WebKit::StorageManager::StorageArea::hasListener const):
(WebKit::StorageManager::StorageArea::clone const):
(WebKit::StorageManager::StorageArea::setItem):
(WebKit::StorageManager::StorageArea::removeItem):
(WebKit::StorageManager::StorageArea::clear):
(WebKit::StorageManager::StorageArea::items const):
(WebKit::StorageManager::StorageArea::openDatabaseAndImportItemsIfNeeded const):
(WebKit::StorageManager::StorageArea::dispatchEvents const):
(WebKit::StorageManager::LocalStorageNamespace::create):
(WebKit::StorageManager::LocalStorageNamespace::LocalStorageNamespace):
(WebKit::StorageManager::LocalStorageNamespace::~LocalStorageNamespace):
(WebKit::StorageManager::LocalStorageNamespace::getOrCreateStorageArea):
(WebKit::StorageManager::LocalStorageNamespace::didDestroyStorageArea):
(WebKit::StorageManager::LocalStorageNamespace::clearStorageAreasMatchingOrigin):
(WebKit::StorageManager::LocalStorageNamespace::clearAllStorageAreas):
(WebKit::StorageManager::SessionStorageNamespace::isEmpty const):
(WebKit::StorageManager::SessionStorageNamespace::allowedConnections const):
(WebKit::StorageManager::SessionStorageNamespace::origins const):
(WebKit::StorageManager::SessionStorageNamespace::clearStorageAreasMatchingOrigin):
(WebKit::StorageManager::SessionStorageNamespace::clearAllStorageAreas):
(WebKit::StorageManager::SessionStorageNamespace::create):
(WebKit::StorageManager::SessionStorageNamespace::SessionStorageNamespace):
(WebKit::StorageManager::SessionStorageNamespace::~SessionStorageNamespace):
(WebKit::StorageManager::SessionStorageNamespace::addAllowedConnection):
(WebKit::StorageManager::SessionStorageNamespace::removeAllowedConnection):
(WebKit::StorageManager::SessionStorageNamespace::getOrCreateStorageArea):
(WebKit::StorageManager::SessionStorageNamespace::cloneTo):
(WebKit::StorageManager::create):
(WebKit::StorageManager::StorageManager):
(WebKit::StorageManager::~StorageManager):
(WebKit::StorageManager::createSessionStorageNamespace):
(WebKit::StorageManager::destroySessionStorageNamespace):
(WebKit::StorageManager::addAllowedSessionStorageNamespaceConnection):
(WebKit::StorageManager::removeAllowedSessionStorageNamespaceConnection):
(WebKit::StorageManager::cloneSessionStorageNamespace):
(WebKit::StorageManager::processWillOpenConnection):
(WebKit::StorageManager::processDidCloseConnection):
(WebKit::StorageManager::getSessionStorageOrigins):
(WebKit::StorageManager::deleteSessionStorageOrigins):
(WebKit::StorageManager::deleteSessionStorageEntriesForOrigins):
(WebKit::StorageManager::getLocalStorageOrigins):
(WebKit::StorageManager::getLocalStorageOriginDetails):
(WebKit::StorageManager::deleteLocalStorageEntriesForOrigin):
(WebKit::StorageManager::deleteLocalStorageOriginsModifiedSince):
(WebKit::StorageManager::deleteLocalStorageEntriesForOrigins):
(WebKit::StorageManager::createLocalStorageMap):
(WebKit::StorageManager::createTransientLocalStorageMap):
(WebKit::StorageManager::createSessionStorageMap):
(WebKit::StorageManager::destroyStorageMap):
(WebKit::StorageManager::getValues):
(WebKit::StorageManager::setItem):
(WebKit::StorageManager::removeItem):
(WebKit::StorageManager::clear):
(WebKit::StorageManager::applicationWillTerminate):
(WebKit::StorageManager::findStorageArea const):
(WebKit::StorageManager::getOrCreateLocalStorageNamespace):
(WebKit::StorageManager::getOrCreateTransientLocalStorageNamespace):

  • NetworkProcess/WebStorage/StorageManager.h: Renamed from Source/WebKit/UIProcess/WebStorage/StorageManager.h.
  • NetworkProcess/WebStorage/StorageManager.messages.in: Renamed from Source/WebKit/UIProcess/WebStorage/StorageManager.messages.in.
  • NetworkProcess/WebStorage/ios/LocalStorageDatabaseTrackerIOS.mm: Copied from Source/WebKit/UIProcess/WebStorage/ios/LocalStorageDatabaseTrackerIOS.mm.

(WebKit::LocalStorageDatabaseTracker::platformMaybeExcludeFromBackup const):

  • NetworkProcess/cocoa/NetworkSessionCocoa.mm:

(WebKit::NetworkSessionCocoa::NetworkSessionCocoa):

  • NetworkProcess/curl/NetworkSessionCurl.cpp:

(WebKit::NetworkSessionCurl::NetworkSessionCurl):

  • NetworkProcess/soup/NetworkSessionSoup.cpp:

(WebKit::NetworkSessionSoup::NetworkSessionSoup):

  • PlatformMac.cmake:
  • PlatformWin.cmake:
  • Shared/WebPageCreationParameters.cpp:

(WebKit::WebPageCreationParameters::encode const):
(WebKit::WebPageCreationParameters::decode):

  • Shared/WebPageCreationParameters.h:
  • Shared/WebsiteData/WebsiteData.cpp:

(WebKit::WebsiteData::ownerProcess):

  • Sources.txt:
  • SourcesCocoa.txt:
  • UIProcess/API/C/WKKeyValueStorageManager.cpp:

(WKKeyValueStorageManagerGetKeyValueStorageOrigins):
(WKKeyValueStorageManagerGetStorageDetailsByOrigin):
(WKKeyValueStorageManagerDeleteEntriesForOrigin):
(WKKeyValueStorageManagerDeleteAllEntries):

  • UIProcess/Network/NetworkProcessProxy.cpp:

(WebKit::NetworkProcessProxy::hasLocalStorage):
(WebKit::NetworkProcessProxy::getLocalStorageDetails):

  • UIProcess/Network/NetworkProcessProxy.h:
  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::createNewPage):

  • UIProcess/WebProcessPool.cpp:

(WebKit::WebProcessPool::ensureNetworkProcess):

  • UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm:

(WebKit::WebsiteDataStore::parameters):
(WebKit::WebsiteDataStore::platformInitialize):
(WebKit::WebsiteDataStore::platformDestroy):

  • UIProcess/WebsiteData/WebsiteDataStore.cpp:

(WebKit::WebsiteDataStore::WebsiteDataStore):
(WebKit::computeNetworkProcessAccessTypeForDataFetch):
(WebKit::WebsiteDataStore::fetchDataAndApply):
(WebKit::WebsiteDataStore::removeData):
(WebKit::WebsiteDataStore::hasLocalStorageForTesting const):
(WebKit::WebsiteDataStore::parameters):
(WebKit::WebsiteDataStore::getLocalStorageDetails):
(WebKit::m_client): Deleted.
(WebKit::WebsiteDataStore::cloneSessionData): Deleted.
(WebKit::WebsiteDataStore::webPageWasAdded): Deleted.
(WebKit::WebsiteDataStore::webPageWasInvalidated): Deleted.
(WebKit::WebsiteDataStore::webProcessWillOpenConnection): Deleted.
(WebKit::WebsiteDataStore::webPageWillOpenConnection): Deleted.
(WebKit::WebsiteDataStore::webPageDidCloseConnection): Deleted.
(WebKit::WebsiteDataStore::webProcessDidCloseConnection): Deleted.

  • UIProcess/WebsiteData/WebsiteDataStore.h:

(WebKit::WebsiteDataStore::resolvedLocalStorageDirectory const):
(WebKit::WebsiteDataStore::storageManager): Deleted.

  • WebKit.xcodeproj/project.pbxproj:
  • WebProcess/InjectedBundle/InjectedBundle.cpp:

(WebKit::InjectedBundle::setPrivateBrowsingEnabled):

  • WebProcess/Network/NetworkProcessConnection.cpp:

(WebKit::NetworkProcessConnection::didReceiveMessage):

  • WebProcess/WebCoreSupport/WebChromeClient.cpp:

(WebKit::WebChromeClient::createWindow):

  • WebProcess/WebPage/WebPage.cpp:

(WebKit::WebPage::close):

  • WebProcess/WebProcess.cpp:

(WebKit::WebProcess::createWebPage):
(WebKit::WebProcess::removeWebPage):
(WebKit::WebProcess::ensureNetworkProcessConnection):
(WebKit::WebProcess::networkProcessConnectionClosed):
(WebKit::WebProcess::registerStorageAreaMap):
(WebKit::WebProcess::unregisterStorageAreaMap):
(WebKit::WebProcess::storageAreaMap const):
(WebKit::WebProcess::enablePrivateBrowsingForTesting):

  • WebProcess/WebProcess.h:
  • WebProcess/WebStorage/StorageAreaMap.cpp:

(WebKit::StorageAreaMap::StorageAreaMap):
(WebKit::StorageAreaMap::~StorageAreaMap):
(WebKit::StorageAreaMap::setItem):
(WebKit::StorageAreaMap::removeItem):
(WebKit::StorageAreaMap::clear):
(WebKit::StorageAreaMap::loadValuesIfNeeded):
(WebKit::StorageAreaMap::connect):
(WebKit::StorageAreaMap::disconnect):

  • WebProcess/WebStorage/StorageAreaMap.h:

(WebKit::StorageAreaMap::identifier const):

Tools:

Reviewed by Youenn Fablet.

  • TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
  • TestWebKitAPI/Tests/WebKitCocoa/LocalStorageDatabaseTracker.mm: Remove the wait for database file update.

(TEST):

  • TestWebKitAPI/Tests/WebKitCocoa/LocalStoragePersistence.mm: Add a test for network process crash recovery.

(TEST):

  • TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm: Fix a typo and add a test case to cover it.
  • TestWebKitAPI/Tests/WebKitCocoa/local-storage-process-crashes.html: Added.
Location:
trunk
Files:
3 added
1 deleted
46 edited
8 copied

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/CMakeLists.txt

    r245492 r245540  
    2121    "${WEBKIT_DIR}/NetworkProcess/IndexedDB"
    2222    "${WEBKIT_DIR}/NetworkProcess/ServiceWorker"
     23    "${WEBKIT_DIR}/NetworkProcess/WebStorage"
    2324    "${WEBKIT_DIR}/NetworkProcess/cache"
    2425    "${WEBKIT_DIR}/NetworkProcess/watchos"
     
    5960    "${WEBKIT_DIR}/UIProcess/WebAuthentication"
    6061    "${WEBKIT_DIR}/UIProcess/WebAuthentication/Mock"
    61     "${WEBKIT_DIR}/UIProcess/WebStorage"
    6262    "${WEBKIT_DIR}/UIProcess/WebsiteData"
    6363    "${WEBKIT_DIR}/WebProcess"
     
    118118    NetworkProcess/ServiceWorker/WebSWServerToContextConnection.messages.in
    119119
     120    NetworkProcess/WebStorage/StorageManager.messages.in
     121
    120122    NetworkProcess/cache/CacheStorageEngineConnection.messages.in
    121123
     
    157159
    158160    UIProcess/UserContent/WebUserContentControllerProxy.messages.in
    159 
    160     UIProcess/WebStorage/StorageManager.messages.in
    161161
    162162    WebProcess/WebProcess.messages.in
  • trunk/Source/WebKit/ChangeLog

    r245536 r245540  
     12019-05-20  Sihui Liu  <sihui_liu@apple.com>
     2
     3        Move Web Storage to Network Process
     4        https://bugs.webkit.org/show_bug.cgi?id=197636
     5
     6        Reviewed by Youenn Fablet.
     7
     8        * CMakeLists.txt:
     9        * DerivedSources.make:
     10        * NetworkProcess/NetworkConnectionToWebProcess.cpp:
     11        (WebKit::NetworkConnectionToWebProcess::didReceiveMessage):
     12        (WebKit::NetworkConnectionToWebProcess::didReceiveSyncMessage):
     13        (WebKit::NetworkConnectionToWebProcess::didClose):
     14        (WebKit::NetworkConnectionToWebProcess::webPageWasAdded):
     15        (WebKit::NetworkConnectionToWebProcess::webPageWasRemoved):
     16        (WebKit::NetworkConnectionToWebProcess::webProcessSessionChanged):
     17        * NetworkProcess/NetworkConnectionToWebProcess.h:
     18        * NetworkProcess/NetworkConnectionToWebProcess.messages.in:
     19        * NetworkProcess/NetworkProcess.cpp:
     20        (WebKit::NetworkProcess::networkSessionByConnection const):
     21        (WebKit::NetworkProcess::hasLocalStorage):
     22        (WebKit::NetworkProcess::fetchWebsiteData):
     23        (WebKit::NetworkProcess::deleteWebsiteData):
     24        (WebKit::NetworkProcess::deleteWebsiteDataForOrigins):
     25        (WebKit::filterForRegistrableDomains):
     26        (WebKit::NetworkProcess::deleteWebsiteDataForRegistrableDomains):
     27        (WebKit::NetworkProcess::webPageWasAdded):
     28        (WebKit::NetworkProcess::webPageWasRemoved):
     29        (WebKit::NetworkProcess::webProcessWasDisconnected):
     30        (WebKit::NetworkProcess::webProcessSessionChanged):
     31        (WebKit::NetworkProcess::getLocalStorageOriginDetails):
     32        * NetworkProcess/NetworkProcess.h:
     33        * NetworkProcess/NetworkProcess.messages.in:
     34        * NetworkProcess/NetworkSession.cpp:
     35        (WebKit::NetworkSession::NetworkSession):
     36        (WebKit::NetworkSession::~NetworkSession):
     37        * NetworkProcess/NetworkSession.h:
     38        (WebKit::NetworkSession::storageManager):
     39        * NetworkProcess/NetworkSessionCreationParameters.cpp:
     40        (WebKit::NetworkSessionCreationParameters::privateSessionParameters):
     41        (WebKit::NetworkSessionCreationParameters::encode const):
     42        (WebKit::NetworkSessionCreationParameters::decode):
     43        * NetworkProcess/NetworkSessionCreationParameters.h:
     44        * NetworkProcess/WebStorage/LocalStorageDatabase.cpp: Renamed from Source/WebKit/UIProcess/WebStorage/LocalStorageDatabase.cpp.
     45        (WebKit::LocalStorageDatabase::create):
     46        (WebKit::LocalStorageDatabase::LocalStorageDatabase):
     47        (WebKit::LocalStorageDatabase::~LocalStorageDatabase):
     48        (WebKit::LocalStorageDatabase::openDatabase):
     49        (WebKit::LocalStorageDatabase::tryToOpenDatabase):
     50        (WebKit::LocalStorageDatabase::migrateItemTableIfNeeded):
     51        (WebKit::LocalStorageDatabase::importItems):
     52        (WebKit::LocalStorageDatabase::setItem):
     53        (WebKit::LocalStorageDatabase::removeItem):
     54        (WebKit::LocalStorageDatabase::clear):
     55        (WebKit::LocalStorageDatabase::close):
     56        (WebKit::LocalStorageDatabase::itemDidChange):
     57        (WebKit::LocalStorageDatabase::scheduleDatabaseUpdate):
     58        (WebKit::LocalStorageDatabase::updateDatabase):
     59        (WebKit::LocalStorageDatabase::updateDatabaseWithChangedItems):
     60        (WebKit::LocalStorageDatabase::databaseIsEmpty):
     61        * NetworkProcess/WebStorage/LocalStorageDatabase.h: Renamed from Source/WebKit/UIProcess/WebStorage/LocalStorageDatabase.h.
     62        * NetworkProcess/WebStorage/LocalStorageDatabaseTracker.cpp: Renamed from Source/WebKit/UIProcess/WebStorage/LocalStorageDatabaseTracker.cpp.
     63        (WebKit::LocalStorageDatabaseTracker::create):
     64        (WebKit::LocalStorageDatabaseTracker::LocalStorageDatabaseTracker):
     65        (WebKit::LocalStorageDatabaseTracker::~LocalStorageDatabaseTracker):
     66        (WebKit::LocalStorageDatabaseTracker::databasePath const):
     67        (WebKit::LocalStorageDatabaseTracker::didOpenDatabaseWithOrigin):
     68        (WebKit::LocalStorageDatabaseTracker::deleteDatabaseWithOrigin):
     69        (WebKit::LocalStorageDatabaseTracker::deleteAllDatabases):
     70        (WebKit::LocalStorageDatabaseTracker::databasesModifiedSince):
     71        (WebKit::LocalStorageDatabaseTracker::origins const):
     72        (WebKit::LocalStorageDatabaseTracker::originDetails):
     73        * NetworkProcess/WebStorage/LocalStorageDatabaseTracker.h: Renamed from Source/WebKit/UIProcess/WebStorage/LocalStorageDatabaseTracker.h.
     74        * NetworkProcess/WebStorage/StorageManager.cpp: Renamed from Source/WebKit/UIProcess/WebStorage/StorageManager.cpp.
     75        (WebKit::StorageManager::StorageArea::securityOrigin const):
     76        (WebKit::StorageManager::StorageArea::isSessionStorage const):
     77        (WebKit::StorageManager::LocalStorageNamespace::storageManager const):
     78        (WebKit::StorageManager::TransientLocalStorageNamespace::create):
     79        (WebKit::StorageManager::TransientLocalStorageNamespace::~TransientLocalStorageNamespace):
     80        (WebKit::StorageManager::TransientLocalStorageNamespace::getOrCreateStorageArea):
     81        (WebKit::StorageManager::TransientLocalStorageNamespace::origins const):
     82        (WebKit::StorageManager::TransientLocalStorageNamespace::clearStorageAreasMatchingOrigin):
     83        (WebKit::StorageManager::TransientLocalStorageNamespace::clearAllStorageAreas):
     84        (WebKit::StorageManager::TransientLocalStorageNamespace::TransientLocalStorageNamespace):
     85        (WebKit::StorageManager::StorageArea::create):
     86        (WebKit::StorageManager::StorageArea::StorageArea):
     87        (WebKit::StorageManager::StorageArea::~StorageArea):
     88        (WebKit::StorageManager::StorageArea::addListener):
     89        (WebKit::StorageManager::StorageArea::removeListener):
     90        (WebKit::StorageManager::StorageArea::hasListener const):
     91        (WebKit::StorageManager::StorageArea::clone const):
     92        (WebKit::StorageManager::StorageArea::setItem):
     93        (WebKit::StorageManager::StorageArea::removeItem):
     94        (WebKit::StorageManager::StorageArea::clear):
     95        (WebKit::StorageManager::StorageArea::items const):
     96        (WebKit::StorageManager::StorageArea::openDatabaseAndImportItemsIfNeeded const):
     97        (WebKit::StorageManager::StorageArea::dispatchEvents const):
     98        (WebKit::StorageManager::LocalStorageNamespace::create):
     99        (WebKit::StorageManager::LocalStorageNamespace::LocalStorageNamespace):
     100        (WebKit::StorageManager::LocalStorageNamespace::~LocalStorageNamespace):
     101        (WebKit::StorageManager::LocalStorageNamespace::getOrCreateStorageArea):
     102        (WebKit::StorageManager::LocalStorageNamespace::didDestroyStorageArea):
     103        (WebKit::StorageManager::LocalStorageNamespace::clearStorageAreasMatchingOrigin):
     104        (WebKit::StorageManager::LocalStorageNamespace::clearAllStorageAreas):
     105        (WebKit::StorageManager::SessionStorageNamespace::isEmpty const):
     106        (WebKit::StorageManager::SessionStorageNamespace::allowedConnections const):
     107        (WebKit::StorageManager::SessionStorageNamespace::origins const):
     108        (WebKit::StorageManager::SessionStorageNamespace::clearStorageAreasMatchingOrigin):
     109        (WebKit::StorageManager::SessionStorageNamespace::clearAllStorageAreas):
     110        (WebKit::StorageManager::SessionStorageNamespace::create):
     111        (WebKit::StorageManager::SessionStorageNamespace::SessionStorageNamespace):
     112        (WebKit::StorageManager::SessionStorageNamespace::~SessionStorageNamespace):
     113        (WebKit::StorageManager::SessionStorageNamespace::addAllowedConnection):
     114        (WebKit::StorageManager::SessionStorageNamespace::removeAllowedConnection):
     115        (WebKit::StorageManager::SessionStorageNamespace::getOrCreateStorageArea):
     116        (WebKit::StorageManager::SessionStorageNamespace::cloneTo):
     117        (WebKit::StorageManager::create):
     118        (WebKit::StorageManager::StorageManager):
     119        (WebKit::StorageManager::~StorageManager):
     120        (WebKit::StorageManager::createSessionStorageNamespace):
     121        (WebKit::StorageManager::destroySessionStorageNamespace):
     122        (WebKit::StorageManager::addAllowedSessionStorageNamespaceConnection):
     123        (WebKit::StorageManager::removeAllowedSessionStorageNamespaceConnection):
     124        (WebKit::StorageManager::cloneSessionStorageNamespace):
     125        (WebKit::StorageManager::processWillOpenConnection):
     126        (WebKit::StorageManager::processDidCloseConnection):
     127        (WebKit::StorageManager::getSessionStorageOrigins):
     128        (WebKit::StorageManager::deleteSessionStorageOrigins):
     129        (WebKit::StorageManager::deleteSessionStorageEntriesForOrigins):
     130        (WebKit::StorageManager::getLocalStorageOrigins):
     131        (WebKit::StorageManager::getLocalStorageOriginDetails):
     132        (WebKit::StorageManager::deleteLocalStorageEntriesForOrigin):
     133        (WebKit::StorageManager::deleteLocalStorageOriginsModifiedSince):
     134        (WebKit::StorageManager::deleteLocalStorageEntriesForOrigins):
     135        (WebKit::StorageManager::createLocalStorageMap):
     136        (WebKit::StorageManager::createTransientLocalStorageMap):
     137        (WebKit::StorageManager::createSessionStorageMap):
     138        (WebKit::StorageManager::destroyStorageMap):
     139        (WebKit::StorageManager::getValues):
     140        (WebKit::StorageManager::setItem):
     141        (WebKit::StorageManager::removeItem):
     142        (WebKit::StorageManager::clear):
     143        (WebKit::StorageManager::applicationWillTerminate):
     144        (WebKit::StorageManager::findStorageArea const):
     145        (WebKit::StorageManager::getOrCreateLocalStorageNamespace):
     146        (WebKit::StorageManager::getOrCreateTransientLocalStorageNamespace):
     147        * NetworkProcess/WebStorage/StorageManager.h: Renamed from Source/WebKit/UIProcess/WebStorage/StorageManager.h.
     148        * NetworkProcess/WebStorage/StorageManager.messages.in: Renamed from Source/WebKit/UIProcess/WebStorage/StorageManager.messages.in.
     149        * NetworkProcess/WebStorage/ios/LocalStorageDatabaseTrackerIOS.mm: Copied from Source/WebKit/UIProcess/WebStorage/ios/LocalStorageDatabaseTrackerIOS.mm.
     150        (WebKit::LocalStorageDatabaseTracker::platformMaybeExcludeFromBackup const):
     151        * NetworkProcess/cocoa/NetworkSessionCocoa.mm:
     152        (WebKit::NetworkSessionCocoa::NetworkSessionCocoa):
     153        * NetworkProcess/curl/NetworkSessionCurl.cpp:
     154        (WebKit::NetworkSessionCurl::NetworkSessionCurl):
     155        * NetworkProcess/soup/NetworkSessionSoup.cpp:
     156        (WebKit::NetworkSessionSoup::NetworkSessionSoup):
     157        * PlatformMac.cmake:
     158        * PlatformWin.cmake:
     159        * Shared/WebPageCreationParameters.cpp:
     160        (WebKit::WebPageCreationParameters::encode const):
     161        (WebKit::WebPageCreationParameters::decode):
     162        * Shared/WebPageCreationParameters.h:
     163        * Shared/WebsiteData/WebsiteData.cpp:
     164        (WebKit::WebsiteData::ownerProcess):
     165        * Sources.txt:
     166        * SourcesCocoa.txt:
     167        * UIProcess/API/C/WKKeyValueStorageManager.cpp:
     168        (WKKeyValueStorageManagerGetKeyValueStorageOrigins):
     169        (WKKeyValueStorageManagerGetStorageDetailsByOrigin):
     170        (WKKeyValueStorageManagerDeleteEntriesForOrigin):
     171        (WKKeyValueStorageManagerDeleteAllEntries):
     172        * UIProcess/Network/NetworkProcessProxy.cpp:
     173        (WebKit::NetworkProcessProxy::hasLocalStorage):
     174        (WebKit::NetworkProcessProxy::getLocalStorageDetails):
     175        * UIProcess/Network/NetworkProcessProxy.h:
     176        * UIProcess/WebPageProxy.cpp:
     177        (WebKit::WebPageProxy::createNewPage):
     178        * UIProcess/WebProcessPool.cpp:
     179        (WebKit::WebProcessPool::ensureNetworkProcess):
     180        * UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm:
     181        (WebKit::WebsiteDataStore::parameters):
     182        (WebKit::WebsiteDataStore::platformInitialize):
     183        (WebKit::WebsiteDataStore::platformDestroy):
     184        * UIProcess/WebsiteData/WebsiteDataStore.cpp:
     185        (WebKit::WebsiteDataStore::WebsiteDataStore):
     186        (WebKit::computeNetworkProcessAccessTypeForDataFetch):
     187        (WebKit::WebsiteDataStore::fetchDataAndApply):
     188        (WebKit::WebsiteDataStore::removeData):
     189        (WebKit::WebsiteDataStore::hasLocalStorageForTesting const):
     190        (WebKit::WebsiteDataStore::parameters):
     191        (WebKit::WebsiteDataStore::getLocalStorageDetails):
     192        (WebKit::m_client): Deleted.
     193        (WebKit::WebsiteDataStore::cloneSessionData): Deleted.
     194        (WebKit::WebsiteDataStore::webPageWasAdded): Deleted.
     195        (WebKit::WebsiteDataStore::webPageWasInvalidated): Deleted.
     196        (WebKit::WebsiteDataStore::webProcessWillOpenConnection): Deleted.
     197        (WebKit::WebsiteDataStore::webPageWillOpenConnection): Deleted.
     198        (WebKit::WebsiteDataStore::webPageDidCloseConnection): Deleted.
     199        (WebKit::WebsiteDataStore::webProcessDidCloseConnection): Deleted.
     200        * UIProcess/WebsiteData/WebsiteDataStore.h:
     201        (WebKit::WebsiteDataStore::resolvedLocalStorageDirectory const):
     202        (WebKit::WebsiteDataStore::storageManager): Deleted.
     203        * WebKit.xcodeproj/project.pbxproj:
     204        * WebProcess/InjectedBundle/InjectedBundle.cpp:
     205        (WebKit::InjectedBundle::setPrivateBrowsingEnabled):
     206        * WebProcess/Network/NetworkProcessConnection.cpp:
     207        (WebKit::NetworkProcessConnection::didReceiveMessage):
     208        * WebProcess/WebCoreSupport/WebChromeClient.cpp:
     209        (WebKit::WebChromeClient::createWindow):
     210        * WebProcess/WebPage/WebPage.cpp:
     211        (WebKit::WebPage::close):
     212        * WebProcess/WebProcess.cpp:
     213        (WebKit::WebProcess::createWebPage):
     214        (WebKit::WebProcess::removeWebPage):
     215        (WebKit::WebProcess::ensureNetworkProcessConnection):
     216        (WebKit::WebProcess::networkProcessConnectionClosed):
     217        (WebKit::WebProcess::registerStorageAreaMap):
     218        (WebKit::WebProcess::unregisterStorageAreaMap):
     219        (WebKit::WebProcess::storageAreaMap const):
     220        (WebKit::WebProcess::enablePrivateBrowsingForTesting):
     221        * WebProcess/WebProcess.h:
     222        * WebProcess/WebStorage/StorageAreaMap.cpp:
     223        (WebKit::StorageAreaMap::StorageAreaMap):
     224        (WebKit::StorageAreaMap::~StorageAreaMap):
     225        (WebKit::StorageAreaMap::setItem):
     226        (WebKit::StorageAreaMap::removeItem):
     227        (WebKit::StorageAreaMap::clear):
     228        (WebKit::StorageAreaMap::loadValuesIfNeeded):
     229        (WebKit::StorageAreaMap::connect):
     230        (WebKit::StorageAreaMap::disconnect):
     231        * WebProcess/WebStorage/StorageAreaMap.h:
     232        (WebKit::StorageAreaMap::identifier const):
     233
    12342019-05-20  Ross Kirsling  <ross.kirsling@sony.com>
    2235
  • trunk/Source/WebKit/DerivedSources-input.xcfilelist

    r244100 r245540  
    2525$(PROJECT_DIR)/NetworkProcess/ServiceWorker/WebSWServerConnection.messages.in
    2626$(PROJECT_DIR)/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.messages.in
     27$(PROJECT_DIR)/NetworkProcess/WebStorage/StorageManager.messages.in
    2728$(PROJECT_DIR)/NetworkProcess/cache/CacheStorageEngineConnection.messages.in
    2829$(PROJECT_DIR)/NetworkProcess/mac/com.apple.WebKit.NetworkProcess.sb.in
  • trunk/Source/WebKit/DerivedSources.make

    r244696 r245540  
    3131    $(WebKit2)/NetworkProcess/IndexedDB \
    3232    $(WebKit2)/NetworkProcess/ServiceWorker \
     33    $(WebKit2)/NetworkProcess/WebStorage \
    3334    $(WebKit2)/PluginProcess \
    3435    $(WebKit2)/PluginProcess/mac \
     
    8081    $(WebKit2)/UIProcess/UserContent \
    8182    $(WebKit2)/UIProcess/WebAuthentication \
    82     $(WebKit2)/UIProcess/WebStorage \
    8383    $(WebKit2)/UIProcess/mac \
    8484    $(WebKit2)/UIProcess/ios \
  • trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp

    r245427 r245540  
    4747#include "PreconnectTask.h"
    4848#include "ServiceWorkerFetchTaskMessages.h"
     49#include "StorageManager.h"
     50#include "StorageManagerMessages.h"
    4951#include "WebCoreArgumentCoders.h"
    5052#include "WebErrors.h"
     
    224226#endif
    225227
     228    if (decoder.messageReceiverName() == Messages::StorageManager::messageReceiverName()) {
     229        if (auto* session = m_networkProcess->networkSessionByConnection(connection)) {
     230            session->storageManager().dispatchMessageToQueue(connection, decoder);
     231            return;
     232        }
     233    }
     234
    226235    ASSERT_NOT_REACHED();
    227236}
     
    263272#endif
    264273
     274    if (decoder.messageReceiverName() == Messages::StorageManager::messageReceiverName()) {
     275        if (auto* session = m_networkProcess->networkSessionByConnection(connection)) {
     276            session->storageManager().dispatchSyncMessageToQueue(connection, decoder, reply);
     277            return;
     278        }
     279    }
     280
    265281    ASSERT_NOT_REACHED();
    266282}
     
    288304    // root activity trackers.
    289305    stopAllNetworkActivityTracking();
     306
     307    m_networkProcess->webProcessWasDisconnected(connection);
    290308
    291309    m_networkProcess->networkBlobRegistry().connectionToWebProcessDidClose(*this);
     
    886904}
    887905
     906void NetworkConnectionToWebProcess::webPageWasAdded(PAL::SessionID sessionID, uint64_t pageID, uint64_t oldPageID)
     907{
     908    m_networkProcess->webPageWasAdded(m_connection.get(), sessionID, pageID, oldPageID);
     909}
     910
     911void NetworkConnectionToWebProcess::webPageWasRemoved(PAL::SessionID sessionID, uint64_t pageID)
     912{
     913    m_networkProcess->webPageWasRemoved(m_connection.get(), sessionID, pageID);
     914}
     915
     916void NetworkConnectionToWebProcess::webProcessSessionChanged(PAL::SessionID newSessionID, const Vector<uint64_t>& pages)
     917{
     918    m_networkProcess->webProcessSessionChanged(m_connection.get(), newSessionID, pages);
     919}
     920
    888921} // namespace WebKit
  • trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h

    r245025 r245540  
    145145    void clearConnectionHasUploads();
    146146
     147    void webPageWasAdded(PAL::SessionID, uint64_t pageID, uint64_t oldPageID);
     148    void webPageWasRemoved(PAL::SessionID, uint64_t pageID);
     149    void webProcessSessionChanged(PAL::SessionID newSessionID, const Vector<uint64_t>& pages);
     150
    147151private:
    148152    NetworkConnectionToWebProcess(NetworkProcess&, IPC::Connection::Identifier);
  • trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in

    r245025 r245540  
    8787
    8888    SetWebProcessIdentifier(WebCore::ProcessIdentifier processIdentifier)
     89
     90    WebPageWasAdded(PAL::SessionID sessionID, uint64_t pageID, uint64_t oldPageID)
     91    WebPageWasRemoved(PAL::SessionID sessionID, uint64_t pageID)
     92    WebProcessSessionChanged(PAL::SessionID newSessionID, Vector<uint64_t> pages)
    8993}
  • trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp

    r245334 r245540  
    5454#include "StatisticsData.h"
    5555#include "StorageAccessStatus.h"
     56#include "StorageManager.h"
     57#include "StorageManagerMessages.h"
    5658#include "WebCookieManager.h"
    5759#include "WebPageProxyMessages.h"
     
    561563}
    562564
     565NetworkSession* NetworkProcess::networkSessionByConnection(IPC::Connection& connection) const
     566{
     567    if (!m_sessionByConnection.contains(connection.uniqueID()))
     568        return nullptr;
     569
     570    return networkSession(m_sessionByConnection.get(connection.uniqueID()));
     571}
     572
    563573void NetworkProcess::setSession(const PAL::SessionID& sessionID, Ref<NetworkSession>&& session)
    564574{
     
    10121022}
    10131023
     1024void NetworkProcess::hasLocalStorage(PAL::SessionID sessionID, const RegistrableDomain& domain, CompletionHandler<void(bool)>&& completionHandler)
     1025{
     1026    if (auto* session = networkSession(sessionID)) {
     1027        session->storageManager().getLocalStorageOrigins([domain, completionHandler = WTFMove(completionHandler)](auto&& origins) mutable {
     1028            completionHandler(WTF::anyOf(origins, [&domain](auto& origin) {
     1029                return domain.matches(origin);
     1030            }));
     1031        });
     1032        return;
     1033    }
     1034    completionHandler(false);
     1035}
     1036
    10141037void NetworkProcess::removePrevalentDomains(PAL::SessionID sessionID, const Vector<RegistrableDomain>& domains)
    10151038{
     
    12581281        CacheStorage::Engine::fetchEntries(*this, sessionID, fetchOptions.contains(WebsiteDataFetchOption::ComputeSizes), [callbackAggregator = callbackAggregator.copyRef()](auto entries) mutable {
    12591282            callbackAggregator->m_websiteData.entries.appendVector(entries);
     1283        });
     1284    }
     1285
     1286    auto* session = networkSession(sessionID);
     1287    if (websiteDataTypes.contains(WebsiteDataType::SessionStorage) && session) {
     1288        session->storageManager().getSessionStorageOrigins([callbackAggregator = callbackAggregator.copyRef()](auto&& origins) {
     1289            while (!origins.isEmpty())
     1290                callbackAggregator->m_websiteData.entries.append(WebsiteData::Entry { origins.takeAny(), WebsiteDataType::SessionStorage, 0 });
     1291        });
     1292    }
     1293
     1294    if (websiteDataTypes.contains(WebsiteDataType::LocalStorage) && session) {
     1295        session->storageManager().getLocalStorageOrigins([callbackAggregator = callbackAggregator.copyRef()](auto&& origins) {
     1296            while (!origins.isEmpty())
     1297                callbackAggregator->m_websiteData.entries.append(WebsiteData::Entry { origins.takeAny(), WebsiteDataType::LocalStorage, 0 });
    12601298        });
    12611299    }
     
    13231361    if (websiteDataTypes.contains(WebsiteDataType::DOMCache))
    13241362        CacheStorage::Engine::clearAllCaches(*this, sessionID, [clearTasksHandler = clearTasksHandler.copyRef()] { });
     1363
     1364    auto* session = networkSession(sessionID);
     1365    if (websiteDataTypes.contains(WebsiteDataType::SessionStorage) && session)
     1366        session->storageManager().deleteSessionStorageOrigins([clearTasksHandler = clearTasksHandler.copyRef()] { });
     1367
     1368    if (websiteDataTypes.contains(WebsiteDataType::LocalStorage) && session)
     1369        session->storageManager().deleteLocalStorageOriginsModifiedSince(modifiedSince, [clearTasksHandler = clearTasksHandler.copyRef()] { });
    13251370
    13261371#if ENABLE(INDEXED_DATABASE)
     
    14171462    }
    14181463
     1464    auto* session = networkSession(sessionID);
     1465    if (websiteDataTypes.contains(WebsiteDataType::SessionStorage) && session)
     1466        session->storageManager().deleteSessionStorageEntriesForOrigins(originDatas, [clearTasksHandler = clearTasksHandler.copyRef()] { });
     1467
     1468    if (websiteDataTypes.contains(WebsiteDataType::LocalStorage) && session)
     1469        session->storageManager().deleteLocalStorageEntriesForOrigins(originDatas, [clearTasksHandler = clearTasksHandler.copyRef()] { });
     1470
    14191471#if ENABLE(INDEXED_DATABASE)
    14201472    if (websiteDataTypes.contains(WebsiteDataType::IndexedDBDatabases) && !sessionID.isEphemeral())
     
    14751527   
    14761528    return result;
     1529}
     1530
     1531static Vector<WebCore::SecurityOriginData> filterForRegistrableDomains(const HashSet<WebCore::SecurityOriginData>& origins, const Vector<RegistrableDomain>& domainsToDelete, HashSet<RegistrableDomain>& domainsDeleted)
     1532{
     1533    Vector<SecurityOriginData> originsDeleted;
     1534    for (const auto& origin : origins) {
     1535        auto domain = RegistrableDomain::uncheckedCreateFromHost(origin.host);
     1536        if (!domainsToDelete.contains(domain))
     1537            continue;
     1538        originsDeleted.append(origin);
     1539        domainsDeleted.add(domain);
     1540    }
     1541
     1542    return originsDeleted;
    14771543}
    14781544
     
    15851651        });
    15861652    }
    1587    
     1653
     1654    auto* session = networkSession(sessionID);
     1655    if (session) {
     1656        auto& storageManager = session->storageManager();
     1657        if (websiteDataTypes.contains(WebsiteDataType::SessionStorage)) {
     1658            storageManager.getSessionStorageOrigins([storageManager = makeRefPtr(storageManager), callbackAggregator = callbackAggregator.copyRef(), domainsToDeleteAllButCookiesFor](auto&& origins) {
     1659                auto originsToDelete = filterForRegistrableDomains(origins, domainsToDeleteAllButCookiesFor, callbackAggregator->m_domains);
     1660                storageManager->deleteSessionStorageEntriesForOrigins(originsToDelete, [callbackAggregator = callbackAggregator.copyRef()] { });
     1661            });
     1662        }
     1663
     1664        if (websiteDataTypes.contains(WebsiteDataType::LocalStorage)) {
     1665            storageManager.getLocalStorageOrigins([storageManager = makeRefPtr(storageManager), callbackAggregator = callbackAggregator.copyRef(), domainsToDeleteAllButCookiesFor](auto&& origins) {
     1666                auto originsToDelete = filterForRegistrableDomains(origins, domainsToDeleteAllButCookiesFor, callbackAggregator->m_domains);
     1667                storageManager->deleteLocalStorageEntriesForOrigins(originsToDelete, [callbackAggregator = callbackAggregator.copyRef()] { });
     1668            });
     1669        }
     1670    }
     1671
    15881672#if ENABLE(INDEXED_DATABASE)
    15891673    auto path = m_idbDatabasePaths.get(sessionID);
     
    25362620}
    25372621
     2622void NetworkProcess::webPageWasAdded(IPC::Connection& connection, PAL::SessionID sessionID, uint64_t pageID, uint64_t oldPageID)
     2623{
     2624    if (!pageID || !oldPageID) {
     2625        LOG_ERROR("Cannot add page with invalid id");
     2626        return;
     2627    }
     2628
     2629    auto* session = networkSession(sessionID);
     2630    if (!session) {
     2631        LOG_ERROR("Cannot add page to an unknown session");
     2632        return;
     2633    }
     2634    auto& storageManager = session->storageManager();
     2635
     2636    auto connectionID = connection.uniqueID();
     2637    m_sessionByConnection.ensure(connectionID, [&]() {
     2638        storageManager.processWillOpenConnection(connection);
     2639        return sessionID;
     2640    });
     2641
     2642    storageManager.createSessionStorageNamespace(pageID, std::numeric_limits<unsigned>::max());
     2643    storageManager.addAllowedSessionStorageNamespaceConnection(pageID, connection);
     2644    if (pageID != oldPageID)
     2645        storageManager.cloneSessionStorageNamespace(oldPageID, pageID);
     2646}
     2647
     2648void NetworkProcess::webPageWasRemoved(IPC::Connection& connection, PAL::SessionID sessionID, uint64_t pageID)
     2649{
     2650    if (!pageID) {
     2651        LOG_ERROR("Cannot remove page with invalid id");
     2652        return;
     2653    }
     2654
     2655    auto* session = networkSession(sessionID);
     2656    // Session can be destroyed before page gets removed.
     2657    if (!session)
     2658        return;
     2659
     2660    auto& storageManager = session->storageManager();
     2661    storageManager.removeAllowedSessionStorageNamespaceConnection(pageID, connection);
     2662    storageManager.destroySessionStorageNamespace(pageID);
     2663}
     2664
     2665void NetworkProcess::webProcessWasDisconnected(IPC::Connection& connection)
     2666{
     2667    auto connectionID = connection.uniqueID();
     2668    if (!m_sessionByConnection.contains(connectionID))
     2669        return;
     2670
     2671    auto sessionID = m_sessionByConnection.take(connectionID);
     2672    if (!m_networkSessions.contains(sessionID))
     2673        return;
     2674
     2675    networkSession(sessionID)->storageManager().processDidCloseConnection(connection);
     2676}
     2677
     2678void NetworkProcess::webProcessSessionChanged(IPC::Connection& connection, PAL::SessionID newSessionID, const Vector<uint64_t>& pageIDs)
     2679{
     2680    auto connectionID = connection.uniqueID();
     2681    ASSERT(m_sessionByConnection.contains(connectionID));
     2682    if (m_sessionByConnection.get(connectionID) == newSessionID)
     2683        return;
     2684
     2685    webProcessWasDisconnected(connection);
     2686    for (auto& pageID : pageIDs)
     2687        webPageWasAdded(connection, newSessionID, pageID, pageID);
     2688}
     2689
     2690void NetworkProcess::getLocalStorageOriginDetails(PAL::SessionID sessionID, CompletionHandler<void(Vector<LocalStorageDatabaseTracker::OriginDetails>&&)>&& completionHandler)
     2691{
     2692    auto* session = networkSession(sessionID);
     2693    if (!session) {
     2694        LOG_ERROR("Cannot get local storage information for an unknown session");
     2695        return;
     2696    }
     2697
     2698    auto& storageManager = session->storageManager();
     2699    storageManager.getLocalStorageOriginDetails([completionHandler = WTFMove(completionHandler)](auto&& details) mutable {
     2700        completionHandler(WTFMove(details));
     2701    });
     2702}
     2703
    25382704} // namespace WebKit
  • trunk/Source/WebKit/NetworkProcess/NetworkProcess.h

    r245334 r245540  
    2929#include "CacheModel.h"
    3030#include "DownloadManager.h"
     31#include "LocalStorageDatabaseTracker.h"
    3132#include "NetworkBlobRegistry.h"
    3233#include "NetworkContentRuleListManager.h"
     
    165166    void setSession(const PAL::SessionID&, Ref<NetworkSession>&&);
    166167    NetworkSession* networkSession(const PAL::SessionID&) const override;
     168    NetworkSession* networkSessionByConnection(IPC::Connection&) const;
    167169    void destroySession(const PAL::SessionID&);
    168170
     
    228230    void setPruneEntriesDownTo(PAL::SessionID, uint64_t pruneTargetCount, CompletionHandler<void()>&&);
    229231    void hadUserInteraction(PAL::SessionID, const RegistrableDomain&, CompletionHandler<void(bool)>&&);
     232    void hasLocalStorage(PAL::SessionID, const RegistrableDomain&, CompletionHandler<void(bool)>&&);
    230233    void getAllStorageAccessEntries(PAL::SessionID, CompletionHandler<void(Vector<String> domains)>&&);
    231234    void logFrameNavigation(PAL::SessionID, const NavigatedToDomain&, const TopFrameDomain&, const NavigatedFromDomain&, bool isRedirect, bool isMainFrame);
     
    269272    bool sessionIsControlledByAutomation(PAL::SessionID) const;
    270273
     274    void webPageWasAdded(IPC::Connection&, PAL::SessionID, uint64_t pageID, uint64_t oldPageID);
     275    void webPageWasRemoved(IPC::Connection&, PAL::SessionID, uint64_t pageID);
     276    void webProcessWasDisconnected(IPC::Connection&);
     277    void webProcessSessionChanged(IPC::Connection&, PAL::SessionID, const Vector<uint64_t>&);
     278    void getLocalStorageOriginDetails(PAL::SessionID, CompletionHandler<void(Vector<LocalStorageDatabaseTracker::OriginDetails>&&)>&&);
     279
    271280#if ENABLE(CONTENT_EXTENSIONS)
    272281    NetworkContentRuleListManager& networkContentRuleListManager() { return m_networkContentRuleListManager; }
     
    559568    HashMap<PAL::SessionID, StorageQuotaManagers> m_storageQuotaManagers;
    560569    uint32_t m_downloadMonitorSpeedMultiplier { 1 };
     570
     571    HashMap<IPC::Connection::UniqueID, PAL::SessionID> m_sessionByConnection;
    561572};
    562573
  • trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in

    r245334 r245540  
    9999    SetPrevalentResourceForDebugMode(PAL::SessionID sessionID, WebCore::RegistrableDomain resourceDomain) -> () Async
    100100    HadUserInteraction(PAL::SessionID sessionID, WebCore::RegistrableDomain resourceDomain) -> (bool hadUserInteraction) Async
     101    HasLocalStorage(PAL::SessionID sessionID, WebCore::RegistrableDomain resourceDomain) -> (bool hadUserInteraction) Async
    101102    GetAllStorageAccessEntries(PAL::SessionID sessionID) -> (Vector<String> domains) Async
    102103    IsRegisteredAsRedirectingTo(PAL::SessionID sessionID, WebCore::RegistrableDomain redirectedFromDomain, WebCore::RegistrableDomain redirectedToDomain) -> (bool isRedirectingTo) Async
     
    170171    OriginsWithPersistentCredentials() -> (Vector<WebCore::SecurityOriginData> origins) Async
    171172    RemoveCredentialsWithOrigins(Vector<WebCore::SecurityOriginData> origins) -> () Async
     173    GetLocalStorageOriginDetails(PAL::SessionID sessionID) -> (Vector<WebKit::LocalStorageDatabaseTracker::OriginDetails> details) Async
    172174}
  • trunk/Source/WebKit/NetworkProcess/NetworkSession.cpp

    r244818 r245540  
    3333#include "NetworkResourceLoader.h"
    3434#include "PingLoad.h"
     35#include "StorageManager.h"
    3536#include "WebPageProxy.h"
    3637#include "WebPageProxyMessages.h"
     
    7374}
    7475
    75 NetworkSession::NetworkSession(NetworkProcess& networkProcess, PAL::SessionID sessionID)
     76NetworkSession::NetworkSession(NetworkProcess& networkProcess, PAL::SessionID sessionID, const String& localStorageDirectory, SandboxExtension::Handle& handle)
    7677    : m_sessionID(sessionID)
    7778    , m_networkProcess(networkProcess)
    7879    , m_adClickAttribution(makeUniqueRef<AdClickAttributionManager>(sessionID))
    79 {
     80    , m_storageManager(StorageManager::create(localStorageDirectory))
     81{
     82    SandboxExtension::consumePermanently(handle);
    8083    m_adClickAttribution->setPingLoadFunction([this, weakThis = makeWeakPtr(this)](NetworkResourceLoadParameters&& loadParameters, CompletionHandler<void(const WebCore::ResourceError&, const WebCore::ResourceResponse&)>&& completionHandler) {
    8184        if (!weakThis)
     
    8891NetworkSession::~NetworkSession()
    8992{
     93    m_storageManager->waitUntilWritesFinished();
    9094}
    9195
  • trunk/Source/WebKit/NetworkProcess/NetworkSession.h

    r245053 r245540  
    2727
    2828#include "PrefetchCache.h"
     29#include "SandboxExtension.h"
    2930#include "WebResourceLoadStatisticsStore.h"
    3031#include <WebCore/AdClickAttribution.h>
     
    5253class NetworkProcess;
    5354class NetworkResourceLoader;
     55class StorageManager;
    5456class WebResourceLoadStatisticsStore;
    5557struct NetworkSessionCreationParameters;
     
    7375    void registerNetworkDataTask(NetworkDataTask& task) { m_dataTaskSet.add(&task); }
    7476    void unregisterNetworkDataTask(NetworkDataTask& task) { m_dataTaskSet.remove(&task); }
     77
     78    StorageManager& storageManager() { return m_storageManager.get(); }
    7579
    7680#if ENABLE(RESOURCE_LOAD_STATISTICS)
     
    99103
    100104protected:
    101     NetworkSession(NetworkProcess&, PAL::SessionID);
     105    NetworkSession(NetworkProcess&, PAL::SessionID, const String& localStorageDirectory, SandboxExtension::Handle&);
    102106
    103107    PAL::SessionID m_sessionID;
     
    116120
    117121    PrefetchCache m_prefetchCache;
     122
     123    Ref<StorageManager> m_storageManager;
    118124};
    119125
  • trunk/Source/WebKit/NetworkProcess/NetworkSessionCreationParameters.cpp

    r243829 r245540  
    5151        , { }, { }
    5252#endif
    53         , { }, { }, false
     53        , { }, { }, false, { }, { }, { }, { }, { }
    5454    };
    5555}
     
    8484    encoder << enableResourceLoadStatisticsDebugMode;
    8585    encoder << resourceLoadStatisticsManualPrevalentResource;
     86
     87    encoder << localStorageDirectory <<  localStorageDirectoryExtensionHandle;
    8688}
    8789
     
    195197    decoder >> resourceLoadStatisticsManualPrevalentResource;
    196198    if (!resourceLoadStatisticsManualPrevalentResource)
     199        return WTF::nullopt;
     200
     201    Optional<String> localStorageDirectory;
     202    decoder >> localStorageDirectory;
     203    if (!localStorageDirectory)
     204        return WTF::nullopt;
     205
     206    Optional<SandboxExtension::Handle> localStorageDirectoryExtensionHandle;
     207    decoder >> localStorageDirectoryExtensionHandle;
     208    if (!localStorageDirectoryExtensionHandle)
    197209        return WTF::nullopt;
    198210
     
    225237        , WTFMove(*enableResourceLoadStatisticsDebugMode)
    226238        , WTFMove(*resourceLoadStatisticsManualPrevalentResource)
     239        , WTFMove(*localStorageDirectory)
     240        , WTFMove(*localStorageDirectoryExtensionHandle)
    227241    }};
    228242}
  • trunk/Source/WebKit/NetworkProcess/NetworkSessionCreationParameters.h

    r243829 r245540  
    8888    bool enableResourceLoadStatisticsDebugMode { false };
    8989    WebCore::RegistrableDomain resourceLoadStatisticsManualPrevalentResource { };
     90
     91    String localStorageDirectory;
     92    SandboxExtension::Handle localStorageDirectoryExtensionHandle;
    9093};
    9194
  • trunk/Source/WebKit/NetworkProcess/WebStorage/LocalStorageDatabase.cpp

    r245539 r245540  
    11/*
    2  * Copyright (C) 2008, 2009, 2010, 2013 Apple Inc. All rights reserved.
     2 * Copyright (C) 2008, 2009, 2010, 2013, 2019 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    8585bool LocalStorageDatabase::tryToOpenDatabase(DatabaseOpeningStrategy openingStrategy)
    8686{
     87    ASSERT(!RunLoop::isMain());
    8788    if (!FileSystem::fileExists(m_databasePath) && openingStrategy == SkipIfNonExistent)
    8889        return true;
     
    249250    m_didScheduleDatabaseUpdate = true;
    250251
    251     m_queue->dispatchAfter(databaseUpdateInterval, [protectedThis = makeRef(*this)] {
     252    m_queue->dispatch([protectedThis = makeRef(*this)] {
    252253        protectedThis->updateDatabase();
    253254    });
  • trunk/Source/WebKit/NetworkProcess/WebStorage/LocalStorageDatabase.h

    r245539 r245540  
    11/*
    2  * Copyright (C) 2008, 2009, 2010, 2013 Apple Inc. All rights reserved.
     2 * Copyright (C) 2008, 2009, 2010, 2013, 2019 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
  • trunk/Source/WebKit/NetworkProcess/WebStorage/LocalStorageDatabaseTracker.cpp

    r245539 r245540  
    11/*
    2  * Copyright (C) 2011, 2013 Apple Inc. All rights reserved.
     2 * Copyright (C) 2011, 2013, 2019 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
  • trunk/Source/WebKit/NetworkProcess/WebStorage/LocalStorageDatabaseTracker.h

    r245539 r245540  
    11/*
    2  * Copyright (C) 2011, 2013 Apple Inc. All rights reserved.
     2 * Copyright (C) 2011, 2013, 2019 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    3636namespace WebKit {
    3737
    38 struct LocalStorageDetails;
    39 
    4038class LocalStorageDatabaseTracker : public ThreadSafeRefCounted<LocalStorageDatabaseTracker> {
    4139public:
     
    5654    struct OriginDetails {
    5755        String originIdentifier;
    58         Markable<WallTime, WallTime::MarkableTraits> creationTime;
    59         Markable<WallTime, WallTime::MarkableTraits> modificationTime;
     56        Optional<WallTime> creationTime;
     57        Optional<WallTime> modificationTime;
     58
     59        template<class Encoder> void encode(Encoder&) const;
     60        template<class Decoder> static Optional<OriginDetails> decode(Decoder&);
    6061    };
    6162    Vector<OriginDetails> originDetails();
     
    7172    };
    7273
    73     RefPtr<WorkQueue> m_queue;
     74    Ref<WorkQueue> m_queue;
    7475    String m_localStorageDirectory;
    7576
     
    8182};
    8283
     84template<class Encoder>
     85void LocalStorageDatabaseTracker::OriginDetails::encode(Encoder& encoder) const
     86{
     87    encoder << originIdentifier << creationTime << modificationTime;
     88}
     89
     90template<class Decoder>
     91Optional<LocalStorageDatabaseTracker::OriginDetails> LocalStorageDatabaseTracker::OriginDetails::decode(Decoder& decoder)
     92{
     93    LocalStorageDatabaseTracker::OriginDetails result;
     94    if (!decoder.decode(result.originIdentifier))
     95        return WTF::nullopt;
     96   
     97    if (!decoder.decode(result.creationTime))
     98        return WTF::nullopt;
     99   
     100    if (!decoder.decode(result.modificationTime))
     101        return WTF::nullopt;
     102   
     103    return result;
     104}
     105
    83106} // namespace WebKit
  • trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManager.cpp

    r245539 r245540  
    11/*
    2  * Copyright (C) 2013-2016 Apple Inc. All rights reserved.
     2 * Copyright (C) 2013-2019 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    5757
    5858    void setItem(IPC::Connection::UniqueID sourceConnection, uint64_t sourceStorageAreaID, const String& key, const String& value, const String& urlString, bool& quotaException);
     59    void setItems(const HashMap<String, String>&);
    5960    void removeItem(IPC::Connection::UniqueID sourceConnection, uint64_t sourceStorageAreaID, const String& key, const String& urlString);
    6061    void clear(IPC::Connection::UniqueID sourceConnection, uint64_t sourceStorageAreaID, const String& urlString);
     
    8687class StorageManager::LocalStorageNamespace : public ThreadSafeRefCounted<LocalStorageNamespace> {
    8788public:
    88     static Ref<LocalStorageNamespace> create(StorageManager*, uint64_t storageManagerID);
     89    static Ref<LocalStorageNamespace> create(StorageManager&, uint64_t storageManagerID);
    8990    ~LocalStorageNamespace();
    9091
    91     StorageManager* storageManager() const { return m_storageManager; }
     92    StorageManager* storageManager() const { return &m_storageManager; }
    9293
    9394    Ref<StorageArea> getOrCreateStorageArea(SecurityOriginData&&);
     
    9899
    99100private:
    100     explicit LocalStorageNamespace(StorageManager*, uint64_t storageManagerID);
    101 
    102     StorageManager* m_storageManager;
     101    LocalStorageNamespace(StorageManager&, uint64_t storageManagerID);
     102
     103    StorageManager& m_storageManager;
    103104    uint64_t m_storageNamespaceID;
    104105    unsigned m_quotaInBytes;
     
    124125    Ref<StorageArea> getOrCreateStorageArea(SecurityOriginData&& securityOrigin)
    125126    {
    126         return *m_storageAreaMap.ensure(securityOrigin, [this, securityOrigin]() mutable {
     127        return *m_storageAreaMap.ensure(securityOrigin, [this, &securityOrigin]() mutable {
    127128            return StorageArea::create(nullptr, WTFMove(securityOrigin), m_quotaInBytes);
    128129        }).iterator->value.copyRef();
     
    143144    void clearStorageAreasMatchingOrigin(const SecurityOriginData& securityOrigin)
    144145    {
    145         for (auto& storageArea : m_storageAreaMap.values()) {
    146             if (storageArea->securityOrigin() == securityOrigin)
    147                 storageArea->clear();
    148         }
     146        auto originAndStorageArea = m_storageAreaMap.find(securityOrigin);
     147        if (originAndStorageArea != m_storageAreaMap.end())
     148            originAndStorageArea->value->clear();
    149149    }
    150150
     
    235235}
    236236
     237void StorageManager::StorageArea::setItems(const HashMap<String, String>& items)
     238{
     239    ASSERT(!m_localStorageDatabase);
     240    for (auto& item : items) {
     241        String oldValue;
     242        bool quotaException;
     243        auto newStorageMap = m_storageMap->setItem(item.key, item.value, oldValue, quotaException);
     244        if (newStorageMap)
     245            m_storageMap = WTFMove(newStorageMap);
     246       
     247        if (quotaException)
     248            return;
     249    }
     250}
     251
    237252void StorageManager::StorageArea::removeItem(IPC::Connection::UniqueID sourceConnection, uint64_t sourceStorageAreaID, const String& key, const String& urlString)
    238253{
     
    320335}
    321336
    322 Ref<StorageManager::LocalStorageNamespace> StorageManager::LocalStorageNamespace::create(StorageManager* storageManager, uint64_t storageNamespaceID)
     337Ref<StorageManager::LocalStorageNamespace> StorageManager::LocalStorageNamespace::create(StorageManager& storageManager, uint64_t storageNamespaceID)
    323338{
    324339    return adoptRef(*new LocalStorageNamespace(storageManager, storageNamespaceID));
     
    327342// FIXME: The quota value is copied from GroupSettings.cpp.
    328343// We should investigate a way to share it with WebCore.
    329 StorageManager::LocalStorageNamespace::LocalStorageNamespace(StorageManager* storageManager, uint64_t storageNamespaceID)
     344StorageManager::LocalStorageNamespace::LocalStorageNamespace(StorageManager& storageManager, uint64_t storageNamespaceID)
    330345    : m_storageManager(storageManager)
    331346    , m_storageNamespaceID(storageNamespaceID)
     
    341356auto StorageManager::LocalStorageNamespace::getOrCreateStorageArea(SecurityOriginData&& securityOrigin) -> Ref<StorageArea>
    342357{
    343     auto& slot = m_storageAreaMap.add(securityOrigin, nullptr).iterator->value;
    344     if (slot)
    345         return *slot;
    346 
    347     auto storageArea = StorageArea::create(this, WTFMove(securityOrigin), m_quotaInBytes);
    348     slot = &storageArea.get();
    349 
    350     return storageArea;
     358    RefPtr<StorageArea> protectedStorageArea;
     359    return *m_storageAreaMap.ensure(securityOrigin, [&]() mutable {
     360        protectedStorageArea = StorageArea::create(this, WTFMove(securityOrigin), m_quotaInBytes);
     361        return protectedStorageArea.get();
     362    }).iterator->value;
    351363}
    352364
     
    359371        return;
    360372
    361     ASSERT(m_storageManager->m_localStorageNamespaces.contains(m_storageNamespaceID));
    362     m_storageManager->m_localStorageNamespaces.remove(m_storageNamespaceID);
     373    ASSERT(m_storageManager.m_localStorageNamespaces.contains(m_storageNamespaceID));
     374    m_storageManager.m_localStorageNamespaces.remove(m_storageNamespaceID);
    363375}
    364376
    365377void StorageManager::LocalStorageNamespace::clearStorageAreasMatchingOrigin(const SecurityOriginData& securityOrigin)
    366378{
    367     for (const auto& originAndStorageArea : m_storageAreaMap) {
    368         if (originAndStorageArea.key == securityOrigin)
    369             originAndStorageArea.value->clear();
    370     }
     379    auto originAndStorageArea = m_storageAreaMap.find(securityOrigin);
     380    if (originAndStorageArea != m_storageAreaMap.end())
     381        originAndStorageArea->value->clear();
    371382}
    372383
     
    384395    bool isEmpty() const { return m_storageAreaMap.isEmpty(); }
    385396
    386     Vector<IPC::Connection::UniqueID> allowedConnections() const { return m_allowedConnections; }
     397    HashSet<IPC::Connection::UniqueID> allowedConnections() const { return m_allowedConnections; }
    387398    void addAllowedConnection(IPC::Connection::UniqueID);
    388399    void removeAllowedConnection(IPC::Connection::UniqueID);
     
    406417    void clearStorageAreasMatchingOrigin(const SecurityOriginData& securityOrigin)
    407418    {
    408         for (auto& storageArea : m_storageAreaMap.values()) {
    409             if (storageArea->securityOrigin() == securityOrigin)
    410                 storageArea->clear();
    411         }
     419        auto originAndStorageArea = m_storageAreaMap.find(securityOrigin);
     420        if (originAndStorageArea != m_storageAreaMap.end())
     421            originAndStorageArea->value->clear();
    412422    }
    413423
     
    421431    explicit SessionStorageNamespace(unsigned quotaInBytes);
    422432
    423     Vector<IPC::Connection::UniqueID> m_allowedConnections;
     433    HashSet<IPC::Connection::UniqueID> m_allowedConnections;
    424434    unsigned m_quotaInBytes;
    425435
     
    443453void StorageManager::SessionStorageNamespace::addAllowedConnection(IPC::Connection::UniqueID allowedConnection)
    444454{
    445     ASSERT(!m_allowedConnections.contains(allowedConnection));
    446     m_allowedConnections.append(allowedConnection);
     455    m_allowedConnections.add(allowedConnection);
    447456}
    448457
     
    451460{
    452461    ASSERT(m_allowedConnections.contains(allowedConnection));
    453     m_allowedConnections.removeAll(allowedConnection);
     462    m_allowedConnections.remove(allowedConnection);
    454463}
    455464auto StorageManager::SessionStorageNamespace::getOrCreateStorageArea(SecurityOriginData&& securityOrigin) -> Ref<StorageArea>
    456465{
    457     return *m_storageAreaMap.ensure(securityOrigin, [this, securityOrigin]() mutable {
     466    return *m_storageAreaMap.ensure(securityOrigin, [this, &securityOrigin]() mutable {
    458467        return StorageArea::create(nullptr, WTFMove(securityOrigin), m_quotaInBytes);
    459468    }).iterator->value.copyRef();
     
    489498{
    490499    m_queue->dispatch([this, protectedThis = makeRef(*this), storageNamespaceID, quotaInBytes]() mutable {
    491         ASSERT(!m_sessionStorageNamespaces.contains(storageNamespaceID));
     500        if (m_sessionStorageNamespaces.contains(storageNamespaceID))
     501            return;
    492502
    493503        m_sessionStorageNamespaces.set(storageNamespaceID, SessionStorageNamespace::create(quotaInBytes));
     
    499509    m_queue->dispatch([this, protectedThis = makeRef(*this), storageNamespaceID] {
    500510        ASSERT(m_sessionStorageNamespaces.contains(storageNamespaceID));
    501         m_sessionStorageNamespaces.remove(storageNamespaceID);
     511        if (m_sessionStorageNamespaces.get(storageNamespaceID)->allowedConnections().isEmpty())
     512            m_sessionStorageNamespaces.remove(storageNamespaceID);
    502513    });
    503514}
     
    541552}
    542553
    543 void StorageManager::processWillOpenConnection(WebProcessProxy& process, IPC::Connection& connection)
     554void StorageManager::processWillOpenConnection(IPC::Connection& connection)
    544555{
    545556    connection.addWorkQueueMessageReceiver(Messages::StorageManager::messageReceiverName(), m_queue.get(), this);
    546557}
    547558
    548 void StorageManager::processDidCloseConnection(WebProcessProxy& process, IPC::Connection& connection)
     559void StorageManager::processDidCloseConnection(IPC::Connection& connection)
    549560{
    550561    connection.removeWorkQueueMessageReceiver(Messages::StorageManager::messageReceiverName());
     
    555566            if (storageArea.key.first != connectionID)
    556567                continue;
    557 
     568           
    558569            storageArea.value->removeListener(storageArea.key.first, storageArea.key.second);
    559570            connectionAndStorageMapIDPairsToRemove.append(storageArea.key);
    560571        }
    561 
     572       
    562573        for (auto& pair : connectionAndStorageMapIDPairsToRemove)
    563574            m_storageAreasByConnection.remove(pair);
     575
     576        Vector<uint64_t> sessionStorageNameSpaceIDsToRemove;
     577        for (auto& sessionStorageNamespace : m_sessionStorageNamespaces) {
     578            if (sessionStorageNamespace.value->allowedConnections().contains(connectionID))
     579                sessionStorageNamespace.value->removeAllowedConnection(connectionID);
     580           
     581            if (sessionStorageNamespace.value->allowedConnections().isEmpty())
     582                sessionStorageNameSpaceIDsToRemove.append(sessionStorageNamespace.key);
     583        }
     584       
     585        for (auto id : sessionStorageNameSpaceIDsToRemove)
     586            m_sessionStorageNamespaces.remove(id);
    564587    });
    565588}
     
    628651}
    629652
    630 void StorageManager::getLocalStorageOriginDetails(Function<void (Vector<LocalStorageDatabaseTracker::OriginDetails>)>&& completionHandler)
     653void StorageManager::getLocalStorageOriginDetails(Function<void(Vector<LocalStorageDatabaseTracker::OriginDetails>&&)>&& completionHandler)
    631654{
    632655    m_queue->dispatch([this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)]() mutable {
     
    696719void StorageManager::createLocalStorageMap(IPC::Connection& connection, uint64_t storageMapID, uint64_t storageNamespaceID, SecurityOriginData&& securityOriginData)
    697720{
     721    // FIXME: Replace this check if https://bugs.webkit.org/show_bug.cgi?id=198048 is done.
     722    ASSERT(!RunLoop::isMain());
    698723    ASSERT(!m_isEphemeral);
    699724    std::pair<IPC::Connection::UniqueID, uint64_t> connectionAndStorageMapIDPair(connection.uniqueID(), storageMapID);
     
    721746void StorageManager::createTransientLocalStorageMap(IPC::Connection& connection, uint64_t storageMapID, uint64_t storageNamespaceID, SecurityOriginData&& topLevelOriginData, SecurityOriginData&& origin)
    722747{
     748    ASSERT(!RunLoop::isMain());
     749
    723750    // FIXME: This should be a message check.
    724751    ASSERT(m_storageAreasByConnection.isValidKey({ connection.uniqueID(), storageMapID }));
     
    750777    ASSERT(!slot);
    751778
    752     TransientLocalStorageNamespace* transientLocalStorageNamespace = getOrCreateTransientLocalStorageNamespace(storageNamespaceID, WTFMove(topLevelOriginData));
     779    auto* transientLocalStorageNamespace = getOrCreateTransientLocalStorageNamespace(storageNamespaceID, WTFMove(topLevelOriginData));
    753780
    754781    auto storageArea = transientLocalStorageNamespace->getOrCreateStorageArea(WTFMove(origin));
     
    760787void StorageManager::createSessionStorageMap(IPC::Connection& connection, uint64_t storageMapID, uint64_t storageNamespaceID, SecurityOriginData&& securityOriginData)
    761788{
     789    ASSERT(!RunLoop::isMain());
     790
    762791    if (m_isEphemeral) {
    763792        m_ephemeralStorage.add(securityOriginData, WebCore::StorageMap::create(localStorageDatabaseQuotaInBytes));
     
    793822void StorageManager::destroyStorageMap(IPC::Connection& connection, uint64_t storageMapID)
    794823{
     824    ASSERT(!RunLoop::isMain());
     825
    795826    std::pair<IPC::Connection::UniqueID, uint64_t> connectionAndStorageMapIDPair(connection.uniqueID(), storageMapID);
    796827
     
    815846void StorageManager::getValues(IPC::Connection& connection, WebCore::SecurityOriginData&& securityOriginData, uint64_t storageMapID, uint64_t storageMapSeed, CompletionHandler<void(const HashMap<String, String>&)>&& completionHandler)
    816847{
    817     StorageArea* storageArea = findStorageArea(connection, storageMapID);
     848    ASSERT(!RunLoop::isMain());
     849
     850    auto* storageArea = findStorageArea(connection, storageMapID);
    818851    if (!storageArea) {
    819852        if (m_isEphemeral) {
     
    831864void StorageManager::setItem(IPC::Connection& connection, WebCore::SecurityOriginData&& securityOriginData, uint64_t storageMapID, uint64_t sourceStorageAreaID, uint64_t storageMapSeed, const String& key, const String& value, const String& urlString)
    832865{
    833     StorageArea* storageArea = findStorageArea(connection, storageMapID);
     866    ASSERT(!RunLoop::isMain());
     867
     868    auto* storageArea = findStorageArea(connection, storageMapID);
    834869    if (!storageArea) {
    835870        if (m_isEphemeral) {
     
    849884}
    850885
     886void StorageManager::setItems(IPC::Connection& connection, uint64_t storageMapID, const HashMap<String, String>& items)
     887{
     888    ASSERT(!RunLoop::isMain());
     889
     890    if (auto* storageArea = findStorageArea(connection, storageMapID))
     891        storageArea->setItems(items);
     892}
     893
    851894void StorageManager::removeItem(IPC::Connection& connection, WebCore::SecurityOriginData&& securityOriginData, uint64_t storageMapID, uint64_t sourceStorageAreaID, uint64_t storageMapSeed, const String& key, const String& urlString)
    852895{
    853     StorageArea* storageArea = findStorageArea(connection, storageMapID);
     896    ASSERT(!RunLoop::isMain());
     897
     898    auto* storageArea = findStorageArea(connection, storageMapID);
    854899    if (!storageArea) {
    855900        if (m_isEphemeral) {
     
    869914void StorageManager::clear(IPC::Connection& connection, WebCore::SecurityOriginData&& securityOriginData, uint64_t storageMapID, uint64_t sourceStorageAreaID, uint64_t storageMapSeed, const String& urlString)
    870915{
    871     StorageArea* storageArea = findStorageArea(connection, storageMapID);
     916    ASSERT(!RunLoop::isMain());
     917
     918    auto* storageArea = findStorageArea(connection, storageMapID);
    872919    if (!storageArea) {
    873920        if (m_isEphemeral)
     
    881928}
    882929
    883 void StorageManager::applicationWillTerminate()
     930void StorageManager::waitUntilWritesFinished()
    884931{
    885932    BinarySemaphore semaphore;
     
    914961        return nullptr;
    915962
    916     auto& slot = m_localStorageNamespaces.add(storageNamespaceID, nullptr).iterator->value;
    917     if (!slot)
    918         slot = LocalStorageNamespace::create(this, storageNamespaceID);
    919 
    920     return slot.get();
     963    return m_localStorageNamespaces.ensure(storageNamespaceID, [this, storageNamespaceID]() {
     964        return LocalStorageNamespace::create(*this, storageNamespaceID);
     965    }).iterator->value.get();
    921966}
    922967
     
    926971        return nullptr;
    927972
    928     auto& slot = m_transientLocalStorageNamespaces.add({ storageNamespaceID, WTFMove(topLevelOrigin) }, nullptr).iterator->value;
    929     if (!slot)
    930         slot = TransientLocalStorageNamespace::create();
    931 
    932     return slot.get();
     973    return m_transientLocalStorageNamespaces.ensure({ storageNamespaceID, WTFMove(topLevelOrigin) }, [](){
     974        return TransientLocalStorageNamespace::create();
     975    }).iterator->value.get();
     976}
     977
     978void StorageManager::dispatchMessageToQueue(IPC::Connection& connection, IPC::Decoder& decoder)
     979{
     980    m_queue->dispatch([this, protectedThis = makeRef(*this), &connection, &decoder] {
     981        didReceiveMessage(connection, decoder);
     982    });
     983}
     984
     985void StorageManager::dispatchSyncMessageToQueue(IPC::Connection& connection, IPC::Decoder& decoder, std::unique_ptr<IPC::Encoder>& replyEncoder)
     986{
     987    m_queue->dispatch([this, protectedThis = makeRef(*this), &connection, &decoder, replyEncoder = WTFMove(replyEncoder)] () mutable {
     988        didReceiveSyncMessage(connection, decoder, replyEncoder);
     989    });
    933990}
    934991
  • trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManager.h

    r245539 r245540  
    11/*
    2  * Copyright (C) 2013 Apple Inc. All rights reserved.
     2 * Copyright (C) 2013-2019 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    3333#include <wtf/Function.h>
    3434#include <wtf/HashSet.h>
    35 #include <wtf/ThreadSafeRefCounted.h>
    3635#include <wtf/text/StringHash.h>
    3736
     
    5655    void cloneSessionStorageNamespace(uint64_t storageNamespaceID, uint64_t newStorageNamespaceID);
    5756
    58     void processWillOpenConnection(WebProcessProxy&, IPC::Connection&);
    59     void processDidCloseConnection(WebProcessProxy&, IPC::Connection&);
    60     void applicationWillTerminate();
     57    void processWillOpenConnection(IPC::Connection&);
     58    void processDidCloseConnection(IPC::Connection&);
     59    void waitUntilWritesFinished();
    6160
    6261    void getSessionStorageOrigins(Function<void(HashSet<WebCore::SecurityOriginData>&&)>&& completionHandler);
     
    7069    void deleteLocalStorageEntriesForOrigins(const Vector<WebCore::SecurityOriginData>&, Function<void()>&& completionHandler);
    7170
    72     void getLocalStorageOriginDetails(Function<void(Vector<LocalStorageDatabaseTracker::OriginDetails>)>&& completionHandler);
     71    void getLocalStorageOriginDetails(Function<void(Vector<LocalStorageDatabaseTracker::OriginDetails>&&)>&& completionHandler);
     72
     73    void dispatchMessageToQueue(IPC::Connection&, IPC::Decoder&);
     74    void dispatchSyncMessageToQueue(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>& replyEncoder);
    7375
    7476private:
     
    8688
    8789    void getValues(IPC::Connection&, WebCore::SecurityOriginData&&, uint64_t storageMapID, uint64_t storageMapSeed, CompletionHandler<void(const HashMap<String, String>&)>&&);
    88     void setItem(IPC::Connection&, WebCore::SecurityOriginData&&, uint64_t storageAreaID, uint64_t sourceStorageAreaID, uint64_t storageMapSeed, const String& key, const String& value, const String& urlString);
     90    void setItem(IPC::Connection&, WebCore::SecurityOriginData&&, uint64_t storageMapID, uint64_t sourceStorageAreaID, uint64_t storageMapSeed, const String& key, const String& value, const String& urlString);
     91    void setItems(IPC::Connection&, uint64_t storageMapID, const HashMap<String, String>& items);
    8992    void removeItem(IPC::Connection&, WebCore::SecurityOriginData&&, uint64_t storageMapID, uint64_t sourceStorageAreaID, uint64_t storageMapSeed, const String& key, const String& urlString);
    9093    void clear(IPC::Connection&, WebCore::SecurityOriginData&&, uint64_t storageMapID, uint64_t sourceStorageAreaID, uint64_t storageMapSeed, const String& urlString);
     
    113116    HashMap<WebCore::SecurityOriginData, Ref<WebCore::StorageMap>> m_ephemeralStorage;
    114117    bool m_isEphemeral { false };
     118
    115119};
    116120
  • trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManager.messages.in

    r245539 r245540  
    1 # Copyright (C) 2013 Apple Inc. All rights reserved.
     1# Copyright (C) 2013-2019 Apple Inc. All rights reserved.
    22#
    33# Redistribution and use in source and binary forms, with or without
     
    3030
    3131    SetItem(struct WebCore::SecurityOriginData securityOriginData, uint64_t storageMapID, uint64_t sourceStorageAreaID, uint64_t storageMapSeed, String key, String value, String urlString) WantsConnection
     32    SetItems(uint64_t storageMapID, HashMap<String, String> items) WantsConnection
    3233    RemoveItem(struct WebCore::SecurityOriginData securityOriginData, uint64_t storageMapID, uint64_t sourceStorageAreaID, uint64_t storageMapSeed, String key, String urlString) WantsConnection
    3334    Clear(struct WebCore::SecurityOriginData securityOriginData, uint64_t storageMapID, uint64_t sourceStorageAreaID, uint64_t storageMapSeed, String urlString) WantsConnection
  • trunk/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm

    r244475 r245540  
    876876
    877877NetworkSessionCocoa::NetworkSessionCocoa(NetworkProcess& networkProcess, NetworkSessionCreationParameters&& parameters)
    878     : NetworkSession(networkProcess, parameters.sessionID)
     878    : NetworkSession(networkProcess, parameters.sessionID, parameters.localStorageDirectory, parameters.localStorageDirectoryExtensionHandle)
    879879    , m_boundInterfaceIdentifier(parameters.boundInterfaceIdentifier)
    880880    , m_sourceApplicationBundleIdentifier(parameters.sourceApplicationBundleIdentifier)
  • trunk/Source/WebKit/NetworkProcess/curl/NetworkSessionCurl.cpp

    r239680 r245540  
    3939
    4040NetworkSessionCurl::NetworkSessionCurl(NetworkProcess& networkProcess, NetworkSessionCreationParameters&& parameters)
    41     : NetworkSession(networkProcess, parameters.sessionID)
     41    : NetworkSession(networkProcess, parameters.sessionID, parameters.localStorageDirectory, parameters.localStorageDirectoryExtensionHandle)
    4242{
    4343    if (!parameters.cookiePersistentStorageFile.isEmpty())
  • trunk/Source/WebKit/NetworkProcess/soup/NetworkSessionSoup.cpp

    r240785 r245540  
    3838
    3939NetworkSessionSoup::NetworkSessionSoup(NetworkProcess& networkProcess, NetworkSessionCreationParameters&& parameters)
    40     : NetworkSession(networkProcess, parameters.sessionID)
     40    : NetworkSession(networkProcess, parameters.sessionID, parameters.localStorageDirectory, parameters.localStorageDirectoryExtensionHandle)
    4141{
    4242    networkStorageSession().setCookieObserverHandler([this] {
  • trunk/Source/WebKit/PlatformMac.cmake

    r245241 r245540  
    3232
    3333    NetworkProcess/Downloads/cocoa/DownloadCocoa.mm
     34
     35    NetworkProcess/WebStorage/StorageManager.cpp
    3436
    3537    NetworkProcess/cache/NetworkCacheDataCocoa.mm
  • trunk/Source/WebKit/PlatformWin.cmake

    r245536 r245540  
    99    NetworkProcess/Classifier/WebResourceLoadStatisticsStore.cpp
    1010    NetworkProcess/Classifier/WebResourceLoadStatisticsTelemetry.cpp
     11
     12    NetworkProcess/WebStorage/StorageManager.cpp
    1113
    1214    NetworkProcess/win/NetworkProcessMainWin.cpp
  • trunk/Source/WebKit/Shared/WebPageCreationParameters.cpp

    r245183 r245540  
    132132#endif
    133133    encoder << backgroundColor;
     134    encoder << oldPageID;
    134135}
    135136
     
    392393    parameters.backgroundColor = WTFMove(*backgroundColor);
    393394
     395    Optional<Optional<uint64_t>> oldPageID;
     396    decoder >> oldPageID;
     397    if (!oldPageID)
     398        return WTF::nullopt;
     399    parameters.oldPageID = WTFMove(*oldPageID);
     400
    394401    return parameters;
    395402}
  • trunk/Source/WebKit/Shared/WebPageCreationParameters.h

    r245183 r245540  
    202202
    203203    Optional<WebCore::Color> backgroundColor;
     204
     205    Optional<uint64_t> oldPageID;
    204206};
    205207
  • trunk/Source/WebKit/Shared/WebsiteData/WebsiteData.cpp

    r244572 r245540  
    100100        return WebsiteDataProcessType::UI;
    101101    case WebsiteDataType::SessionStorage:
    102         return WebsiteDataProcessType::UI;
     102        return WebsiteDataProcessType::Network;
    103103    case WebsiteDataType::LocalStorage:
    104         return WebsiteDataProcessType::UI;
     104        return WebsiteDataProcessType::Network;
    105105    case WebsiteDataType::WebSQLDatabases:
    106106        return WebsiteDataProcessType::UI;
  • trunk/Source/WebKit/Sources.txt

    r245241 r245540  
    6565NetworkProcess/ServiceWorker/WebSWServerConnection.cpp @no-unify
    6666NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp @no-unify
     67
     68NetworkProcess/WebStorage/LocalStorageDatabase.cpp
     69NetworkProcess/WebStorage/LocalStorageDatabaseTracker.cpp
     70NetworkProcess/WebStorage/StorageManager.cpp
    6771
    6872NetworkProcess/cache/CacheStorageEngine.cpp
     
    411415UIProcess/WebAuthentication/WebAuthenticatorCoordinatorProxy.cpp
    412416
    413 UIProcess/WebStorage/LocalStorageDatabase.cpp
    414 UIProcess/WebStorage/LocalStorageDatabaseTracker.cpp
    415 UIProcess/WebStorage/StorageManager.cpp
    416 
    417417UIProcess/WebsiteData/WebDeviceOrientationAndMotionAccessController.cpp
    418418UIProcess/WebsiteData/WebsiteDataRecord.cpp
  • trunk/Source/WebKit/SourcesCocoa.txt

    r245501 r245540  
    4242NetworkProcess/EntryPoint/Cocoa/Daemon/DaemonEntryPoint.mm
    4343NetworkProcess/EntryPoint/Cocoa/XPCService/NetworkServiceEntryPoint.mm
     44
     45NetworkProcess/WebStorage/ios/LocalStorageDatabaseTrackerIOS.mm
    4446
    4547NetworkProcess/ios/NetworkConnectionToWebProcessIOS.mm
     
    489491UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm
    490492
    491 UIProcess/WebStorage/ios/LocalStorageDatabaseTrackerIOS.mm
    492 
    493493WebProcess/API/Cocoa/WKWebProcess.cpp
    494494
  • trunk/Source/WebKit/UIProcess/API/C/WKKeyValueStorageManager.cpp

    r238802 r245540  
    3232#include "StorageManager.h"
    3333#include "WKAPICast.h"
     34#include "WebsiteDataRecord.h"
    3435#include "WebsiteDataStore.h"
    3536#include <wtf/RunLoop.h>
     
    6364
    6465{
    65     StorageManager* storageManager = toImpl(reinterpret_cast<WKWebsiteDataStoreRef>(keyValueStorageManager))->websiteDataStore().storageManager();
    66     if (!storageManager) {
    67         RunLoop::main().dispatch([context, callback] {
    68             callback(toAPI(API::Array::create().ptr()), nullptr, context);
    69         });
    70         return;
    71     }
     66    auto& websiteDataStore = toImpl(reinterpret_cast<WKWebsiteDataStoreRef>(keyValueStorageManager))->websiteDataStore();
     67    websiteDataStore.fetchData({ WebsiteDataType::LocalStorage, WebsiteDataType::SessionStorage }, { }, [context, callback](auto dataRecords) {
     68        Vector<RefPtr<API::Object>> securityOrigins;
     69        for (const auto& dataRecord : dataRecords) {
     70            for (const auto& origin : dataRecord.origins)
     71                securityOrigins.append(API::SecurityOrigin::create(origin.securityOrigin()));
     72        }
    7273
    73     storageManager->getLocalStorageOrigins([context, callback](auto&& securityOrigins) {
    74         Vector<RefPtr<API::Object>> webSecurityOrigins;
    75         webSecurityOrigins.reserveInitialCapacity(securityOrigins.size());
    76         for (auto& origin : securityOrigins)
    77             webSecurityOrigins.uncheckedAppend(API::SecurityOrigin::create(origin.securityOrigin()));
    78 
    79         callback(toAPI(API::Array::create(WTFMove(webSecurityOrigins)).ptr()), nullptr, context);
     74        callback(toAPI(API::Array::create(WTFMove(securityOrigins)).ptr()), nullptr, context);
    8075    });
    8176}
     
    8378void WKKeyValueStorageManagerGetStorageDetailsByOrigin(WKKeyValueStorageManagerRef keyValueStorageManager, void* context, WKKeyValueStorageManagerGetStorageDetailsByOriginFunction callback)
    8479{
    85     StorageManager* storageManager = toImpl(reinterpret_cast<WKWebsiteDataStoreRef>(keyValueStorageManager))->websiteDataStore().storageManager();
    86     if (!storageManager) {
    87         RunLoop::main().dispatch([context, callback] {
    88             callback(toAPI(API::Array::create().ptr()), nullptr, context);
    89         });
    90         return;
    91     }
     80    auto& websiteDataStore = toImpl(reinterpret_cast<WKWebsiteDataStoreRef>(keyValueStorageManager))->websiteDataStore();
     81    websiteDataStore.getLocalStorageDetails([context, callback](auto&& details) {
     82        Vector<RefPtr<API::Object>> result;
     83        result.reserveInitialCapacity(details.size());
    9284
    93     storageManager->getLocalStorageOriginDetails([context, callback](auto storageDetails) {
    94         HashMap<String, RefPtr<API::Object>> detailsMap;
    95         Vector<RefPtr<API::Object>> result;
    96         result.reserveInitialCapacity(storageDetails.size());
     85        for (const auto& detail : details) {
     86            HashMap<String, RefPtr<API::Object>> detailMap;
     87            RefPtr<API::Object> origin = API::SecurityOrigin::create(WebCore::SecurityOriginData::fromDatabaseIdentifier(detail.originIdentifier)->securityOrigin());
    9788
    98         for (const auto& originDetails : storageDetails) {
    99             HashMap<String, RefPtr<API::Object>> detailsMap;
     89            detailMap.set(toImpl(WKKeyValueStorageManagerGetOriginKey())->string(), origin);
     90            if (detail.creationTime)
     91                detailMap.set(toImpl(WKKeyValueStorageManagerGetCreationTimeKey())->string(), API::Double::create(detail.creationTime->secondsSinceEpoch().value()));
     92            if (detail.modificationTime)
     93                detailMap.set(toImpl(WKKeyValueStorageManagerGetModificationTimeKey())->string(), API::Double::create(detail.modificationTime->secondsSinceEpoch().value()));
    10094
    101             RefPtr<API::Object> origin = API::SecurityOrigin::create(WebCore::SecurityOriginData::fromDatabaseIdentifier(originDetails.originIdentifier)->securityOrigin());
    102 
    103             detailsMap.set(toImpl(WKKeyValueStorageManagerGetOriginKey())->string(), origin);
    104             if (originDetails.creationTime)
    105                 detailsMap.set(toImpl(WKKeyValueStorageManagerGetCreationTimeKey())->string(), API::Double::create(originDetails.creationTime->secondsSinceEpoch().value()));
    106             if (originDetails.modificationTime)
    107                 detailsMap.set(toImpl(WKKeyValueStorageManagerGetModificationTimeKey())->string(), API::Double::create(originDetails.modificationTime->secondsSinceEpoch().value()));
    108 
    109             result.uncheckedAppend(API::Dictionary::create(WTFMove(detailsMap)));
     95            result.uncheckedAppend(API::Dictionary::create(WTFMove(detailMap)));
    11096        }
    11197
     
    116102void WKKeyValueStorageManagerDeleteEntriesForOrigin(WKKeyValueStorageManagerRef keyValueStorageManager, WKSecurityOriginRef origin)
    117103{
    118     StorageManager* storageManager = toImpl(reinterpret_cast<WKWebsiteDataStoreRef>(keyValueStorageManager))->websiteDataStore().storageManager();
    119     if (!storageManager)
    120         return;
    121 
    122     storageManager->deleteLocalStorageEntriesForOrigin(toImpl(origin)->securityOrigin().data());
     104    auto& websiteDataStore = toImpl(reinterpret_cast<WKWebsiteDataStoreRef>(keyValueStorageManager))->websiteDataStore();
     105    WebsiteDataRecord dataRecord;
     106    dataRecord.add(WebsiteDataType::LocalStorage, toImpl(origin)->securityOrigin().data());
     107    dataRecord.add(WebsiteDataType::SessionStorage, toImpl(origin)->securityOrigin().data());
     108    websiteDataStore.removeData({ WebsiteDataType::LocalStorage, WebsiteDataType::SessionStorage }, { dataRecord }, [] { });
    123109}
    124110
    125111void WKKeyValueStorageManagerDeleteAllEntries(WKKeyValueStorageManagerRef keyValueStorageManager)
    126112{
    127     StorageManager* storageManager = toImpl(reinterpret_cast<WKWebsiteDataStoreRef>(keyValueStorageManager))->websiteDataStore().storageManager();
    128     if (!storageManager)
    129         return;
    130 
    131     storageManager->deleteLocalStorageOriginsModifiedSince(-WallTime::infinity(), [] { });
     113    auto& websiteDataStore = toImpl(reinterpret_cast<WKWebsiteDataStoreRef>(keyValueStorageManager))->websiteDataStore();
     114    websiteDataStore.removeData({ WebsiteDataType::LocalStorage, WebsiteDataType::SessionStorage }, -WallTime::infinity(), [] { });
    132115}
  • trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp

    r245334 r245540  
    567567}
    568568
     569void NetworkProcessProxy::hasLocalStorage(PAL::SessionID sessionID, const RegistrableDomain& resourceDomain, CompletionHandler<void(bool)>&& completionHandler)
     570{
     571    if (!canSendMessage()) {
     572        completionHandler(false);
     573        return;
     574    }
     575
     576    sendWithAsyncReply(Messages::NetworkProcess::HasLocalStorage(sessionID, resourceDomain), WTFMove(completionHandler));
     577}
     578
    569579void NetworkProcessProxy::setAgeCapForClientSideCookies(PAL::SessionID sessionID, Optional<Seconds> seconds, CompletionHandler<void()>&& completionHandler)
    570580{
     
    11971207#endif
    11981208
     1209void NetworkProcessProxy::getLocalStorageDetails(PAL::SessionID sessionID, CompletionHandler<void(Vector<LocalStorageDatabaseTracker::OriginDetails>&&)>&& completionHandler)
     1210{
     1211    if (!canSendMessage()) {
     1212        completionHandler({ });
     1213        return;
     1214    }
     1215
     1216    sendWithAsyncReply(Messages::NetworkProcess::GetLocalStorageOriginDetails(sessionID), WTFMove(completionHandler));
     1217}
     1218
    11991219} // namespace WebKit
    12001220
  • trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h

    r245025 r245540  
    9797    void deleteWebsiteDataForOrigins(PAL::SessionID, OptionSet<WebKit::WebsiteDataType>, const Vector<WebCore::SecurityOriginData>& origins, const Vector<String>& cookieHostNames, const Vector<String>& HSTSCacheHostNames, CompletionHandler<void()>&&);
    9898
     99    void getLocalStorageDetails(PAL::SessionID, CompletionHandler<void(Vector<LocalStorageDatabaseTracker::OriginDetails>&&)>&&);
     100
    99101#if ENABLE(RESOURCE_LOAD_STATISTICS)
    100102    void clearPrevalentResource(PAL::SessionID, const RegistrableDomain&, CompletionHandler<void()>&&);
     
    103105    void updatePrevalentDomainsToBlockCookiesFor(PAL::SessionID, const Vector<RegistrableDomain>&, CompletionHandler<void()>&&);
    104106    void hasHadUserInteraction(PAL::SessionID, const RegistrableDomain&, CompletionHandler<void(bool)>&&);
     107    void hasLocalStorage(PAL::SessionID, const RegistrableDomain&, CompletionHandler<void(bool)>&&);
    105108    void isGrandfathered(PAL::SessionID, const RegistrableDomain&, CompletionHandler<void(bool)>&&);
    106109    void isPrevalentResource(PAL::SessionID, const RegistrableDomain&, CompletionHandler<void(bool)>&&);
  • trunk/Source/WebKit/UIProcess/WebPageProxy.cpp

    r245507 r245540  
    50295029        reply(newPage->pageID(), newPage->creationParameters(m_process, *newPage->drawingArea()));
    50305030
    5031         WebsiteDataStore::cloneSessionData(*this, *newPage);
    50325031        newPage->m_shouldSuppressAppLinksInNextNavigationPolicyDecision = hostsAreEqual(URL({ }, mainFrameURL), request.url());
    50335032
  • trunk/Source/WebKit/UIProcess/WebProcessPool.cpp

    r245255 r245540  
    575575#endif
    576576
     577    auto localStorageDirectory = m_websiteDataStore ? m_websiteDataStore->websiteDataStore().resolvedLocalStorageDirectory() : nullString();
     578    if (!localStorageDirectory)
     579        localStorageDirectory = API::WebsiteDataStore::defaultLocalStorageDirectory();
     580    parameters.defaultDataStoreParameters.networkSessionParameters.localStorageDirectory = localStorageDirectory;
     581    SandboxExtension::createHandleForReadWriteDirectory(localStorageDirectory, parameters.defaultDataStoreParameters.networkSessionParameters.localStorageDirectoryExtensionHandle);
     582
    577583    if (m_websiteDataStore)
    578584        parameters.defaultDataStoreParameters.networkSessionParameters.resourceLoadStatisticsDirectory = m_websiteDataStore->websiteDataStore().resolvedResourceLoadStatisticsDirectory();
  • trunk/Source/WebKit/UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm

    r243911 r245540  
    4949static id terminationObserver;
    5050
    51 static Vector<WebsiteDataStore*>& dataStoresWithStorageManagers()
    52 {
    53     static NeverDestroyed<Vector<WebsiteDataStore*>> dataStoresWithStorageManagers;
    54 
    55     return dataStoresWithStorageManagers;
     51static HashSet<WebsiteDataStore*>& dataStores()
     52{
     53    static NeverDestroyed<HashSet<WebsiteDataStore*>> dataStores;
     54
     55    return dataStores;
    5656}
    5757
     
    107107    if (!resourceLoadStatisticsDirectory.isEmpty())
    108108        SandboxExtension::createHandleForReadWriteDirectory(resourceLoadStatisticsDirectory, resourceLoadStatisticsDirectoryHandle);
     109
     110    auto localStorageDirectory = resolvedLocalStorageDirectory();
     111    SandboxExtension::Handle localStorageDirectoryExtensionHandle;
     112    if (!localStorageDirectory.isEmpty())
     113        SandboxExtension::createHandleForReadWriteDirectory(localStorageDirectory, localStorageDirectoryExtensionHandle);
    109114
    110115    bool shouldIncludeLocalhostInResourceLoadStatistics = isSafari;
     
    127132        shouldIncludeLocalhostInResourceLoadStatistics,
    128133        enableResourceLoadStatisticsDebugMode,
    129         WTFMove(resourceLoadStatisticsManualPrevalentResource)
     134        WTFMove(resourceLoadStatisticsManualPrevalentResource),
     135        WTFMove(localStorageDirectory),
     136        WTFMove(localStorageDirectoryExtensionHandle)
    130137    };
    131138    networkingHasBegun();
     
    169176void WebsiteDataStore::platformInitialize()
    170177{
    171     if (!m_storageManager)
    172         return;
    173 
    174178    if (!terminationObserver) {
    175         ASSERT(dataStoresWithStorageManagers().isEmpty());
     179        ASSERT(dataStores().isEmpty());
    176180
    177181#if PLATFORM(MAC)
     
    181185#endif
    182186        terminationObserver = [[NSNotificationCenter defaultCenter] addObserverForName:notificationName object:nil queue:nil usingBlock:^(NSNotification *note) {
    183             for (auto& dataStore : dataStoresWithStorageManagers()) {
    184                 dataStore->m_storageManager->applicationWillTerminate();
     187            for (auto& dataStore : dataStores()) {
    185188#if ENABLE(RESOURCE_LOAD_STATISTICS)
    186189                if (dataStore->m_resourceLoadStatistics)
     
    191194    }
    192195
    193     ASSERT(!dataStoresWithStorageManagers().contains(this));
    194     dataStoresWithStorageManagers().append(this);
     196    ASSERT(!dataStores().contains(this));
     197    dataStores().add(this);
    195198}
    196199
     
    202205#endif
    203206
    204     if (!m_storageManager)
    205         return;
    206 
    207     // FIXME: Rename applicationWillTerminate to something that better indicates what StorageManager does (waits for pending writes to finish).
    208     m_storageManager->applicationWillTerminate();
    209 
    210     ASSERT(dataStoresWithStorageManagers().contains(this));
    211     dataStoresWithStorageManagers().removeFirst(this);
    212 
    213     if (dataStoresWithStorageManagers().isEmpty()) {
     207    ASSERT(dataStores().contains(this));
     208    dataStores().remove(this);
     209
     210    if (dataStores().isEmpty()) {
    214211        [[NSNotificationCenter defaultCenter] removeObserver:terminationObserver];
    215212        terminationObserver = nil;
  • trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp

    r245025 r245540  
    3636#include "ShouldGrandfatherStatistics.h"
    3737#include "StorageAccessStatus.h"
    38 #include "StorageManager.h"
    3938#include "WebProcessCache.h"
    4039#include "WebProcessMessages.h"
     
    9796    , m_resolvedConfiguration(WTFMove(configuration))
    9897    , m_configuration(m_resolvedConfiguration->copy())
    99     , m_storageManager(StorageManager::create(m_configuration->localStorageDirectory()))
    10098    , m_deviceIdHashSaltStorage(DeviceIdHashSaltStorage::create(isPersistent() ? m_configuration->deviceIdHashSaltsStorageDirectory() : String()))
    10199    , m_queue(WorkQueue::create("com.apple.WebKit.WebsiteDataStore"))
     
    121119    , m_resolvedConfiguration(WebsiteDataStoreConfiguration::create())
    122120    , m_configuration(m_resolvedConfiguration->copy())
    123     , m_storageManager(StorageManager::create({ }))
    124121    , m_deviceIdHashSaltStorage(DeviceIdHashSaltStorage::create(isPersistent() ? m_configuration->deviceIdHashSaltsStorageDirectory() : String()))
    125122    , m_queue(WorkQueue::create("com.apple.WebKit.WebsiteDataStore"))
     
    208205}
    209206
    210 void WebsiteDataStore::cloneSessionData(WebPageProxy& sourcePage, WebPageProxy& newPage)
    211 {
    212     auto& sourceDataStore = sourcePage.websiteDataStore();
    213     auto& newDataStore = newPage.websiteDataStore();
    214 
    215     // FIXME: Handle this.
    216     if (&sourceDataStore != &newDataStore)
    217         return;
    218 
    219     if (!sourceDataStore.m_storageManager)
    220         return;
    221 
    222     sourceDataStore.m_storageManager->cloneSessionStorageNamespace(sourcePage.pageID(), newPage.pageID());
    223 }
    224 
    225207enum class ProcessAccessType {
    226208    None,
     
    246228        processAccessType = std::max(processAccessType, ProcessAccessType::Launch);
    247229
     230    if (dataTypes.contains(WebsiteDataType::SessionStorage))
     231        processAccessType = std::max(processAccessType, ProcessAccessType::OnlyIfLaunched);
     232   
     233    if (dataTypes.contains(WebsiteDataType::LocalStorage)) {
     234        if (isNonPersistentStore)
     235            processAccessType = std::max(processAccessType, ProcessAccessType::OnlyIfLaunched);
     236        else
     237            processAccessType = std::max(processAccessType, ProcessAccessType::Launch);
     238    }
     239
     240    // FIXME: https://bugs.webkit.org/show_bug.cgi?id=198050.
    248241    if (dataTypes.contains(WebsiteDataType::DOMCache))
    249242        processAccessType = std::max(processAccessType, ProcessAccessType::Launch);
     
    482475            });
    483476        }
    484     }
    485 
    486     if (dataTypes.contains(WebsiteDataType::SessionStorage) && m_storageManager) {
    487         callbackAggregator->addPendingCallback();
    488 
    489         m_storageManager->getSessionStorageOrigins([callbackAggregator](HashSet<WebCore::SecurityOriginData>&& origins) {
    490             WebsiteData websiteData;
    491 
    492             while (!origins.isEmpty())
    493                 websiteData.entries.append(WebsiteData::Entry { origins.takeAny(), WebsiteDataType::SessionStorage, 0 });
    494 
    495             callbackAggregator->removePendingCallback(WTFMove(websiteData));
    496         });
    497     }
    498 
    499     if (dataTypes.contains(WebsiteDataType::LocalStorage) && m_storageManager) {
    500         callbackAggregator->addPendingCallback();
    501 
    502         m_storageManager->getLocalStorageOrigins([callbackAggregator](HashSet<WebCore::SecurityOriginData>&& origins) {
    503             WebsiteData websiteData;
    504 
    505             while (!origins.isEmpty())
    506                 websiteData.entries.append(WebsiteData::Entry { origins.takeAny(), WebsiteDataType::LocalStorage, 0 });
    507 
    508             callbackAggregator->removePendingCallback(WTFMove(websiteData));
    509         });
    510477    }
    511478
     
    822789    }
    823790
    824     if (dataTypes.contains(WebsiteDataType::SessionStorage) && m_storageManager) {
    825         callbackAggregator->addPendingCallback();
    826 
    827         m_storageManager->deleteSessionStorageOrigins([callbackAggregator] {
    828             callbackAggregator->removePendingCallback();
    829         });
    830     }
    831 
    832     if (dataTypes.contains(WebsiteDataType::LocalStorage) && m_storageManager) {
    833         callbackAggregator->addPendingCallback();
    834 
    835         m_storageManager->deleteLocalStorageOriginsModifiedSince(modifiedSince, [callbackAggregator] {
    836             callbackAggregator->removePendingCallback();
    837         });
    838     }
    839 
    840791    if (dataTypes.contains(WebsiteDataType::DeviceIdHashSalt) || (dataTypes.contains(WebsiteDataType::Cookies))) {
    841792        callbackAggregator->addPendingCallback();
     
    11021053    }
    11031054
    1104     if (dataTypes.contains(WebsiteDataType::SessionStorage) && m_storageManager) {
    1105         callbackAggregator->addPendingCallback();
    1106 
    1107         m_storageManager->deleteSessionStorageEntriesForOrigins(origins, [callbackAggregator] {
    1108             callbackAggregator->removePendingCallback();
    1109         });
    1110     }
    1111 
    1112     if (dataTypes.contains(WebsiteDataType::LocalStorage) && m_storageManager) {
    1113         callbackAggregator->addPendingCallback();
    1114 
    1115         m_storageManager->deleteLocalStorageEntriesForOrigins(origins, [callbackAggregator] {
    1116             callbackAggregator->removePendingCallback();
    1117         });
    1118     }
    1119 
    11201055    if (dataTypes.contains(WebsiteDataType::DeviceIdHashSalt) || (dataTypes.contains(WebsiteDataType::Cookies))) {
    11211056        callbackAggregator->addPendingCallback();
     
    17961731void WebsiteDataStore::hasLocalStorageForTesting(const URL& url, CompletionHandler<void(bool)>&& completionHandler) const
    17971732{
    1798     if (!m_storageManager) {
    1799         completionHandler(false);
    1800         return;
    1801     }
    1802 
    1803     m_storageManager->getLocalStorageOrigins([url, completionHandler = WTFMove(completionHandler)](HashSet<WebCore::SecurityOriginData>&& origins) mutable {
    1804         for (auto& origin : origins) {
    1805             if (origin.host == url.host()) {
    1806                 completionHandler(true);
    1807                 return;
    1808             }
    1809         }
    1810 
    1811         completionHandler(false);
    1812     });
     1733    for (auto& processPool : processPools()) {
     1734        if (auto* networkProcess = processPool->networkProcess()) {
     1735            networkProcess->hasLocalStorage(m_sessionID, WebCore::RegistrableDomain { url }, WTFMove(completionHandler));
     1736            ASSERT(processPools().size() == 1);
     1737            break;
     1738        }
     1739    }
     1740    ASSERT(!completionHandler);
    18131741}
    18141742#endif // ENABLE(RESOURCE_LOAD_STATISTICS)
     
    18411769}
    18421770
    1843 void WebsiteDataStore::webPageWasAdded(WebPageProxy& webPageProxy)
    1844 {
    1845     if (m_storageManager)
    1846         m_storageManager->createSessionStorageNamespace(webPageProxy.pageID(), std::numeric_limits<unsigned>::max());
    1847 }
    1848 
    1849 void WebsiteDataStore::webPageWasInvalidated(WebPageProxy& webPageProxy)
    1850 {
    1851     if (m_storageManager)
    1852         m_storageManager->destroySessionStorageNamespace(webPageProxy.pageID());
    1853 }
    1854 
    1855 void WebsiteDataStore::webProcessWillOpenConnection(WebProcessProxy& webProcessProxy, IPC::Connection& connection)
    1856 {
    1857     if (m_storageManager)
    1858         m_storageManager->processWillOpenConnection(webProcessProxy, connection);
    1859 }
    1860 
    1861 void WebsiteDataStore::webPageWillOpenConnection(WebPageProxy& webPageProxy, IPC::Connection& connection)
    1862 {
    1863     if (m_storageManager)
    1864         m_storageManager->addAllowedSessionStorageNamespaceConnection(webPageProxy.pageID(), connection);
    1865 }
    1866 
    1867 void WebsiteDataStore::webPageDidCloseConnection(WebPageProxy& webPageProxy, IPC::Connection& connection)
    1868 {
    1869     if (m_storageManager)
    1870         m_storageManager->removeAllowedSessionStorageNamespaceConnection(webPageProxy.pageID(), connection);
    1871 }
    1872 
    1873 void WebsiteDataStore::webProcessDidCloseConnection(WebProcessProxy& webProcessProxy, IPC::Connection& connection)
    1874 {
    1875     if (m_storageManager)
    1876         m_storageManager->processDidCloseConnection(webProcessProxy, connection);
    1877 }
    1878 
    18791771bool WebsiteDataStore::isAssociatedProcessPool(WebProcessPool& processPool) const
    18801772{
     
    21082000    resolveDirectoriesIfNecessary();
    21092001
     2002    auto localStorageDirectory = resolvedLocalStorageDirectory();
     2003    if (!localStorageDirectory.isEmpty()) {
     2004        parameters.networkSessionParameters.localStorageDirectory = localStorageDirectory;
     2005        SandboxExtension::createHandleForReadWriteDirectory(localStorageDirectory, parameters.networkSessionParameters.localStorageDirectoryExtensionHandle);
     2006    }
     2007
    21102008#if ENABLE(INDEXED_DATABASE)
    21112009    parameters.indexedDatabaseDirectory = resolvedIndexedDatabaseDirectory();
     
    21832081}
    21842082
    2185 }
     2083void WebsiteDataStore::getLocalStorageDetails(Function<void(Vector<LocalStorageDatabaseTracker::OriginDetails>&&)>&& completionHandler)
     2084{
     2085    if (!isPersistent()) {
     2086        completionHandler({ });
     2087        return;
     2088    }
     2089
     2090    for (auto& processPool : processPools()) {
     2091        processPool->ensureNetworkProcess(this);
     2092        processPool->networkProcess()->getLocalStorageDetails(m_sessionID, [completionHandler = WTFMove(completionHandler)](auto&& details) {
     2093            completionHandler(WTFMove(details));
     2094        });
     2095        // FIXME: Support fetching from multiple pools.
     2096        break;
     2097    }
     2098    ASSERT(!completionHandler);
     2099}
     2100
     2101}
  • trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h

    r245025 r245540  
    2626#pragma once
    2727
     28#include "LocalStorageDatabaseTracker.h"
    2829#include "NetworkSessionCreationParameters.h"
    2930#include "WebDeviceOrientationAndMotionAccessController.h"
     
    7273class AuthenticatorManager;
    7374class SecKeyProxyStore;
    74 class StorageManager;
    7575class DeviceIdHashSaltStorage;
    7676class WebPageProxy;
     
    123123#endif
    124124
    125     static void cloneSessionData(WebPageProxy& sourcePage, WebPageProxy& newPage);
    126 
    127125    void fetchData(OptionSet<WebsiteDataType>, OptionSet<WebsiteDataFetchOption>, Function<void(Vector<WebsiteDataRecord>)>&& completionHandler);
    128126    void removeData(OptionSet<WebsiteDataType>, WallTime modifiedSince, Function<void()>&& completionHandler);
    129127    void removeData(OptionSet<WebsiteDataType>, const Vector<WebsiteDataRecord>&, Function<void()>&& completionHandler);
     128
     129    void getLocalStorageDetails(Function<void(Vector<LocalStorageDatabaseTracker::OriginDetails>&&)>&&);
    130130
    131131#if ENABLE(RESOURCE_LOAD_STATISTICS)
     
    180180    void resolveDirectoriesIfNecessary();
    181181    const String& resolvedApplicationCacheDirectory() const { return m_resolvedConfiguration->applicationCacheDirectory(); }
     182    const String& resolvedLocalStorageDirectory() const { return m_resolvedConfiguration->localStorageDirectory(); }
    182183    const String& resolvedMediaCacheDirectory() const { return m_resolvedConfiguration->mediaCacheDirectory(); }
    183184    const String& resolvedMediaKeysDirectory() const { return m_resolvedConfiguration->mediaKeysStorageDirectory(); }
     
    189190    const String& resolvedResourceLoadStatisticsDirectory() const { return m_resolvedConfiguration->resourceLoadStatisticsDirectory(); }
    190191
    191     StorageManager* storageManager() { return m_storageManager.get(); }
    192 
    193192    DeviceIdHashSaltStorage& deviceIdHashSaltStorage() { return m_deviceIdHashSaltStorage.get(); }
    194193
     
    266265    void fetchDataAndApply(OptionSet<WebsiteDataType>, OptionSet<WebsiteDataFetchOption>, RefPtr<WorkQueue>&&, Function<void(Vector<WebsiteDataRecord>)>&& apply);
    267266
    268     // WebProcessLifetimeObserver.
    269     void webPageWasAdded(WebPageProxy&) override;
    270     void webPageWasInvalidated(WebPageProxy&) override;
    271     void webProcessWillOpenConnection(WebProcessProxy&, IPC::Connection&) override;
    272     void webPageWillOpenConnection(WebPageProxy&, IPC::Connection&) override;
    273     void webPageDidCloseConnection(WebPageProxy&, IPC::Connection&) override;
    274     void webProcessDidCloseConnection(WebProcessProxy&, IPC::Connection&) override;
    275 
    276267    void platformInitialize();
    277268    void platformDestroy();
     
    300291    bool m_hasResolvedDirectories { false };
    301292
    302     const RefPtr<StorageManager> m_storageManager;
    303293    const Ref<DeviceIdHashSaltStorage> m_deviceIdHashSaltStorage;
    304294
  • trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj

    r245501 r245540  
    153153                1A1B0EB618A424950038481A /* WKNavigationResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A1B0EB418A424950038481A /* WKNavigationResponse.h */; settings = {ATTRIBUTES = (Public, ); }; };
    154154                1A1B0EB818A424CD0038481A /* WKNavigationResponseInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A1B0EB718A424CD0038481A /* WKNavigationResponseInternal.h */; };
    155                 1A1D8BA21731A36300141DA4 /* LocalStorageDatabase.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A1D8BA01731A36300141DA4 /* LocalStorageDatabase.h */; };
    156155                1A1DC340196346D700FF7059 /* LegacySessionStateCoding.h in Headers */ = {isa = PBXBuildFile; fileRef = 31607F3819627002009B87DA /* LegacySessionStateCoding.h */; };
    157156                1A1E093418861D3800D2DC49 /* WebProgressTrackerClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A1E093218861D3800D2DC49 /* WebProgressTrackerClient.h */; };
     
    196195                1A445BA3184D5FCF004B3414 /* WKContextDownloadClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A445BA2184D5FCF004B3414 /* WKContextDownloadClient.h */; settings = {ATTRIBUTES = (Private, ); }; };
    197196                1A445BA5184D5FDA004B3414 /* WKContextConnectionClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A445BA4184D5FDA004B3414 /* WKContextConnectionClient.h */; settings = {ATTRIBUTES = (Private, ); }; };
    198                 1A44B95C16B73F9F00B7BBD8 /* StorageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A44B95A16B73F9F00B7BBD8 /* StorageManager.h */; };
    199197                1A4832CC1A9BC465008B4DFE /* WKWebsiteDataRecord.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A4832CA1A9BC465008B4DFE /* WKWebsiteDataRecord.h */; settings = {ATTRIBUTES = (Public, ); }; };
    200198                1A4832CE1A9BC484008B4DFE /* WKWebsiteDataRecordInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A4832CD1A9BC484008B4DFE /* WKWebsiteDataRecordInternal.h */; };
     
    246244                1A8B66B01BC43C860082DF77 /* PageLoadStateObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A8B66AE1BC43C860082DF77 /* PageLoadStateObserver.h */; };
    247245                1A8B66B41BC45B010082DF77 /* WKBundleMac.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A8B66B21BC45B010082DF77 /* WKBundleMac.h */; settings = {ATTRIBUTES = (Private, ); }; };
    248                 1A8C728D1738477C000A6554 /* LocalStorageDatabaseTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A8C728B1738477C000A6554 /* LocalStorageDatabaseTracker.h */; };
    249246                1A8E7D3C18C15149005A702A /* VisitedLinkTableControllerMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A8E7D3A18C15149005A702A /* VisitedLinkTableControllerMessageReceiver.cpp */; };
    250247                1A8E7D3D18C15149005A702A /* VisitedLinkTableControllerMessages.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A8E7D3B18C15149005A702A /* VisitedLinkTableControllerMessages.h */; };
     
    12601257                93A88B3B1BC710D900ABA5C2 /* _WKHitTestResultInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 93A88B3A1BC710D900ABA5C2 /* _WKHitTestResultInternal.h */; };
    12611258                93A88B461BC8829300ABA5C2 /* APIHitTestResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 93A88B431BC8828C00ABA5C2 /* APIHitTestResult.h */; };
     1259                93B2614D227D149E00B97A76 /* StorageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 93B26149227D147200B97A76 /* StorageManager.h */; };
     1260                93B2614E227D14B100B97A76 /* LocalStorageDatabase.h in Headers */ = {isa = PBXBuildFile; fileRef = 93B26145227D147000B97A76 /* LocalStorageDatabase.h */; };
     1261                93B2614F227D14B100B97A76 /* LocalStorageDatabaseTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = 93B26146227D147100B97A76 /* LocalStorageDatabaseTracker.h */; };
    12621262                93BDEB01171DD7AF00BFEE1B /* WKPageLoadTypesPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 93BDEB00171DD7AF00BFEE1B /* WKPageLoadTypesPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
    12631263                93E6A4EE1BC5DD3900F8A0E7 /* _WKHitTestResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 93E6A4ED1BC5DD3900F8A0E7 /* _WKHitTestResult.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    20192019                1A1D2116191D995C0001619F /* postprocess-framework-headers.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; name = "postprocess-framework-headers.sh"; path = "mac/postprocess-framework-headers.sh"; sourceTree = "<group>"; };
    20202020                1A1D2117191D996C0001619F /* MigrateHeadersFromWebKitLegacy.make */ = {isa = PBXFileReference; lastKnownFileType = text; name = MigrateHeadersFromWebKitLegacy.make; path = mac/MigrateHeadersFromWebKitLegacy.make; sourceTree = "<group>"; };
    2021                 1A1D8B9F1731A36300141DA4 /* LocalStorageDatabase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LocalStorageDatabase.cpp; sourceTree = "<group>"; };
    2022                 1A1D8BA01731A36300141DA4 /* LocalStorageDatabase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LocalStorageDatabase.h; sourceTree = "<group>"; };
    20232021                1A1E093118861D3800D2DC49 /* WebProgressTrackerClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebProgressTrackerClient.cpp; sourceTree = "<group>"; };
    20242022                1A1E093218861D3800D2DC49 /* WebProgressTrackerClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebProgressTrackerClient.h; sourceTree = "<group>"; };
     
    20972095                1A445BA2184D5FCF004B3414 /* WKContextDownloadClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKContextDownloadClient.h; sourceTree = "<group>"; };
    20982096                1A445BA4184D5FDA004B3414 /* WKContextConnectionClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKContextConnectionClient.h; sourceTree = "<group>"; };
    2099                 1A44B95916B73F9F00B7BBD8 /* StorageManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StorageManager.cpp; sourceTree = "<group>"; };
    2100                 1A44B95A16B73F9F00B7BBD8 /* StorageManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StorageManager.h; sourceTree = "<group>"; };
    21012097                1A4832C11A965A3C008B4DFE /* WebsiteDataStoreCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebsiteDataStoreCocoa.mm; sourceTree = "<group>"; };
    21022098                1A4832C91A9BC465008B4DFE /* WKWebsiteDataRecord.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKWebsiteDataRecord.mm; sourceTree = "<group>"; };
     
    21852181                1A8B66B11BC45B010082DF77 /* WKBundleMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKBundleMac.mm; sourceTree = "<group>"; };
    21862182                1A8B66B21BC45B010082DF77 /* WKBundleMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKBundleMac.h; sourceTree = "<group>"; };
    2187                 1A8C728A1738477C000A6554 /* LocalStorageDatabaseTracker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LocalStorageDatabaseTracker.cpp; sourceTree = "<group>"; };
    2188                 1A8C728B1738477C000A6554 /* LocalStorageDatabaseTracker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LocalStorageDatabaseTracker.h; sourceTree = "<group>"; };
    21892183                1A8E7D3818C150BF005A702A /* VisitedLinkTableController.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = VisitedLinkTableController.messages.in; sourceTree = "<group>"; };
    21902184                1A8E7D3A18C15149005A702A /* VisitedLinkTableControllerMessageReceiver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = VisitedLinkTableControllerMessageReceiver.cpp; path = DerivedSources/WebKit2/VisitedLinkTableControllerMessageReceiver.cpp; sourceTree = BUILT_PRODUCTS_DIR; };
     
    22822276                1AB1F7941D1B3613007C9BD1 /* WebPaymentCoordinatorProxyMessageReceiver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WebPaymentCoordinatorProxyMessageReceiver.cpp; path = DerivedSources/WebKit2/WebPaymentCoordinatorProxyMessageReceiver.cpp; sourceTree = BUILT_PRODUCTS_DIR; };
    22832277                1AB1F7951D1B3613007C9BD1 /* WebPaymentCoordinatorProxyMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebPaymentCoordinatorProxyMessages.h; path = DerivedSources/WebKit2/WebPaymentCoordinatorProxyMessages.h; sourceTree = BUILT_PRODUCTS_DIR; };
    2284                 1AB31A9316BC65AB00F6DBC9 /* StorageManager.messages.in */ = {isa = PBXFileReference; lastKnownFileType = text; path = StorageManager.messages.in; sourceTree = "<group>"; };
    22852278                1AB31A9416BC688100F6DBC9 /* StorageManagerMessageReceiver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = StorageManagerMessageReceiver.cpp; path = DerivedSources/WebKit2/StorageManagerMessageReceiver.cpp; sourceTree = BUILT_PRODUCTS_DIR; };
    22862279                1AB31A9516BC688100F6DBC9 /* StorageManagerMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StorageManagerMessages.h; path = DerivedSources/WebKit2/StorageManagerMessages.h; sourceTree = BUILT_PRODUCTS_DIR; };
     
    32093202                511F8A77138B460900A95F44 /* SecItemShimLibrary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SecItemShimLibrary.h; path = ../../WebProcess/mac/SecItemShimLibrary.h; sourceTree = "<group>"; };
    32103203                511F8A78138B460900A95F44 /* SecItemShimLibrary.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = SecItemShimLibrary.mm; path = ../../WebProcess/mac/SecItemShimLibrary.mm; sourceTree = "<group>"; };
    3211                 5120C8301E54E2650025B250 /* LocalStorageDatabaseTrackerIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = LocalStorageDatabaseTrackerIOS.mm; sourceTree = "<group>"; };
    32123204                5120C8331E5B71570025B250 /* _WKWebsiteDataStoreConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKWebsiteDataStoreConfiguration.h; sourceTree = "<group>"; };
    32133205                5120C8341E5B71570025B250 /* _WKWebsiteDataStoreConfiguration.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = _WKWebsiteDataStoreConfiguration.mm; sourceTree = "<group>"; };
     
    38513843                93A88B421BC8828C00ABA5C2 /* APIHitTestResult.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = APIHitTestResult.cpp; sourceTree = "<group>"; };
    38523844                93A88B431BC8828C00ABA5C2 /* APIHitTestResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APIHitTestResult.h; sourceTree = "<group>"; };
     3845                93B26145227D147000B97A76 /* LocalStorageDatabase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LocalStorageDatabase.h; sourceTree = "<group>"; };
     3846                93B26146227D147100B97A76 /* LocalStorageDatabaseTracker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LocalStorageDatabaseTracker.h; sourceTree = "<group>"; };
     3847                93B26147227D147100B97A76 /* LocalStorageDatabaseTracker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LocalStorageDatabaseTracker.cpp; sourceTree = "<group>"; };
     3848                93B26148227D147100B97A76 /* ios */ = {isa = PBXFileReference; lastKnownFileType = folder; path = ios; sourceTree = "<group>"; };
     3849                93B26149227D147200B97A76 /* StorageManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StorageManager.h; sourceTree = "<group>"; };
     3850                93B2614A227D147200B97A76 /* StorageManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StorageManager.cpp; sourceTree = "<group>"; };
     3851                93B2614B227D147200B97A76 /* StorageManager.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = StorageManager.messages.in; sourceTree = "<group>"; };
     3852                93B2614C227D147200B97A76 /* LocalStorageDatabase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LocalStorageDatabase.cpp; sourceTree = "<group>"; };
    38533853                93BA04DA2151ADF3007F455F /* WebSWServerConnection.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = WebSWServerConnection.messages.in; sourceTree = "<group>"; };
    38543854                93BA04DB2151ADF3007F455F /* WebSWServerToContextConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebSWServerToContextConnection.h; sourceTree = "<group>"; };
     
    48974897                        sourceTree = "<group>";
    48984898                };
    4899                 1A44B95816B73F8C00B7BBD8 /* WebStorage */ = {
    4900                         isa = PBXGroup;
    4901                         children = (
    4902                                 5120C82D1E54E2040025B250 /* ios */,
    4903                                 1A1D8B9F1731A36300141DA4 /* LocalStorageDatabase.cpp */,
    4904                                 1A1D8BA01731A36300141DA4 /* LocalStorageDatabase.h */,
    4905                                 1A8C728A1738477C000A6554 /* LocalStorageDatabaseTracker.cpp */,
    4906                                 1A8C728B1738477C000A6554 /* LocalStorageDatabaseTracker.h */,
    4907                                 1A44B95916B73F9F00B7BBD8 /* StorageManager.cpp */,
    4908                                 1A44B95A16B73F9F00B7BBD8 /* StorageManager.h */,
    4909                                 1AB31A9316BC65AB00F6DBC9 /* StorageManager.messages.in */,
    4910                         );
    4911                         path = WebStorage;
    4912                         sourceTree = "<group>";
    4913                 };
    49144899                1A4832C01A965A33008B4DFE /* Cocoa */ = {
    49154900                        isa = PBXGroup;
     
    65936578                                93BA04D92151ADCD007F455F /* ServiceWorker */,
    65946579                                413075971DE84ED70039EC69 /* webrtc */,
     6580                                93B26143227D143100B97A76 /* WebStorage */,
    65956581                                6BD05864220CE8C2000BED5C /* AdClickAttributionManager.cpp */,
    65966582                                6BD05863220CE8C2000BED5C /* AdClickAttributionManager.h */,
     
    67036689                        sourceTree = "<group>";
    67046690                };
    6705                 5120C82D1E54E2040025B250 /* ios */ = {
    6706                         isa = PBXGroup;
    6707                         children = (
    6708                                 5120C8301E54E2650025B250 /* LocalStorageDatabaseTrackerIOS.mm */,
    6709                         );
    6710                         path = ios;
    6711                         sourceTree = "<group>";
    6712                 };
    67136691                5123CF18133D25E60056F800 /* cg */ = {
    67146692                        isa = PBXGroup;
     
    71837161                        );
    71847162                        path = mac;
     7163                        sourceTree = "<group>";
     7164                };
     7165                93B26143227D143100B97A76 /* WebStorage */ = {
     7166                        isa = PBXGroup;
     7167                        children = (
     7168                                93B26148227D147100B97A76 /* ios */,
     7169                                93B2614C227D147200B97A76 /* LocalStorageDatabase.cpp */,
     7170                                93B26145227D147000B97A76 /* LocalStorageDatabase.h */,
     7171                                93B26147227D147100B97A76 /* LocalStorageDatabaseTracker.cpp */,
     7172                                93B26146227D147100B97A76 /* LocalStorageDatabaseTracker.h */,
     7173                                93B2614A227D147200B97A76 /* StorageManager.cpp */,
     7174                                93B26149227D147200B97A76 /* StorageManager.h */,
     7175                                93B2614B227D147200B97A76 /* StorageManager.messages.in */,
     7176                        );
     7177                        path = WebStorage;
    71857178                        sourceTree = "<group>";
    71867179                };
     
    75197512                                57608294202BD84900116678 /* WebAuthentication */,
    75207513                                1A53C2A31A325691004E8C70 /* WebsiteData */,
    7521                                 1A44B95816B73F8C00B7BBD8 /* WebStorage */,
    75227514                                7CD102D91866770600ED429D /* AutoCorrectionCallback.h */,
    75237515                                E1513C64166EABB200149FCB /* AuxiliaryProcessProxy.cpp */,
     
    93189310                                57DCEDAD214C602C0016B847 /* LocalConnection.h in Headers */,
    93199311                                57DCEDAE214C60330016B847 /* LocalService.h in Headers */,
    9320                                 1A1D8BA21731A36300141DA4 /* LocalStorageDatabase.h in Headers */,
    9321                                 1A8C728D1738477C000A6554 /* LocalStorageDatabaseTracker.h in Headers */,
     9312                                93B2614E227D14B100B97A76 /* LocalStorageDatabase.h in Headers */,
     9313                                93B2614F227D14B100B97A76 /* LocalStorageDatabaseTracker.h in Headers */,
    93229314                                51A7F2F3125BF820008AEB1D /* Logging.h in Headers */,
    93239315                                0FDCD7F71D47E92A009F08BC /* LogInitialization.h in Headers */,
     
    95359527                                1ACECD2517162DB1001FC9EF /* StorageAreaMap.h in Headers */,
    95369528                                1A334DEE16DE8F88006A8E38 /* StorageAreaMapMessages.h in Headers */,
    9537                                 1A44B95C16B73F9F00B7BBD8 /* StorageManager.h in Headers */,
     9529                                93B2614D227D149E00B97A76 /* StorageManager.h in Headers */,
    95389530                                1AB31A9716BC688100F6DBC9 /* StorageManagerMessages.h in Headers */,
    95399531                                1AE00D6C18327C1200087DD7 /* StringReference.h in Headers */,
  • trunk/Source/WebKit/WebProcess/InjectedBundle/InjectedBundle.cpp

    r243666 r245540  
    349349{
    350350    ASSERT(!hasProcessPrivilege(ProcessPrivilege::CanAccessRawCookies));
    351     if (enabled)
    352         WebProcess::singleton().ensureLegacyPrivateBrowsingSessionInNetworkProcess();
     351    WebProcess::singleton().enablePrivateBrowsingForTesting(enabled);
    353352
    354353    const HashSet<Page*>& pages = PageGroup::pageGroup(pageGroup->identifier())->pages();
  • trunk/Source/WebKit/WebProcess/Network/NetworkProcessConnection.cpp

    r242748 r245540  
    3131#include "NetworkConnectionToWebProcessMessages.h"
    3232#include "ServiceWorkerClientFetchMessages.h"
     33#include "StorageAreaMap.h"
     34#include "StorageAreaMapMessages.h"
    3335#include "WebCacheStorageConnection.h"
    3436#include "WebCacheStorageConnectionMessages.h"
     
    9496        return;
    9597    }
     98    if (decoder.messageReceiverName() == Messages::StorageAreaMap::messageReceiverName()) {
     99        if (auto* stoargeAreaMap = WebProcess::singleton().storageAreaMap(decoder.destinationID()))
     100            stoargeAreaMap->didReceiveMessage(connection, decoder);
     101        return;
     102    }
    96103
    97104#if USE(LIBWEBRTC)
  • trunk/Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp

    r245366 r245540  
    297297        return nullptr;
    298298    ASSERT(parameters);
     299    if (parameters->sessionID == m_page.sessionID())
     300        parameters->oldPageID = m_page.pageID();
    299301
    300302    webProcess.createWebPage(newPageID, WTFMove(*parameters));
  • trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp

    r245335 r245540  
    14061406    m_drawingArea = nullptr;
    14071407
     1408    auto sessionID = this->sessionID();
    14081409    DeferredPageDestructor::createDeferredPageDestructor(WTFMove(m_page), this);
    14091410
     
    14331434
    14341435    // The WebPage can be destroyed by this call.
    1435     WebProcess::singleton().removeWebPage(m_pageID);
     1436    WebProcess::singleton().removeWebPage(sessionID, m_pageID);
    14361437
    14371438    WebProcess::singleton().updateActivePages();
  • trunk/Source/WebKit/WebProcess/WebProcess.cpp

    r245335 r245540  
    4343#include "PluginProcessConnectionManager.h"
    4444#include "StatisticsData.h"
     45#include "StorageAreaMap.h"
    4546#include "UserData.h"
    4647#include "WebAutomationSessionProxy.h"
     
    5758#include "WebMessagePortChannelProvider.h"
    5859#include "WebPage.h"
     60#include "WebPageCreationParameters.h"
    5961#include "WebPageGroupProxy.h"
    6062#include "WebPaymentCoordinator.h"
     
    676678    // link) the WebPage gets created both in the synchronous handler and through the normal way.
    677679    HashMap<uint64_t, RefPtr<WebPage>>::AddResult result = m_pageMap.add(pageID, nullptr);
     680    auto oldPageID = parameters.oldPageID ? parameters.oldPageID.value() : pageID;
    678681    if (result.isNewEntry) {
    679682        ASSERT(!result.iterator->value);
     
    686689        result.iterator->value->reinitializeWebPage(WTFMove(parameters));
    687690
     691    ensureNetworkProcessConnection().connection().send(Messages::NetworkConnectionToWebProcess::WebPageWasAdded(result.iterator->value->sessionID(), pageID, oldPageID), 0);
     692
    688693    ASSERT(result.iterator->value);
    689694}
    690695
    691 void WebProcess::removeWebPage(uint64_t pageID)
     696void WebProcess::removeWebPage(PAL::SessionID sessionID, uint64_t pageID)
    692697{
    693698    ASSERT(m_pageMap.contains(pageID));
    694699
     700    ensureNetworkProcessConnection().connection().send(Messages::NetworkConnectionToWebProcess::WebPageWasRemoved(sessionID, pageID), 0);
    695701    pageWillLeaveWindow(pageID);
    696702    m_pageMap.remove(pageID);
     
    12421248        m_networkProcessConnection = NetworkProcessConnection::create(connectionIdentifier);
    12431249        m_networkProcessConnection->connection().send(Messages::NetworkConnectionToWebProcess::SetWebProcessIdentifier(Process::identifier()), 0);
     1250
     1251        // To recover web storage, network process needs to know active webpages to prepare session storage.
     1252        // FIXME: https://bugs.webkit.org/show_bug.cgi?id=198051.
     1253        // Webpage should be added when Storage is used, not when connection is re-established.
     1254        for (auto& page : m_pageMap) {
     1255            if (!page.value)
     1256                continue;
     1257
     1258            m_networkProcessConnection->connection().send(Messages::NetworkConnectionToWebProcess::WebPageWasAdded(page.value->sessionID(), page.key, page.key), 0);
     1259        }
    12441260    }
    12451261   
     
    12711287    ASSERT(m_networkProcessConnection);
    12721288    ASSERT_UNUSED(connection, m_networkProcessConnection == connection);
     1289
     1290    for (auto* storageAreaMap : m_storageAreaMaps.values())
     1291        storageAreaMap->disconnect();
    12731292
    12741293#if ENABLE(INDEXED_DATABASE)
     
    16311650}
    16321651
     1652void WebProcess::registerStorageAreaMap(StorageAreaMap& storageAreaMap)
     1653{
     1654    ASSERT(!m_storageAreaMaps.contains(storageAreaMap.identifier()));
     1655    m_storageAreaMaps.set(storageAreaMap.identifier(), &storageAreaMap);
     1656}
     1657
     1658void WebProcess::unregisterStorageAreaMap(StorageAreaMap& storageAreaMap)
     1659{
     1660    ASSERT(m_storageAreaMaps.contains(storageAreaMap.identifier()));
     1661    ASSERT(m_storageAreaMaps.get(storageAreaMap.identifier()) == &storageAreaMap);
     1662    m_storageAreaMaps.remove(storageAreaMap.identifier());
     1663}
     1664
     1665StorageAreaMap* WebProcess::storageAreaMap(uint64_t identifier) const
     1666{
     1667    ASSERT(m_storageAreaMaps.contains(identifier));
     1668    return m_storageAreaMaps.get(identifier);
     1669}
     1670
     1671void WebProcess::enablePrivateBrowsingForTesting(bool enable)
     1672{
     1673    if (enable)
     1674        ensureLegacyPrivateBrowsingSessionInNetworkProcess();
     1675
     1676    Vector<uint64_t> pageIDs;
     1677    for (auto& page : m_pageMap) {
     1678        if (page.value)
     1679            pageIDs.append(page.key);
     1680    }
     1681
     1682    if (!pageIDs.isEmpty())
     1683        ensureNetworkProcessConnection().connection().send(Messages::NetworkConnectionToWebProcess::WebProcessSessionChanged(enable ? PAL::SessionID::legacyPrivateSessionID() : PAL::SessionID::defaultSessionID(), pageIDs), 0);
     1684}
     1685
    16331686void WebProcess::setResourceLoadStatisticsEnabled(bool enabled)
    16341687{
  • trunk/Source/WebKit/WebProcess/WebProcess.h

    r245334 r245540  
    9898class NetworkProcessConnection;
    9999class ObjCObjectGraph;
     100class StorageAreaMap;
    100101class UserData;
    101102class WaylandCompositorDisplay;
     
    147148    WebPage* webPage(uint64_t pageID) const;
    148149    void createWebPage(uint64_t pageID, WebPageCreationParameters&&);
    149     void removeWebPage(uint64_t pageID);
     150    void removeWebPage(PAL::SessionID, uint64_t pageID);
    150151    WebPage* focusedWebPage() const;
    151152
     
    203204
    204205    void nonVisibleProcessCleanupTimerFired();
     206
     207    void registerStorageAreaMap(StorageAreaMap&);
     208    void unregisterStorageAreaMap(StorageAreaMap&);
     209    StorageAreaMap* storageAreaMap(uint64_t identifier) const;
     210
     211    void enablePrivateBrowsingForTesting(bool);
    205212
    206213#if PLATFORM(COCOA)
     
    555562    float m_backlightLevel { 0 };
    556563#endif
     564
     565    HashMap<uint64_t, StorageAreaMap*> m_storageAreaMaps;
    557566};
    558567
  • trunk/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.cpp

    r242122 r245540  
    2727#include "StorageAreaMap.h"
    2828
     29#include "NetworkProcessConnection.h"
    2930#include "StorageAreaImpl.h"
    3031#include "StorageAreaMapMessages.h"
     
    7071    , m_hasPendingGetValues(false)
    7172{
    72     switch (m_storageType) {
    73     case StorageType::Local:
    74     case StorageType::TransientLocal:
    75         if (SecurityOrigin* topLevelOrigin = storageNamespace->topLevelOrigin())
    76             WebProcess::singleton().parentProcessConnection()->send(Messages::StorageManager::CreateTransientLocalStorageMap(m_storageMapID, storageNamespace->storageNamespaceID(), topLevelOrigin->data(), m_securityOrigin->data()), 0);
    77         else
    78             WebProcess::singleton().parentProcessConnection()->send(Messages::StorageManager::CreateLocalStorageMap(m_storageMapID, storageNamespace->storageNamespaceID(), m_securityOrigin->data()), 0);
    79 
    80         break;
    81 
    82     case StorageType::Session:
    83         WebProcess::singleton().parentProcessConnection()->send(Messages::StorageManager::CreateSessionStorageMap(m_storageMapID, storageNamespace->storageNamespaceID(), m_securityOrigin->data()), 0);
    84         break;
    85 
    86     case StorageType::EphemeralLocal:
    87         ASSERT_NOT_REACHED();
    88         return;
    89     }
    90 
    91     WebProcess::singleton().addMessageReceiver(Messages::StorageAreaMap::messageReceiverName(), m_storageMapID, *this);
     73    WebProcess::singleton().registerStorageAreaMap(*this);
     74    connect();
    9275}
    9376
    9477StorageAreaMap::~StorageAreaMap()
    9578{
    96     if (m_storageType != StorageType::EphemeralLocal) {
    97         WebProcess::singleton().parentProcessConnection()->send(Messages::StorageManager::DestroyStorageMap(m_storageMapID), 0);
    98         WebProcess::singleton().removeMessageReceiver(Messages::StorageAreaMap::messageReceiverName(), m_storageMapID);
    99     }
     79    if (m_storageType != StorageType::EphemeralLocal)
     80        WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::StorageManager::DestroyStorageMap(m_storageMapID), 0);
    10081
    10182    m_storageNamespace->didDestroyStorageAreaMap(*this);
     83
     84    WebProcess::singleton().unregisterStorageAreaMap(*this);
    10285}
    10386
     
    140123    m_pendingValueChanges.add(key);
    141124
    142     WebProcess::singleton().parentProcessConnection()->send(Messages::StorageManager::SetItem(m_securityOrigin->data(), m_storageMapID, sourceArea->storageAreaID(), m_currentSeed, key, value, sourceFrame->document()->url()), 0);
     125    WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::StorageManager::SetItem(m_securityOrigin->data(), m_storageMapID, sourceArea->storageAreaID(), m_currentSeed, key, value, sourceFrame->document()->url()), 0);
    143126}
    144127
     
    156139    m_pendingValueChanges.add(key);
    157140
    158     WebProcess::singleton().parentProcessConnection()->send(Messages::StorageManager::RemoveItem(m_securityOrigin->data(), m_storageMapID, sourceArea->storageAreaID(), m_currentSeed, key, sourceFrame->document()->url()), 0);
     141    WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::StorageManager::RemoveItem(m_securityOrigin->data(), m_storageMapID, sourceArea->storageAreaID(), m_currentSeed, key, sourceFrame->document()->url()), 0);
    159142}
    160143
     
    165148    m_hasPendingClear = true;
    166149    m_storageMap = StorageMap::create(m_quotaInBytes);
    167     WebProcess::singleton().parentProcessConnection()->send(Messages::StorageManager::Clear(m_securityOrigin->data(), m_storageMapID, sourceArea->storageAreaID(), m_currentSeed, sourceFrame->document()->url()), 0);
     150    WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::StorageManager::Clear(m_securityOrigin->data(), m_storageMapID, sourceArea->storageAreaID(), m_currentSeed, sourceFrame->document()->url()), 0);
    168151}
    169152
     
    187170void StorageAreaMap::loadValuesIfNeeded()
    188171{
     172    connect();
     173
    189174    if (m_storageMap)
    190175        return;
     
    194179    // (This flag does not yet exist). Since loadValuesIfNeeded() ends up being called from within JavaScript code, processing incoming synchronous messages
    195180    // could lead to weird reentrency bugs otherwise.
    196     WebProcess::singleton().parentProcessConnection()->sendSync(Messages::StorageManager::GetValues(m_securityOrigin->data(), m_storageMapID, m_currentSeed), Messages::StorageManager::GetValues::Reply(values), 0);
     181    WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::StorageManager::GetValues(m_securityOrigin->data(), m_storageMapID, m_currentSeed), Messages::StorageManager::GetValues::Reply(values), 0);
    197182
    198183    m_storageMap = StorageMap::create(m_quotaInBytes);
     
    386371}
    387372
     373void StorageAreaMap::connect()
     374{
     375    if (!m_isDisconnected)
     376        return;
     377
     378    switch (m_storageType) {
     379    case StorageType::Local:
     380    case StorageType::TransientLocal:
     381        if (SecurityOrigin* topLevelOrigin = m_storageNamespace->topLevelOrigin())
     382            WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::StorageManager::CreateTransientLocalStorageMap(m_storageMapID, m_storageNamespace->storageNamespaceID(), topLevelOrigin->data(), m_securityOrigin->data()), 0);
     383        else
     384            WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::StorageManager::CreateLocalStorageMap(m_storageMapID, m_storageNamespace->storageNamespaceID(), m_securityOrigin->data()), 0);
     385        break;
     386    case StorageType::Session:
     387        WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::StorageManager::CreateSessionStorageMap(m_storageMapID, m_storageNamespace->storageNamespaceID(), m_securityOrigin->data()), 0);
     388        if (m_storageMap)
     389            WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::StorageManager::SetItems(m_storageMapID, m_storageMap->items()), 0);
     390        break;
     391    case StorageType::EphemeralLocal:
     392        ASSERT_NOT_REACHED();
     393        return;
     394    }
     395
     396    m_isDisconnected = false;
     397}
     398
     399void StorageAreaMap::disconnect()
     400{
     401    m_isDisconnected = true;
     402    if (m_storageType == StorageType::Session && m_storageMap) {
     403        m_pendingValueChanges.clear();
     404        m_hasPendingClear = false;
     405    } else
     406        resetValues();
     407}
     408
    388409} // namespace WebKit
  • trunk/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.h

    r219966 r245540  
    5959    bool contains(const String& key);
    6060
     61    // IPC::MessageReceiver
     62    void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
     63
    6164    const WebCore::SecurityOrigin& securityOrigin() const { return m_securityOrigin.get(); }
     65
     66    void connect();
     67    void disconnect();
     68    uint64_t identifier() const { return m_storageMapID; }
    6269
    6370private:
    6471    StorageAreaMap(StorageNamespaceImpl*, Ref<WebCore::SecurityOrigin>&&);
    65 
    66     // IPC::MessageReceiver
    67     void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
    6872
    6973    void didGetValues(uint64_t storageMapSeed);
     
    99103    bool m_hasPendingGetValues;
    100104    HashCountedSet<String> m_pendingValueChanges;
     105
     106    bool m_isDisconnected { true };
    101107};
    102108
  • trunk/Tools/ChangeLog

    r245531 r245540  
     12019-05-20  Sihui Liu  <sihui_liu@apple.com>
     2
     3        Move Web Storage to Network Process
     4        https://bugs.webkit.org/show_bug.cgi?id=197636
     5 
     6        Reviewed by Youenn Fablet.
     7 
     8        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
     9        * TestWebKitAPI/Tests/WebKitCocoa/LocalStorageDatabaseTracker.mm: Remove the wait for database file update.
     10        (TEST):
     11        * TestWebKitAPI/Tests/WebKitCocoa/LocalStoragePersistence.mm: Add a test for network process crash recovery.
     12        (TEST):
     13        * TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm: Fix a typo and add a test case to cover it.
     14        * TestWebKitAPI/Tests/WebKitCocoa/local-storage-process-crashes.html: Added.
     15
    1162019-05-20  Keith Rollin  <krollin@apple.com>
    217
  • trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj

    r245328 r245540  
    793793                CA5B94D32190C0F40059FE38 /* IndexedDBTempFileSize-2.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = CA5B94D12190C0E00059FE38 /* IndexedDBTempFileSize-2.html */; };
    794794                CA5B94D72191005B0059FE38 /* IndexedDBTempFileSize.mm in Sources */ = {isa = PBXBuildFile; fileRef = CA5B94D62191005B0059FE38 /* IndexedDBTempFileSize.mm */; };
     795                CA7787FF228CEFDB00E50463 /* local-storage-process-crashes.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = CA7787FE228CEFC700E50463 /* local-storage-process-crashes.html */; };
    795796                CA97B394219366600045DF6F /* IndexedDBUserDelete.mm in Sources */ = {isa = PBXBuildFile; fileRef = CA97B3922193663B0045DF6F /* IndexedDBUserDelete.mm */; };
    796797                CA97B3952193667A0045DF6F /* IndexedDBUserDelete.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = CA97B393219366470045DF6F /* IndexedDBUserDelete.html */; };
     
    12271228                                573255A722139BC700396AE8 /* load-web-archive-2.html in Copy Resources */,
    12281229                                57901FB11CAF142D00ED64F9 /* LoadInvalidURLRequest.html in Copy Resources */,
     1230                                CA7787FF228CEFDB00E50463 /* local-storage-process-crashes.html in Copy Resources */,
    12291231                                8C10AF98206467920018FD90 /* localstorage-empty-string-value.html in Copy Resources */,
    12301232                                51E6A8961D2F1CA700C004B6 /* LocalStorageClear.html in Copy Resources */,
     
    21492151                CA5B94D12190C0E00059FE38 /* IndexedDBTempFileSize-2.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "IndexedDBTempFileSize-2.html"; sourceTree = "<group>"; };
    21502152                CA5B94D62191005B0059FE38 /* IndexedDBTempFileSize.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = IndexedDBTempFileSize.mm; sourceTree = "<group>"; };
     2153                CA7787FE228CEFC700E50463 /* local-storage-process-crashes.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "local-storage-process-crashes.html"; sourceTree = "<group>"; };
    21512154                CA97B3922193663B0045DF6F /* IndexedDBUserDelete.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = IndexedDBUserDelete.mm; sourceTree = "<group>"; };
    21522155                CA97B393219366470045DF6F /* IndexedDBUserDelete.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = IndexedDBUserDelete.html; sourceTree = "<group>"; };
     
    30453048                                F41AB99D1EF4692C0083FA08 /* link-and-target-div.html */,
    30463049                                F46128D1211E2D2500D9FADB /* link-in-iframe-and-input.html */,
     3050                                CA7787FE228CEFC700E50463 /* local-storage-process-crashes.html */,
    30473051                                8C10AF97206467830018FD90 /* localstorage-empty-string-value.html */,
    30483052                                51E6A8951D2F1C7700C004B6 /* LocalStorageClear.html */,
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/LocalStorageDatabaseTracker.mm

    r242339 r245540  
    6161    TestWebKitAPI::Util::run(&readyToContinue);
    6262
    63     // Local storage database update interval is 1 second.
    64     TestWebKitAPI::Util::sleep(1);
    65 
    6663    readyToContinue = false;
    6764    [[WKWebsiteDataStore defaultDataStore] fetchDataRecordsOfTypes:[WKWebsiteDataStore allWebsiteDataTypes] completionHandler:^(NSArray<WKWebsiteDataRecord *> *dataRecords) {
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/LocalStoragePersistence.mm

    r242339 r245540  
    5454@end
    5555
     56TEST(WKWebView, LocalStorageProcessCrashes)
     57{
     58    readyToContinue = false;
     59    [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:[WKWebsiteDataStore allWebsiteDataTypes] modifiedSince:[NSDate distantPast] completionHandler:^() {
     60        readyToContinue = true;
     61    }];
     62    TestWebKitAPI::Util::run(&readyToContinue);
     63
     64    RetainPtr<LocalStorageMessageHandler> handler = adoptNS([[LocalStorageMessageHandler alloc] init]);
     65    RetainPtr<WKWebViewConfiguration> configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
     66    [[configuration userContentController] addScriptMessageHandler:handler.get() name:@"testHandler"];
     67    [configuration _setAllowUniversalAccessFromFileURLs:YES];
     68    RetainPtr<WKWebView> webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
     69    NSURLRequest *request = [NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"local-storage-process-crashes" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]];
     70    [webView loadRequest:request];
     71   
     72    receivedScriptMessage = false;
     73    [webView loadRequest:request];
     74    TestWebKitAPI::Util::run(&receivedScriptMessage);
     75    EXPECT_WK_STREQ(@"local:storage", [lastScriptMessage body]);
     76   
     77    receivedScriptMessage = false;
     78    [webView loadRequest:request];
     79    TestWebKitAPI::Util::run(&receivedScriptMessage);
     80    EXPECT_WK_STREQ(@"session:storage", [lastScriptMessage body]);
     81
     82    [configuration.get().processPool _terminateNetworkProcess];
     83   
     84    receivedScriptMessage = false;
     85    [webView loadRequest:request];
     86    TestWebKitAPI::Util::run(&receivedScriptMessage);
     87    EXPECT_WK_STREQ(@"Network Process Crashed", [lastScriptMessage body]);
     88
     89    readyToContinue = false;
     90    [webView evaluateJavaScript:@"window.localStorage.getItem('local')" completionHandler:^(id result, NSError *) {
     91        EXPECT_TRUE([@"storage" isEqualToString:result]);
     92        readyToContinue = true;
     93    }];
     94    TestWebKitAPI::Util::run(&readyToContinue);
     95
     96    readyToContinue = false;
     97    [webView evaluateJavaScript:@"window.sessionStorage.getItem('session')" completionHandler:^(id result, NSError *) {
     98        EXPECT_TRUE([@"storage" isEqualToString:result]);
     99        readyToContinue = true;
     100    }];
     101    TestWebKitAPI::Util::run(&readyToContinue);
     102}
    56103
    57104TEST(WKWebView, LocalStorageEmptyString)
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm

    r245323 r245540  
    50005000
    50015001    done = false;
    5002     [webView evaluateJavaScript:@"window.sessionStorage.setItem('b,'a')" completionHandler:^(id, NSError *) {
     5002    [webView evaluateJavaScript:@"window.sessionStorage.setItem('b','a')" completionHandler:^(id, NSError *) {
    50035003        done = true;
    50045004    }];
     
    50165016    [webView evaluateJavaScript:@"window.localStorage.getItem('a')" completionHandler:^(id result, NSError *) {
    50175017        EXPECT_TRUE([@"b" isEqualToString:result]);
     5018        done = true;
     5019    }];
     5020    TestWebKitAPI::Util::run(&done);
     5021
     5022    done = false;
     5023    [webView evaluateJavaScript:@"window.sessionStorage.getItem('b')" completionHandler:^(id result, NSError *) {
     5024        EXPECT_TRUE([@"a" isEqualToString:result]);
    50185025        done = true;
    50195026    }];
Note: See TracChangeset for help on using the changeset viewer.