⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 286936 in webkit


Ignore:
Timestamp:
Dec 12, 2021, 11:39:53 PM (5 years ago)
Author:
sihui_liu@apple.com
Message:

Merge StorageManager with NetworkStorageManager to manage WebStorage by origin
https://bugs.webkit.org/show_bug.cgi?id=234087

Reviewed by Chris Dumez.

Source/WebCore:

  • platform/sql/SQLiteFileSystem.cpp:

(WebCore::SQLiteFileSystem::deleteDatabaseFile):
(WebCore::SQLiteFileSystem::moveDatabaseFile):
(WebCore::SQLiteFileSystem::databaseFileSize):

  • platform/sql/SQLiteFileSystem.h:

Source/WebKit:

In network process, WebStorage data is managed by WebKit::StorageManager class. Each StorageManager owns one or
many StorageNameSpaces, and each StorageNamespace owns one or more StorageAreas. Each StorageArea correponds
to one storage map (one localStorage or sessionStorage object), using either a SQLite database or a in-memory
map as backend. Now that we have NetworkStorageManager, which manages storage by origin. We can merge
StorageManager with NetworkStorageManager, since localStorage and sessionStorage are not shared between
different origins.

The new structure is:
NetworkStorageManager (manage storage for a session, owns one or more OriginStorageManagers)
OriginStorageManager (manage storage for an origin, owns one LocalStorageManager and one SessionStorageManager)
LocalStorageManager / SessionStorageManager (manage LocalStorage and SessionStorage, owns one or more
StorageAreaBases)
MemoryStorageArea / SQLiteStorageArea (inherits StorageAreaBases; manage one local or session storage, like
Webkit::StorageArea)

StorageNamespace layer is removed. For SessionStorage, different StorageNamespaces means different web pages,
and same origin can have different sessionStorages on different pages, so we keep a StorageNamespace <=>
StorageArea map in SessionStorageManager. For LocalStorage, differnt StorageNamespaces means different page
groups. Our original plan was the same origin can have different localStorages in different page groups, but our
old implementation actually made all page groups point to the same database file. To keep existing behavior
that all page groups with same origin share the storage, we now keep one local StorageArea and one transient
StorageArea per LocalStorageManager.

Mostly refactoring and covered by existing tests.

  • NetworkProcess/NetworkProcess.cpp:

(WebKit::NetworkProcess::NetworkProcess):
(WebKit::NetworkProcess::lowMemoryHandler):
(WebKit::NetworkProcess::createNetworkConnectionToWebProcess):
(WebKit::NetworkProcess::addWebsiteDataStore):
(WebKit::NetworkProcess::addStorageManagerForSession):
(WebKit::NetworkProcess::destroySession):
(WebKit::NetworkProcess::hasLocalStorage):
(WebKit::NetworkProcess::fetchWebsiteData):
(WebKit::NetworkProcess::deleteWebsiteData):
(WebKit::NetworkProcess::deleteWebsiteDataForOrigins):
(WebKit::NetworkProcess::deleteAndRestrictWebsiteDataForRegistrableDomains):
(WebKit::NetworkProcess::prepareToSuspend):
(WebKit::NetworkProcess::resume):
(WebKit::NetworkProcess::syncLocalStorage):
(WebKit::NetworkProcess::renameOriginInWebsiteData):
(WebKit::NetworkProcess::connectionToWebProcessClosed):
(WebKit::NetworkProcess::getLocalStorageOriginDetails): Deleted.

  • NetworkProcess/NetworkProcess.h:
  • NetworkProcess/NetworkProcess.messages.in:
  • NetworkProcess/storage/LocalStorageManager.cpp: Added.

(WebKit::fileNameToOrigin):
(WebKit::originToFileName):
(WebKit::LocalStorageManager::originsOfLocalStorageData):
(WebKit::LocalStorageManager::localStorageFilePath):
(WebKit::LocalStorageManager::LocalStorageManager):
(WebKit::LocalStorageManager::isActive const):
(WebKit::LocalStorageManager::hasDataInMemory const):
(WebKit::LocalStorageManager::clearDataInMemory):
(WebKit::LocalStorageManager::clearDataOnDisk):
(WebKit::LocalStorageManager::close):
(WebKit::LocalStorageManager::handleLowMemoryWarning):
(WebKit::LocalStorageManager::syncLocalStorage):
(WebKit::LocalStorageManager::connectionClosed):
(WebKit::LocalStorageManager::connectionClosedForLocalStorageArea):
(WebKit::LocalStorageManager::connectionClosedForTransientStorageArea):
(WebKit::LocalStorageManager::connectToLocalStorageArea):
(WebKit::LocalStorageManager::connectToTransientLocalStorageArea):
(WebKit::LocalStorageManager::disconnectFromStorageArea):

  • NetworkProcess/storage/LocalStorageManager.h: Added.
  • NetworkProcess/storage/MemoryStorageArea.cpp: Added.

(WebKit::MemoryStorageArea::MemoryStorageArea):
(WebKit::MemoryStorageArea::isEmpty):
(WebKit::MemoryStorageArea::clear):
(WebKit::MemoryStorageArea::allItems):
(WebKit::MemoryStorageArea::setItem):
(WebKit::MemoryStorageArea::removeItem):
(WebKit::MemoryStorageArea::clone const):

  • NetworkProcess/storage/MemoryStorageArea.h: Added.

(isType):

  • NetworkProcess/storage/NetworkStorageManager.cpp:

(WebKit::readOriginFromFile):
(WebKit::writeOriginToFileIfNecessary):
(WebKit::NetworkStorageManager::create):
(WebKit::NetworkStorageManager::NetworkStorageManager):
(WebKit::NetworkStorageManager::canHandleTypes):
(WebKit::NetworkStorageManager::close):
(WebKit::originDirectoryPath):
(WebKit::originFilePath):
(WebKit::NetworkStorageManager::localOriginStorageManager):
(WebKit::NetworkStorageManager::removeOriginStorageManagerIfPossible):
(WebKit::NetworkStorageManager::deleteOriginDirectoryIfPossible):
(WebKit::NetworkStorageManager::clearStorageForTesting):
(WebKit::NetworkStorageManager::forEachOriginDirectory):
(WebKit::NetworkStorageManager::getAllOrigins):
(WebKit::NetworkStorageManager::fetchDataFromDisk):
(WebKit::NetworkStorageManager::deleteDataOnDisk):
(WebKit::NetworkStorageManager::moveData):
(WebKit::NetworkStorageManager::suspend):
(WebKit::NetworkStorageManager::resume):
(WebKit::NetworkStorageManager::handleLowMemoryWarning):
(WebKit::NetworkStorageManager::syncLocalStorage):
(WebKit::NetworkStorageManager::connectToLocalStorageArea):
(WebKit::NetworkStorageManager::connectToTransientLocalStorageArea):
(WebKit::NetworkStorageManager::connectToSessionStorageArea):
(WebKit::NetworkStorageManager::disconnectFromStorageArea):
(WebKit::NetworkStorageManager::cloneSessionStorageNamespace):
(WebKit::NetworkStorageManager::getValues):
(WebKit::NetworkStorageManager::setItem):
(WebKit::NetworkStorageManager::removeItem):
(WebKit::NetworkStorageManager::clear):
(WebKit::toWebsiteDataType): Deleted.

  • NetworkProcess/storage/NetworkStorageManager.h:
  • NetworkProcess/storage/NetworkStorageManager.messages.in:
  • NetworkProcess/storage/OriginStorageManager.cpp:

(WebKit::OriginStorageManager::StorageBucket::StorageBucket):
(WebKit::OriginStorageManager::StorageBucket::toWebsiteDataType):
(WebKit::OriginStorageManager::StorageBucket::toStorageIdentifier):
(WebKit::OriginStorageManager::StorageBucket::localStorageManager):
(WebKit::OriginStorageManager::StorageBucket::existingLocalStorageManager):
(WebKit::OriginStorageManager::StorageBucket::sessionStorageManager):
(WebKit::OriginStorageManager::StorageBucket::existingSessionStorageManager):
(WebKit::OriginStorageManager::StorageBucket::isActive const):
(WebKit::OriginStorageManager::StorageBucket::isEmpty const):
(WebKit::OriginStorageManager::StorageBucket::fetchDataTypesInList):
(WebKit::OriginStorageManager::StorageBucket::deleteData):
(WebKit::OriginStorageManager::StorageBucket::moveData):
(WebKit::OriginStorageManager::StorageBucket::fetchDataTypesInListFromMemory):
(WebKit::OriginStorageManager::StorageBucket::fetchDataTypesInListFromDisk):
(WebKit::OriginStorageManager::StorageBucket::deleteLocalStorageData):
(WebKit::OriginStorageManager::StorageBucket::deleteSessionStorageData):
(WebKit::OriginStorageManager::OriginStorageManager):
(WebKit::OriginStorageManager::defaultBucket):
(WebKit::OriginStorageManager::localStorageManager):
(WebKit::OriginStorageManager::existingLocalStorageManager):
(WebKit::OriginStorageManager::sessionStorageManager):
(WebKit::OriginStorageManager::existingSessionStorageManager):
(WebKit::OriginStorageManager::isEmpty):
(WebKit::OriginStorageManager::fetchDataTypesInList):
(WebKit::OriginStorageManager::deleteData):
(WebKit::OriginStorageManager::moveData):
(WebKit::OriginStorageManager::StorageBucket::isActive): Deleted.

  • NetworkProcess/storage/OriginStorageManager.h:
  • NetworkProcess/storage/SQLiteStorageArea.cpp: Added.

(WebKit::SQLiteStorageArea::statementString const):
(WebKit::SQLiteStorageArea::SQLiteStorageArea):
(WebKit::SQLiteStorageArea::close):
(WebKit::SQLiteStorageArea::~SQLiteStorageArea):
(WebKit::SQLiteStorageArea::isEmpty):
(WebKit::SQLiteStorageArea::clear):
(WebKit::SQLiteStorageArea::createTableIfNecessary):
(WebKit::SQLiteStorageArea::prepareDatabase):
(WebKit::SQLiteStorageArea::startTransactionIfNecessary):
(WebKit::SQLiteStorageArea::cachedStatement):
(WebKit::SQLiteStorageArea::getItem):
(WebKit::SQLiteStorageArea::getItemFromDatabase):
(WebKit::SQLiteStorageArea::allItems):
(WebKit::SQLiteStorageArea::setItem):
(WebKit::SQLiteStorageArea::removeItem):
(WebKit::SQLiteStorageArea::commitTransactionIfNecessary):
(WebKit::SQLiteStorageArea::handleLowMemoryWarning):

  • NetworkProcess/storage/SQLiteStorageArea.h: Added.

(isType):

  • NetworkProcess/storage/SessionStorageManager.cpp: Added.

(WebKit::SessionStorageManager::SessionStorageManager):
(WebKit::SessionStorageManager::isActive const):
(WebKit::SessionStorageManager::hasDataInMemory const):
(WebKit::SessionStorageManager::clearData):
(WebKit::SessionStorageManager::connectionClosed):
(WebKit::SessionStorageManager::addStorageArea):
(WebKit::SessionStorageManager::connectToSessionStorageArea):
(WebKit::SessionStorageManager::disconnectFromStorageArea):
(WebKit::SessionStorageManager::cloneStorageArea):

  • NetworkProcess/storage/SessionStorageManager.h: Added.
  • NetworkProcess/storage/StorageAreaBase.cpp: Added. Some code is moved from NetworkProcess/WebStoreage/StorageArea.cpp.

(WebKit::StorageAreaBase::StorageAreaBase):
(WebKit::StorageAreaBase::addListener):
(WebKit::StorageAreaBase::removeListener):
(WebKit::StorageAreaBase::hasListeners const):
(WebKit::StorageAreaBase::notifyListenersAboutClear):
(WebKit::StorageAreaBase::dispatchEvents const):

  • NetworkProcess/storage/StorageAreaBase.h: Added. Some code is moved from NetworkProcess/WebStoreage/StorageArea.h.

(WebKit::StorageAreaBase::identifier const):
(WebKit::StorageAreaBase::origin const):
(WebKit::StorageAreaBase::quota const):

  • NetworkProcess/storage/StorageAreaRegistry.cpp: Added.

(WebKit::StorageAreaRegistry::registerStorageArea):
(WebKit::StorageAreaRegistry::unregisterStorageArea):
(WebKit::StorageAreaRegistry::getStorageArea):

  • NetworkProcess/storage/StorageAreaRegistry.h: Added.
  • Scripts/generate-unified-sources.sh:
  • Sources.txt:
  • UIProcess/Network/NetworkProcessProxy.cpp:

(WebKit::NetworkProcessProxy::getLocalStorageDetails): Deleted.

  • UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm:

(WebKit::WebsiteDataStore::excludeDirectoryFromBackup):

  • UIProcess/WebsiteData/WebsiteDataStore.cpp:

(WebKit::WebsiteDataStore::parameters):
(WebKit::WebsiteDataStore::getLocalStorageDetails): Deleted.

  • UIProcess/WebsiteData/WebsiteDataStore.h:
  • UnifiedSources-output.xcfilelist:
  • WebKit.xcodeproj/project.pbxproj:
  • WebProcess/WebStorage/StorageAreaMap.cpp:

(WebKit::StorageAreaMap::setItem):
(WebKit::StorageAreaMap::removeItem):
(WebKit::StorageAreaMap::clear):
(WebKit::StorageAreaMap::ensureMap):
(WebKit::StorageAreaMap::connect):
(WebKit::StorageAreaMap::disconnect):

  • WebProcess/WebStorage/StorageNamespaceImpl.cpp:

(WebKit::StorageNamespaceImpl::copy):

