Title: [290033] trunk
Revision
290033
Author
sihui_...@apple.com
Date
2022-02-17 10:19:24 -0800 (Thu, 17 Feb 2022)

Log Message

Ensure NetworkStorageManager::moveData performs move operation based on data types
https://bugs.webkit.org/show_bug.cgi?id=236727
rdar://89009881

Reviewed by Chris Dumez.

Source/WebKit:

In r286936, we introduced NetworkStorageManager::moveData to move data from one origin to another. However, the
function does not take dataTypes parameter as NetworkProcess::renameOriginInWebsiteData does, and
NetworkStorageManager would try to move every storage type it manages. This has caused an unexpected failure, as
FileSystem storage needs special handling before data can be moved. To address the regression, let's revert
the behavior change by making sure NetworkStorageManager checks the types value, and only performs move
operation for IndexedDB and LocalStorage data.

Updated existing API test to ensure only expected data types are moved.

* NetworkProcess/NetworkProcess.cpp:
(WebKit::NetworkProcess::renameOriginInWebsiteData):
* NetworkProcess/storage/NetworkStorageManager.cpp:
(WebKit::NetworkStorageManager::moveData):
* NetworkProcess/storage/NetworkStorageManager.h:
* NetworkProcess/storage/OriginStorageManager.cpp:
(WebKit::OriginStorageManager::StorageBucket::moveData):
(WebKit::OriginStorageManager::StorageBucket::resolvedLocalStoragePath):
(WebKit::OriginStorageManager::StorageBucket::deleteIDBStorageData):
(WebKit::OriginStorageManager::resolvedLocalStoragePath):
(WebKit::OriginStorageManager::resolvedIDBStoragePath):
(WebKit::OriginStorageManager::moveData):
* NetworkProcess/storage/OriginStorageManager.h:

Tools:

* TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm:
(TEST):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (290032 => 290033)


--- trunk/Source/WebKit/ChangeLog	2022-02-17 17:57:53 UTC (rev 290032)
+++ trunk/Source/WebKit/ChangeLog	2022-02-17 18:19:24 UTC (rev 290033)
@@ -1,3 +1,34 @@
+2022-02-17  Sihui Liu  <sihui_...@apple.com>
+
+        Ensure NetworkStorageManager::moveData performs move operation based on data types
+        https://bugs.webkit.org/show_bug.cgi?id=236727
+        rdar://89009881
+
+        Reviewed by Chris Dumez.
+
+        In r286936, we introduced NetworkStorageManager::moveData to move data from one origin to another. However, the 
+        function does not take dataTypes parameter as NetworkProcess::renameOriginInWebsiteData does, and 
+        NetworkStorageManager would try to move every storage type it manages. This has caused an unexpected failure, as
+        FileSystem storage needs special handling before data can be moved. To address the regression, let's revert 
+        the behavior change by making sure NetworkStorageManager checks the types value, and only performs move 
+        operation for IndexedDB and LocalStorage data.
+
+        Updated existing API test to ensure only expected data types are moved.
+
+        * NetworkProcess/NetworkProcess.cpp:
+        (WebKit::NetworkProcess::renameOriginInWebsiteData):
+        * NetworkProcess/storage/NetworkStorageManager.cpp:
+        (WebKit::NetworkStorageManager::moveData):
+        * NetworkProcess/storage/NetworkStorageManager.h:
+        * NetworkProcess/storage/OriginStorageManager.cpp:
+        (WebKit::OriginStorageManager::StorageBucket::moveData):
+        (WebKit::OriginStorageManager::StorageBucket::resolvedLocalStoragePath):
+        (WebKit::OriginStorageManager::StorageBucket::deleteIDBStorageData):
+        (WebKit::OriginStorageManager::resolvedLocalStoragePath):
+        (WebKit::OriginStorageManager::resolvedIDBStoragePath):
+        (WebKit::OriginStorageManager::moveData):
+        * NetworkProcess/storage/OriginStorageManager.h:
+
 2022-02-17  Kimmo Kinnunen  <kkinnu...@apple.com>
 
         MediaPlayer::videoFrameForCurrentTime() should return VideoFrame

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp (290032 => 290033)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2022-02-17 17:57:53 UTC (rev 290032)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2022-02-17 18:19:24 UTC (rev 290033)
@@ -2247,7 +2247,7 @@
 
     auto* session = networkSession(sessionID);
     if (auto* manager = session ? session->storageManager() : nullptr)
