Title: [290669] trunk/Source/WebKit
Revision
290669
Author
[email protected]
Date
2022-03-01 12:57:25 -0800 (Tue, 01 Mar 2022)

Log Message

Move StorageBucket function definitions outside the class definition
https://bugs.webkit.org/show_bug.cgi?id=237300

Reviewed by Chris Dumez.

* NetworkProcess/storage/NetworkStorageManager.h:
* NetworkProcess/storage/OriginStorageManager.cpp:
(WebKit::OriginStorageManager::StorageBucket::mode const):
(WebKit::OriginStorageManager::StorageBucket::setMode):
(WebKit::OriginStorageManager::StorageBucket::StorageBucket):
(WebKit::OriginStorageManager::StorageBucket::connectionClosed):
(WebKit::OriginStorageManager::StorageBucket::toStorageIdentifier const):
(WebKit::OriginStorageManager::StorageBucket::typeStoragePath const):
(WebKit::OriginStorageManager::StorageBucket::fileSystemStorageManager):
(WebKit::OriginStorageManager::StorageBucket::localStorageManager):
(WebKit::OriginStorageManager::StorageBucket::existingLocalStorageManager):
(WebKit::OriginStorageManager::StorageBucket::sessionStorageManager):
(WebKit::OriginStorageManager::StorageBucket::existingSessionStorageManager):
(WebKit::OriginStorageManager::StorageBucket::idbStorageManager):
(WebKit::OriginStorageManager::StorageBucket::existingIDBStorageManager):
(WebKit::OriginStorageManager::StorageBucket::isActive const):
(WebKit::OriginStorageManager::StorageBucket::isEmpty):
(WebKit::OriginStorageManager::StorageBucket::fetchDataTypesInList):
(WebKit::OriginStorageManager::StorageBucket::fetchDataTypesInListFromMemory):
(WebKit::OriginStorageManager::StorageBucket::fetchDataTypesInListFromDisk):
(WebKit::OriginStorageManager::StorageBucket::deleteData):
(WebKit::OriginStorageManager::StorageBucket::deleteFileSystemStorageData):
(WebKit::OriginStorageManager::StorageBucket::deleteLocalStorageData):
(WebKit::OriginStorageManager::StorageBucket::deleteSessionStorageData):
(WebKit::OriginStorageManager::StorageBucket::deleteIDBStorageData):
(WebKit::OriginStorageManager::StorageBucket::moveData):
(WebKit::OriginStorageManager::StorageBucket::resolvedLocalStoragePath):
(WebKit::OriginStorageManager::StorageBucket::resolvedIDBStoragePath):
(WebKit::OriginStorageManager::StorageBucket::toWebsiteDataType): Deleted.
(WebKit::OriginStorageManager::StorageBucket::toStorageIdentifier): Deleted.

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (290668 => 290669)


--- trunk/Source/WebKit/ChangeLog	2022-03-01 20:08:39 UTC (rev 290668)
+++ trunk/Source/WebKit/ChangeLog	2022-03-01 20:57:25 UTC (rev 290669)
@@ -1,3 +1,41 @@
+2022-03-01  Sihui Liu  <[email protected]>
+
+        Move StorageBucket function definitions outside the class definition
+        https://bugs.webkit.org/show_bug.cgi?id=237300
+
+        Reviewed by Chris Dumez.
+
+        * NetworkProcess/storage/NetworkStorageManager.h:
+        * NetworkProcess/storage/OriginStorageManager.cpp:
+        (WebKit::OriginStorageManager::StorageBucket::mode const):
+        (WebKit::OriginStorageManager::StorageBucket::setMode):
+        (WebKit::OriginStorageManager::StorageBucket::StorageBucket):
+        (WebKit::OriginStorageManager::StorageBucket::connectionClosed):
+        (WebKit::OriginStorageManager::StorageBucket::toStorageIdentifier const):
+        (WebKit::OriginStorageManager::StorageBucket::typeStoragePath const):
+        (WebKit::OriginStorageManager::StorageBucket::fileSystemStorageManager):
+        (WebKit::OriginStorageManager::StorageBucket::localStorageManager):
+        (WebKit::OriginStorageManager::StorageBucket::existingLocalStorageManager):
+        (WebKit::OriginStorageManager::StorageBucket::sessionStorageManager):
+        (WebKit::OriginStorageManager::StorageBucket::existingSessionStorageManager):
+        (WebKit::OriginStorageManager::StorageBucket::idbStorageManager):
+        (WebKit::OriginStorageManager::StorageBucket::existingIDBStorageManager):
+        (WebKit::OriginStorageManager::StorageBucket::isActive const):
+        (WebKit::OriginStorageManager::StorageBucket::isEmpty):
+        (WebKit::OriginStorageManager::StorageBucket::fetchDataTypesInList):
+        (WebKit::OriginStorageManager::StorageBucket::fetchDataTypesInListFromMemory):
+        (WebKit::OriginStorageManager::StorageBucket::fetchDataTypesInListFromDisk):
+        (WebKit::OriginStorageManager::StorageBucket::deleteData):
+        (WebKit::OriginStorageManager::StorageBucket::deleteFileSystemStorageData):
+        (WebKit::OriginStorageManager::StorageBucket::deleteLocalStorageData):
+        (WebKit::OriginStorageManager::StorageBucket::deleteSessionStorageData):
+        (WebKit::OriginStorageManager::StorageBucket::deleteIDBStorageData):
+        (WebKit::OriginStorageManager::StorageBucket::moveData):
+        (WebKit::OriginStorageManager::StorageBucket::resolvedLocalStoragePath):
+        (WebKit::OriginStorageManager::StorageBucket::resolvedIDBStoragePath):
+        (WebKit::OriginStorageManager::StorageBucket::toWebsiteDataType): Deleted.
+        (WebKit::OriginStorageManager::StorageBucket::toStorageIdentifier): Deleted.
+
 2022-03-01  Alex Christensen  <[email protected]>
 
         If the main resource was loaded over private relay, load all sub resources over private relay