Location:
trunk/Source
Files:
7 added
22 edited
5 copied

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r286933 r286936  
     12021-12-12  Sihui Liu  <sihui_liu@apple.com>
     2
     3        Merge StorageManager with NetworkStorageManager to manage WebStorage by origin
     4        https://bugs.webkit.org/show_bug.cgi?id=234087
     5
     6        Reviewed by Chris Dumez.
     7
     8        * platform/sql/SQLiteFileSystem.cpp:
     9        (WebCore::SQLiteFileSystem::deleteDatabaseFile):
     10        (WebCore::SQLiteFileSystem::moveDatabaseFile):
     11        (WebCore::SQLiteFileSystem::databaseFileSize):
     12        * platform/sql/SQLiteFileSystem.h:
     13
    1142021-12-12  Alan Bujtas  <zalan@apple.com>
    215
  • trunk/Source/WebCore/platform/sql/SQLiteFileSystem.cpp

    r278533 r286936  
    4444namespace WebCore {
    4545
     46static constexpr std::array<const char *, 3> databaseFileSuffixes { "", "-shm", "-wal" };
     47
    4648SQLiteFileSystem::SQLiteFileSystem()
    4749{
     
    7880}
    7981
    80 bool SQLiteFileSystem::deleteDatabaseFile(const String& fileName)
     82bool SQLiteFileSystem::deleteDatabaseFile(const String& filePath)
    8183{
    82     auto walFileName = makeString(fileName, "-wal"_s);
    83     auto shmFileName = makeString(fileName, "-shm"_s);
     84    bool fileExists = false;
     85    for (const auto* suffix : databaseFileSuffixes) {
     86        String path = filePath + suffix;
     87        FileSystem::deleteFile(path);
     88        fileExists |= FileSystem::fileExists(path);
     89    }
    8490
    85     // Try to delete all three files whether or not they are there.
    86     FileSystem::deleteFile(fileName);
    87     FileSystem::deleteFile(walFileName);
    88     FileSystem::deleteFile(shmFileName);
     91    return !fileExists;
     92}
    8993
    90     // If any of the wal or shm files remain after the delete attempt, the overall delete operation failed.
    91     return !FileSystem::fileExists(fileName) && !FileSystem::fileExists(walFileName) && !FileSystem::fileExists(shmFileName);
     94void SQLiteFileSystem::moveDatabaseFile(const String& oldFilePath, const String& newFilePath)
     95{
     96    for (const auto* suffix : databaseFileSuffixes)
     97        FileSystem::moveFile(makeString(oldFilePath, suffix), makeString(newFilePath, suffix));
    9298}
    9399
     
    99105#endif
    100106   
    101 uint64_t SQLiteFileSystem::databaseFileSize(const String& fileName)
    102 {       
     107uint64_t SQLiteFileSystem::databaseFileSize(const String& filePath)
     108{
    103109    uint64_t totalSize = 0;
    104 
    105     if (auto fileSize = FileSystem::fileSize(fileName))
    106         totalSize += *fileSize;
    107 
    108     if (auto fileSize = FileSystem::fileSize(makeString(fileName, "-wal"_s)))
    109         totalSize += *fileSize;
    110 
    111     if (auto fileSize = FileSystem::fileSize(makeString(fileName, "-shm"_s)))
    112         totalSize += *fileSize;
     110    for (const auto* suffix : databaseFileSuffixes) {
     111        if (auto fileSize = FileSystem::fileSize(filePath + suffix))
     112            totalSize += *fileSize;
     113    }
    113114
    114115    return totalSize;
  • trunk/Source/WebCore/platform/sql/SQLiteFileSystem.h

    r278253 r286936  
    7979    //
    8080    // fileName - The file name.
    81     WEBCORE_EXPORT static bool deleteDatabaseFile(const String& fileName);
     81    WEBCORE_EXPORT static bool deleteDatabaseFile(const String& filePath);
    8282
    83     WEBCORE_EXPORT static String computeHashForFileName(const String& fileName);
     83    // Moves a database file to a new place.
     84    WEBCORE_EXPORT static void moveDatabaseFile(const String& oldFilePath, const String& newFilePath);
     85    WEBCORE_EXPORT static String computeHashForFileName(const String& filePath);
    8486
    8587#if PLATFORM(IOS_FAMILY)
  • trunk/Source/WebKit/ChangeLog

    r286919 r286936  
     12021-12-12  Sihui Liu  <sihui_liu@apple.com>
     2
     3        Merge StorageManager with NetworkStorageManager to manage WebStorage by origin
     4        https://bugs.webkit.org/show_bug.cgi?id=234087
     5
     6        Reviewed by Chris Dumez.
     7
     8        In network process, WebStorage data is managed by WebKit::StorageManager class. Each StorageManager owns one or
     9        many StorageNameSpaces, and each StorageNamespace owns one or more StorageAreas. Each StorageArea correponds
     10        to one storage map (one localStorage or sessionStorage object), using either a SQLite database or a in-memory
     11        map as backend. Now that we have NetworkStorageManager, which manages storage by origin. We can merge
     12        StorageManager with NetworkStorageManager, since localStorage and sessionStorage are not shared between
     13        different origins.
     14
     15        The new structure is:
     16        NetworkStorageManager (manage storage for a session, owns one or more OriginStorageManagers)
     17        OriginStorageManager (manage storage for an origin, owns one LocalStorageManager and one SessionStorageManager)
     18        LocalStorageManager / SessionStorageManager (manage LocalStorage and SessionStorage, owns one or more
     19        StorageAreaBases)
     20        MemoryStorageArea / SQLiteStorageArea (inherits StorageAreaBases; manage one local or session storage, like
     21        Webkit::StorageArea)
     22
     23        StorageNamespace layer is removed. For SessionStorage, different StorageNamespaces means different web pages,
     24        and same origin can have different sessionStorages on different pages, so we keep a StorageNamespace <=>
     25        StorageArea map in SessionStorageManager. For LocalStorage, differnt StorageNamespaces means different page
     26        groups. Our original plan was the same origin can have different localStorages in different page groups, but our
     27        old implementation actually made all page groups point to the same database file. To keep existing behavior
     28        that all page groups with same origin share the storage, we now keep one local StorageArea and one transient
     29        StorageArea per LocalStorageManager.
     30
     31        Mostly refactoring and covered by existing tests.
     32
     33        * NetworkProcess/NetworkProcess.cpp:
     34        (WebKit::NetworkProcess::NetworkProcess):
     35        (WebKit::NetworkProcess::lowMemoryHandler):
     36        (WebKit::NetworkProcess::createNetworkConnectionToWebProcess):
     37        (WebKit::NetworkProcess::addWebsiteDataStore):
     38        (WebKit::NetworkProcess::addStorageManagerForSession):
     39        (WebKit::NetworkProcess::destroySession):
     40        (WebKit::NetworkProcess::hasLocalStorage):
     41        (WebKit::NetworkProcess::fetchWebsiteData):
     42        (WebKit::NetworkProcess::deleteWebsiteData):
     43        (WebKit::NetworkProcess::deleteWebsiteDataForOrigins):
     44        (WebKit::NetworkProcess::deleteAndRestrictWebsiteDataForRegistrableDomains):
     45        (WebKit::NetworkProcess::prepareToSuspend):
     46        (WebKit::NetworkProcess::resume):
     47        (WebKit::NetworkProcess::syncLocalStorage):
     48        (WebKit::NetworkProcess::renameOriginInWebsiteData):
     49        (WebKit::NetworkProcess::connectionToWebProcessClosed):
     50        (WebKit::NetworkProcess::getLocalStorageOriginDetails): Deleted.
     51        * NetworkProcess/NetworkProcess.h:
     52        * NetworkProcess/NetworkProcess.messages.in:
     53        * NetworkProcess/storage/LocalStorageManager.cpp: Added.
     54        (WebKit::fileNameToOrigin):
     55        (WebKit::originToFileName):
     56        (WebKit::LocalStorageManager::originsOfLocalStorageData):
     57        (WebKit::LocalStorageManager::localStorageFilePath):
     58        (WebKit::LocalStorageManager::LocalStorageManager):
     59        (WebKit::LocalStorageManager::isActive const):
     60        (WebKit::LocalStorageManager::hasDataInMemory const):
     61        (WebKit::LocalStorageManager::clearDataInMemory):
     62        (WebKit::LocalStorageManager::clearDataOnDisk):
     63        (WebKit::LocalStorageManager::close):
     64        (WebKit::LocalStorageManager::handleLowMemoryWarning):
     65        (WebKit::LocalStorageManager::syncLocalStorage):
     66        (WebKit::LocalStorageManager::connectionClosed):
     67        (WebKit::LocalStorageManager::connectionClosedForLocalStorageArea):
     68        (WebKit::LocalStorageManager::connectionClosedForTransientStorageArea):
     69        (WebKit::LocalStorageManager::connectToLocalStorageArea):
     70        (WebKit::LocalStorageManager::connectToTransientLocalStorageArea):
     71        (WebKit::LocalStorageManager::disconnectFromStorageArea):
     72        * NetworkProcess/storage/LocalStorageManager.h: Added.
     73        * NetworkProcess/storage/MemoryStorageArea.cpp: Added.
     74        (WebKit::MemoryStorageArea::MemoryStorageArea):
     75        (WebKit::MemoryStorageArea::isEmpty):
     76        (WebKit::MemoryStorageArea::clear):
     77        (WebKit::MemoryStorageArea::allItems):
     78        (WebKit::MemoryStorageArea::setItem):
     79        (WebKit::MemoryStorageArea::removeItem):
     80        (WebKit::MemoryStorageArea::clone const):
     81        * NetworkProcess/storage/MemoryStorageArea.h: Added.
     82        (isType):
     83        * NetworkProcess/storage/NetworkStorageManager.cpp:
     84        (WebKit::readOriginFromFile):
     85        (WebKit::writeOriginToFileIfNecessary):
     86        (WebKit::NetworkStorageManager::create):
     87        (WebKit::NetworkStorageManager::NetworkStorageManager):
     88        (WebKit::NetworkStorageManager::canHandleTypes):
     89        (WebKit::NetworkStorageManager::close):
     90        (WebKit::originDirectoryPath):
     91        (WebKit::originFilePath):
     92        (WebKit::NetworkStorageManager::localOriginStorageManager):
     93        (WebKit::NetworkStorageManager::removeOriginStorageManagerIfPossible):
     94        (WebKit::NetworkStorageManager::deleteOriginDirectoryIfPossible):
     95        (WebKit::NetworkStorageManager::clearStorageForTesting):
     96        (WebKit::NetworkStorageManager::forEachOriginDirectory):
     97        (WebKit::NetworkStorageManager::getAllOrigins):
     98        (WebKit::NetworkStorageManager::fetchDataFromDisk):
     99        (WebKit::NetworkStorageManager::deleteDataOnDisk):
     100        (WebKit::NetworkStorageManager::moveData):
     101        (WebKit::NetworkStorageManager::suspend):
     102        (WebKit::NetworkStorageManager::resume):
     103        (WebKit::NetworkStorageManager::handleLowMemoryWarning):
     104        (WebKit::NetworkStorageManager::syncLocalStorage):
     105        (WebKit::NetworkStorageManager::connectToLocalStorageArea):
     106        (WebKit::NetworkStorageManager::connectToTransientLocalStorageArea):
     107        (WebKit::NetworkStorageManager::connectToSessionStorageArea):
     108        (WebKit::NetworkStorageManager::disconnectFromStorageArea):
     109        (WebKit::NetworkStorageManager::cloneSessionStorageNamespace):
     110        (WebKit::NetworkStorageManager::getValues):
     111        (WebKit::NetworkStorageManager::setItem):
     112        (WebKit::NetworkStorageManager::removeItem):
     113        (WebKit::NetworkStorageManager::clear):
     114        (WebKit::toWebsiteDataType): Deleted.
     115        * NetworkProcess/storage/NetworkStorageManager.h:
     116        * NetworkProcess/storage/NetworkStorageManager.messages.in:
     117        * NetworkProcess/storage/OriginStorageManager.cpp:
     118        (WebKit::OriginStorageManager::StorageBucket::StorageBucket):
     119        (WebKit::OriginStorageManager::StorageBucket::toWebsiteDataType):
     120        (WebKit::OriginStorageManager::StorageBucket::toStorageIdentifier):
     121        (WebKit::OriginStorageManager::StorageBucket::localStorageManager):
     122        (WebKit::OriginStorageManager::StorageBucket::existingLocalStorageManager):
     123        (WebKit::OriginStorageManager::StorageBucket::sessionStorageManager):
     124        (WebKit::OriginStorageManager::StorageBucket::existingSessionStorageManager):
     125        (WebKit::OriginStorageManager::StorageBucket::isActive const):
     126        (WebKit::OriginStorageManager::StorageBucket::isEmpty const):
     127        (WebKit::OriginStorageManager::StorageBucket::fetchDataTypesInList):
     128        (WebKit::OriginStorageManager::StorageBucket::deleteData):
     129        (WebKit::OriginStorageManager::StorageBucket::moveData):
     130        (WebKit::OriginStorageManager::StorageBucket::fetchDataTypesInListFromMemory):
     131        (WebKit::OriginStorageManager::StorageBucket::fetchDataTypesInListFromDisk):
     132        (WebKit::OriginStorageManager::StorageBucket::deleteLocalStorageData):
     133        (WebKit::OriginStorageManager::StorageBucket::deleteSessionStorageData):
     134        (WebKit::OriginStorageManager::OriginStorageManager):
     135        (WebKit::OriginStorageManager::defaultBucket):
     136        (WebKit::OriginStorageManager::localStorageManager):
     137        (WebKit::OriginStorageManager::existingLocalStorageManager):
     138        (WebKit::OriginStorageManager::sessionStorageManager):
     139        (WebKit::OriginStorageManager::existingSessionStorageManager):
     140        (WebKit::OriginStorageManager::isEmpty):
     141        (WebKit::OriginStorageManager::fetchDataTypesInList):
     142        (WebKit::OriginStorageManager::deleteData):
     143        (WebKit::OriginStorageManager::moveData):
     144        (WebKit::OriginStorageManager::StorageBucket::isActive): Deleted.
     145        * NetworkProcess/storage/OriginStorageManager.h:
     146        * NetworkProcess/storage/SQLiteStorageArea.cpp: Added.
     147        (WebKit::SQLiteStorageArea::statementString const):
     148        (WebKit::SQLiteStorageArea::SQLiteStorageArea):
     149        (WebKit::SQLiteStorageArea::close):
     150        (WebKit::SQLiteStorageArea::~SQLiteStorageArea):
     151        (WebKit::SQLiteStorageArea::isEmpty):
     152        (WebKit::SQLiteStorageArea::clear):
     153        (WebKit::SQLiteStorageArea::createTableIfNecessary):
     154        (WebKit::SQLiteStorageArea::prepareDatabase):
     155        (WebKit::SQLiteStorageArea::startTransactionIfNecessary):
     156        (WebKit::SQLiteStorageArea::cachedStatement):
     157        (WebKit::SQLiteStorageArea::getItem):
     158        (WebKit::SQLiteStorageArea::getItemFromDatabase):
     159        (WebKit::SQLiteStorageArea::allItems):
     160        (WebKit::SQLiteStorageArea::setItem):
     161        (WebKit::SQLiteStorageArea::removeItem):
     162        (WebKit::SQLiteStorageArea::commitTransactionIfNecessary):
     163        (WebKit::SQLiteStorageArea::handleLowMemoryWarning):
     164        * NetworkProcess/storage/SQLiteStorageArea.h: Added.
     165        (isType):
     166        * NetworkProcess/storage/SessionStorageManager.cpp: Added.
     167        (WebKit::SessionStorageManager::SessionStorageManager):
     168        (WebKit::SessionStorageManager::isActive const):
     169        (WebKit::SessionStorageManager::hasDataInMemory const):
     170        (WebKit::SessionStorageManager::clearData):
     171        (WebKit::SessionStorageManager::connectionClosed):
     172        (WebKit::SessionStorageManager::addStorageArea):
     173        (WebKit::SessionStorageManager::connectToSessionStorageArea):
     174        (WebKit::SessionStorageManager::disconnectFromStorageArea):
     175        (WebKit::SessionStorageManager::cloneStorageArea):
     176        * NetworkProcess/storage/SessionStorageManager.h: Added.
     177        * NetworkProcess/storage/StorageAreaBase.cpp: Added. Some code is moved from NetworkProcess/WebStoreage/StorageArea.cpp.
     178        (WebKit::StorageAreaBase::StorageAreaBase):
     179        (WebKit::StorageAreaBase::addListener):
     180        (WebKit::StorageAreaBase::removeListener):
     181        (WebKit::StorageAreaBase::hasListeners const):
     182        (WebKit::StorageAreaBase::notifyListenersAboutClear):
     183        (WebKit::StorageAreaBase::dispatchEvents const):
     184        * NetworkProcess/storage/StorageAreaBase.h: Added. Some code is moved from NetworkProcess/WebStoreage/StorageArea.h.
     185        (WebKit::StorageAreaBase::identifier const):
     186        (WebKit::StorageAreaBase::origin const):
     187        (WebKit::StorageAreaBase::quota const):
     188        * NetworkProcess/storage/StorageAreaRegistry.cpp: Added.
     189        (WebKit::StorageAreaRegistry::registerStorageArea):
     190        (WebKit::StorageAreaRegistry::unregisterStorageArea):
     191        (WebKit::StorageAreaRegistry::getStorageArea):
     192        * NetworkProcess/storage/StorageAreaRegistry.h: Added.
     193        * Scripts/generate-unified-sources.sh:
     194        * Sources.txt:
     195        * UIProcess/Network/NetworkProcessProxy.cpp:
     196        (WebKit::NetworkProcessProxy::getLocalStorageDetails): Deleted.
     197        * UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm:
     198        (WebKit::WebsiteDataStore::excludeDirectoryFromBackup):
     199        * UIProcess/WebsiteData/WebsiteDataStore.cpp:
     200        (WebKit::WebsiteDataStore::parameters):
     201        (WebKit::WebsiteDataStore::getLocalStorageDetails): Deleted.
     202        * UIProcess/WebsiteData/WebsiteDataStore.h:
     203        * UnifiedSources-output.xcfilelist:
     204        * WebKit.xcodeproj/project.pbxproj:
     205        * WebProcess/WebStorage/StorageAreaMap.cpp:
     206        (WebKit::StorageAreaMap::setItem):
     207        (WebKit::StorageAreaMap::removeItem):
     208        (WebKit::StorageAreaMap::clear):
     209        (WebKit::StorageAreaMap::ensureMap):
     210        (WebKit::StorageAreaMap::connect):
     211        (WebKit::StorageAreaMap::disconnect):
     212        * WebProcess/WebStorage/StorageNamespaceImpl.cpp:
     213        (WebKit::StorageNamespaceImpl::copy):
     214
    12152021-12-11  Tim Horton  <timothy_horton@apple.com>
    2216
  • trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp

    r286788 r286936  
    159159NetworkProcess::NetworkProcess(AuxiliaryProcessInitializationParameters&& parameters)
    160160    : m_downloadManager(*this)
    161     , m_storageManagerSet(StorageManagerSet::create())
    162161#if ENABLE(CONTENT_EXTENSIONS)
    163162    , m_networkContentRuleListManager(*this)
     
    315314    });
    316315
    317     m_storageManagerSet->handleLowMemoryWarning();
    318 
    319316#if ENABLE(SERVICE_WORKER)
    320317    for (auto& swServer : m_swServers.values())
    321318        swServer->handleLowMemoryWarning();
    322319#endif
     320
     321    for (auto& manager : m_storageManagers.values())
     322        manager->handleLowMemoryWarning();
    323323}
    324324
     
    403403    connection.setOnLineState(NetworkStateNotifier::singleton().onLine());
    404404
    405     m_storageManagerSet->addConnection(connection.connection());
    406405    webIDBServer(sessionID).addConnection(connection.connection(), identifier);
    407406    if (auto manager = m_storageManagers.get(sessionID))
     
    422421    auto sessionID = parameters.networkSessionParameters.sessionID;
    423422
    424     addStorageManagerForSession(sessionID, parameters.generalStorageDirectory, parameters.generalStorageDirectoryHandle);
     423    addStorageManagerForSession(sessionID, parameters.generalStorageDirectory, parameters.generalStorageDirectoryHandle, parameters.localStorageDirectory, parameters.localStorageDirectoryExtensionHandle);
    425424    addSessionStorageQuotaManager(sessionID, parameters.perOriginStorageQuota, parameters.perThirdPartyOriginStorageQuota, parameters.cacheStorageDirectory, parameters.cacheStorageDirectoryExtensionHandle);
    426425
     
    430429    addServiceWorkerSession(sessionID, parameters.serviceWorkerProcessTerminationDelayEnabled, WTFMove(parameters.serviceWorkerRegistrationDirectory), parameters.serviceWorkerRegistrationDirectoryExtensionHandle);
    431430#endif
    432 
    433     m_storageManagerSet->add(sessionID, parameters.localStorageDirectory, parameters.localStorageDirectoryExtensionHandle);
    434431
    435432    RemoteNetworkingContext::ensureWebsiteDataStoreSession(*this, WTFMove(parameters));
     
    455452}
    456453
    457 void NetworkProcess::addStorageManagerForSession(PAL::SessionID sessionID, const String& generalStoragePath, SandboxExtension::Handle& generalStoragePathHandle)
     454void NetworkProcess::addStorageManagerForSession(PAL::SessionID sessionID, const String& generalStoragePath, SandboxExtension::Handle& generalStoragePathHandle, const String& localStoragePath, SandboxExtension::Handle& localStoragePathHandle)
    458455{
    459456    m_storageManagers.ensure(sessionID, [&] {
    460457        SandboxExtension::consumePermanently(generalStoragePathHandle);
    461         return NetworkStorageManager::create(sessionID, generalStoragePath);
     458        SandboxExtension::consumePermanently(localStoragePathHandle);
     459        return NetworkStorageManager::create(sessionID, generalStoragePath, localStoragePath);
    462460    });
    463461}
     
    576574#endif
    577575
    578     m_storageManagerSet->remove(sessionID);
    579576    if (auto server = m_webIDBServers.take(sessionID))
    580577        server->close();
     
    10661063void NetworkProcess::hasLocalStorage(PAL::SessionID sessionID, const RegistrableDomain& domain, CompletionHandler<void(bool)>&& completionHandler)
    10671064{
    1068     if (m_storageManagerSet->contains(sessionID)) {
    1069         m_storageManagerSet->getLocalStorageOrigins(sessionID, [domain, completionHandler = WTFMove(completionHandler)](auto&& origins) mutable {
    1070             completionHandler(WTF::anyOf(origins, [&domain](auto& origin) {
    1071                 return domain.matches(origin);
    1072             }));
    1073         });
    1074         return;
    1075     }
    1076     completionHandler(false);
     1065    auto iterator = m_storageManagers.find(sessionID);
     1066    if (iterator == m_storageManagers.end())
     1067        return completionHandler(false);
     1068
     1069    auto types = OptionSet<WebsiteDataType> { WebsiteDataType::LocalStorage };
     1070    iterator->value->fetchData(types, [domain, completionHandler = WTFMove(completionHandler)](auto entries) mutable {
     1071        completionHandler(WTF::anyOf(entries, [&domain](auto& entry) {
     1072            return domain.matches(entry.origin);
     1073        }));
     1074    });
    10771075}
    10781076
     
    14921490    }
    14931491
    1494     if (websiteDataTypes.contains(WebsiteDataType::SessionStorage) && m_storageManagerSet->contains(sessionID)) {
    1495         m_storageManagerSet->getSessionStorageOrigins(sessionID, [callbackAggregator](auto&& origins) {
    1496             while (!origins.isEmpty())
    1497                 callbackAggregator->m_websiteData.entries.append(WebsiteData::Entry { origins.takeAny(), WebsiteDataType::SessionStorage, 0 });
    1498         });
    1499     }
    1500 
    1501     if (websiteDataTypes.contains(WebsiteDataType::LocalStorage) && m_storageManagerSet->contains(sessionID)) {
    1502         m_storageManagerSet->getLocalStorageOrigins(sessionID, [callbackAggregator](auto&& origins) {
    1503             while (!origins.isEmpty())
    1504                 callbackAggregator->m_websiteData.entries.append(WebsiteData::Entry { origins.takeAny(), WebsiteDataType::LocalStorage, 0 });
    1505         });
    1506     }
    1507 
    15081492#if PLATFORM(COCOA) || USE(SOUP)
    15091493    if (websiteDataTypes.contains(WebsiteDataType::HSTSCache))
     
    15581542#endif
    15591543
    1560     if (auto iterator = m_storageManagers.find(sessionID); iterator != m_storageManagers.end()) {
    1561         iterator->value->fetchData(websiteDataTypes, [callbackAggregator](auto entries) mutable {
    1562             callbackAggregator->m_websiteData.entries.appendVector(WTFMove(entries));
    1563         });
     1544    if (NetworkStorageManager::canHandleTypes(websiteDataTypes)) {
     1545        if (auto iterator = m_storageManagers.find(sessionID); iterator != m_storageManagers.end()) {
     1546            iterator->value->fetchData(websiteDataTypes, [callbackAggregator](auto entries) mutable {
     1547                callbackAggregator->m_websiteData.entries.appendVector(WTFMove(entries));
     1548            });
     1549        }
    15641550    }
    15651551}
     
    15871573    if (websiteDataTypes.contains(WebsiteDataType::DOMCache))
    15881574        CacheStorage::Engine::clearAllCaches(*this, sessionID, [clearTasksHandler] { });
    1589 
    1590     if (websiteDataTypes.contains(WebsiteDataType::SessionStorage) && m_storageManagerSet->contains(sessionID))
    1591         m_storageManagerSet->deleteSessionStorage(sessionID, [clearTasksHandler] { });
    1592 
    1593     if (websiteDataTypes.contains(WebsiteDataType::LocalStorage) && m_storageManagerSet->contains(sessionID))
    1594         m_storageManagerSet->deleteLocalStorageModifiedSince(sessionID, modifiedSince, [clearTasksHandler] { });
    15951575
    15961576    if (websiteDataTypes.contains(WebsiteDataType::IndexedDBDatabases) && !sessionID.isEphemeral())
     
    16381618#endif
    16391619
    1640     if (auto iterator = m_storageManagers.find(sessionID); iterator != m_storageManagers.end())
    1641         iterator->value->deleteDataModifiedSince(websiteDataTypes, modifiedSince, [clearTasksHandler] { });
     1620    if (NetworkStorageManager::canHandleTypes(websiteDataTypes)) {
     1621        if (auto iterator = m_storageManagers.find(sessionID); iterator != m_storageManagers.end())
     1622            iterator->value->deleteDataModifiedSince(websiteDataTypes, modifiedSince, [clearTasksHandler] { });
     1623    }
    16421624}
    16431625
     
    17041686    }
    17051687
    1706     if (websiteDataTypes.contains(WebsiteDataType::SessionStorage) && m_storageManagerSet->contains(sessionID))
    1707         m_storageManagerSet->deleteSessionStorageForOrigins(sessionID, originDatas, [clearTasksHandler] { });
    1708 
    1709     if (websiteDataTypes.contains(WebsiteDataType::LocalStorage) && m_storageManagerSet->contains(sessionID))
    1710         m_storageManagerSet->deleteLocalStorageForOrigins(sessionID, originDatas, [clearTasksHandler] { });
    1711 
    17121688    if (websiteDataTypes.contains(WebsiteDataType::IndexedDBDatabases) && !sessionID.isEphemeral())
    17131689        webIDBServer(sessionID).closeAndDeleteDatabasesForOrigins(originDatas, [clearTasksHandler] { });
     
    17471723#endif
    17481724
    1749     if (auto iterator = m_storageManagers.find(sessionID); iterator != m_storageManagers.end())
    1750         iterator->value->deleteData(websiteDataTypes, originDatas, [clearTasksHandler] { });
     1725    if (NetworkStorageManager::canHandleTypes(websiteDataTypes)) {
     1726        if (auto iterator = m_storageManagers.find(sessionID); iterator != m_storageManagers.end())
     1727            iterator->value->deleteData(websiteDataTypes, originDatas, [clearTasksHandler] { });
     1728    }
    17511729
    17521730    if (auto* networkSession = this->networkSession(sessionID)) {
     
    19051883    }
    19061884
    1907     if (m_storageManagerSet->contains(sessionID)) {
    1908         if (websiteDataTypes.contains(WebsiteDataType::SessionStorage)) {
    1909             m_storageManagerSet->getSessionStorageOrigins(sessionID, [protectedThis = Ref { *this }, this, sessionID, callbackAggregator, domainsToDeleteAllNonCookieWebsiteDataFor](auto&& origins) {
    1910                 if (!m_storageManagerSet->contains(sessionID))
    1911                     return;
    1912 
    1913                 auto originsToDelete = filterForRegistrableDomains(origins, domainsToDeleteAllNonCookieWebsiteDataFor, callbackAggregator->m_domains);
    1914                 m_storageManagerSet->deleteSessionStorageForOrigins(sessionID, originsToDelete, [callbackAggregator] { });
    1915             });
    1916         }
    1917 
    1918         if (websiteDataTypes.contains(WebsiteDataType::LocalStorage)) {
    1919             m_storageManagerSet->getLocalStorageOrigins(sessionID, [protectedThis = Ref { *this }, this, sessionID, callbackAggregator, domainsToDeleteAllNonCookieWebsiteDataFor](auto&& origins) {
    1920                 if (!m_storageManagerSet->contains(sessionID))
    1921                     return;
    1922 
    1923                 auto originsToDelete = filterForRegistrableDomains(origins, domainsToDeleteAllNonCookieWebsiteDataFor, callbackAggregator->m_domains);
    1924                 m_storageManagerSet->deleteLocalStorageForOrigins(sessionID, originsToDelete, [callbackAggregator] { });
    1925             });
    1926         }
    1927     }
    1928 
    19291885    auto path = m_idbDatabasePaths.get(sessionID);
    19301886    if (!path.isEmpty() && websiteDataTypes.contains(WebsiteDataType::IndexedDBDatabases)) {
     
    19731929    }
    19741930
    1975     if (auto iterator = m_storageManagers.find(sessionID); iterator != m_storageManagers.end()) {
    1976         iterator->value->deleteDataForRegistrableDomains(websiteDataTypes, domainsToDeleteAllNonCookieWebsiteDataFor, [callbackAggregator](auto deletedDomains) mutable {
    1977             for (auto domain : deletedDomains)
    1978                 callbackAggregator->m_domains.add(WTFMove(domain));
    1979         });
     1931    if (NetworkStorageManager::canHandleTypes(websiteDataTypes)) {
     1932        if (auto iterator = m_storageManagers.find(sessionID); iterator != m_storageManagers.end()) {
     1933            iterator->value->deleteDataForRegistrableDomains(websiteDataTypes, domainsToDeleteAllNonCookieWebsiteDataFor, [callbackAggregator](auto&& deletedDomains) mutable {
     1934                for (auto domain : deletedDomains)
     1935                    callbackAggregator->m_domains.add(WTFMove(domain));
     1936            });
     1937        }
    19801938    }
    19811939
     
    23082266#endif
    23092267
    2310     m_storageManagerSet->suspend([callbackAggregator] { });
     2268    for (auto& manager : m_storageManagers.values())
     2269        manager->suspend([callbackAggregator] { });
    23112270}
    23122271
     
    23472306#endif
    23482307
    2349     m_storageManagerSet->resume();
     2308    for (auto& manager : m_storageManagers.values())
     2309        manager->resume();
    23502310}
    23512311
     
    24432403void NetworkProcess::syncLocalStorage(CompletionHandler<void()>&& completionHandler)
    24442404{
    2445     m_storageManagerSet->waitUntilSyncingLocalStorageFinished();
    2446     completionHandler();
     2405    auto aggregator = CallbackAggregator::create(WTFMove(completionHandler));
     2406    for (auto& manager : m_storageManagers.values())
     2407        manager->syncLocalStorage([aggregator] { });
    24472408}
    24482409
     
    24742435        return;
    24752436
    2476     if (dataTypes.contains(WebsiteDataType::LocalStorage)) {
    2477         if (m_storageManagerSet->contains(sessionID))
    2478             m_storageManagerSet->renameOrigin(sessionID, oldName, newName, [aggregator] { });
    2479     }
     2437    if (auto iterator = m_storageManagers.find(sessionID); iterator != m_storageManagers.end())
     2438        iterator->value->moveData(oldOrigin, newOrigin, [aggregator] { });
    24802439
    24812440    if (dataTypes.contains(WebsiteDataType::IndexedDBDatabases)) {
     
    27722731}
    27732732
    2774 void NetworkProcess::getLocalStorageOriginDetails(PAL::SessionID sessionID, CompletionHandler<void(Vector<LocalStorageDatabaseTracker::OriginDetails>&&)>&& completionHandler)
    2775 {
    2776     if (!m_storageManagerSet->contains(sessionID)) {
    2777         LOG_ERROR("Cannot get local storage information for an unknown session");
    2778         completionHandler({ });
    2779         return;
    2780     }
    2781 
    2782     m_storageManagerSet->getLocalStorageOriginDetails(sessionID, WTFMove(completionHandler));
    2783 }
    2784 
    27852733void NetworkProcess::connectionToWebProcessClosed(IPC::Connection& connection, PAL::SessionID sessionID)
    27862734{
    2787     m_storageManagerSet->removeConnection(connection);
    2788 
    27892735    if (auto* server = m_webIDBServers.get(sessionID))
    27902736        server->removeConnection(connection);
  • trunk/Source/WebKit/NetworkProcess/NetworkProcess.h

    r286788 r286936  
    108108class NetworkStorageManager;
    109109class ProcessAssertion;
    110 class StorageManagerSet;
    111110class WebPageNetworkParameters;
    112111class WebSWServerConnection;
     
    297296
    298297    void connectionToWebProcessClosed(IPC::Connection&, PAL::SessionID);
    299     void getLocalStorageOriginDetails(PAL::SessionID, CompletionHandler<void(Vector<LocalStorageDatabaseTracker::OriginDetails>&&)>&&);
    300298
    301299#if ENABLE(CONTENT_EXTENSIONS)
     
    555553    void removeSessionStorageQuotaManager(PAL::SessionID);
    556554
    557     void addStorageManagerForSession(PAL::SessionID, const String& path, SandboxExtension::Handle&);
     555    void addStorageManagerForSession(PAL::SessionID, const String& path, SandboxExtension::Handle&, const String& localStoragePath, SandboxExtension::Handle&);
    558556    void removeStorageManagerForSession(PAL::SessionID);
    559557
     
    577575    HashMap<PAL::SessionID, std::unique_ptr<NetworkSession>> m_networkSessions;
    578576    HashMap<PAL::SessionID, std::unique_ptr<WebCore::NetworkStorageSession>> m_networkStorageSessions;
    579 
    580     Ref<StorageManagerSet> m_storageManagerSet;
    581577
    582578#if PLATFORM(COCOA)
  • trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in

    r286788 r286936  
    174174    SetPCMFraudPreventionValuesForTesting(PAL::SessionID sessionID, String secretToken, String unlinkableToken, String signature, String keyID) -> () Async
    175175    SetPrivateClickMeasurementAppBundleIDForTesting(PAL::SessionID sessionID, String appBundleIDForTesting) -> () Async
    176     GetLocalStorageOriginDetails(PAL::SessionID sessionID) -> (Vector<WebKit::LocalStorageDatabaseTracker::OriginDetails> details) Async
    177176
    178177    SetServiceWorkerFetchTimeoutForTesting(Seconds seconds) -> () Synchronous
  • trunk/Source/WebKit/NetworkProcess/storage/LocalStorageManager.h

    r286935 r286936  
    2626#pragma once
    2727
    28 #include "Connection.h"
    29 #include <wtf/text/WTFString.h>
     28#include "StorageAreaIdentifier.h"
    3029
    3130namespace WebCore {
    3231struct ClientOrigin;
     32struct SecurityOriginData;
    3333}
    3434
    3535namespace WebKit {
    3636
    37 class FileSystemStorageHandleRegistry;
    38 class FileSystemStorageManager;
    39 enum class WebsiteDataType : uint32_t;
     37class MemoryStorageArea;
     38class StorageAreaBase;
     39class StorageAreaRegistry;
    4040
    41 class OriginStorageManager {
     41class LocalStorageManager {
    4242    WTF_MAKE_FAST_ALLOCATED;
    4343public:
    44     explicit OriginStorageManager(String&& path);
    45     ~OriginStorageManager();
     44    static Vector<WebCore::SecurityOriginData> originsOfLocalStorageData(const String& path);
     45    static String localStorageFilePath(const String& path, const WebCore::ClientOrigin&);
    4646
     47    LocalStorageManager(const String& path, StorageAreaRegistry&);
     48    bool isActive() const;
     49    bool hasDataInMemory() const;
     50    void clearDataInMemory();
     51    void clearDataOnDisk();
     52    void close();
     53    void handleLowMemoryWarning();
     54    void syncLocalStorage();
    4755    void connectionClosed(IPC::Connection::UniqueID);
    48     bool persisted() const { return m_persisted; }
    49     void setPersisted(bool value);
    50     FileSystemStorageManager& fileSystemStorageManager(FileSystemStorageHandleRegistry&);
    51     bool isActive();
    52     void deleteData(OptionSet<WebsiteDataType>, WallTime);
     56
     57    StorageAreaIdentifier connectToLocalStorageArea(IPC::Connection::UniqueID, const WebCore::ClientOrigin&, Ref<WorkQueue>&&);
     58    StorageAreaIdentifier connectToTransientLocalStorageArea(IPC::Connection::UniqueID, const WebCore::ClientOrigin&);
     59    void disconnectFromStorageArea(IPC::Connection::UniqueID, StorageAreaIdentifier);
    5360
    5461private:
    55     enum class StorageBucketMode : bool;
    56     class StorageBucket;
    57     StorageBucket& defaultBucket();
     62    void connectionClosedForLocalStorageArea(IPC::Connection::UniqueID);
     63    void connectionClosedForTransientStorageArea(IPC::Connection::UniqueID);
    5864
    59     void createOriginFileIfNecessary(const WebCore::ClientOrigin&);
    60     void deleteOriginFileIfNecessary();
    61 
    62     std::unique_ptr<StorageBucket> m_defaultBucket;
    6365    String m_path;
    64     bool m_persisted { false };
     66    StorageAreaRegistry& m_registry;
     67    std::unique_ptr<MemoryStorageArea> m_transientStorageArea;
     68    std::unique_ptr<StorageAreaBase> m_localStorageArea;
    6569};
    6670
    6771} // namespace WebKit
    6872
     73
  • trunk/Source/WebKit/NetworkProcess/storage/MemoryStorageArea.h

    r286935 r286936  
    11/*
    2  * Copyright (C) 2021 Apple Inc. All rights reserved.
     2 * Copyright (C) 2013-2021 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2626#pragma once
    2727
    28 #include "Connection.h"
    29 #include <wtf/text/WTFString.h>
     28#include "StorageAreaBase.h"
     29#include <WebCore/StorageMap.h>
    3030
    3131namespace WebCore {
    32 struct ClientOrigin;
     32class StorageMap;
    3333}
    3434
    3535namespace WebKit {
    3636
    37 class FileSystemStorageHandleRegistry;
    38 class FileSystemStorageManager;
    39 enum class WebsiteDataType : uint32_t;
     37class MemoryStorageArea final : public StorageAreaBase {
     38public:
     39    explicit MemoryStorageArea(const WebCore::ClientOrigin&, StorageAreaBase::StorageType = StorageAreaBase::StorageType::Session);
    4040
    41 class OriginStorageManager {
    42     WTF_MAKE_FAST_ALLOCATED;
    43 public:
    44     explicit OriginStorageManager(String&& path);
    45     ~OriginStorageManager();
    46 
    47     void connectionClosed(IPC::Connection::UniqueID);
    48     bool persisted() const { return m_persisted; }
    49     void setPersisted(bool value);
    50     FileSystemStorageManager& fileSystemStorageManager(FileSystemStorageHandleRegistry&);
    51     bool isActive();
    52     void deleteData(OptionSet<WebsiteDataType>, WallTime);
     41    StorageAreaBase::Type type() const final { return StorageAreaBase::Type::Memory; };
     42    bool isEmpty() final;
     43    void clear() final;
     44    std::unique_ptr<MemoryStorageArea> clone() const;
     45   
    5346
    5447private:
    55     enum class StorageBucketMode : bool;
    56     class StorageBucket;
    57     StorageBucket& defaultBucket();
     48    // StorageAreaBase
     49    StorageAreaBase::StorageType storageType() const final { return m_storageType; }
     50    HashMap<String, String> allItems() final;
     51    Expected<void, StorageError> setItem(IPC::Connection::UniqueID, StorageAreaImplIdentifier, String&& key, String&& value, const String& urlString) final;
     52    Expected<void, StorageError> removeItem(IPC::Connection::UniqueID, StorageAreaImplIdentifier, const String& key, const String& urlString) final;
     53    Expected<void, StorageError> clear(IPC::Connection::UniqueID, StorageAreaImplIdentifier, const String& urlString) final;
    5854
    59     void createOriginFileIfNecessary(const WebCore::ClientOrigin&);
    60     void deleteOriginFileIfNecessary();
    61 
    62     std::unique_ptr<StorageBucket> m_defaultBucket;
    63     String m_path;
    64     bool m_persisted { false };
     55    mutable WebCore::StorageMap m_map;
     56    StorageAreaBase::StorageType m_storageType;
    6557};
    6658
    6759} // namespace WebKit
    6860
     61SPECIALIZE_TYPE_TRAITS_BEGIN(WebKit::MemoryStorageArea)
     62    static bool isType(const WebKit::StorageAreaBase& area) { return area.type() == WebKit::StorageAreaBase::Type::Memory; }
     63SPECIALIZE_TYPE_TRAITS_END()
  • trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.cpp

    r286771 r286936  
    2929#include "FileSystemStorageHandleRegistry.h"
    3030#include "FileSystemStorageManager.h"
     31#include "LocalStorageManager.h"
    3132#include "Logging.h"
    3233#include "NetworkStorageManagerMessages.h"
    3334#include "OriginStorageManager.h"
     35#include "SessionStorageManager.h"
     36#include "StorageAreaBase.h"
     37#include "StorageAreaMapMessages.h"
     38#include "StorageAreaRegistry.h"
    3439#include "WebsiteDataType.h"
     40#include <WebCore/SecurityOriginData.h>
    3541#include <pal/crypto/CryptoDigest.h>
    3642#include <wtf/Scope.h>
     43#include <wtf/SuspendableWorkQueue.h>
    3744#include <wtf/persistence/PersistentCoders.h>
    3845#include <wtf/text/Base64.h>
     
    4451    ASSERT(!RunLoop::isMain());
    4552
    46     if (!FileSystem::fileExists(filePath))
     53    if (filePath.isEmpty() || !FileSystem::fileExists(filePath))
    4754        return std::nullopt;
    4855
     
    6774static void writeOriginToFileIfNecessary(const String& filePath, const WebCore::ClientOrigin& origin)
    6875{
    69     if (FileSystem::fileExists(filePath))
     76    if (filePath.isEmpty() || FileSystem::fileExists(filePath))
    7077        return;
    7178
     
    7784
    7885    if (!FileSystem::isHandleValid(originFileHandle)) {
    79         LOG_ERROR("writeOriginToFileIfNecessary: Failed to open origin file");
     86        LOG_ERROR("writeOriginToFileIfNecessary: Failed to open origin file '%s'", filePath.utf8().data());
    8087        return;
    8188    }
     
    94101}
    95102
    96 Ref<NetworkStorageManager> NetworkStorageManager::create(PAL::SessionID sessionID, const String& path)
    97 {
    98     return adoptRef(*new NetworkStorageManager(sessionID, path));
    99 }
    100 
    101 NetworkStorageManager::NetworkStorageManager(PAL::SessionID sessionID, const String& path)
     103Ref<NetworkStorageManager> NetworkStorageManager::create(PAL::SessionID sessionID, const String& path, const String& customLocalStoragePath)
     104{
     105    return adoptRef(*new NetworkStorageManager(sessionID, path, customLocalStoragePath));
     106}
     107
     108NetworkStorageManager::NetworkStorageManager(PAL::SessionID sessionID, const String& path, const String& customLocalStoragePath)
    102109    : m_sessionID(sessionID)
    103     , m_queue(WorkQueue::create("com.apple.WebKit.Storage"))
    104 {
    105     ASSERT(RunLoop::isMain());
    106 
    107     m_queue->dispatch([this, protectedThis = Ref { *this }, path = path.isolatedCopy()]() mutable {
     110    , m_queue(SuspendableWorkQueue::create("com.apple.WebKit.Storage"))
     111{
     112    ASSERT(RunLoop::isMain());
     113
     114    m_queue->dispatch([this, protectedThis = Ref { *this }, path = path.isolatedCopy(), customLocalStoragePath = crossThreadCopy(customLocalStoragePath)]() mutable {
    108115        m_fileSystemStorageHandleRegistry = makeUnique<FileSystemStorageHandleRegistry>();
     116        m_storageAreaRegistry = makeUnique<StorageAreaRegistry>();
    109117        m_path = path;
     118        m_customLocalStoragePath = customLocalStoragePath;
    110119        if (!m_path.isEmpty()) {
    111120            auto saltPath = FileSystem::pathByAppendingComponent(m_path, "salt");
     
    121130}
    122131
     132bool NetworkStorageManager::canHandleTypes(OptionSet<WebsiteDataType> types)
     133{
     134    return types.contains(WebsiteDataType::LocalStorage) || types.contains(WebsiteDataType::SessionStorage) || types.contains(WebsiteDataType::FileSystem);
     135}
     136
    123137void NetworkStorageManager::close()
    124138{
     
    134148    m_queue->dispatch([this, protectedThis = Ref { *this }]() mutable {
    135149        m_localOriginStorageManagers.clear();
    136         m_sessionOriginStorageManagers.clear();
    137150        m_fileSystemStorageHandleRegistry = nullptr;
    138151
     
    178191{
    179192    if (rootPath.isEmpty())
    180         return rootPath;
     193        return String { };
    181194
    182195    auto encodedTopOrigin = encode(origin.topOrigin.toString(), salt);
     
    187200static String originFilePath(const String& directory)
    188201{
     202    if (directory.isEmpty())
     203        return String { };
    189204    return FileSystem::pathByAppendingComponent(directory, "origin"_s);
    190205}
     
    197212        auto originDirectory = originDirectoryPath(m_path, origin, m_salt);
    198213        writeOriginToFileIfNecessary(originFilePath(originDirectory), origin);
    199         return makeUnique<OriginStorageManager>(WTFMove(originDirectory));
     214        return makeUnique<OriginStorageManager>(WTFMove(originDirectory), LocalStorageManager::localStorageFilePath(m_customLocalStoragePath, origin));
    200215    }).iterator->value;
    201216}
    202217
    203 void NetworkStorageManager::removeOriginStorageManagerIfPossible(const WebCore::ClientOrigin& origin)
    204 {
    205     if (auto iterator = m_localOriginStorageManagers.find(origin); iterator != m_localOriginStorageManagers.end()) {
    206         if (!iterator->value->isActive())
    207             m_localOriginStorageManagers.remove(iterator);
    208     }
     218bool NetworkStorageManager::removeOriginStorageManagerIfPossible(const WebCore::ClientOrigin& origin)
     219{
     220    auto iterator = m_localOriginStorageManagers.find(origin);
     221    if (iterator == m_localOriginStorageManagers.end())
     222        return true;
     223
     224    if (iterator->value->isActive())
     225        return false;
     226
     227    m_localOriginStorageManagers.remove(iterator);
     228    return true;
     229}
     230
     231void NetworkStorageManager::deleteOriginDirectoryIfPossible(const WebCore::ClientOrigin& origin)
     232{
     233    bool isEmpty = localOriginStorageManager(origin).isEmpty();
     234    bool removed = removeOriginStorageManagerIfPossible(origin);
     235    if (!removed || !isEmpty)
     236        return;
     237
     238    auto originDirectory = originDirectoryPath(m_path, origin, m_salt);
     239    auto filePath = originFilePath(originDirectory);
     240    deleteOriginFileIfNecessary(filePath);
     241    FileSystem::deleteEmptyDirectory(originDirectory);
    209242}
    210243
     
    233266            manager->setPersisted(false);
    234267
    235         for (auto& manager : m_sessionOriginStorageManagers.values())
    236             manager->setPersisted(false);
    237 
    238268        RunLoop::main().dispatch([protectedThis = WTFMove(protectedThis), completionHandler = WTFMove(completionHandler)]() mutable {
    239269            completionHandler();
     
    381411
    382412    completionHandler(handle->getHandle(connection.uniqueID(), WTFMove(name)));
    383 }
    384 
    385 static std::optional<WebsiteDataType> toWebsiteDataType(const String& storageType)
    386 {
    387     if (storageType == "FileSystem")
    388         return WebsiteDataType::FileSystem;
    389 
    390     return std::nullopt;
    391413}
    392414
     
    402424
    403425        for (auto& openingOrigin : openingOrigins) {
     426            if (openingOrigin.startsWith('.'))
     427                continue;
     428
    404429            auto openingOriginDirectory = FileSystem::pathByAppendingComponent(topOriginDirectory, openingOrigin);
    405430            apply(openingOriginDirectory);
     
    408433}
    409434
     435HashSet<WebCore::ClientOrigin> NetworkStorageManager::getAllOrigins()
     436{
     437    HashSet<WebCore::ClientOrigin> allOrigins;
     438    for (auto& origin : m_localOriginStorageManagers.keys())
     439        allOrigins.add(origin);
     440
     441    forEachOriginDirectory([&](auto directory) {
     442        if (auto origin = readOriginFromFile(originFilePath(directory)))
     443            allOrigins.add(*origin);
     444    });
     445
     446    for (auto& origin : LocalStorageManager::originsOfLocalStorageData(m_customLocalStoragePath))
     447        allOrigins.add(WebCore::ClientOrigin { origin, origin });
     448
     449    return allOrigins;
     450}
     451
    410452Vector<WebsiteData::Entry> NetworkStorageManager::fetchDataFromDisk(OptionSet<WebsiteDataType> targetTypes)
    411453{
     
    413455
    414456    HashMap<WebCore::SecurityOriginData, OptionSet<WebsiteDataType>> originTypes;
    415     forEachOriginDirectory([&](auto directory) mutable {
    416         auto origin = readOriginFromFile(originFilePath(directory));
    417         if (!origin)
    418             return;
    419 
    420         for (auto& storageType : FileSystem::listDirectory(directory)) {
    421             if (auto type = toWebsiteDataType(storageType); type && targetTypes.contains(*type)) {
    422                 // Return both top origin and opening origin for this data.
    423                 originTypes.add(origin->clientOrigin, OptionSet<WebsiteDataType> { }).iterator->value.add(*type);
    424                 originTypes.add(origin->topOrigin, OptionSet<WebsiteDataType> { }).iterator->value.add(*type);
    425             }
    426         }
    427     });
     457    for (auto& origin : getAllOrigins()) {
     458        auto types = localOriginStorageManager(origin).fetchDataTypesInList(targetTypes);
     459        originTypes.add(origin.clientOrigin, OptionSet<WebsiteDataType> { }).iterator->value.add(types);
     460        originTypes.add(origin.topOrigin, OptionSet<WebsiteDataType> { }).iterator->value.add(types);
     461        removeOriginStorageManagerIfPossible(origin);
     462    }
    428463
    429464    Vector<WebsiteData::Entry> entries;
     
    449484}
    450485
    451 Vector<WebCore::ClientOrigin> NetworkStorageManager::deleteDataOnDisk(OptionSet<WebsiteDataType> types, WallTime modifiedSinceTime, const Function<bool(const WebCore::ClientOrigin&)>& filter)
    452 {
    453     ASSERT(!RunLoop::isMain());
    454 
    455     Vector<WebCore::ClientOrigin> deletedOrigins;
    456     forEachOriginDirectory([&](auto directory) mutable {
    457         auto filePath = originFilePath(directory);
    458         auto origin = readOriginFromFile(filePath);
    459         if (!origin) {
    460             // If origin cannot be retrieved, but we are asked to remove data for all origins, remove it.
    461             RELEASE_LOG_ERROR(Storage, "NetworkStorageManager::deleteDataOnDisk failed to read origin from '%s'", filePath.utf8().data());
    462             if (filter(WebCore::ClientOrigin { })) {
    463                 auto tempOriginStorageManager = makeUnique<OriginStorageManager>(String { directory });
    464                 tempOriginStorageManager->deleteData(types, modifiedSinceTime);
    465                 deleteOriginFileIfNecessary(filePath);
    466                 FileSystem::deleteEmptyDirectory(directory);
    467             }
    468             return;
     486HashSet<WebCore::ClientOrigin> NetworkStorageManager::deleteDataOnDisk(OptionSet<WebsiteDataType> types, WallTime modifiedSinceTime, const Function<bool(const WebCore::ClientOrigin&)>& filter)
     487{
     488    ASSERT(!RunLoop::isMain());
     489
     490    HashSet<WebCore::ClientOrigin> deletedOrigins;
     491    for (auto& origin : getAllOrigins()) {
     492        if (!filter(origin))
     493            continue;
     494
     495        auto existingDataTypes = localOriginStorageManager(origin).fetchDataTypesInList(types);
     496        if (!existingDataTypes.isEmpty()) {
     497            deletedOrigins.add(origin);
     498            localOriginStorageManager(origin).deleteData(types, modifiedSinceTime);
    469499        }
    470 
    471         if (!filter(*origin))
    472             return;
    473 
    474         deletedOrigins.append(*origin);
    475         localOriginStorageManager(*origin).deleteData(types, modifiedSinceTime);
    476         removeOriginStorageManagerIfPossible(*origin);
    477         deleteOriginFileIfNecessary(filePath);
    478         FileSystem::deleteEmptyDirectory(directory);
    479     });
     500        deleteOriginDirectoryIfPossible(origin);
     501    }
    480502
    481503    return deletedOrigins;
     
    542564}
    543565
     566void NetworkStorageManager::moveData(const WebCore::SecurityOriginData& source, const WebCore::SecurityOriginData& target, CompletionHandler<void()>&& completionHandler)
     567{
     568    ASSERT(RunLoop::isMain());
     569    ASSERT(!m_closed);
     570
     571    m_queue->dispatch([this, protectedThis = Ref { *this }, source = crossThreadCopy(source), target = crossThreadCopy(target), completionHandler = WTFMove(completionHandler)]() mutable {
     572        auto sourceOrigin = WebCore::ClientOrigin { source, source };
     573        auto targetOrigin = WebCore::ClientOrigin { target, target };
     574       
     575        // Clear existing data of target origin.
     576        OptionSet<WebsiteDataType> types = { WebsiteDataType::FileSystem, WebsiteDataType::LocalStorage, WebsiteDataType::SessionStorage  };
     577        localOriginStorageManager(targetOrigin).deleteData(types, -WallTime::infinity());
     578        removeOriginStorageManagerIfPossible(targetOrigin);
     579
     580        // Move data from source origin to target origin.
     581        localOriginStorageManager(sourceOrigin).moveData(originDirectoryPath(m_path, targetOrigin, m_salt), LocalStorageManager::localStorageFilePath(m_customLocalStoragePath, targetOrigin));
     582        removeOriginStorageManagerIfPossible(sourceOrigin);
     583
     584        RunLoop::main().dispatch(WTFMove(completionHandler));
     585    });
     586}
     587
     588void NetworkStorageManager::suspend(CompletionHandler<void()>&& completionHandler)
     589{
     590    ASSERT(RunLoop::isMain());
     591
     592    m_queue->suspend([this, protectedThis = Ref { *this }] {
     593        for (auto& manager : m_localOriginStorageManagers.values()) {
     594            if (auto localStorageManager = manager->existingLocalStorageManager())
     595                localStorageManager->syncLocalStorage();
     596        }
     597    }, WTFMove(completionHandler));
     598}
     599
     600void NetworkStorageManager::resume()
     601{
     602    ASSERT(RunLoop::isMain());
     603
     604    m_queue->resume();
     605}
     606
     607void NetworkStorageManager::handleLowMemoryWarning()
     608{
     609    ASSERT(RunLoop::isMain());
     610
     611    m_queue->dispatch([this, protectedThis = Ref { *this }] {
     612        for (auto& manager : m_localOriginStorageManagers.values()) {
     613            if (auto localStorageManager = manager->existingLocalStorageManager())
     614                localStorageManager->handleLowMemoryWarning();
     615        }
     616    });
     617}
     618
     619void NetworkStorageManager::syncLocalStorage(CompletionHandler<void()>&& completionHandler)
     620{
     621    ASSERT(RunLoop::isMain());
     622
     623    m_queue->dispatch([this, protectedThis = Ref { *this }, completionHandler = WTFMove(completionHandler)]() mutable {
     624        for (auto& manager : m_localOriginStorageManagers.values()) {
     625            if (auto localStorageManager = manager->existingLocalStorageManager())
     626                localStorageManager->syncLocalStorage();
     627        }
     628
     629        RunLoop::main().dispatch(WTFMove(completionHandler));
     630    });
     631}
     632
     633void NetworkStorageManager::connectToLocalStorageArea(IPC::Connection& connection, StorageNamespaceIdentifier, WebCore::SecurityOriginData&& topOrigin, CompletionHandler<void(StorageAreaIdentifier)>&& completionHandler)
     634{
     635    ASSERT(!RunLoop::isMain());
     636
     637    WebCore::ClientOrigin origin = { topOrigin, topOrigin };
     638    completionHandler(localOriginStorageManager(origin).localStorageManager(*m_storageAreaRegistry).connectToLocalStorageArea(connection.uniqueID(), origin, m_queue.copyRef()));
     639}
     640
     641void NetworkStorageManager::connectToTransientLocalStorageArea(IPC::Connection& connection, StorageNamespaceIdentifier, WebCore::SecurityOriginData&& topOrigin, WebCore::SecurityOriginData&& openingOrigin, CompletionHandler<void(StorageAreaIdentifier)>&& completionHandler)
     642{
     643    WebCore::ClientOrigin origin = { topOrigin, openingOrigin };
     644    completionHandler(localOriginStorageManager(origin).localStorageManager(*m_storageAreaRegistry).connectToTransientLocalStorageArea(connection.uniqueID(), origin));
     645}
     646
     647void NetworkStorageManager::connectToSessionStorageArea(IPC::Connection& connection, StorageNamespaceIdentifier identifier, WebCore::SecurityOriginData&& topOrigin, CompletionHandler<void(StorageAreaIdentifier)>&& completionHandler)
     648{
     649    WebCore::ClientOrigin origin = { topOrigin, topOrigin };
     650    completionHandler(localOriginStorageManager(origin).sessionStorageManager(*m_storageAreaRegistry).connectToSessionStorageArea(connection.uniqueID(), origin, identifier));
     651}
     652
     653void NetworkStorageManager::disconnectFromStorageArea(IPC::Connection& connection, StorageAreaIdentifier identifier)
     654{
     655    ASSERT(!RunLoop::isMain());
     656
     657    auto storageArea = m_storageAreaRegistry->getStorageArea(identifier);
     658    if (!storageArea)
     659        return;
     660
     661    if (storageArea->storageType() == StorageAreaBase::StorageType::Local)
     662        localOriginStorageManager(storageArea->origin()).localStorageManager(*m_storageAreaRegistry).disconnectFromStorageArea(connection.uniqueID(), identifier);
     663    else
     664        localOriginStorageManager(storageArea->origin()).sessionStorageManager(*m_storageAreaRegistry).disconnectFromStorageArea(connection.uniqueID(), identifier);
     665}
     666
     667void NetworkStorageManager::cloneSessionStorageNamespace(IPC::Connection& connection, StorageNamespaceIdentifier fromIdentifier, StorageNamespaceIdentifier toIdentifier)
     668{
     669    ASSERT(!RunLoop::isMain());
     670
     671    for (auto& manager : m_localOriginStorageManagers.values()) {
     672        if (auto* sessionStorageManager = manager->existingSessionStorageManager())
     673            sessionStorageManager->cloneStorageArea(connection.uniqueID(), fromIdentifier, toIdentifier);
     674    }
     675}
     676
     677void NetworkStorageManager::getValues(StorageAreaIdentifier identifier, CompletionHandler<void(const HashMap<String, String>&)>&& completionHandler)
     678{
     679    ASSERT(!RunLoop::isMain());
     680
     681    if (auto storageArea = m_storageAreaRegistry->getStorageArea(identifier))
     682        return completionHandler(storageArea->allItems());
     683   
     684    return completionHandler({ });
     685}
     686
     687void NetworkStorageManager::setItem(IPC::Connection& connection, StorageAreaIdentifier identifier, StorageAreaImplIdentifier implIdentifier, uint64_t storageMapSeed, String&& key, String&& value, String&& urlString)
     688{
     689    ASSERT(!RunLoop::isMain());
     690
     691    bool hasQuotaError = false;
     692    if (auto storageArea = m_storageAreaRegistry->getStorageArea(identifier)) {
     693        auto result = storageArea->setItem(connection.uniqueID(), implIdentifier, String { key }, WTFMove(value), WTFMove(urlString));
     694        if (!result)
     695            hasQuotaError = (result.error() == StorageError::QuotaExceeded);
     696    }
     697
     698    connection.send(Messages::StorageAreaMap::DidSetItem(storageMapSeed, key, hasQuotaError), identifier);
     699}
     700
     701void NetworkStorageManager::removeItem(IPC::Connection& connection, StorageAreaIdentifier identifier, StorageAreaImplIdentifier implIdentifier, uint64_t storageMapSeed, String&& key, String&& urlString)
     702{
     703    ASSERT(!RunLoop::isMain());
     704
     705    if (auto storageArea = m_storageAreaRegistry->getStorageArea(identifier))
     706        storageArea->removeItem(connection.uniqueID(), implIdentifier, key, WTFMove(urlString));
     707
     708    connection.send(Messages::StorageAreaMap::DidRemoveItem(storageMapSeed, WTFMove(key)), identifier);
     709}
     710
     711void NetworkStorageManager::clear(IPC::Connection& connection, StorageAreaIdentifier identifier, StorageAreaImplIdentifier implIdentifier, uint64_t storageMapSeed, String&& urlString)
     712{
     713    ASSERT(!RunLoop::isMain());
     714
     715    if (auto storageArea = m_storageAreaRegistry->getStorageArea(identifier))
     716        storageArea->clear(connection.uniqueID(), implIdentifier, WTFMove(urlString));
     717
     718    connection.send(Messages::StorageAreaMap::DidClear(storageMapSeed), identifier);
     719}
     720
    544721} // namespace WebKit
    545722
  • trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.h

    r286601 r286936  
    2929#include "FileSystemStorageError.h"
    3030#include "OriginStorageManager.h"
     31#include "StorageAreaIdentifier.h"
     32#include "StorageAreaImplIdentifier.h"
     33#include "StorageNamespaceIdentifier.h"
    3134#include "WebsiteData.h"
    3235#include <WebCore/ClientOrigin.h>
     
    4750
    4851class FileSystemStorageHandleRegistry;
     52class StorageAreaRegistry;
    4953
    5054class NetworkStorageManager final : public IPC::Connection::WorkQueueMessageReceiver {
    5155public:
    52     static Ref<NetworkStorageManager> create(PAL::SessionID, const String& path);
     56    static Ref<NetworkStorageManager> create(PAL::SessionID, const String& path, const String& customLocalStoragePath);
     57    static bool canHandleTypes(OptionSet<WebsiteDataType>);
    5358
    5459    void startReceivingMessageFromConnection(IPC::Connection&);
     
    6267    void deleteDataModifiedSince(OptionSet<WebsiteDataType>, WallTime, CompletionHandler<void()>&&);
    6368    void deleteDataForRegistrableDomains(OptionSet<WebsiteDataType>, const Vector<WebCore::RegistrableDomain>&, CompletionHandler<void(HashSet<WebCore::RegistrableDomain>&&)>&&);
     69    void moveData(const WebCore::SecurityOriginData& source, const WebCore::SecurityOriginData& target, CompletionHandler<void()>&&);
     70    void suspend(CompletionHandler<void()>&&);
     71    void resume();
     72    void handleLowMemoryWarning();
     73    void syncLocalStorage(CompletionHandler<void()>&&);
    6474
    6575private:
    66     NetworkStorageManager(PAL::SessionID, const String& path);
     76    NetworkStorageManager(PAL::SessionID, const String& path, const String& customLocalStoragePath);
    6777    ~NetworkStorageManager();
    6878    OriginStorageManager& localOriginStorageManager(const WebCore::ClientOrigin&);
    69     void removeOriginStorageManagerIfPossible(const WebCore::ClientOrigin&);
     79    bool removeOriginStorageManagerIfPossible(const WebCore::ClientOrigin&);
     80    void deleteOriginDirectoryIfPossible(const WebCore::ClientOrigin&);
    7081    FileSystemStorageHandleRegistry& fileSystemStorageHandleRegistry();
    7182
    7283    void forEachOriginDirectory(const Function<void(const String&)>&);
     84    HashSet<WebCore::ClientOrigin> getAllOrigins();
    7385    Vector<WebsiteData::Entry> fetchDataFromDisk(OptionSet<WebsiteDataType>);
    74     Vector<WebCore::ClientOrigin> deleteDataOnDisk(OptionSet<WebsiteDataType>, WallTime, const Function<bool(const WebCore::ClientOrigin&)>&);
     86    HashSet<WebCore::ClientOrigin> deleteDataOnDisk(OptionSet<WebsiteDataType>, WallTime, const Function<bool(const WebCore::ClientOrigin&)>&);
    7587
    7688    // IPC::MessageReceiver (implemented by generated code)
    7789    void didReceiveMessage(IPC::Connection&, IPC::Decoder&);
     90    bool didReceiveSyncMessage(IPC::Connection&, IPC::Decoder&, UniqueRef<IPC::Encoder>& replyEncoder);
    7891
    79     // Message handlers
     92    // Message handlers for FileSystem.
    8093    void persisted(const WebCore::ClientOrigin&, CompletionHandler<void(bool)>&&);
    8194    void persist(const WebCore::ClientOrigin&, CompletionHandler<void(bool)>&&);
     
    89102    void resolve(WebCore::FileSystemHandleIdentifier, WebCore::FileSystemHandleIdentifier, CompletionHandler<void(Expected<Vector<String>, FileSystemStorageError>)>&&);
    90103    void getFile(WebCore::FileSystemHandleIdentifier, CompletionHandler<void(Expected<String, FileSystemStorageError>)>&&);
    91 
    92104    using AccessHandleInfo = std::pair<WebCore::FileSystemSyncAccessHandleIdentifier, IPC::SharedFileHandle>;
    93105    void createSyncAccessHandle(WebCore::FileSystemHandleIdentifier, CompletionHandler<void(Expected<AccessHandleInfo, FileSystemStorageError>)>&&);
     
    95107    void getHandleNames(WebCore::FileSystemHandleIdentifier, CompletionHandler<void(Expected<Vector<String>, FileSystemStorageError>)>&&);
    96108    void getHandle(IPC::Connection&, WebCore::FileSystemHandleIdentifier, String&& name, CompletionHandler<void(Expected<std::pair<WebCore::FileSystemHandleIdentifier, bool>, FileSystemStorageError>)>&&);
     109   
     110    // Message handlers for WebStorage.
     111    void connectToLocalStorageArea(IPC::Connection&, StorageNamespaceIdentifier, WebCore::SecurityOriginData&&, CompletionHandler<void(StorageAreaIdentifier)>&&);
     112    void connectToTransientLocalStorageArea(IPC::Connection&, StorageNamespaceIdentifier, WebCore::SecurityOriginData&&, WebCore::SecurityOriginData&&, CompletionHandler<void(StorageAreaIdentifier)>&&);
     113    void connectToSessionStorageArea(IPC::Connection&, StorageNamespaceIdentifier, WebCore::SecurityOriginData&&, CompletionHandler<void(StorageAreaIdentifier)>&&);
     114    void disconnectFromStorageArea(IPC::Connection&, StorageAreaIdentifier);
     115    void cloneSessionStorageNamespace(IPC::Connection&, StorageNamespaceIdentifier, StorageNamespaceIdentifier);
     116    void getValues(StorageAreaIdentifier, CompletionHandler<void(const HashMap<String, String>&)>&&);
     117    void setItem(IPC::Connection&, StorageAreaIdentifier, StorageAreaImplIdentifier, uint64_t seed, String&& key, String&& value, String&& urlString);
     118    void removeItem(IPC::Connection&, StorageAreaIdentifier, StorageAreaImplIdentifier, uint64_t seed, String&& key, String&& urlString);
     119    void clear(IPC::Connection&, StorageAreaIdentifier, StorageAreaImplIdentifier, uint64_t seed, String&& urlString);
    97120
    98121    PAL::SessionID m_sessionID;
    99     Ref<WorkQueue> m_queue;
     122    Ref<SuspendableWorkQueue> m_queue;
    100123    String m_path;
    101124    FileSystem::Salt m_salt;
    102125    bool m_closed { false };
    103126    HashMap<WebCore::ClientOrigin, std::unique_ptr<OriginStorageManager>> m_localOriginStorageManagers;
    104     HashMap<WebCore::ClientOrigin, std::unique_ptr<OriginStorageManager>> m_sessionOriginStorageManagers;
    105127    WeakHashSet<IPC::Connection> m_connections; // Main thread only.
    106128    std::unique_ptr<FileSystemStorageHandleRegistry> m_fileSystemStorageHandleRegistry;
     129    std::unique_ptr<StorageAreaRegistry> m_storageAreaRegistry;
     130    String m_customLocalStoragePath;
    107131};
    108132
  • trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.messages.in

    r285912 r286936  
    3636    Move(WebCore::FileSystemHandleIdentifier identifier, WebCore::FileSystemHandleIdentifier destinationIdentifier, String newName) -> (std::optional<WebKit::FileSystemStorageError> result) Async
    3737    GetFile(WebCore::FileSystemHandleIdentifier identifier) -> (Expected<String, WebKit::FileSystemStorageError> result) Async
    38 
    3938    CreateSyncAccessHandle(WebCore::FileSystemHandleIdentifier identifier) -> (Expected<std::pair<WebCore::FileSystemSyncAccessHandleIdentifier, IPC::SharedFileHandle>, WebKit::FileSystemStorageError> result) Async
    4039    CloseAccessHandle(WebCore::FileSystemHandleIdentifier identifier, WebCore::FileSystemSyncAccessHandleIdentifier accessHandleIdentifier) -> (std::optional<WebKit::FileSystemStorageError> result) Async
    4140    GetHandleNames(WebCore::FileSystemHandleIdentifier identifier) -> (Expected<Vector<String>, WebKit::FileSystemStorageError> result) Async
    4241    GetHandle(WebCore::FileSystemHandleIdentifier identifier, String name) -> (Expected<std::pair<WebCore::FileSystemHandleIdentifier, bool>, WebKit::FileSystemStorageError> result) Async WantsConnection
     42
     43    ConnectToLocalStorageArea(WebKit::StorageNamespaceIdentifier storageNamespaceID, struct WebCore::SecurityOriginData securityOriginData) -> (WebKit::StorageAreaIdentifier identifier) Synchronous WantsConnection
     44    ConnectToTransientLocalStorageArea(WebKit::StorageNamespaceIdentifier storageNamespaceID, struct WebCore::SecurityOriginData topLevelSecurityOriginData, struct WebCore::SecurityOriginData securityOriginData) -> (WebKit::StorageAreaIdentifier identifier) Synchronous WantsConnection
     45    ConnectToSessionStorageArea(WebKit::StorageNamespaceIdentifier storageNamespaceID, struct WebCore::SecurityOriginData securityOriginData) -> (WebKit::StorageAreaIdentifier identifier) Synchronous WantsConnection
     46    DisconnectFromStorageArea(WebKit::StorageAreaIdentifier identifier) WantsConnection
     47    CloneSessionStorageNamespace(WebKit::StorageNamespaceIdentifier fromStorageNamespaceID, WebKit::StorageNamespaceIdentifier toStorageNamespaceID) WantsConnection
     48    GetValues(WebKit::StorageAreaIdentifier identifier) -> (HashMap<String, String> values) Synchronous
     49    SetItem(WebKit::StorageAreaIdentifier identifier, WebKit::StorageAreaImplIdentifier implIdentifier, uint64_t storageMapSeed, String key, String value, String urlString) WantsConnection
     50    RemoveItem(WebKit::StorageAreaIdentifier identifier, WebKit::StorageAreaImplIdentifier implIdentifier, uint64_t storageMapSeed, String key, String urlString) WantsConnection
     51    Clear(WebKit::StorageAreaIdentifier identifier, WebKit::StorageAreaImplIdentifier implIdentifier, uint64_t storageMapSeed, String urlString) WantsConnection
    4352}
  • trunk/Source/WebKit/NetworkProcess/storage/OriginStorageManager.cpp

    r286837 r286936  
    2929#include "FileSystemStorageHandleRegistry.h"
    3030#include "FileSystemStorageManager.h"
     31#include "LocalStorageManager.h"
     32#include "SessionStorageManager.h"
     33#include "StorageAreaRegistry.h"
    3134#include "WebsiteDataType.h"
     35#include <WebCore/SQLiteFileSystem.h>
    3236#include <wtf/FileSystem.h>
    3337
    3438namespace WebKit {
    3539
     40static constexpr auto originFileName = "origin"_s;
    3641enum class OriginStorageManager::StorageBucketMode : bool { BestEffort, Persistent };
    3742
     
    3944    WTF_MAKE_FAST_ALLOCATED;
    4045public:
    41     StorageBucket(const String& rootPath, const String& identifier)
     46    StorageBucket(const String& rootPath, const String& identifier, const String& localStoragePath)
    4247        : m_rootPath(rootPath)
    4348        , m_identifier(identifier)
     49        , m_localStoragePath(localStoragePath)
    4450    {
    4551    }
     
    5662    enum class StorageType : uint8_t {
    5763        FileSystem,
     64        LocalStorage,
     65        SessionStorage,
    5866    };
     67
     68    static std::optional<WebsiteDataType> toWebsiteDataType(const String& storageIdentifier)
     69    {
     70        if (storageIdentifier == "FileSystem"_s)
     71            return WebsiteDataType::FileSystem;
     72        if (storageIdentifier == "LocalStorage"_s)
     73            return WebsiteDataType::LocalStorage;
     74        if (storageIdentifier == "SessionStorage"_s)
     75            return WebsiteDataType::SessionStorage;
     76
     77        return std::nullopt;
     78    }
    5979
    6080    static String toStorageIdentifier(StorageType type)
     
    6383        case StorageType::FileSystem:
    6484            return "FileSystem"_s;
     85        case StorageType::LocalStorage:
     86            return "LocalStorage"_s;
     87        case StorageType::SessionStorage:
     88            return "SessionStorage"_s;
    6589        default:
    6690            break;
     
    87111    }
    88112
    89     bool isActive()
    90     {
    91         return !!m_fileSystemStorageManager;
     113    LocalStorageManager& localStorageManager(StorageAreaRegistry& registry)
     114    {
     115        if (!m_localStorageManager)
     116            m_localStorageManager = makeUnique<LocalStorageManager>(m_localStoragePath, registry);
     117
     118        return *m_localStorageManager;
     119    }
     120
     121    LocalStorageManager* existingLocalStorageManager()
     122    {
     123        return m_localStorageManager.get();
     124    }
     125
     126    SessionStorageManager& sessionStorageManager(StorageAreaRegistry& registry)
     127    {
     128        if (!m_sessionStorageManager)
     129            m_sessionStorageManager = makeUnique<SessionStorageManager>(registry);
     130
     131        return *m_sessionStorageManager;
     132    }
     133
     134    SessionStorageManager* existingSessionStorageManager()
     135    {
     136        return m_sessionStorageManager.get();
     137    }
     138
     139    bool isActive() const
     140    {
     141        return m_fileSystemStorageManager || m_localStorageManager || m_sessionStorageManager;
     142    }
     143
     144    bool isEmpty() const
     145    {
     146        auto files = FileSystem::listDirectory(m_rootPath);
     147        auto hasValidFile = WTF::anyOf(files, [&](auto file) {
     148            bool isInvalidFile = (file == originFileName);
     149#if PLATFORM(COCOA)
     150            isInvalidFile |= (file == ".DS_Store");
     151#endif
     152            return !isInvalidFile;
     153        });
     154        if (hasValidFile)
     155            return false;
     156
     157        return !FileSystem::fileExists(m_localStoragePath);
     158    }
     159
     160    OptionSet<WebsiteDataType> fetchDataTypesInList(OptionSet<WebsiteDataType> types)
     161    {
     162        auto result = fetchDataTypesInListFromMemory(types);
     163        result.add(fetchDataTypesInListFromDisk(types));
     164
     165        return result;
    92166    }
    93167
     
    96170        if (types.contains(WebsiteDataType::FileSystem))
    97171            deleteFileSystemStorageData(modifiedSinceTime);
     172
     173        if (types.contains(WebsiteDataType::LocalStorage))
     174            deleteLocalStorageData(modifiedSinceTime);
     175
     176        if (types.contains(WebsiteDataType::SessionStorage) && modifiedSinceTime == -WallTime::infinity())
     177            deleteSessionStorageData();
     178    }
     179
     180    void moveData(const String& path, const String& localStoragePath)
     181    {
     182        m_fileSystemStorageManager = nullptr;
     183        if (m_localStorageManager)
     184            m_localStorageManager->close();
     185
     186        FileSystem::makeAllDirectories(FileSystem::parentPath(path));
     187        FileSystem::moveFile(m_rootPath, path);
     188
     189        if (!m_localStoragePath.isEmpty() && !localStoragePath.isEmpty()) {
     190            FileSystem::makeAllDirectories(FileSystem::parentPath(localStoragePath));
     191            WebCore::SQLiteFileSystem::moveDatabaseFile(m_localStoragePath, localStoragePath);
     192        }
    98193    }
    99194
    100195private:
     196    OptionSet<WebsiteDataType> fetchDataTypesInListFromMemory(OptionSet<WebsiteDataType> types)
     197    {
     198        OptionSet<WebsiteDataType> result;
     199        if (types.contains(WebsiteDataType::LocalStorage)) {
     200            if (m_localStorageManager && m_localStorageManager->hasDataInMemory())
     201                result.add(WebsiteDataType::LocalStorage);
     202        }
     203
     204        if (types.contains(WebsiteDataType::SessionStorage)) {
     205            if (m_sessionStorageManager && m_sessionStorageManager->hasDataInMemory())
     206                result.add(WebsiteDataType::SessionStorage);
     207        }
     208
     209        return result;
     210    }
     211
     212    OptionSet<WebsiteDataType> fetchDataTypesInListFromDisk(OptionSet<WebsiteDataType> types)
     213    {
     214        OptionSet<WebsiteDataType> result;
     215        for (auto& storageType : FileSystem::listDirectory(m_rootPath)) {
     216            if (auto type = toWebsiteDataType(storageType); type && types.contains(*type))
     217                result.add(*type);
     218        }
     219
     220        if (types.contains(WebsiteDataType::LocalStorage) && !result.contains(WebsiteDataType::LocalStorage)) {
     221            if (FileSystem::fileExists(m_localStoragePath))
     222                result.add(WebsiteDataType::LocalStorage);
     223        }
     224
     225        return result;
     226    }
     227
    101228    void deleteFileSystemStorageData(WallTime modifiedSinceTime)
    102229    {
     
    107234    }
    108235
     236    void deleteLocalStorageData(WallTime time)
     237    {
     238        if (auto modificationTime = FileSystem::fileModificationTime(m_localStoragePath); *modificationTime >= time) {
     239            if (m_localStorageManager)
     240                m_localStorageManager->clearDataOnDisk();
     241            WebCore::SQLiteFileSystem::deleteDatabaseFile(m_localStoragePath);
     242        }
     243
     244        if (!m_localStorageManager)
     245            return;
     246
     247        m_localStorageManager->clearDataInMemory();
     248        if (!m_localStorageManager->isActive())
     249            m_localStorageManager = nullptr;
     250    }
     251
     252    void deleteSessionStorageData()
     253    {
     254        if (!m_sessionStorageManager)
     255            return;
     256
     257        m_sessionStorageManager->clearData();
     258        if (!m_sessionStorageManager->isActive())
     259            m_sessionStorageManager = nullptr;
     260    }
     261   
    109262    String m_rootPath;
    110263    String m_identifier;
    111264    StorageBucketMode m_mode { StorageBucketMode::BestEffort };
    112265    std::unique_ptr<FileSystemStorageManager> m_fileSystemStorageManager;
     266    std::unique_ptr<LocalStorageManager> m_localStorageManager;
     267    String m_localStoragePath;
     268    std::unique_ptr<SessionStorageManager> m_sessionStorageManager;
    113269};
    114270
    115 OriginStorageManager::OriginStorageManager(String&& path)
     271OriginStorageManager::OriginStorageManager(String&& path, String&& localStoragePath)
    116272    : m_path(WTFMove(path))
     273    , m_localStoragePath(WTFMove(localStoragePath))
    117274{
    118275    ASSERT(!RunLoop::isMain());
     
    130287{
    131288    if (!m_defaultBucket)
    132         m_defaultBucket = makeUnique<StorageBucket>(m_path, "default"_s);
     289        m_defaultBucket = makeUnique<StorageBucket>(m_path, "default"_s, m_localStoragePath);
    133290
    134291    return *m_defaultBucket;
     
    140297}
    141298
     299LocalStorageManager& OriginStorageManager::localStorageManager(StorageAreaRegistry& registry)
     300{
     301    return defaultBucket().localStorageManager(registry);
     302}
     303
     304LocalStorageManager* OriginStorageManager::existingLocalStorageManager()
     305{
     306    return defaultBucket().existingLocalStorageManager();
     307}
     308
     309SessionStorageManager& OriginStorageManager::sessionStorageManager(StorageAreaRegistry& registry)
     310{
     311    return defaultBucket().sessionStorageManager(registry);
     312}
     313
     314SessionStorageManager* OriginStorageManager::existingSessionStorageManager()
     315{
     316    return defaultBucket().existingSessionStorageManager();
     317}
     318
    142319bool OriginStorageManager::isActive()
    143320{
     
    145322}
    146323
    147 void OriginStorageManager::deleteData(OptionSet<WebsiteDataType> types, WallTime modifiedSince)
    148 {
    149     ASSERT(!RunLoop::isMain());
    150     defaultBucket().deleteData(types, modifiedSince);
     324bool OriginStorageManager::isEmpty()
     325{
     326    return defaultBucket().isEmpty();
    151327}
    152328
     
    159335}
    160336
     337OptionSet<WebsiteDataType> OriginStorageManager::fetchDataTypesInList(OptionSet<WebsiteDataType> types)
     338{
     339    ASSERT(!RunLoop::isMain());
     340
     341    return defaultBucket().fetchDataTypesInList(types);
     342}
     343
     344void OriginStorageManager::deleteData(OptionSet<WebsiteDataType> types, WallTime modifiedSince)
     345{
     346    ASSERT(!RunLoop::isMain());
     347
     348    defaultBucket().deleteData(types, modifiedSince);
     349}
     350
     351void OriginStorageManager::moveData(const String& newPath, const String& localStoragePath)
     352{
     353    ASSERT(!RunLoop::isMain());
     354
     355    defaultBucket().moveData(newPath, localStoragePath);
     356}
     357
    161358} // namespace WebKit
    162359
  • trunk/Source/WebKit/NetworkProcess/storage/OriginStorageManager.h

    r286601 r286936  
    3737class FileSystemStorageHandleRegistry;
    3838class FileSystemStorageManager;
     39class LocalStorageManager;
     40class SessionStorageManager;
     41class StorageAreaRegistry;
    3942enum class WebsiteDataType : uint32_t;
    4043
     
    4245    WTF_MAKE_FAST_ALLOCATED;
    4346public:
    44     explicit OriginStorageManager(String&& path);
     47    OriginStorageManager(String&& path, String&& localStoragePath);
    4548    ~OriginStorageManager();
    4649
     
    4952    void setPersisted(bool value);
    5053    FileSystemStorageManager& fileSystemStorageManager(FileSystemStorageHandleRegistry&);
     54    LocalStorageManager& localStorageManager(StorageAreaRegistry&);
     55    LocalStorageManager* existingLocalStorageManager();
     56    SessionStorageManager& sessionStorageManager(StorageAreaRegistry&);
     57    SessionStorageManager* existingSessionStorageManager();
    5158    bool isActive();
     59    bool isEmpty();
     60    OptionSet<WebsiteDataType> fetchDataTypesInList(OptionSet<WebsiteDataType>);
    5261    void deleteData(OptionSet<WebsiteDataType>, WallTime);
     62    void moveData(const String& newPath, const String& localStoragePath);
    5363
    5464private:
     
    6373    String m_path;
    6474    bool m_persisted { false };
     75    String m_localStoragePath;
    6576};
    6677
  • trunk/Source/WebKit/NetworkProcess/storage/SessionStorageManager.h

    r286935 r286936  
    2626#pragma once
    2727
    28 #include "Connection.h"
    29 #include <wtf/text/WTFString.h>
    30 
    31 namespace WebCore {
    32 struct ClientOrigin;
    33 }
     28#include "StorageAreaIdentifier.h"
     29#include "StorageNamespaceIdentifier.h"
    3430
    3531namespace WebKit {
    3632
    37 class FileSystemStorageHandleRegistry;
    38 class FileSystemStorageManager;
    39 enum class WebsiteDataType : uint32_t;
     33class MemoryStorageArea;
     34class StorageAreaRegistry;
    4035
    41 class OriginStorageManager {
     36class SessionStorageManager {
    4237    WTF_MAKE_FAST_ALLOCATED;
    4338public:
    44     explicit OriginStorageManager(String&& path);
    45     ~OriginStorageManager();
     39    explicit SessionStorageManager(StorageAreaRegistry&);
     40    bool isActive() const;
     41    bool hasDataInMemory() const;
     42    void clearData();
     43    void connectionClosed(IPC::Connection::UniqueID);
    4644
    47     void connectionClosed(IPC::Connection::UniqueID);
    48     bool persisted() const { return m_persisted; }
    49     void setPersisted(bool value);
    50     FileSystemStorageManager& fileSystemStorageManager(FileSystemStorageHandleRegistry&);
    51     bool isActive();
    52     void deleteData(OptionSet<WebsiteDataType>, WallTime);
     45    StorageAreaIdentifier connectToSessionStorageArea(IPC::Connection::UniqueID, const WebCore::ClientOrigin&, StorageNamespaceIdentifier);
     46    void disconnectFromStorageArea(IPC::Connection::UniqueID, StorageAreaIdentifier);
     47    void cloneStorageArea(IPC::Connection::UniqueID, StorageNamespaceIdentifier, StorageNamespaceIdentifier);
    5348
    5449private:
    55     enum class StorageBucketMode : bool;
    56     class StorageBucket;
    57     StorageBucket& defaultBucket();
     50    StorageAreaIdentifier addStorageArea(std::unique_ptr<MemoryStorageArea>, IPC::Connection::UniqueID, StorageNamespaceIdentifier);
    5851
    59     void createOriginFileIfNecessary(const WebCore::ClientOrigin&);
    60     void deleteOriginFileIfNecessary();
    61 
    62     std::unique_ptr<StorageBucket> m_defaultBucket;
    63     String m_path;
    64     bool m_persisted { false };
     52    StorageAreaRegistry& m_registry;
     53    HashMap<StorageAreaIdentifier, std::unique_ptr<MemoryStorageArea>> m_storageAreas;
     54    HashMap<StorageNamespaceIdentifier, StorageAreaIdentifier> m_storageAreasByNamespace;
    6555};
    6656
    6757} // namespace WebKit
    68 
  • trunk/Source/WebKit/NetworkProcess/storage/StorageAreaRegistry.cpp

    r286935 r286936  
    2424 */
    2525
    26 #pragma once
     26#include "config.h"
     27#include "StorageAreaRegistry.h"
    2728
    28 #include "Connection.h"
    29 #include <wtf/text/WTFString.h>
    30 
    31 namespace WebCore {
    32 struct ClientOrigin;
    33 }
     29#include "StorageAreaBase.h"
    3430
    3531namespace WebKit {
    3632
    37 class FileSystemStorageHandleRegistry;
    38 class FileSystemStorageManager;
    39 enum class WebsiteDataType : uint32_t;
     33StorageAreaRegistry::StorageAreaRegistry() = default;
    4034
    41 class OriginStorageManager {
    42     WTF_MAKE_FAST_ALLOCATED;
    43 public:
    44     explicit OriginStorageManager(String&& path);
    45     ~OriginStorageManager();
     35void StorageAreaRegistry::registerStorageArea(StorageAreaIdentifier identifier, StorageAreaBase& storageArea)
     36{
     37    ASSERT(!m_storageAreas.contains(identifier));
    4638
    47     void connectionClosed(IPC::Connection::UniqueID);
    48     bool persisted() const { return m_persisted; }
    49     void setPersisted(bool value);
    50     FileSystemStorageManager& fileSystemStorageManager(FileSystemStorageHandleRegistry&);
    51     bool isActive();
    52     void deleteData(OptionSet<WebsiteDataType>, WallTime);
     39    m_storageAreas.add(identifier, storageArea);
     40}
    5341
    54 private:
    55     enum class StorageBucketMode : bool;
    56     class StorageBucket;
    57     StorageBucket& defaultBucket();
     42void StorageAreaRegistry::unregisterStorageArea(StorageAreaIdentifier identifier)
     43{
     44    ASSERT(m_storageAreas.contains(identifier));
    5845
    59     void createOriginFileIfNecessary(const WebCore::ClientOrigin&);
    60     void deleteOriginFileIfNecessary();
     46    m_storageAreas.remove(identifier);
     47}
    6148
    62     std::unique_ptr<StorageBucket> m_defaultBucket;
    63     String m_path;
    64     bool m_persisted { false };
    65 };
     49StorageAreaBase* StorageAreaRegistry::getStorageArea(StorageAreaIdentifier identifier)
     50{
     51    return m_storageAreas.get(identifier).get();
     52}
    6653
    6754} // namespace WebKit
    68 
  • trunk/Source/WebKit/NetworkProcess/storage/StorageAreaRegistry.h

    r286935 r286936  
    2626#pragma once
    2727
    28 #include "Connection.h"
    29 #include <wtf/text/WTFString.h>
    30 
    31 namespace WebCore {
    32 struct ClientOrigin;
    33 }
     28#include "StorageAreaIdentifier.h"
     29#include <wtf/WeakPtr.h>
    3430
    3531namespace WebKit {
    3632
    37 class FileSystemStorageHandleRegistry;
    38 class FileSystemStorageManager;
    39 enum class WebsiteDataType : uint32_t;
     33class StorageAreaBase;
    4034
    41 class OriginStorageManager {
     35class StorageAreaRegistry {
    4236    WTF_MAKE_FAST_ALLOCATED;
    4337public:
    44     explicit OriginStorageManager(String&& path);
    45     ~OriginStorageManager();
    46 
    47     void connectionClosed(IPC::Connection::UniqueID);
    48     bool persisted() const { return m_persisted; }
    49     void setPersisted(bool value);
    50     FileSystemStorageManager& fileSystemStorageManager(FileSystemStorageHandleRegistry&);
    51     bool isActive();
    52     void deleteData(OptionSet<WebsiteDataType>, WallTime);
     38    StorageAreaRegistry();
     39    void registerStorageArea(StorageAreaIdentifier, StorageAreaBase&);
     40    void unregisterStorageArea(StorageAreaIdentifier);
     41    StorageAreaBase* getStorageArea(StorageAreaIdentifier);
    5342
    5443private:
    55     enum class StorageBucketMode : bool;
    56     class StorageBucket;
    57     StorageBucket& defaultBucket();
    58 
    59     void createOriginFileIfNecessary(const WebCore::ClientOrigin&);
    60     void deleteOriginFileIfNecessary();
    61 
    62     std::unique_ptr<StorageBucket> m_defaultBucket;
    63     String m_path;
    64     bool m_persisted { false };
     44    HashMap<StorageAreaIdentifier, WeakPtr<StorageAreaBase>> m_storageAreas;
    6545};
    6646
    6747} // namespace WebKit
    68 
  • trunk/Source/WebKit/Scripts/generate-unified-sources.sh

    r286535 r286936  
    1515fi
    1616
    17 UnifiedSourceCppFileCount=111
     17UnifiedSourceCppFileCount=112
    1818UnifiedSourceMmFileCount=80
    1919
  • trunk/Source/WebKit/Sources.txt

    r286484 r286936  
    144144NetworkProcess/storage/FileSystemStorageHandle.cpp
    145145NetworkProcess/storage/FileSystemStorageHandleRegistry.cpp
     146NetworkProcess/storage/LocalStorageManager.cpp
     147NetworkProcess/storage/MemoryStorageArea.cpp
    146148NetworkProcess/storage/NetworkStorageManager.cpp
    147149NetworkProcess/storage/OriginStorageManager.cpp
     150NetworkProcess/storage/SQLiteStorageArea.cpp
     151NetworkProcess/storage/SessionStorageManager.cpp
     152NetworkProcess/storage/StorageAreaBase.cpp
     153NetworkProcess/storage/StorageAreaRegistry.cpp
    148154
    149155NetworkProcess/WebStorage/LocalStorageDatabase.cpp
  • trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp

    r286788 r286936  
    15731573}
    15741574
    1575 void NetworkProcessProxy::getLocalStorageDetails(PAL::SessionID sessionID, CompletionHandler<void(Vector<LocalStorageDatabaseTracker::OriginDetails>&&)>&& completionHandler)
    1576 {
    1577     if (!canSendMessage()) {
    1578         completionHandler({ });
    1579         return;
    1580     }
    1581 
    1582     sendWithAsyncReply(Messages::NetworkProcess::GetLocalStorageOriginDetails(sessionID), WTFMove(completionHandler));
    1583 }
    1584 
    15851575void NetworkProcessProxy::preconnectTo(PAL::SessionID sessionID, WebPageProxyIdentifier webPageProxyID, WebCore::PageIdentifier webPageID, const URL& url, const String& userAgent, WebCore::StoredCredentialsPolicy storedCredentialsPolicy, std::optional<NavigatingToAppBoundDomain> isNavigatingToAppBoundDomain, LastNavigationWasAppInitiated lastNavigationWasAppInitiated)
    15861576{
  • trunk/Source/WebKit/UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm

    r285746 r286936  
    645645}
    646646
    647 }
     647#if PLATFORM(IOS_FAMILY)
     648
     649void WebsiteDataStore::excludeDirectoryFromBackup(const String& directory)
     650{
     651    NSURL *url = [NSURL URLWithString:(NSString *)directory];
     652    if ([[NSFileManager defaultManager] createDirectoryAtURL:url withIntermediateDirectories:YES attributes:nil error:nullptr])
     653        [[NSURL fileURLWithPath:(NSString *)directory isDirectory:YES] setResourceValue:@YES forKey:NSURLIsExcludedFromBackupKey error:nil];
     654}
     655
     656#endif
     657
     658}
  • trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp

    r286455 r286936  
    19041904    if (!localStorageDirectory.isEmpty()) {
    19051905        parameters.localStorageDirectory = localStorageDirectory;
     1906#if PLATFORM(IOS_FAMILY)
     1907        excludeDirectoryFromBackup(localStorageDirectory);
     1908#endif
    19061909        // FIXME: SandboxExtension::createHandleForReadWriteDirectory resolves the directory, but that has already been done. Remove this duplicate work.
    19071910        if (auto handle = SandboxExtension::createHandleForReadWriteDirectory(localStorageDirectory))
     
    19701973}
    19711974
    1972 void WebsiteDataStore::getLocalStorageDetails(Function<void(Vector<LocalStorageDatabaseTracker::OriginDetails>&&)>&& completionHandler)
    1973 {
    1974     if (!isPersistent()) {
    1975         completionHandler({ });
    1976         return;
    1977     }
    1978 
    1979     networkProcess().getLocalStorageDetails(m_sessionID, [completionHandler = WTFMove(completionHandler)](auto&& details) {
    1980         completionHandler(WTFMove(details));
    1981     });
    1982 }
    1983 
    19841975void WebsiteDataStore::resetQuota(CompletionHandler<void()>&& completionHandler)
    19851976{
  • trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h

    r286455 r286936  
    168168    void removeData(OptionSet<WebsiteDataType>, const Vector<WebsiteDataRecord>&, Function<void()>&& completionHandler);
    169169
    170     void getLocalStorageDetails(Function<void(Vector<LocalStorageDatabaseTracker::OriginDetails>&&)>&&);
    171170    void setCacheModelSynchronouslyForTesting(CacheModel);
    172171    void setServiceWorkerTimeoutForTesting(Seconds);
     
    373372    void countNonDefaultSessionSets(CompletionHandler<void(size_t)>&&);
    374373
     374#if PLATFORM(IOS_FAMILY)
     375    void excludeDirectoryFromBackup(const String& directory);
     376#endif
     377
    375378private:
    376379    enum class ForceReinitialization : bool { No, Yes };
  • trunk/Source/WebKit/UnifiedSources-output.xcfilelist

    r286535 r286936  
    1818$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/unified-sources/UnifiedSource110.cpp
    1919$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/unified-sources/UnifiedSource111.cpp
     20$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/unified-sources/UnifiedSource112.cpp
    2021$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/unified-sources/UnifiedSource12-mm.mm
    2122$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/unified-sources/UnifiedSource12.cpp
  • trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj

    r286911 r286936  
    15151515                93E799872756FAB40074008A /* WebFileSystemStorageConnectionMessagesReplies.h in Headers */ = {isa = PBXBuildFile; fileRef = 93E799832756FA540074008A /* WebFileSystemStorageConnectionMessagesReplies.h */; };
    15161516                93E799882756FAC20074008A /* WebFileSystemStorageConnectionMessages.h in Headers */ = {isa = PBXBuildFile; fileRef = 93E799812756FA530074008A /* WebFileSystemStorageConnectionMessages.h */; };
     1517                93E799C7276027460074008A /* StorageAreaRegistry.h in Headers */ = {isa = PBXBuildFile; fileRef = 93E799C6276027370074008A /* StorageAreaRegistry.h */; };
     1518                93E799CE2760497B0074008A /* SessionStorageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 93E799CA2760497A0074008A /* SessionStorageManager.h */; };
     1519                93E799CF2760497B0074008A /* LocalStorageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 93E799CB2760497A0074008A /* LocalStorageManager.h */; };
     1520                93E799D22760AA5B0074008A /* UnifiedSource112.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93E799D12760AA5A0074008A /* UnifiedSource112.cpp */; };
     1521                93E799DA276121080074008A /* SQLiteStorageArea.h in Headers */ = {isa = PBXBuildFile; fileRef = 93E799D4276121070074008A /* SQLiteStorageArea.h */; };
     1522                93E799DB276121080074008A /* MemoryStorageArea.h in Headers */ = {isa = PBXBuildFile; fileRef = 93E799D5276121070074008A /* MemoryStorageArea.h */; };
     1523                93E799DC276121080074008A /* StorageAreaBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 93E799D6276121080074008A /* StorageAreaBase.h */; };
    15171524                93F549B41E3174B7000E7239 /* WKSnapshotConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 93F549B31E3174B7000E7239 /* WKSnapshotConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; };
    15181525                950F2880252414EA00B74F1C /* WKMouseDeviceObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = 950F287E252414E900B74F1C /* WKMouseDeviceObserver.h */; };
     
    53545361                93E799822756FA540074008A /* WebFileSystemStorageConnectionMessageReceiver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebFileSystemStorageConnectionMessageReceiver.cpp; sourceTree = "<group>"; };
    53555362                93E799832756FA540074008A /* WebFileSystemStorageConnectionMessagesReplies.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebFileSystemStorageConnectionMessagesReplies.h; sourceTree = "<group>"; };
     5363                93E799C5276027360074008A /* StorageAreaRegistry.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StorageAreaRegistry.cpp; sourceTree = "<group>"; };
     5364                93E799C6276027370074008A /* StorageAreaRegistry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StorageAreaRegistry.h; sourceTree = "<group>"; };
     5365                93E799C92760497A0074008A /* LocalStorageManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LocalStorageManager.cpp; sourceTree = "<group>"; };
     5366                93E799CA2760497A0074008A /* SessionStorageManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SessionStorageManager.h; sourceTree = "<group>"; };
     5367                93E799CB2760497A0074008A /* LocalStorageManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LocalStorageManager.h; sourceTree = "<group>"; };
     5368                93E799CC2760497B0074008A /* SessionStorageManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SessionStorageManager.cpp; sourceTree = "<group>"; };
     5369                93E799D12760AA5A0074008A /* UnifiedSource112.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UnifiedSource112.cpp; sourceTree = "<group>"; };
     5370                93E799D3276121070074008A /* SQLiteStorageArea.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SQLiteStorageArea.cpp; sourceTree = "<group>"; };
     5371                93E799D4276121070074008A /* SQLiteStorageArea.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SQLiteStorageArea.h; sourceTree = "<group>"; };
     5372                93E799D5276121070074008A /* MemoryStorageArea.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MemoryStorageArea.h; sourceTree = "<group>"; };
     5373                93E799D6276121080074008A /* StorageAreaBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StorageAreaBase.h; sourceTree = "<group>"; };
     5374                93E799D7276121080074008A /* StorageAreaBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StorageAreaBase.cpp; sourceTree = "<group>"; };
     5375                93E799D8276121080074008A /* MemoryStorageArea.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MemoryStorageArea.cpp; sourceTree = "<group>"; };
    53565376                93F549B31E3174B7000E7239 /* WKSnapshotConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKSnapshotConfiguration.h; sourceTree = "<group>"; };
    53575377                93F549B51E3174DA000E7239 /* WKSnapshotConfiguration.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKSnapshotConfiguration.mm; sourceTree = "<group>"; };
     
    82358255                                1CAECB6027465AE300AB78D0 /* UnifiedSource110.cpp */,
    82368256                                1CAECB5E27465AE300AB78D0 /* UnifiedSource111.cpp */,
     8257                                93E799D12760AA5A0074008A /* UnifiedSource112.cpp */,
    82378258                        );
    82388259                        name = "unified-sources";
     
    1031510336                                931A075126F06310004474CD /* FileSystemStorageManager.cpp */,
    1031610337                                931A075026F06310004474CD /* FileSystemStorageManager.h */,
     10338                                93E799C92760497A0074008A /* LocalStorageManager.cpp */,
     10339                                93E799CB2760497A0074008A /* LocalStorageManager.h */,
     10340                                93E799D8276121080074008A /* MemoryStorageArea.cpp */,
     10341                                93E799D5276121070074008A /* MemoryStorageArea.h */,
    1031710342                                93085DC326E1BBBD000EC6A7 /* NetworkStorageManager.cpp */,
    1031810343                                93085DC426E1BBBD000EC6A7 /* NetworkStorageManager.h */,
     
    1032010345                                93085DC526E1C6CF000EC6A7 /* OriginStorageManager.cpp */,
    1032110346                                93085DC626E1C6CF000EC6A7 /* OriginStorageManager.h */,
     10347                                93E799CC2760497B0074008A /* SessionStorageManager.cpp */,
     10348                                93E799CA2760497A0074008A /* SessionStorageManager.h */,
     10349                                93E799D3276121070074008A /* SQLiteStorageArea.cpp */,
     10350                                93E799D4276121070074008A /* SQLiteStorageArea.h */,
     10351                                93E799D7276121080074008A /* StorageAreaBase.cpp */,
     10352                                93E799D6276121080074008A /* StorageAreaBase.h */,
     10353                                93E799C5276027360074008A /* StorageAreaRegistry.cpp */,
     10354                                93E799C6276027370074008A /* StorageAreaRegistry.h */,
    1032210355                        );
    1032310356                        path = storage;
     
    1297413007                                93B2614E227D14B100B97A76 /* LocalStorageDatabase.h in Headers */,
    1297513008                                93B2614F227D14B100B97A76 /* LocalStorageDatabaseTracker.h in Headers */,
     13009                                93E799CF2760497B0074008A /* LocalStorageManager.h in Headers */,
    1297613010                                46BEB6DB22FB9D4800269867 /* LocalStorageNamespace.h in Headers */,
    1297713011                                51A7F2F3125BF820008AEB1D /* Logging.h in Headers */,
     
    1299213026                                075A9CF326169BAB006DFA3A /* MediaSessionCoordinatorProxyPrivate.h in Headers */,
    1299313027                                A15799B72584433200528236 /* MediaTrackReader.h in Headers */,
     13028                                93E799DB276121080074008A /* MemoryStorageArea.h in Headers */,
    1299413029                                51933DEF1965EB31008AC3EA /* MenuUtilities.h in Headers */,
    1299513030                                9B47908D25314D8300EC11AB /* MessageArgumentDescriptions.h in Headers */,
     
    1304013075                                839902031BE9A02B000F3653 /* NetworkLoad.h in Headers */,
    1304113076                                83D454D71BE9D3C4006C93BD /* NetworkLoadClient.h in Headers */,
    13042                                 517B5F97275EC5E5002DC22D /* WebPushMessage.h in Headers */,
    1304313077                                839149651BEA838500D2D953 /* NetworkLoadParameters.h in Headers */,
    1304413078                                E47FC8A025B8331C005495FC /* NetworkLoadScheduler.h in Headers */,
     
    1312813162                                517B5F81275E97B6002DC22D /* PushAppBundle.h in Headers */,
    1312913163                                517B5F7D275E97B6002DC22D /* PushClientConnection.h in Headers */,
     13164                                517B5F95275EBA63002DC22D /* PushMessageForTesting.h in Headers */,
    1313013165                                A1E688701F6E2BAB007006A6 /* QuarantineSPI.h in Headers */,
    1313113166                                1A0C227E2451130A00ED614D /* QuickLookThumbnailingSoftLink.h in Headers */,
     
    1321213247                                1AFDE65A1954A42B00C48FFA /* SessionState.h in Headers */,
    1321313248                                1A002D49196B345D00B9AD44 /* SessionStateCoding.h in Headers */,
     13249                                93E799CE2760497B0074008A /* SessionStorageManager.h in Headers */,
    1321413250                                46BEB6DF22FBB16B00269867 /* SessionStorageNamespace.h in Headers */,
    1321513251                                1A6420E512DCE2FF00CAAE2C /* ShareableBitmap.h in Headers */,
     
    1324013276                                93D6B784254CCD0E0058DD3A /* SpeechRecognitionServerMessages.h in Headers */,
    1324113277                                93D6B785254CCD430058DD3A /* SpeechRecognitionServerMessagesReplies.h in Headers */,
     13278                                93E799DA276121080074008A /* SQLiteStorageArea.h in Headers */,
    1324213279                                7A3FECA221F7C09700F267CD /* StorageAccessStatus.h in Headers */,
    1324313280                                46BEB6D722FB9BD700269867 /* StorageArea.h in Headers */,
     13281                                93E799DC276121080074008A /* StorageAreaBase.h in Headers */,
    1324413282                                1AD3306F16B1D991004F60E7 /* StorageAreaImpl.h in Headers */,
    1324513283                                1ACECD2517162DB1001FC9EF /* StorageAreaMap.h in Headers */,
    1324613284                                1A334DEE16DE8F88006A8E38 /* StorageAreaMapMessages.h in Headers */,
     13285                                93E799C7276027460074008A /* StorageAreaRegistry.h in Headers */,
    1324713286                                93B2614D227D149E00B97A76 /* StorageManager.h in Headers */,
    1324813287                                936B059823039097002FC06B /* StorageManagerSet.h in Headers */,
     
    1351413553                                512CD69A2721F0A900F7F8EC /* WebPushDaemonConstants.h in Headers */,
    1351513554                                517B5F73275E9609002DC22D /* WebPushDaemonMain.h in Headers */,
     13555                                517B5F97275EC5E5002DC22D /* WebPushMessage.h in Headers */,
    1351613556                                461CCCA6231485AA00B659B9 /* WebRemoteObjectRegistry.h in Headers */,
    1351713557                                A5860E71230F67FC00461AAE /* WebResourceInterceptController.h in Headers */,
     
    1354813588                                517A53101F47A86200DCDC0A /* WebSWClientConnectionMessages.h in Headers */,
    1354913589                                466BC03C1FA266DA002FA9C1 /* WebSWContextManagerConnection.h in Headers */,
    13550                                 517B5F95275EBA63002DC22D /* PushMessageForTesting.h in Headers */,
    1355113590                                460F48901F996F7100CF4B87 /* WebSWContextManagerConnectionMessages.h in Headers */,
    1355213591                                C11A9ECC214035F800CFB20A /* WebSwitchingGPUClient.h in Headers */,
     
    1511715156                        files = (
    1511815157                                517B5F9A275F3A86002DC22D /* ArgumentCoders.cpp in Sources */,
     15158                                517B5F9C275F3C37002DC22D /* DaemonEncoder.cpp in Sources */,
     15159                                517B5F9B275F3A98002DC22D /* DaemonUtilities.mm in Sources */,
    1511915160                                517B5F68275A9A78002DC22D /* WebPushToolConnection.mm in Sources */,
    15120                                 517B5F9B275F3A98002DC22D /* DaemonUtilities.mm in Sources */,
    15121                                 517B5F9C275F3C37002DC22D /* DaemonEncoder.cpp in Sources */,
    1512215161                                517B5F65275A8D7F002DC22D /* WebPushToolMain.mm in Sources */,
    1512315162                        );
     
    1521515254                                C1A152D724E5A29A00978C8B /* HandleXPCEndpointMessages.mm in Sources */,
    1521615255                                2749F6442146561B008380BF /* InjectedBundleNodeHandle.cpp in Sources */,
    15217                                 517B5F99275EC601002DC22D /* WebPushMessageCocoa.mm in Sources */,
    1521815256                                2749F6452146561E008380BF /* InjectedBundleRangeHandle.cpp in Sources */,
    1521915257                                9BF5EC642541145600984E77 /* JSIPCBinding.cpp in Sources */,
     
    1550415542                                1CAECB6827465AE400AB78D0 /* UnifiedSource110.cpp in Sources */,
    1550515543                                1CAECB6627465AE400AB78D0 /* UnifiedSource111.cpp in Sources */,
     15544                                93E799D22760AA5B0074008A /* UnifiedSource112.cpp in Sources */,
    1550615545                                E38A1FC023A551BF00D2374F /* UserInterfaceIdiom.mm in Sources */,
    1550715546                                CD491B0D1E732E4D00009066 /* UserMediaCaptureManagerMessageReceiver.cpp in Sources */,
     
    1557515614                                517B5F7A275E97A4002DC22D /* WebPushDaemon.mm in Sources */,
    1557615615                                517B5F79275E97A1002DC22D /* WebPushDaemonMain.mm in Sources */,
     15616                                517B5F99275EC601002DC22D /* WebPushMessageCocoa.mm in Sources */,
    1557715617                                51F060E11654318500F3281B /* WebResourceLoaderMessageReceiver.cpp in Sources */,
    1557815618                                51F060E11654318500F3281F /* WebRTCMonitorMessageReceiver.cpp in Sources */,
  • trunk/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.cpp

    r281398 r286936  
    2929#include "Logging.h"
    3030#include "NetworkProcessConnection.h"
     31#include "NetworkStorageManagerMessages.h"
    3132#include "StorageAreaImpl.h"
    3233#include "StorageAreaMapMessages.h"
     
    9697
    9798    if (m_mapID)
    98         WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::StorageManagerSet::SetItem(*m_mapID, sourceArea->identifier(), m_currentSeed, key, value, sourceFrame->document()->url().string()), 0);
     99        WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkStorageManager::SetItem(*m_mapID, sourceArea->identifier(), m_currentSeed, key, value, sourceFrame->document()->url().string()), 0);
    99100    else
    100101        RELEASE_LOG_ERROR(Storage, "StorageAreaMap::setItem failed because storage map ID is invalid");
     
    115116
    116117    if (m_mapID)
    117         WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::StorageManagerSet::RemoveItem(*m_mapID, sourceArea->identifier(), m_currentSeed, key, sourceFrame->document()->url().string()), 0);
     118        WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkStorageManager::RemoveItem(*m_mapID, sourceArea->identifier(), m_currentSeed, key, sourceFrame->document()->url().string()), 0);
    118119    else
    119120        RELEASE_LOG_ERROR(Storage, "StorageAreaMap::removeItem failed because storage map ID is invalid");
     
    130131
    131132    if (m_mapID)
    132         WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::StorageManagerSet::Clear(*m_mapID, sourceArea->identifier(), m_currentSeed, sourceFrame->document()->url().string()), 0);
     133        WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkStorageManager::Clear(*m_mapID, sourceArea->identifier(), m_currentSeed, sourceFrame->document()->url().string()), 0);
    133134    else
    134135        RELEASE_LOG_ERROR(Storage, "StorageAreaMap::clear failed because storage map ID is invalid");
     
    161162            IPC::UnboundedSynchronousIPCScope unboundedSynchronousIPCScope;
    162163            HashMap<String, String> values;
    163             WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::StorageManagerSet::GetValues(*m_mapID), Messages::StorageManagerSet::GetValues::Reply(values), 0);
     164            WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::NetworkStorageManager::GetValues(*m_mapID), Messages::StorageManagerSet::GetValues::Reply(values), 0);
    164165            m_map->importItems(WTFMove(values));
    165166        } else
     
    349350        return;
    350351
     352    StorageAreaIdentifier mapID;
    351353    switch (m_type) {
    352354    case StorageType::Local:
    353355    case StorageType::TransientLocal:
    354356        if (SecurityOrigin* topLevelOrigin = m_namespace.topLevelOrigin())
    355             WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::StorageManagerSet::ConnectToTransientLocalStorageArea(WebProcess::singleton().sessionID(), m_namespace.storageNamespaceID(), topLevelOrigin->data(), m_securityOrigin->data()), Messages::StorageManagerSet::ConnectToTransientLocalStorageArea::Reply(m_mapID), 0);
     357            WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::NetworkStorageManager::ConnectToTransientLocalStorageArea(m_namespace.storageNamespaceID(), topLevelOrigin->data(), m_securityOrigin->data()), Messages::NetworkStorageManager::ConnectToTransientLocalStorageArea::Reply(mapID), 0);
    356358        else
    357             WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::StorageManagerSet::ConnectToLocalStorageArea(WebProcess::singleton().sessionID(), m_namespace.storageNamespaceID(), m_securityOrigin->data()), Messages::StorageManagerSet::ConnectToLocalStorageArea::Reply(m_mapID), 0);
     359            WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::NetworkStorageManager::ConnectToLocalStorageArea(m_namespace.storageNamespaceID(), m_securityOrigin->data()), Messages::NetworkStorageManager::ConnectToLocalStorageArea::Reply(mapID), 0);
    358360        break;
    359361    case StorageType::Session:
    360         WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::StorageManagerSet::ConnectToSessionStorageArea(WebProcess::singleton().sessionID(), m_namespace.storageNamespaceID(), m_securityOrigin->data()), Messages::StorageManagerSet::ConnectToSessionStorageArea::Reply(m_mapID), 0);
    361     }
    362 
    363     if (m_mapID)
     362        WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::NetworkStorageManager::ConnectToSessionStorageArea(m_namespace.storageNamespaceID(), m_securityOrigin->data()), Messages::NetworkStorageManager::ConnectToSessionStorageArea::Reply(mapID), 0);
     363    }
     364
     365    if (mapID.isValid()) {
     366        m_mapID = mapID;
    364367        WebProcess::singleton().registerStorageAreaMap(*this);
     368    }
    365369}
    366370
     
    374378
    375379    if (auto* networkProcessConnection = WebProcess::singleton().existingNetworkProcessConnection())
    376         networkProcessConnection->connection().send(Messages::StorageManagerSet::DisconnectFromStorageArea(*m_mapID), 0);
     380        networkProcessConnection->connection().send(Messages::NetworkStorageManager::DisconnectFromStorageArea(*m_mapID), 0);
    377381
    378382    m_mapID = { };
  • trunk/Source/WebKit/WebProcess/WebStorage/StorageNamespaceImpl.cpp

    r281398 r286936  
    2828
    2929#include "NetworkProcessConnection.h"
     30#include "NetworkStorageManagerMessages.h"
    3031#include "StorageAreaImpl.h"
    3132#include "StorageAreaMap.h"
    32 #include "StorageManagerSetMessages.h"
    3333#include "WebPage.h"
    3434#include "WebPageGroupProxy.h"
     
    115115
    116116    if (auto networkProcessConnection = WebProcess::singleton().existingNetworkProcessConnection())
    117         networkProcessConnection->connection().send(Messages::StorageManagerSet::CloneSessionStorageNamespace(sessionID(), m_storageNamespaceID, WebPage::fromCorePage(newPage).sessionStorageNamespaceIdentifier()), 0);
     117        networkProcessConnection->connection().send(Messages::NetworkStorageManager::CloneSessionStorageNamespace(m_storageNamespaceID, WebPage::fromCorePage(newPage).sessionStorageNamespaceIdentifier()), 0);
    118118
    119119    return adoptRef(*new StorageNamespaceImpl(m_storageType, WebPage::fromCorePage(newPage).sessionStorageNamespaceIdentifier(), WebPage::fromCorePage(newPage).identifier(), m_topLevelOrigin.get(), m_quotaInBytes));
Note: See TracChangeset for help on using the changeset viewer.