-        manager->moveData(oldOrigin, newOrigin, [aggregator] { });
+        manager->moveData(dataTypes, oldOrigin, newOrigin, [aggregator] { });
 }
 
 #if ENABLE(SERVICE_WORKER)

Modified: trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.cpp (290032 => 290033)


--- trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.cpp	2022-02-17 17:57:53 UTC (rev 290032)
+++ trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.cpp	2022-02-17 18:19:24 UTC (rev 290033)
@@ -609,27 +609,22 @@
     });
 }
 
-void NetworkStorageManager::moveData(const WebCore::SecurityOriginData& source, const WebCore::SecurityOriginData& target, CompletionHandler<void()>&& completionHandler)
+void NetworkStorageManager::moveData(OptionSet<WebsiteDataType> types, const WebCore::SecurityOriginData& source, const WebCore::SecurityOriginData& target, CompletionHandler<void()>&& completionHandler)
 {
     ASSERT(RunLoop::isMain());
     ASSERT(!m_closed);
 
-    m_queue->dispatch([this, protectedThis = Ref { *this }, source = crossThreadCopy(source), target = crossThreadCopy(target), completionHandler = WTFMove(completionHandler)]() mutable {
+    m_queue->dispatch([this, protectedThis = Ref { *this }, types, source = crossThreadCopy(source), target = crossThreadCopy(target), completionHandler = WTFMove(completionHandler)]() mutable {
         auto sourceOrigin = WebCore::ClientOrigin { source, source };
         auto targetOrigin = WebCore::ClientOrigin { target, target };
         
         // Clear existing data of target origin.
-        OptionSet<WebsiteDataType> types = {
-            WebsiteDataType::FileSystem,
-            WebsiteDataType::LocalStorage,
-            WebsiteDataType::SessionStorage,
-            WebsiteDataType::IndexedDBDatabases
-        };
         localOriginStorageManager(targetOrigin).deleteData(types, -WallTime::infinity());
-        removeOriginStorageManagerIfPossible(targetOrigin);
 
         // Move data from source origin to target origin.
-        localOriginStorageManager(sourceOrigin).moveData(originDirectoryPath(m_path, targetOrigin, m_salt), LocalStorageManager::localStorageFilePath(m_customLocalStoragePath, targetOrigin), IDBStorageManager::idbStorageOriginDirectory(m_customIDBStoragePath, targetOrigin));
+        localOriginStorageManager(sourceOrigin).moveData(types, localOriginStorageManager(targetOrigin).resolvedLocalStoragePath(), localOriginStorageManager(targetOrigin).resolvedIDBStoragePath());
+
+        removeOriginStorageManagerIfPossible(targetOrigin);
         removeOriginStorageManagerIfPossible(sourceOrigin);
 
         RunLoop::main().dispatch(WTFMove(completionHandler));

Modified: trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.h (290032 => 290033)


--- trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.h	2022-02-17 17:57:53 UTC (rev 290032)
+++ trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.h	2022-02-17 18:19:24 UTC (rev 290033)
@@ -84,7 +84,7 @@
     void deleteData(OptionSet<WebsiteDataType>, const Vector<WebCore::SecurityOriginData>&, CompletionHandler<void()>&&);
     void deleteDataModifiedSince(OptionSet<WebsiteDataType>, WallTime, CompletionHandler<void()>&&);
     void deleteDataForRegistrableDomains(OptionSet<WebsiteDataType>, const Vector<WebCore::RegistrableDomain>&, CompletionHandler<void(HashSet<WebCore::RegistrableDomain>&&)>&&);
-    void moveData(const WebCore::SecurityOriginData& source, const WebCore::SecurityOriginData& target, CompletionHandler<void()>&&);
+    void moveData(OptionSet<WebsiteDataType>, const WebCore::SecurityOriginData& source, const WebCore::SecurityOriginData& target, CompletionHandler<void()>&&);
     void suspend(CompletionHandler<void()>&&);
     void resume();
     void handleLowMemoryWarning();

Modified: trunk/Source/WebKit/NetworkProcess/storage/OriginStorageManager.cpp (290032 => 290033)


--- trunk/Source/WebKit/NetworkProcess/storage/OriginStorageManager.cpp	2022-02-17 17:57:53 UTC (rev 290032)
+++ trunk/Source/WebKit/NetworkProcess/storage/OriginStorageManager.cpp	2022-02-17 18:19:24 UTC (rev 290033)
@@ -218,29 +218,51 @@
             deleteIDBStorageData(modifiedSinceTime);
     }
 
-    void moveData(const String& path, const String& localStoragePath, const String& idbStoragePath)
+    void moveData(OptionSet<WebsiteDataType> types, const String& localStoragePath, const String& idbStoragePath)
     {
-        m_fileSystemStorageManager = nullptr;
-        if (m_localStorageManager)
-            m_localStorageManager->close();
+        // This is only supported for IndexedDB and LocalStorage now.
+        if (types.contains(WebsiteDataType::LocalStorage) && !localStoragePath.isEmpty()) {
+            if (m_localStorageManager)
+                m_localStorageManager->close();
 
-        if (m_idbStorageManager)
-            m_idbStorageManager->closeDatabasesForDeletion();
+            auto currentLocalStoragePath = resolvedLocalStoragePath();
+            if (!currentLocalStoragePath.isEmpty()) {
+                FileSystem::makeAllDirectories(FileSystem::parentPath(localStoragePath));
+                WebCore::SQLiteFileSystem::moveDatabaseFile(currentLocalStoragePath, localStoragePath);
+            }
+        }
 
-        FileSystem::makeAllDirectories(FileSystem::parentPath(path));
-        FileSystem::moveFile(m_rootPath, path);
+        if (types.contains(WebsiteDataType::IndexedDBDatabases) && !idbStoragePath.isEmpty()) {
+            if (m_idbStorageManager)
+                m_idbStorageManager->closeDatabasesForDeletion();
 
-        auto currentLocalStoragePath = resolvedLocalStoragePath();
-        if (!currentLocalStoragePath.isEmpty() && !localStoragePath.isEmpty()) {
-            FileSystem::makeAllDirectories(FileSystem::parentPath(localStoragePath));
-            WebCore::SQLiteFileSystem::moveDatabaseFile(currentLocalStoragePath, localStoragePath);
+            auto currentIDBStoragePath = resolvedIDBStoragePath();
+            if (!currentIDBStoragePath.isEmpty()) {
+                FileSystem::makeAllDirectories(FileSystem::parentPath(idbStoragePath));
+                FileSystem::moveFile(currentIDBStoragePath, idbStoragePath);
+            }
         }
+    }
 
-        auto currentIDBStoragePath = resolvedIDBStoragePath();
-        if (!currentIDBStoragePath.isEmpty() && !idbStoragePath.isEmpty()) {
-            FileSystem::makeAllDirectories(FileSystem::parentPath(idbStoragePath));
-            WebCore::SQLiteFileSystem::moveDatabaseFile(currentIDBStoragePath, idbStoragePath);
+    String resolvedLocalStoragePath()
+    {
+        if (!m_resolvedLocalStoragePath.isNull())
+            return m_resolvedLocalStoragePath;
+
+        if (m_shouldUseCustomPaths) {
+            ASSERT(m_customLocalStoragePath.isEmpty() == m_rootPath.isEmpty());
+            m_resolvedLocalStoragePath = m_customLocalStoragePath;
+        } else {
+            auto localStoragePath = LocalStorageManager::localStorageFilePath(typeStoragePath(StorageType::LocalStorage));
+            if (!m_customLocalStoragePath.isEmpty() && !FileSystem::fileExists(localStoragePath)) {
+                FileSystem::makeAllDirectories(FileSystem::parentPath(localStoragePath));
+                WebCore::SQLiteFileSystem::moveDatabaseFile(m_customLocalStoragePath, localStoragePath);
+            }
+
+            m_resolvedLocalStoragePath = localStoragePath;
         }
+
+        return m_resolvedLocalStoragePath;
     }
 
     String resolvedIDBStoragePath()
@@ -352,28 +374,7 @@
 
         FileSystem::deleteAllFilesModifiedSince(resolvedIDBStoragePath(), time);
     }
-    
-    String resolvedLocalStoragePath()
-    {
-        if (!m_resolvedLocalStoragePath.isNull())
-            return m_resolvedLocalStoragePath;
 
-        if (m_shouldUseCustomPaths) {
-            ASSERT(m_customLocalStoragePath.isEmpty() == m_rootPath.isEmpty());
-            m_resolvedLocalStoragePath = m_customLocalStoragePath;
-        } else {
-            auto localStoragePath = LocalStorageManager::localStorageFilePath(typeStoragePath(StorageType::LocalStorage));
-            if (!m_customLocalStoragePath.isEmpty() && !FileSystem::fileExists(localStoragePath)) {
-                FileSystem::makeAllDirectories(FileSystem::parentPath(localStoragePath));
-                WebCore::SQLiteFileSystem::moveDatabaseFile(m_customLocalStoragePath, localStoragePath);
-            }
-
-            m_resolvedLocalStoragePath = localStoragePath;
-        }
-
-        return m_resolvedLocalStoragePath;
-    }
-
     String m_rootPath;
     String m_identifier;
     StorageBucketMode m_mode { StorageBucketMode::BestEffort };
@@ -481,6 +482,16 @@
     return defaultBucket().existingIDBStorageManager();
 }
 
+String OriginStorageManager::resolvedLocalStoragePath()
+{
+    return defaultBucket().resolvedLocalStoragePath();
+}
+
+String OriginStorageManager::resolvedIDBStoragePath()
+{
+    return defaultBucket().resolvedIDBStoragePath();
+}
+
 bool OriginStorageManager::isActive()
 {
     return defaultBucket().isActive();
@@ -513,11 +524,11 @@
     defaultBucket().deleteData(types, modifiedSince);
 }
 
-void OriginStorageManager::moveData(const String& newPath, const String& localStoragePath, const String& idbStoragePath)
+void OriginStorageManager::moveData(OptionSet<WebsiteDataType> types, const String& localStoragePath, const String& idbStoragePath)
 {
     ASSERT(!RunLoop::isMain());
 
-    defaultBucket().moveData(newPath, localStoragePath, idbStoragePath);
+    defaultBucket().moveData(types, localStoragePath, idbStoragePath);
 }
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/NetworkProcess/storage/OriginStorageManager.h (290032 => 290033)


--- trunk/Source/WebKit/NetworkProcess/storage/OriginStorageManager.h	2022-02-17 17:57:53 UTC (rev 290032)
+++ trunk/Source/WebKit/NetworkProcess/storage/OriginStorageManager.h	2022-02-17 18:19:24 UTC (rev 290033)
@@ -59,11 +59,13 @@
     SessionStorageManager* existingSessionStorageManager();
     IDBStorageManager& idbStorageManager(IDBStorageRegistry&);
     IDBStorageManager* existingIDBStorageManager();
+    String resolvedLocalStoragePath();
+    String resolvedIDBStoragePath();
     bool isActive();
     bool isEmpty();
     OptionSet<WebsiteDataType> fetchDataTypesInList(OptionSet<WebsiteDataType>);
     void deleteData(OptionSet<WebsiteDataType>, WallTime);
-    void moveData(const String& newPath, const String& localStoragePath, const String& idbStoragePath);
+    void moveData(OptionSet<WebsiteDataType>, const String& localStoragePath, const String& idbStoragePath);
 
 private:
     enum class StorageBucketMode : bool;

Modified: trunk/Tools/ChangeLog (290032 => 290033)


--- trunk/Tools/ChangeLog	2022-02-17 17:57:53 UTC (rev 290032)
+++ trunk/Tools/ChangeLog	2022-02-17 18:19:24 UTC (rev 290033)
@@ -1,3 +1,14 @@
+2022-02-17  Sihui Liu  <sihui_...@apple.com>
+
+        Ensure NetworkStorageManager::moveData performs move operation based on data types
+        https://bugs.webkit.org/show_bug.cgi?id=236727
+        rdar://89009881
+
+        Reviewed by Chris Dumez.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm:
+        (TEST):
+
 2022-02-17  Angelos Oikonomopoulos  <ange...@igalia.com>
 
         [JSC] Increase timeout to account for MIPS slowness

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm (290032 => 290033)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm	2022-02-17 17:57:53 UTC (rev 290032)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm	2022-02-17 18:19:24 UTC (rev 290033)
@@ -542,6 +542,7 @@
 
     [webView loadHTMLString:testString baseURL:exampleURL];
     EXPECT_WK_STREQ("database is created", getNextMessage().body);
+    [webView stringByEvaluatingJavaScript:@"localStorage.setItem('testkey', 'testvalue')"];
 
     auto dataStore = webView.get().configuration.websiteDataStore;
     auto indexedDBType = adoptNS([[NSSet alloc] initWithObjects:WKWebsiteDataTypeIndexedDBDatabases, nil]);
@@ -554,6 +555,8 @@
     
     [webView loadHTMLString:testString baseURL:webKitURL];
     EXPECT_WK_STREQ("database exists", getNextMessage().body);
+    // Ensure LocalStorage data is not moved.
+    EXPECT_WK_STREQ("<null>", [webView stringByEvaluatingJavaScript:@"localStorage.getItem('testkey')"]);
 
     [webView loadHTMLString:testString baseURL:exampleURL];
     EXPECT_WK_STREQ("database is created", getNextMessage().body);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to