Modified: trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.h (290668 => 290669)


--- trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.h	2022-03-01 20:08:39 UTC (rev 290668)
+++ trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.h	2022-03-01 20:57:25 UTC (rev 290669)
@@ -40,7 +40,6 @@
 #include <WebCore/IndexedDB.h>
 #include <pal/SessionID.h>
 #include <wtf/Forward.h>
-#include <wtf/WeakHashSet.h>
 
 namespace IPC {
 class SharedFileHandle;

Modified: trunk/Source/WebKit/NetworkProcess/storage/OriginStorageManager.cpp (290668 => 290669)


--- trunk/Source/WebKit/NetworkProcess/storage/OriginStorageManager.cpp	2022-03-01 20:08:39 UTC (rev 290668)
+++ trunk/Source/WebKit/NetworkProcess/storage/OriginStorageManager.cpp	2022-03-01 20:57:25 UTC (rev 290669)
@@ -47,30 +47,6 @@
 class OriginStorageManager::StorageBucket {
     WTF_MAKE_FAST_ALLOCATED;
 public:
-    StorageBucket(const String& rootPath, const String& identifier, const String& localStoragePath, const String& idbStoragePath, bool shouldUseCustomPaths)
-        : m_rootPath(rootPath)
-        , m_identifier(identifier)
-        , m_customLocalStoragePath(localStoragePath)
-        , m_customIDBStoragePath(idbStoragePath)
-        , m_shouldUseCustomPaths(shouldUseCustomPaths)
-    {
-    }
-
-    StorageBucketMode mode() const { return m_mode; }
-    void setMode(StorageBucketMode mode) { m_mode = mode; }
-
-    void connectionClosed(IPC::Connection::UniqueID connection)
-    {
-        if (m_fileSystemStorageManager)
-            m_fileSystemStorageManager->connectionClosed(connection);
-
-        if (m_localStorageManager)
-            m_localStorageManager->connectionClosed(connection);
-
-        if (m_sessionStorageManager)
-            m_sessionStorageManager->connectionClosed(connection);
-    }
-
     enum class StorageType : uint8_t {
         FileSystem,
         LocalStorage,
@@ -77,318 +53,337 @@
         SessionStorage,
         IndexedDB,
     };
+    String toStorageIdentifier(StorageType) const;
+    StorageBucket(const String& rootPath, const String& identifier, const String& localStoragePath, const String& idbStoragePath, bool shouldUseCustomPaths);
+    StorageBucketMode mode() const { return m_mode; }
+    void setMode(StorageBucketMode mode) { m_mode = mode; }
+    void connectionClosed(IPC::Connection::UniqueID);
+    String typeStoragePath(StorageType) const;
+    FileSystemStorageManager& fileSystemStorageManager(FileSystemStorageHandleRegistry&);
+    LocalStorageManager& localStorageManager(StorageAreaRegistry&);
+    LocalStorageManager* existingLocalStorageManager() { return m_localStorageManager.get(); }
+    SessionStorageManager& sessionStorageManager(StorageAreaRegistry&);
+    SessionStorageManager* existingSessionStorageManager() { return m_sessionStorageManager.get(); }
+    IDBStorageManager& idbStorageManager(IDBStorageRegistry&, IDBStorageManager::QuotaCheckFunction&&);
+    IDBStorageManager* existingIDBStorageManager() { return m_idbStorageManager.get(); }
+    bool isActive() const;
+    bool isEmpty();
+    OptionSet<WebsiteDataType> fetchDataTypesInList(OptionSet<WebsiteDataType>);
+    void deleteData(OptionSet<WebsiteDataType>, WallTime);
+    void moveData(OptionSet<WebsiteDataType>, const String& localStoragePath, const String& idbStoragePath);
+    String resolvedLocalStoragePath();
+    String resolvedIDBStoragePath();
 
-    static std::optional<WebsiteDataType> toWebsiteDataType(const String& storageIdentifier)
-    {
-        if (storageIdentifier == "FileSystem"_s)
-            return WebsiteDataType::FileSystem;
-        if (storageIdentifier == "LocalStorage"_s)
-            return WebsiteDataType::LocalStorage;
-        if (storageIdentifier == "SessionStorage"_s)
-            return WebsiteDataType::SessionStorage;
-        if (storageIdentifier == "IndexedDB"_s)
-            return WebsiteDataType::IndexedDBDatabases;
+private:
+    OptionSet<WebsiteDataType> fetchDataTypesInListFromMemory(OptionSet<WebsiteDataType>);
+    OptionSet<WebsiteDataType> fetchDataTypesInListFromDisk(OptionSet<WebsiteDataType>);
+    void deleteFileSystemStorageData(WallTime);
+    void deleteLocalStorageData(WallTime);
+    void deleteSessionStorageData();
+    void deleteIDBStorageData(WallTime);
 
-        return std::nullopt;
-    }
+    String m_rootPath;
+    String m_identifier;
+    StorageBucketMode m_mode { StorageBucketMode::BestEffort };
+    std::unique_ptr<FileSystemStorageManager> m_fileSystemStorageManager;
+    std::unique_ptr<LocalStorageManager> m_localStorageManager;
+    String m_customLocalStoragePath;
+    String m_resolvedLocalStoragePath;
+    std::unique_ptr<SessionStorageManager> m_sessionStorageManager;
+    std::unique_ptr<IDBStorageManager> m_idbStorageManager;
+    String m_customIDBStoragePath;
+    String m_resolvedIDBStoragePath;
+    bool m_shouldUseCustomPaths;
+};
 
-    static String toStorageIdentifier(StorageType type)
-    {
-        switch (type) {
-        case StorageType::FileSystem:
-            return "FileSystem"_s;
-        case StorageType::LocalStorage:
-            return "LocalStorage"_s;
-        case StorageType::SessionStorage:
-            return "SessionStorage"_s;
-        case StorageType::IndexedDB:
-            return "IndexedDB"_s;
-        default:
-            break;
-        }
-        ASSERT_NOT_REACHED();
-        return ""_s;
-    }
+OriginStorageManager::StorageBucket::StorageBucket(const String& rootPath, const String& identifier, const String& localStoragePath, const String& idbStoragePath, bool shouldUseCustomPaths)
+    : m_rootPath(rootPath)
+    , m_identifier(identifier)
+    , m_customLocalStoragePath(localStoragePath)
+    , m_customIDBStoragePath(idbStoragePath)
+    , m_shouldUseCustomPaths(shouldUseCustomPaths)
+{
+}
 
-    String typeStoragePath(StorageType type) const
-    {
-        auto storageIdentifier = toStorageIdentifier(type);
-        if (m_rootPath.isEmpty() || storageIdentifier.isEmpty())
-            return emptyString();
+void OriginStorageManager::StorageBucket::connectionClosed(IPC::Connection::UniqueID connection)
+{
+    if (m_fileSystemStorageManager)
+        m_fileSystemStorageManager->connectionClosed(connection);
 
-        return FileSystem::pathByAppendingComponent(m_rootPath, storageIdentifier);
-    }
+    if (m_localStorageManager)
+        m_localStorageManager->connectionClosed(connection);
 
-    FileSystemStorageManager& fileSystemStorageManager(FileSystemStorageHandleRegistry& registry)
-    {
-        if (!m_fileSystemStorageManager)
-            m_fileSystemStorageManager = makeUnique<FileSystemStorageManager>(typeStoragePath(StorageType::FileSystem), registry);
+    if (m_sessionStorageManager)
+        m_sessionStorageManager->connectionClosed(connection);
+}
 
-        return *m_fileSystemStorageManager;
+String OriginStorageManager::StorageBucket::toStorageIdentifier(StorageType type) const
+{
+    switch (type) {
+    case StorageType::FileSystem:
+        return "FileSystem"_s;
+    case StorageType::LocalStorage:
+        return "LocalStorage"_s;
+    case StorageType::SessionStorage:
+        return "SessionStorage"_s;
+    case StorageType::IndexedDB:
+        return "IndexedDB"_s;
+    default:
+        break;
     }
+    ASSERT_NOT_REACHED();
+    return emptyString();
+}
 
-    LocalStorageManager& localStorageManager(StorageAreaRegistry& registry)
-    {
-        if (!m_localStorageManager)
-            m_localStorageManager = makeUnique<LocalStorageManager>(resolvedLocalStoragePath(), registry);
+String OriginStorageManager::StorageBucket::typeStoragePath(StorageType type) const
+{
+    auto storageIdentifier = toStorageIdentifier(type);
+    if (m_rootPath.isEmpty() || storageIdentifier.isEmpty())
+        return emptyString();
 
-        return *m_localStorageManager;
-    }
+    return FileSystem::pathByAppendingComponent(m_rootPath, storageIdentifier);
+}
 
-    LocalStorageManager* existingLocalStorageManager()
-    {
-        return m_localStorageManager.get();
-    }
+FileSystemStorageManager& OriginStorageManager::StorageBucket::fileSystemStorageManager(FileSystemStorageHandleRegistry& registry)
+{
+    if (!m_fileSystemStorageManager)
+        m_fileSystemStorageManager = makeUnique<FileSystemStorageManager>(typeStoragePath(StorageType::FileSystem), registry);
 
-    SessionStorageManager& sessionStorageManager(StorageAreaRegistry& registry)
-    {
-        if (!m_sessionStorageManager)
-            m_sessionStorageManager = makeUnique<SessionStorageManager>(registry);
+    return *m_fileSystemStorageManager;
+}
 
-        return *m_sessionStorageManager;
-    }
+LocalStorageManager& OriginStorageManager::StorageBucket::localStorageManager(StorageAreaRegistry& registry)
+{
+    if (!m_localStorageManager)
+        m_localStorageManager = makeUnique<LocalStorageManager>(resolvedLocalStoragePath(), registry);
 
-    SessionStorageManager* existingSessionStorageManager()
-    {
-        return m_sessionStorageManager.get();
-    }
+    return *m_localStorageManager;
+}
 
-    IDBStorageManager& idbStorageManager(IDBStorageRegistry& registry, IDBStorageManager::QuotaCheckFunction&& quotaCheckFunction)
-    {
-        if (!m_idbStorageManager)
-            m_idbStorageManager = makeUnique<IDBStorageManager>(resolvedIDBStoragePath(), registry, WTFMove(quotaCheckFunction));
+SessionStorageManager& OriginStorageManager::StorageBucket::sessionStorageManager(StorageAreaRegistry& registry)
+{
+    if (!m_sessionStorageManager)
+        m_sessionStorageManager = makeUnique<SessionStorageManager>(registry);
 
-        return *m_idbStorageManager;
-    }
+    return *m_sessionStorageManager;
+}
 
-    IDBStorageManager* existingIDBStorageManager()
-    {
-        return m_idbStorageManager.get();
-    }
+IDBStorageManager& OriginStorageManager::StorageBucket::idbStorageManager(IDBStorageRegistry& registry, IDBStorageManager::QuotaCheckFunction&& quotaCheckFunction)
+{
+    if (!m_idbStorageManager)
+        m_idbStorageManager = makeUnique<IDBStorageManager>(resolvedIDBStoragePath(), registry, WTFMove(quotaCheckFunction));
 
-    bool isActive() const
-    {
-        // We cannot remove the bucket if it has in-memory data, otherwise session
-        // data may be lost.
-        return (m_fileSystemStorageManager && m_fileSystemStorageManager->isActive())
-            || (m_localStorageManager && (m_localStorageManager->hasDataInMemory() || m_localStorageManager->isActive()))
-            || (m_sessionStorageManager && (m_sessionStorageManager->hasDataInMemory() || m_sessionStorageManager->isActive()))
-            || (m_idbStorageManager && (m_idbStorageManager->hasDataInMemory() || m_idbStorageManager->isActive()));
-    }
+    return *m_idbStorageManager;
+}
 
-    bool isEmpty()
-    {
-        ASSERT(!RunLoop::isMain());
+bool OriginStorageManager::StorageBucket::isActive() const
+{
+    // We cannot remove the bucket if it has in-memory data, otherwise session
+    // data may be lost.
+    return (m_fileSystemStorageManager && m_fileSystemStorageManager->isActive())
+        || (m_localStorageManager && (m_localStorageManager->hasDataInMemory() || m_localStorageManager->isActive()))
+        || (m_sessionStorageManager && (m_sessionStorageManager->hasDataInMemory() || m_sessionStorageManager->isActive()))
+        || (m_idbStorageManager && (m_idbStorageManager->hasDataInMemory() || m_idbStorageManager->isActive()));
+}
 
-        auto files = FileSystem::listDirectory(m_rootPath);
-        auto hasValidFile = WTF::anyOf(files, [&](auto file) {
-            bool isInvalidFile = (file == originFileName);
+bool OriginStorageManager::StorageBucket::isEmpty()
+{
+    ASSERT(!RunLoop::isMain());
+
+    auto files = FileSystem::listDirectory(m_rootPath);
+    auto hasValidFile = WTF::anyOf(files, [&](auto file) {
+        bool isInvalidFile = (file == originFileName);
 #if PLATFORM(COCOA)
-            isInvalidFile |= (file == ".DS_Store");
+        isInvalidFile |= (file == ".DS_Store");
 #endif
-            return !isInvalidFile;
-        });
-        if (hasValidFile)
-            return false;
+        return !isInvalidFile;
+    });
+    if (hasValidFile)
+        return false;
 
-        auto idbStorageFiles = FileSystem::listDirectory(resolvedIDBStoragePath());
-        return !FileSystem::fileExists(resolvedLocalStoragePath()) && idbStorageFiles.isEmpty();
+    auto idbStorageFiles = FileSystem::listDirectory(resolvedIDBStoragePath());
+    return !FileSystem::fileExists(resolvedLocalStoragePath()) && idbStorageFiles.isEmpty();
+}
+
+OptionSet<WebsiteDataType> OriginStorageManager::StorageBucket::fetchDataTypesInList(OptionSet<WebsiteDataType> types)
+{
+    auto result = fetchDataTypesInListFromMemory(types);
+    result.add(fetchDataTypesInListFromDisk(types));
+
+    return result;
+}
+
+OptionSet<WebsiteDataType> OriginStorageManager::StorageBucket::fetchDataTypesInListFromMemory(OptionSet<WebsiteDataType> types)
+{
+    OptionSet<WebsiteDataType> result;
+    if (types.contains(WebsiteDataType::LocalStorage)) {
+        if (m_localStorageManager && m_localStorageManager->hasDataInMemory())
+            result.add(WebsiteDataType::LocalStorage);
     }
 
-    OptionSet<WebsiteDataType> fetchDataTypesInList(OptionSet<WebsiteDataType> types)
-    {
-        auto result = fetchDataTypesInListFromMemory(types);
-        result.add(fetchDataTypesInListFromDisk(types));
+    if (types.contains(WebsiteDataType::SessionStorage)) {
+        if (m_sessionStorageManager && m_sessionStorageManager->hasDataInMemory())
+            result.add(WebsiteDataType::SessionStorage);
+    }
 
-        return result;
+    if (types.contains(WebsiteDataType::IndexedDBDatabases)) {
+        if (m_idbStorageManager && m_idbStorageManager->hasDataInMemory())
+            result.add(WebsiteDataType::IndexedDBDatabases);
     }
 
-    void deleteData(OptionSet<WebsiteDataType> types, WallTime modifiedSinceTime)
-    {
-        if (types.contains(WebsiteDataType::FileSystem))
-            deleteFileSystemStorageData(modifiedSinceTime);
+    return result;
+}
 
-        if (types.contains(WebsiteDataType::LocalStorage))
-            deleteLocalStorageData(modifiedSinceTime);
+OptionSet<WebsiteDataType> OriginStorageManager::StorageBucket::fetchDataTypesInListFromDisk(OptionSet<WebsiteDataType> types)
+{
+    OptionSet<WebsiteDataType> result;
+    if (types.contains(WebsiteDataType::FileSystem)) {
+        auto fileSystemStoragePath = typeStoragePath(StorageType::FileSystem);
+        if (auto files = FileSystem::listDirectory(fileSystemStoragePath); !files.isEmpty())
+            result.add(WebsiteDataType::FileSystem);
+    }
 
-        if (types.contains(WebsiteDataType::SessionStorage) && modifiedSinceTime < WallTime::now())
-            deleteSessionStorageData();
+    if (types.contains(WebsiteDataType::LocalStorage)) {
+        if (FileSystem::fileExists(resolvedLocalStoragePath()))
+            result.add(WebsiteDataType::LocalStorage);
+    }
 
-        if (types.contains(WebsiteDataType::IndexedDBDatabases))
-            deleteIDBStorageData(modifiedSinceTime);
+    if (types.contains(WebsiteDataType::IndexedDBDatabases)) {
+        if (auto databases = FileSystem::listDirectory(resolvedIDBStoragePath()); !databases.isEmpty())
+            result.add(WebsiteDataType::IndexedDBDatabases);
     }
 
-    void moveData(OptionSet<WebsiteDataType> types, const String& localStoragePath, const String& idbStoragePath)
-    {
-        // This is only supported for IndexedDB and LocalStorage now.
-        if (types.contains(WebsiteDataType::LocalStorage) && !localStoragePath.isEmpty()) {
-            if (m_localStorageManager)
-                m_localStorageManager->close();
+    return result;
+}
 
-            auto currentLocalStoragePath = resolvedLocalStoragePath();
-            if (!currentLocalStoragePath.isEmpty()) {
-                FileSystem::makeAllDirectories(FileSystem::parentPath(localStoragePath));
-                WebCore::SQLiteFileSystem::moveDatabaseFile(currentLocalStoragePath, localStoragePath);
-            }
-        }
+void OriginStorageManager::StorageBucket::deleteData(OptionSet<WebsiteDataType> types, WallTime modifiedSinceTime)
+{
+    if (types.contains(WebsiteDataType::FileSystem))
+        deleteFileSystemStorageData(modifiedSinceTime);
 
-        if (types.contains(WebsiteDataType::IndexedDBDatabases) && !idbStoragePath.isEmpty()) {
-            if (m_idbStorageManager)
-                m_idbStorageManager->closeDatabasesForDeletion();
+    if (types.contains(WebsiteDataType::LocalStorage))
+        deleteLocalStorageData(modifiedSinceTime);
 
-            auto currentIDBStoragePath = resolvedIDBStoragePath();
-            if (!currentIDBStoragePath.isEmpty()) {
-                FileSystem::makeAllDirectories(FileSystem::parentPath(idbStoragePath));
-                FileSystem::moveFile(currentIDBStoragePath, idbStoragePath);
-            }
-        }
-    }
+    if (types.contains(WebsiteDataType::SessionStorage) && modifiedSinceTime < WallTime::now())
+        deleteSessionStorageData();
 
-    String resolvedLocalStoragePath()
-    {
-        if (!m_resolvedLocalStoragePath.isNull())
-            return m_resolvedLocalStoragePath;
+    if (types.contains(WebsiteDataType::IndexedDBDatabases))
+        deleteIDBStorageData(modifiedSinceTime);
+}
 
-        if (m_shouldUseCustomPaths) {
-            ASSERT(m_customLocalStoragePath.isEmpty() == m_rootPath.isEmpty());
-            m_resolvedLocalStoragePath = m_customLocalStoragePath;
-        } else if (!m_rootPath.isEmpty()) {
-            auto localStorageDirectory = typeStoragePath(StorageType::LocalStorage);
-            FileSystem::makeAllDirectories(localStorageDirectory);
-            FileSystem::excludeFromBackup(localStorageDirectory);
+void OriginStorageManager::StorageBucket::deleteFileSystemStorageData(WallTime modifiedSinceTime)
+{
+    m_fileSystemStorageManager = nullptr;
 
-            auto localStoragePath = LocalStorageManager::localStorageFilePath(localStorageDirectory);
-            if (!m_customLocalStoragePath.isEmpty() && !FileSystem::fileExists(localStoragePath) && FileSystem::fileExists(m_customLocalStoragePath))
-                WebCore::SQLiteFileSystem::moveDatabaseFile(m_customLocalStoragePath, localStoragePath);
+    auto fileSystemStoragePath = typeStoragePath(StorageType::FileSystem);
+    FileSystem::deleteAllFilesModifiedSince(fileSystemStoragePath, modifiedSinceTime);
+}
 
-            m_resolvedLocalStoragePath = localStoragePath;
-        } else
-            m_resolvedLocalStoragePath = emptyString();
-
-        return m_resolvedLocalStoragePath;
+void OriginStorageManager::StorageBucket::deleteLocalStorageData(WallTime time)
+{
+    auto currentLocalStoragePath = resolvedLocalStoragePath();
+    if (FileSystem::fileModificationTime(currentLocalStoragePath) >= time) {
+        if (m_localStorageManager)
+            m_localStorageManager->clearDataOnDisk();
+        WebCore::SQLiteFileSystem::deleteDatabaseFile(currentLocalStoragePath);
     }
 
-    String resolvedIDBStoragePath()
-    {
-        ASSERT(!RunLoop::isMain());
+    if (!m_localStorageManager)
+        return;
 
-        if (!m_resolvedIDBStoragePath.isNull())
-            return m_resolvedIDBStoragePath;
+    m_localStorageManager->clearDataInMemory();
+    if (!m_localStorageManager->isActive())
+        m_localStorageManager = nullptr;
+}
 
-        if (m_shouldUseCustomPaths) {
-            ASSERT(m_customIDBStoragePath.isEmpty() == m_rootPath.isEmpty());
-            m_resolvedIDBStoragePath = m_customIDBStoragePath;
-        } else {
-            auto idbStoragePath = typeStoragePath(StorageType::IndexedDB);
-            IDBStorageManager::migrateOriginData(m_customIDBStoragePath, idbStoragePath);
-            m_resolvedIDBStoragePath = idbStoragePath;
-        }
-        
-        ASSERT(!m_resolvedIDBStoragePath.isNull());
-        return m_resolvedIDBStoragePath;
-    }
+void OriginStorageManager::StorageBucket::deleteSessionStorageData()
+{
+    if (!m_sessionStorageManager)
+        return;
 
-private:
-    OptionSet<WebsiteDataType> fetchDataTypesInListFromMemory(OptionSet<WebsiteDataType> types)
-    {
-        OptionSet<WebsiteDataType> result;
-        if (types.contains(WebsiteDataType::LocalStorage)) {
-            if (m_localStorageManager && m_localStorageManager->hasDataInMemory())
-                result.add(WebsiteDataType::LocalStorage);
-        }
+    m_sessionStorageManager->clearData();
+    if (!m_sessionStorageManager->isActive())
+        m_sessionStorageManager = nullptr;
+}
 
-        if (types.contains(WebsiteDataType::SessionStorage)) {
-            if (m_sessionStorageManager && m_sessionStorageManager->hasDataInMemory())
-                result.add(WebsiteDataType::SessionStorage);
-        }
+void OriginStorageManager::StorageBucket::deleteIDBStorageData(WallTime time)
+{
+    if (m_idbStorageManager)
+        m_idbStorageManager->closeDatabasesForDeletion();
 
-        if (types.contains(WebsiteDataType::IndexedDBDatabases)) {
-            if (m_idbStorageManager && m_idbStorageManager->hasDataInMemory())
-                result.add(WebsiteDataType::IndexedDBDatabases);
-        }
+    FileSystem::deleteAllFilesModifiedSince(resolvedIDBStoragePath(), time);
+}
 
-        return result;
-    }
+void OriginStorageManager::StorageBucket::moveData(OptionSet<WebsiteDataType> types, const String& localStoragePath, const String& idbStoragePath)
+{
+    // This is only supported for IndexedDB and LocalStorage now.
+    if (types.contains(WebsiteDataType::LocalStorage) && !localStoragePath.isEmpty()) {
+        if (m_localStorageManager)
+            m_localStorageManager->close();
 
-    OptionSet<WebsiteDataType> fetchDataTypesInListFromDisk(OptionSet<WebsiteDataType> types)
-    {
-        OptionSet<WebsiteDataType> result;
-        if (types.contains(WebsiteDataType::FileSystem)) {
-            auto fileSystemStoragePath = typeStoragePath(StorageType::FileSystem);
-            if (auto files = FileSystem::listDirectory(fileSystemStoragePath); !files.isEmpty())
-                result.add(WebsiteDataType::FileSystem);
+        auto currentLocalStoragePath = resolvedLocalStoragePath();
+        if (!currentLocalStoragePath.isEmpty()) {
+            FileSystem::makeAllDirectories(FileSystem::parentPath(localStoragePath));
+            WebCore::SQLiteFileSystem::moveDatabaseFile(currentLocalStoragePath, localStoragePath);
         }
+    }
 
-        if (types.contains(WebsiteDataType::LocalStorage)) {
-            if (FileSystem::fileExists(resolvedLocalStoragePath()))
-                result.add(WebsiteDataType::LocalStorage);
-        }
+    if (types.contains(WebsiteDataType::IndexedDBDatabases) && !idbStoragePath.isEmpty()) {
+        if (m_idbStorageManager)
+            m_idbStorageManager->closeDatabasesForDeletion();
 
-        if (types.contains(WebsiteDataType::IndexedDBDatabases)) {
-            if (auto databases = FileSystem::listDirectory(resolvedIDBStoragePath()); !databases.isEmpty())
-                result.add(WebsiteDataType::IndexedDBDatabases);
+        auto currentIDBStoragePath = resolvedIDBStoragePath();
+        if (!currentIDBStoragePath.isEmpty()) {
+            FileSystem::makeAllDirectories(FileSystem::parentPath(idbStoragePath));
+            FileSystem::moveFile(currentIDBStoragePath, idbStoragePath);
         }
-
-        return result;
     }
+}
 
-    void deleteFileSystemStorageData(WallTime modifiedSinceTime)
-    {
-        m_fileSystemStorageManager = nullptr;
+String OriginStorageManager::StorageBucket::resolvedLocalStoragePath()
+{
+    if (!m_resolvedLocalStoragePath.isNull())
+        return m_resolvedLocalStoragePath;
 
-        auto fileSystemStoragePath = typeStoragePath(StorageType::FileSystem);
-        FileSystem::deleteAllFilesModifiedSince(fileSystemStoragePath, modifiedSinceTime);
-    }
+    if (m_shouldUseCustomPaths) {
+        ASSERT(m_customLocalStoragePath.isEmpty() == m_rootPath.isEmpty());
+        m_resolvedLocalStoragePath = m_customLocalStoragePath;
+    } else if (!m_rootPath.isEmpty()) {
+        auto localStorageDirectory = typeStoragePath(StorageType::LocalStorage);
+        FileSystem::makeAllDirectories(localStorageDirectory);
+        FileSystem::excludeFromBackup(localStorageDirectory);
 
-    void deleteLocalStorageData(WallTime time)
-    {
-        auto currentLocalStoragePath = resolvedLocalStoragePath();
-        if (FileSystem::fileModificationTime(currentLocalStoragePath) >= time) {
-            if (m_localStorageManager)
-                m_localStorageManager->clearDataOnDisk();
-            WebCore::SQLiteFileSystem::deleteDatabaseFile(currentLocalStoragePath);
-        }
+        auto localStoragePath = LocalStorageManager::localStorageFilePath(localStorageDirectory);
+        if (!m_customLocalStoragePath.isEmpty() && !FileSystem::fileExists(localStoragePath) && FileSystem::fileExists(m_customLocalStoragePath))
+            WebCore::SQLiteFileSystem::moveDatabaseFile(m_customLocalStoragePath, localStoragePath);
 
-        if (!m_localStorageManager)
-            return;
+        m_resolvedLocalStoragePath = localStoragePath;
+    } else
+        m_resolvedLocalStoragePath = emptyString();
 
-        m_localStorageManager->clearDataInMemory();
-        if (!m_localStorageManager->isActive())
-            m_localStorageManager = nullptr;
-    }
+    return m_resolvedLocalStoragePath;
+}
 
-    void deleteSessionStorageData()
-    {
-        if (!m_sessionStorageManager)
-            return;
+String OriginStorageManager::StorageBucket::resolvedIDBStoragePath()
+{
+    ASSERT(!RunLoop::isMain());
 
-        m_sessionStorageManager->clearData();
-        if (!m_sessionStorageManager->isActive())
-            m_sessionStorageManager = nullptr;
+    if (!m_resolvedIDBStoragePath.isNull())
+        return m_resolvedIDBStoragePath;
+
+    if (m_shouldUseCustomPaths) {
+        ASSERT(m_customIDBStoragePath.isEmpty() == m_rootPath.isEmpty());
+        m_resolvedIDBStoragePath = m_customIDBStoragePath;
+    } else {
+        auto idbStoragePath = typeStoragePath(StorageType::IndexedDB);
+        IDBStorageManager::migrateOriginData(m_customIDBStoragePath, idbStoragePath);
+        m_resolvedIDBStoragePath = idbStoragePath;
     }
     
-    void deleteIDBStorageData(WallTime time)
-    {
-        if (m_idbStorageManager)
-            m_idbStorageManager->closeDatabasesForDeletion();
+    ASSERT(!m_resolvedIDBStoragePath.isNull());
+    return m_resolvedIDBStoragePath;
+}
 
-        FileSystem::deleteAllFilesModifiedSince(resolvedIDBStoragePath(), time);
-    }
-
-    String m_rootPath;
-    String m_identifier;
-    StorageBucketMode m_mode { StorageBucketMode::BestEffort };
-    std::unique_ptr<FileSystemStorageManager> m_fileSystemStorageManager;
-    std::unique_ptr<LocalStorageManager> m_localStorageManager;
-    String m_customLocalStoragePath;
-    String m_resolvedLocalStoragePath;
-    std::unique_ptr<SessionStorageManager> m_sessionStorageManager;
-    std::unique_ptr<IDBStorageManager> m_idbStorageManager;
-    String m_customIDBStoragePath;
-    String m_resolvedIDBStoragePath;
-    bool m_shouldUseCustomPaths;
-};
-
 String OriginStorageManager::originFileIdentifier()
 {
     return originFileName;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to