Title: [285007] trunk
Revision
285007
Author
sihui_...@apple.com
Date
2021-10-28 16:46:21 -0700 (Thu, 28 Oct 2021)

Log Message

Release FileSystemStorageHandle when it is not in use
https://bugs.webkit.org/show_bug.cgi?id=232363

Reviewed by Youenn Fablet.

Source/WebCore:

When FileSystemHandle is destroyed, its corresponding FileSystemStorageHandle should be destroyed as it will
not be used any more. Also, stop creating a new FileSystemHandle or FileSystemSyncAccessHandle if context
already stops.

* Modules/filesystemaccess/FileSystemDirectoryHandle.cpp:
(WebCore::FileSystemDirectoryHandle::create):
(WebCore::FileSystemDirectoryHandle::FileSystemDirectoryHandle):
(WebCore::FileSystemDirectoryHandle::getFileHandle):
(WebCore::FileSystemDirectoryHandle::getDirectoryHandle):
(WebCore::FileSystemDirectoryHandle::getHandle):
* Modules/filesystemaccess/FileSystemDirectoryHandle.h:
* Modules/filesystemaccess/FileSystemFileHandle.cpp:
(WebCore::FileSystemFileHandle::create):
(WebCore::FileSystemFileHandle::FileSystemFileHandle):
(WebCore::FileSystemFileHandle::createSyncAccessHandle):
* Modules/filesystemaccess/FileSystemFileHandle.h:
* Modules/filesystemaccess/FileSystemHandle.cpp:
(WebCore::FileSystemHandle::FileSystemHandle):
* Modules/filesystemaccess/FileSystemHandle.h:
* Modules/filesystemaccess/FileSystemStorageConnection.h:
* Modules/filesystemaccess/FileSystemSyncAccessHandle.cpp:
(WebCore::FileSystemSyncAccessHandle::create):
(WebCore::FileSystemSyncAccessHandle::FileSystemSyncAccessHandle):
* Modules/filesystemaccess/FileSystemSyncAccessHandle.h:
* Modules/filesystemaccess/WorkerFileSystemStorageConnection.cpp:
(WebCore::WorkerFileSystemStorageConnection::closeHandle):
* Modules/filesystemaccess/WorkerFileSystemStorageConnection.h:
* Modules/storage/StorageManager.cpp:
(WebCore::StorageManager::fileSystemAccessGetDirectory):

Source/WebKit:

* NetworkProcess/storage/FileSystemStorageHandle.cpp:
(WebKit::FileSystemStorageHandle::close):
* NetworkProcess/storage/FileSystemStorageHandle.h:
* NetworkProcess/storage/FileSystemStorageManager.cpp:
(WebKit::FileSystemStorageManager::closeHandle):
(WebKit::FileSystemStorageManager::connectionClosed):
* NetworkProcess/storage/FileSystemStorageManager.h:
* NetworkProcess/storage/NetworkStorageManager.cpp:
(WebKit::NetworkStorageManager::closeHandle):
* NetworkProcess/storage/NetworkStorageManager.h:
* NetworkProcess/storage/NetworkStorageManager.messages.in:
* WebProcess/WebCoreSupport/WebFileSystemStorageConnection.cpp:
(WebKit::WebFileSystemStorageConnection::closeHandle):
* WebProcess/WebCoreSupport/WebFileSystemStorageConnection.h:

LayoutTests:

* storage/filesystemaccess/resources/sync-access-handle-basics.js:
(getDirectory): clean up existing file before test.

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (285006 => 285007)


--- trunk/LayoutTests/ChangeLog	2021-10-28 23:36:36 UTC (rev 285006)
+++ trunk/LayoutTests/ChangeLog	2021-10-28 23:46:21 UTC (rev 285007)
@@ -1,3 +1,13 @@
+2021-10-28  Sihui Liu  <sihui_...@apple.com>
+
+        Release FileSystemStorageHandle when it is not in use
+        https://bugs.webkit.org/show_bug.cgi?id=232363
+
+        Reviewed by Youenn Fablet.
+
+        * storage/filesystemaccess/resources/sync-access-handle-basics.js:
+        (getDirectory): clean up existing file before test.
+
 2021-10-28  Ayumi Kojima  <ayumi_koj...@apple.com>
 
         [ iOS Debug ] fast/selectors/ backtracking tests are timing out.

Modified: trunk/LayoutTests/storage/filesystemaccess/resources/sync-access-handle-basics.js (285006 => 285007)


--- trunk/LayoutTests/storage/filesystemaccess/resources/sync-access-handle-basics.js	2021-10-28 23:36:36 UTC (rev 285006)
+++ trunk/LayoutTests/storage/filesystemaccess/resources/sync-access-handle-basics.js	2021-10-28 23:46:21 UTC (rev 285007)
@@ -17,7 +17,11 @@
 function getDirectory() {
     navigator.storage.getDirectory().then((handle) => {
         rootHandle = handle;
-        createFileHandle(rootHandle);
+        rootHandle.removeEntry("sync-access-handle.txt").then(() => {
+            createFileHandle(rootHandle);
+        }).catch((error) => {
+            finishTest(error);
+        });
     }).catch((error) => {
         finishTest(error);
     });

Modified: trunk/Source/WebCore/ChangeLog (285006 => 285007)


--- trunk/Source/WebCore/ChangeLog	2021-10-28 23:36:36 UTC (rev 285006)
+++ trunk/Source/WebCore/ChangeLog	2021-10-28 23:46:21 UTC (rev 285007)
@@ -1,3 +1,40 @@
+2021-10-28  Sihui Liu  <sihui_...@apple.com>
+
+        Release FileSystemStorageHandle when it is not in use
+        https://bugs.webkit.org/show_bug.cgi?id=232363
+
+        Reviewed by Youenn Fablet.
+
+        When FileSystemHandle is destroyed, its corresponding FileSystemStorageHandle should be destroyed as it will
+        not be used any more. Also, stop creating a new FileSystemHandle or FileSystemSyncAccessHandle if context 
+        already stops.
+
+        * Modules/filesystemaccess/FileSystemDirectoryHandle.cpp:
+        (WebCore::FileSystemDirectoryHandle::create):
+        (WebCore::FileSystemDirectoryHandle::FileSystemDirectoryHandle):
+        (WebCore::FileSystemDirectoryHandle::getFileHandle):
+        (WebCore::FileSystemDirectoryHandle::getDirectoryHandle):
+        (WebCore::FileSystemDirectoryHandle::getHandle):
+        * Modules/filesystemaccess/FileSystemDirectoryHandle.h:
+        * Modules/filesystemaccess/FileSystemFileHandle.cpp:
+        (WebCore::FileSystemFileHandle::create):
+        (WebCore::FileSystemFileHandle::FileSystemFileHandle):
+        (WebCore::FileSystemFileHandle::createSyncAccessHandle):
+        * Modules/filesystemaccess/FileSystemFileHandle.h:
+        * Modules/filesystemaccess/FileSystemHandle.cpp:
+        (WebCore::FileSystemHandle::FileSystemHandle):
+        * Modules/filesystemaccess/FileSystemHandle.h:
+        * Modules/filesystemaccess/FileSystemStorageConnection.h:
+        * Modules/filesystemaccess/FileSystemSyncAccessHandle.cpp:
+        (WebCore::FileSystemSyncAccessHandle::create):
+        (WebCore::FileSystemSyncAccessHandle::FileSystemSyncAccessHandle):
+        * Modules/filesystemaccess/FileSystemSyncAccessHandle.h:
+        * Modules/filesystemaccess/WorkerFileSystemStorageConnection.cpp:
+        (WebCore::WorkerFileSystemStorageConnection::closeHandle):
+        * Modules/filesystemaccess/WorkerFileSystemStorageConnection.h:
+        * Modules/storage/StorageManager.cpp:
+        (WebCore::StorageManager::fileSystemAccessGetDirectory):
+
 2021-10-28  Andres Gonzalez  <andresg...@apple.com>
 
         Isolated tree mode: Dispatch all calls to [WebAccessibilityObjectWrapper accessibilityAttributeValue] in WTR::AccessibilityUIElement to the AX thread.

Modified: trunk/Source/WebCore/Modules/filesystemaccess/FileSystemDirectoryHandle.cpp (285006 => 285007)


--- trunk/Source/WebCore/Modules/filesystemaccess/FileSystemDirectoryHandle.cpp	2021-10-28 23:36:36 UTC (rev 285006)
+++ trunk/Source/WebCore/Modules/filesystemaccess/FileSystemDirectoryHandle.cpp	2021-10-28 23:46:21 UTC (rev 285007)
@@ -36,12 +36,12 @@
 
 WTF_MAKE_ISO_ALLOCATED_IMPL(FileSystemDirectoryHandle);
 
-Ref<FileSystemDirectoryHandle> FileSystemDirectoryHandle::create(ScriptExecutionContext* context, String&& name, FileSystemHandleIdentifier identifier, Ref<FileSystemStorageConnection>&& connection)
+Ref<FileSystemDirectoryHandle> FileSystemDirectoryHandle::create(ScriptExecutionContext& context, String&& name, FileSystemHandleIdentifier identifier, Ref<FileSystemStorageConnection>&& connection)
 {
     return adoptRef(*new FileSystemDirectoryHandle(context, WTFMove(name), identifier, WTFMove(connection)));
 }
 
-FileSystemDirectoryHandle::FileSystemDirectoryHandle(ScriptExecutionContext* context, String&& name, FileSystemHandleIdentifier identifier, Ref<FileSystemStorageConnection>&& connection)
+FileSystemDirectoryHandle::FileSystemDirectoryHandle(ScriptExecutionContext& context, String&& name, FileSystemHandleIdentifier identifier, Ref<FileSystemStorageConnection>&& connection)
     : FileSystemHandle(context, FileSystemHandle::Kind::Directory, WTFMove(name), identifier, WTFMove(connection))
 {
 }
@@ -56,8 +56,14 @@
         if (result.hasException())
             return promise.reject(result.releaseException());
 
+        auto identifier = result.returnValue();
         auto* context = weakThis ? weakThis->scriptExecutionContext() : nullptr;
-        promise.settle(FileSystemFileHandle::create(context, String { name }, result.returnValue(), WTFMove(connection)));
+        if (!context) {
+            connection->closeHandle(identifier);
+            return promise.reject(Exception { InvalidStateError, "Context has stopped"_s });
+        }
+
+        promise.settle(FileSystemFileHandle::create(*context, String { name }, result.returnValue(), WTFMove(connection)));
     });
 }
 
@@ -71,8 +77,14 @@
         if (result.hasException())
             return promise.reject(result.releaseException());
 
+        auto identifier = result.returnValue();
         auto* context = weakThis ? weakThis->scriptExecutionContext() : nullptr;
-        promise.settle(FileSystemDirectoryHandle::create(context, String { name }, result.returnValue(), WTFMove(connection)));
+        if (!context) {
+            connection->closeHandle(identifier);
+            return promise.reject(Exception { InvalidStateError, "Context has stopped"_s });
+        }
+
+        promise.settle(FileSystemDirectoryHandle::create(*context, String { name }, identifier, WTFMove(connection)));
     });
 }
 
@@ -119,12 +131,17 @@
 
         auto [identifier, isDirectory] = result.releaseReturnValue();
         auto* context = weakThis ? weakThis->scriptExecutionContext() : nullptr;
+        if (!context) {
+            connection->closeHandle(identifier);
+            return completionHandler(Exception { InvalidStateError, "Context has stopped"_s });
+        }
+
         if (isDirectory) {
-            Ref<FileSystemHandle> handle = FileSystemDirectoryHandle::create(context, String { name }, identifier, WTFMove(connection));
+            Ref<FileSystemHandle> handle = FileSystemDirectoryHandle::create(*context, String { name }, identifier, WTFMove(connection));
             return completionHandler(WTFMove(handle));
         }
 
-        Ref<FileSystemHandle> handle = FileSystemFileHandle::create(context, String { name }, identifier, WTFMove(connection));
+        Ref<FileSystemHandle> handle = FileSystemFileHandle::create(*context, String { name }, identifier, WTFMove(connection));
         completionHandler(WTFMove(handle));
     });
 }

Modified: trunk/Source/WebCore/Modules/filesystemaccess/FileSystemDirectoryHandle.h (285006 => 285007)


--- trunk/Source/WebCore/Modules/filesystemaccess/FileSystemDirectoryHandle.h	2021-10-28 23:36:36 UTC (rev 285006)
+++ trunk/Source/WebCore/Modules/filesystemaccess/FileSystemDirectoryHandle.h	2021-10-28 23:46:21 UTC (rev 285007)
@@ -47,7 +47,7 @@
         bool recursive { false };
     };
 
-    WEBCORE_EXPORT static Ref<FileSystemDirectoryHandle> create(ScriptExecutionContext*, String&&, FileSystemHandleIdentifier, Ref<FileSystemStorageConnection>&&);
+    WEBCORE_EXPORT static Ref<FileSystemDirectoryHandle> create(ScriptExecutionContext&, String&&, FileSystemHandleIdentifier, Ref<FileSystemStorageConnection>&&);
     void getFileHandle(const String& name, std::optional<GetFileOptions>, DOMPromiseDeferred<IDLInterface<FileSystemFileHandle>>&&);
     void getDirectoryHandle(const String& name, std::optional<GetDirectoryOptions>, DOMPromiseDeferred<IDLInterface<FileSystemDirectoryHandle>>&&);
     void removeEntry(const String& name, std::optional<RemoveOptions>, DOMPromiseDeferred<void>&&);
@@ -77,7 +77,7 @@
     Ref<Iterator> createIterator();
 
 private:
-    FileSystemDirectoryHandle(ScriptExecutionContext*, String&&, FileSystemHandleIdentifier, Ref<FileSystemStorageConnection>&&);
+    FileSystemDirectoryHandle(ScriptExecutionContext&, String&&, FileSystemHandleIdentifier, Ref<FileSystemStorageConnection>&&);
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/Modules/filesystemaccess/FileSystemFileHandle.cpp (285006 => 285007)


--- trunk/Source/WebCore/Modules/filesystemaccess/FileSystemFileHandle.cpp	2021-10-28 23:36:36 UTC (rev 285006)
+++ trunk/Source/WebCore/Modules/filesystemaccess/FileSystemFileHandle.cpp	2021-10-28 23:46:21 UTC (rev 285007)
@@ -36,12 +36,12 @@
 
 WTF_MAKE_ISO_ALLOCATED_IMPL(FileSystemFileHandle);
 
-Ref<FileSystemFileHandle> FileSystemFileHandle::create(ScriptExecutionContext* context, String&& name, FileSystemHandleIdentifier identifier, Ref<FileSystemStorageConnection>&& connection)
+Ref<FileSystemFileHandle> FileSystemFileHandle::create(ScriptExecutionContext& context, String&& name, FileSystemHandleIdentifier identifier, Ref<FileSystemStorageConnection>&& connection)
 {
     return adoptRef(*new FileSystemFileHandle(context, WTFMove(name), identifier, WTFMove(connection)));
 }
 
-FileSystemFileHandle::FileSystemFileHandle(ScriptExecutionContext* context, String&& name, FileSystemHandleIdentifier identifier, Ref<FileSystemStorageConnection>&& connection)
+FileSystemFileHandle::FileSystemFileHandle(ScriptExecutionContext& context, String&& name, FileSystemHandleIdentifier identifier, Ref<FileSystemStorageConnection>&& connection)
     : FileSystemHandle(context, FileSystemHandle::Kind::File, WTFMove(name), identifier, WTFMove(connection))
 {
 }
@@ -60,11 +60,18 @@
         if (result.hasException())
             return promise.reject(result.releaseException());
 
-        auto resultValue = result.releaseReturnValue();
-        if (resultValue.second == FileSystem::invalidPlatformFileHandle)
+        auto [identifier, file] = result.releaseReturnValue();
+        if (file == FileSystem::invalidPlatformFileHandle)
             return promise.reject(Exception { UnknownError, "Invalid platform file handle"_s });
 
-        promise.settle(FileSystemSyncAccessHandle::create(protectedThis->scriptExecutionContext(), protectedThis.get(), resultValue.first, resultValue.second));
+        auto* context = protectedThis->scriptExecutionContext();
+        if (!context) {
+            FileSystem::closeFile(file);
+            protectedThis->close(identifier, { });
+            return promise.reject(Exception { InvalidStateError, "Context has stopped"_s });
+        }
+
+        promise.settle(FileSystemSyncAccessHandle::create(*context, protectedThis.get(), identifier, file));
     });
 }
 

Modified: trunk/Source/WebCore/Modules/filesystemaccess/FileSystemFileHandle.h (285006 => 285007)


--- trunk/Source/WebCore/Modules/filesystemaccess/FileSystemFileHandle.h	2021-10-28 23:36:36 UTC (rev 285006)
+++ trunk/Source/WebCore/Modules/filesystemaccess/FileSystemFileHandle.h	2021-10-28 23:46:21 UTC (rev 285007)
@@ -37,7 +37,7 @@
 class FileSystemFileHandle final : public FileSystemHandle {
     WTF_MAKE_ISO_ALLOCATED(FileSystemFileHandle);
 public:
-    WEBCORE_EXPORT static Ref<FileSystemFileHandle> create(ScriptExecutionContext*, String&&, FileSystemHandleIdentifier, Ref<FileSystemStorageConnection>&&);
+    WEBCORE_EXPORT static Ref<FileSystemFileHandle> create(ScriptExecutionContext&, String&&, FileSystemHandleIdentifier, Ref<FileSystemStorageConnection>&&);
     void getFile(DOMPromiseDeferred<IDLInterface<File>>&&);
 
     void createSyncAccessHandle(DOMPromiseDeferred<IDLInterface<FileSystemSyncAccessHandle>>&&);
@@ -47,7 +47,7 @@
     void close(FileSystemSyncAccessHandleIdentifier, CompletionHandler<void(ExceptionOr<void>&&)>&&);
 
 private:
-    FileSystemFileHandle(ScriptExecutionContext*, String&&, FileSystemHandleIdentifier, Ref<FileSystemStorageConnection>&&);
+    FileSystemFileHandle(ScriptExecutionContext&, String&&, FileSystemHandleIdentifier, Ref<FileSystemStorageConnection>&&);
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/Modules/filesystemaccess/FileSystemHandle.cpp (285006 => 285007)


--- trunk/Source/WebCore/Modules/filesystemaccess/FileSystemHandle.cpp	2021-10-28 23:36:36 UTC (rev 285006)
+++ trunk/Source/WebCore/Modules/filesystemaccess/FileSystemHandle.cpp	2021-10-28 23:46:21 UTC (rev 285007)
@@ -34,8 +34,8 @@
 
 WTF_MAKE_ISO_ALLOCATED_IMPL(FileSystemHandle);
 
-FileSystemHandle::FileSystemHandle(ScriptExecutionContext* context, FileSystemHandle::Kind kind, String&& name, FileSystemHandleIdentifier identifier, Ref<FileSystemStorageConnection>&& connection)
-    : ActiveDOMObject(context)
+FileSystemHandle::FileSystemHandle(ScriptExecutionContext& context, FileSystemHandle::Kind kind, String&& name, FileSystemHandleIdentifier identifier, Ref<FileSystemStorageConnection>&& connection)
+    : ActiveDOMObject(&context)
     , m_kind(kind)
     , m_name(WTFMove(name))
     , m_identifier(identifier)

Modified: trunk/Source/WebCore/Modules/filesystemaccess/FileSystemHandle.h (285006 => 285007)


--- trunk/Source/WebCore/Modules/filesystemaccess/FileSystemHandle.h	2021-10-28 23:36:36 UTC (rev 285006)
+++ trunk/Source/WebCore/Modules/filesystemaccess/FileSystemHandle.h	2021-10-28 23:46:21 UTC (rev 285007)
@@ -54,7 +54,7 @@
     void move(FileSystemHandle&, const String& newName, DOMPromiseDeferred<void>&&);
 
 protected:
-    FileSystemHandle(ScriptExecutionContext*, Kind, String&& name, FileSystemHandleIdentifier, Ref<FileSystemStorageConnection>&&);
+    FileSystemHandle(ScriptExecutionContext&, Kind, String&& name, FileSystemHandleIdentifier, Ref<FileSystemStorageConnection>&&);
     FileSystemStorageConnection& connection() { return m_connection.get(); }
 
 private:

Modified: trunk/Source/WebCore/Modules/filesystemaccess/FileSystemStorageConnection.h (285006 => 285007)


--- trunk/Source/WebCore/Modules/filesystemaccess/FileSystemStorageConnection.h	2021-10-28 23:36:36 UTC (rev 285006)
+++ trunk/Source/WebCore/Modules/filesystemaccess/FileSystemStorageConnection.h	2021-10-28 23:46:21 UTC (rev 285007)
@@ -50,6 +50,7 @@
     using GetHandleNamesCallback = CompletionHandler<void(ExceptionOr<Vector<String>>&&)>;
     using GetHandleWithTypeCallback = CompletionHandler<void(ExceptionOr<std::pair<FileSystemHandleIdentifier, bool>>&&)>;
 
+    virtual void closeHandle(FileSystemHandleIdentifier) = 0;
     virtual void isSameEntry(FileSystemHandleIdentifier, FileSystemHandleIdentifier, SameEntryCallback&&) = 0;
     virtual void move(FileSystemHandleIdentifier, FileSystemHandleIdentifier, const String& newName, VoidCallback&&) = 0;
     virtual void getFileHandle(FileSystemHandleIdentifier, const String& name, bool createIfNecessary, GetHandleCallback&&) = 0;

Modified: trunk/Source/WebCore/Modules/filesystemaccess/FileSystemSyncAccessHandle.cpp (285006 => 285007)


--- trunk/Source/WebCore/Modules/filesystemaccess/FileSystemSyncAccessHandle.cpp	2021-10-28 23:36:36 UTC (rev 285006)
+++ trunk/Source/WebCore/Modules/filesystemaccess/FileSystemSyncAccessHandle.cpp	2021-10-28 23:46:21 UTC (rev 285007)
@@ -33,13 +33,13 @@
 
 namespace WebCore {
 
-Ref<FileSystemSyncAccessHandle> FileSystemSyncAccessHandle::create(ScriptExecutionContext* context, FileSystemFileHandle& source, FileSystemSyncAccessHandleIdentifier identifier, FileSystem::PlatformFileHandle file)
+Ref<FileSystemSyncAccessHandle> FileSystemSyncAccessHandle::create(ScriptExecutionContext& context, FileSystemFileHandle& source, FileSystemSyncAccessHandleIdentifier identifier, FileSystem::PlatformFileHandle file)
 {
     return adoptRef(*new FileSystemSyncAccessHandle(context, source, identifier, file));
 }
 
-FileSystemSyncAccessHandle::FileSystemSyncAccessHandle(ScriptExecutionContext* context, FileSystemFileHandle& source, FileSystemSyncAccessHandleIdentifier identifier, FileSystem::PlatformFileHandle file)
-    : ActiveDOMObject(context)
+FileSystemSyncAccessHandle::FileSystemSyncAccessHandle(ScriptExecutionContext& context, FileSystemFileHandle& source, FileSystemSyncAccessHandleIdentifier identifier, FileSystem::PlatformFileHandle file)
+    : ActiveDOMObject(&context)
     , m_source(source)
     , m_identifier(identifier)
     , m_file(file)

Modified: trunk/Source/WebCore/Modules/filesystemaccess/FileSystemSyncAccessHandle.h (285006 => 285007)


--- trunk/Source/WebCore/Modules/filesystemaccess/FileSystemSyncAccessHandle.h	2021-10-28 23:36:36 UTC (rev 285006)
+++ trunk/Source/WebCore/Modules/filesystemaccess/FileSystemSyncAccessHandle.h	2021-10-28 23:46:21 UTC (rev 285007)
@@ -44,7 +44,7 @@
         unsigned long long at;
     };
 
-    static Ref<FileSystemSyncAccessHandle> create(ScriptExecutionContext*, FileSystemFileHandle&, FileSystemSyncAccessHandleIdentifier, FileSystem::PlatformFileHandle);
+    static Ref<FileSystemSyncAccessHandle> create(ScriptExecutionContext&, FileSystemFileHandle&, FileSystemSyncAccessHandleIdentifier, FileSystem::PlatformFileHandle);
     ~FileSystemSyncAccessHandle();
 
     void truncate(unsigned long long size, DOMPromiseDeferred<void>&&);
@@ -56,7 +56,7 @@
     ExceptionOr<unsigned long long> write(BufferSource&&, FilesystemReadWriteOptions);
 
 private:
-    FileSystemSyncAccessHandle(ScriptExecutionContext*, FileSystemFileHandle&, FileSystemSyncAccessHandleIdentifier, FileSystem::PlatformFileHandle);
+    FileSystemSyncAccessHandle(ScriptExecutionContext&, FileSystemFileHandle&, FileSystemSyncAccessHandleIdentifier, FileSystem::PlatformFileHandle);
     bool isClosingOrClosed() const;
     using CloseCallback = CompletionHandler<void(ExceptionOr<void>&&)>;
     void closeInternal(CloseCallback&&);

Modified: trunk/Source/WebCore/Modules/filesystemaccess/WorkerFileSystemStorageConnection.cpp (285006 => 285007)


--- trunk/Source/WebCore/Modules/filesystemaccess/WorkerFileSystemStorageConnection.cpp	2021-10-28 23:36:36 UTC (rev 285006)
+++ trunk/Source/WebCore/Modules/filesystemaccess/WorkerFileSystemStorageConnection.cpp	2021-10-28 23:46:21 UTC (rev 285007)
@@ -29,6 +29,7 @@
 #include "WorkerGlobalScope.h"
 #include "WorkerLoaderProxy.h"
 #include "WorkerThread.h"
+#include <wtf/Scope.h>
 
 namespace WebCore {
 
@@ -75,6 +76,14 @@
     m_scope = nullptr;
 }
 
+void WorkerFileSystemStorageConnection::closeHandle(FileSystemHandleIdentifier identifier)
+{
+    callOnMainThread([mainThreadConnection = m_mainThreadConnection, identifier]() mutable {
+        if (mainThreadConnection)
+            mainThreadConnection->closeHandle(identifier);
+    });
+}
+
 void WorkerFileSystemStorageConnection::isSameEntry(FileSystemHandleIdentifier identifier, FileSystemHandleIdentifier otherIdentifier, FileSystemStorageConnection::SameEntryCallback&& callback)
 {
     if (!m_scope)

Modified: trunk/Source/WebCore/Modules/filesystemaccess/WorkerFileSystemStorageConnection.h (285006 => 285007)


--- trunk/Source/WebCore/Modules/filesystemaccess/WorkerFileSystemStorageConnection.h	2021-10-28 23:36:36 UTC (rev 285006)
+++ trunk/Source/WebCore/Modules/filesystemaccess/WorkerFileSystemStorageConnection.h	2021-10-28 23:46:21 UTC (rev 285007)
@@ -57,6 +57,7 @@
     WorkerFileSystemStorageConnection(WorkerGlobalScope&, Ref<FileSystemStorageConnection>&&);
 
     // FileSystemStorageConnection
+    void closeHandle(FileSystemHandleIdentifier) final;
     void isSameEntry(FileSystemHandleIdentifier, FileSystemHandleIdentifier, FileSystemStorageConnection::SameEntryCallback&&) final;
     void move(FileSystemHandleIdentifier, FileSystemHandleIdentifier, const String& newName, VoidCallback&&) final;
     void getFileHandle(FileSystemHandleIdentifier, const String& name, bool createIfNecessary, FileSystemStorageConnection::GetHandleCallback&&) final;

Modified: trunk/Source/WebCore/Modules/storage/StorageManager.cpp (285006 => 285007)


--- trunk/Source/WebCore/Modules/storage/StorageManager.cpp	2021-10-28 23:36:36 UTC (rev 285006)
+++ trunk/Source/WebCore/Modules/storage/StorageManager.cpp	2021-10-28 23:46:21 UTC (rev 285007)
@@ -119,9 +119,14 @@
         if (result.hasException())
             return promise.reject(result.releaseException());
 
+        auto [identifier, connection] = result.releaseReturnValue();
         auto* context = weakNavigator ? weakNavigator->scriptExecutionContext() : nullptr;
-        auto identifierConnectionPair = result.releaseReturnValue();
-        promise.resolve(FileSystemDirectoryHandle::create(context, { }, identifierConnectionPair.first, Ref { * identifierConnectionPair.second }));
+        if (!context) {
+            connection->closeHandle(identifier);
+            return promise.reject(Exception { InvalidStateError, "Context has stopped"_s });
+        }
+
+        promise.resolve(FileSystemDirectoryHandle::create(*context, { }, identifier, Ref { *connection }));
     });
 }
 

Modified: trunk/Source/WebKit/ChangeLog (285006 => 285007)


--- trunk/Source/WebKit/ChangeLog	2021-10-28 23:36:36 UTC (rev 285006)
+++ trunk/Source/WebKit/ChangeLog	2021-10-28 23:46:21 UTC (rev 285007)
@@ -1,3 +1,25 @@
+2021-10-28  Sihui Liu  <sihui_...@apple.com>
+
+        Release FileSystemStorageHandle when it is not in use
+        https://bugs.webkit.org/show_bug.cgi?id=232363
+
+        Reviewed by Youenn Fablet.
+
+        * NetworkProcess/storage/FileSystemStorageHandle.cpp:
+        (WebKit::FileSystemStorageHandle::close):
+        * NetworkProcess/storage/FileSystemStorageHandle.h:
+        * NetworkProcess/storage/FileSystemStorageManager.cpp:
+        (WebKit::FileSystemStorageManager::closeHandle):
+        (WebKit::FileSystemStorageManager::connectionClosed):
+        * NetworkProcess/storage/FileSystemStorageManager.h:
+        * NetworkProcess/storage/NetworkStorageManager.cpp:
+        (WebKit::NetworkStorageManager::closeHandle):
+        * NetworkProcess/storage/NetworkStorageManager.h:
+        * NetworkProcess/storage/NetworkStorageManager.messages.in:
+        * WebProcess/WebCoreSupport/WebFileSystemStorageConnection.cpp:
+        (WebKit::WebFileSystemStorageConnection::closeHandle):
+        * WebProcess/WebCoreSupport/WebFileSystemStorageConnection.h:
+
 2021-10-28  Alex Christensen  <achristen...@webkit.org>
 
         Disable NETSCAPE_PLUGIN_API at build time on macOS and Windows

Modified: trunk/Source/WebKit/NetworkProcess/storage/FileSystemStorageHandle.cpp (285006 => 285007)


--- trunk/Source/WebKit/NetworkProcess/storage/FileSystemStorageHandle.cpp	2021-10-28 23:36:36 UTC (rev 285006)
+++ trunk/Source/WebKit/NetworkProcess/storage/FileSystemStorageHandle.cpp	2021-10-28 23:46:21 UTC (rev 285007)
@@ -69,6 +69,14 @@
         FileSystem::closeFile(m_handle);
 }
 
+void FileSystemStorageHandle::close()
+{
+    if (!m_manager)
+        return;
+
+    m_manager->closeHandle(*this);
+}
+
 bool FileSystemStorageHandle::isSameEntry(WebCore::FileSystemHandleIdentifier identifier)
 {
     auto path = m_manager->getPath(identifier);

Modified: trunk/Source/WebKit/NetworkProcess/storage/FileSystemStorageHandle.h (285006 => 285007)


--- trunk/Source/WebKit/NetworkProcess/storage/FileSystemStorageHandle.h	2021-10-28 23:36:36 UTC (rev 285006)
+++ trunk/Source/WebKit/NetworkProcess/storage/FileSystemStorageHandle.h	2021-10-28 23:46:21 UTC (rev 285007)
@@ -50,6 +50,7 @@
     const String& path() const { return m_path; }
     Type type() const { return m_type; }
 
+    void close();
     bool isSameEntry(WebCore::FileSystemHandleIdentifier);
     std::optional<FileSystemStorageError> move(WebCore::FileSystemHandleIdentifier, const String& newName);
     Expected<WebCore::FileSystemHandleIdentifier, FileSystemStorageError> getFileHandle(IPC::Connection::UniqueID, String&& name, bool createIfNecessary);

Modified: trunk/Source/WebKit/NetworkProcess/storage/FileSystemStorageManager.cpp (285006 => 285007)


--- trunk/Source/WebKit/NetworkProcess/storage/FileSystemStorageManager.cpp	2021-10-28 23:36:36 UTC (rev 285006)
+++ trunk/Source/WebKit/NetworkProcess/storage/FileSystemStorageManager.cpp	2021-10-28 23:46:21 UTC (rev 285007)
@@ -94,6 +94,14 @@
     return handle == m_handles.end() ? FileSystemStorageHandle::Type::Any : handle->value->type();
 }
 
+void FileSystemStorageManager::closeHandle(FileSystemStorageHandle& handle)
+{
+    auto identifier = handle.identifier();
+    auto takenHandle = m_handles.take(identifier);
+    ASSERT(takenHandle.get() == &handle);
+    m_registry.unregisterHandle(identifier);
+}
+
 void FileSystemStorageManager::connectionClosed(IPC::Connection::UniqueID connection)
 {
     ASSERT(!RunLoop::isMain());
@@ -104,7 +112,7 @@
 
     auto identifiers = connectionHandles->value;
     for (auto identifier : identifiers) {
-        auto handle = m_handles.take(identifier);
+        m_handles.remove(identifier);
         m_registry.unregisterHandle(identifier);
     }
 

Modified: trunk/Source/WebKit/NetworkProcess/storage/FileSystemStorageManager.h (285006 => 285007)


--- trunk/Source/WebKit/NetworkProcess/storage/FileSystemStorageManager.h	2021-10-28 23:36:36 UTC (rev 285006)
+++ trunk/Source/WebKit/NetworkProcess/storage/FileSystemStorageManager.h	2021-10-28 23:46:21 UTC (rev 285007)
@@ -42,6 +42,7 @@
     Expected<WebCore::FileSystemHandleIdentifier, FileSystemStorageError> createHandle(IPC::Connection::UniqueID, FileSystemStorageHandle::Type, String&& path, String&& name, bool createIfNecessary);
     const String& getPath(WebCore::FileSystemHandleIdentifier);
     FileSystemStorageHandle::Type getType(WebCore::FileSystemHandleIdentifier);
+    void closeHandle(FileSystemStorageHandle&);
     void connectionClosed(IPC::Connection::UniqueID);
     Expected<WebCore::FileSystemHandleIdentifier, FileSystemStorageError> getDirectory(IPC::Connection::UniqueID);
     bool acquireLockForFile(const String& path, WebCore::FileSystemHandleIdentifier);

Modified: trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.cpp (285006 => 285007)


--- trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.cpp	2021-10-28 23:36:36 UTC (rev 285006)
+++ trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.cpp	2021-10-28 23:46:21 UTC (rev 285007)
@@ -171,6 +171,14 @@
     completionHandler(localOriginStorageManager(origin).fileSystemStorageManager(*m_fileSystemStorageHandleRegistry).getDirectory(connection.uniqueID()));
 }
 
+void NetworkStorageManager::closeHandle(WebCore::FileSystemHandleIdentifier identifier)
+{
+    ASSERT(!RunLoop::isMain());
+
+    if (auto handle = m_fileSystemStorageHandleRegistry->getHandle(identifier))
+        handle->close();
+}
+
 void NetworkStorageManager::isSameEntry(WebCore::FileSystemHandleIdentifier identifier, WebCore::FileSystemHandleIdentifier targetIdentifier, CompletionHandler<void(bool)>&& completionHandler)
 {
     ASSERT(!RunLoop::isMain());

Modified: trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.h (285006 => 285007)


--- trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.h	2021-10-28 23:36:36 UTC (rev 285006)
+++ trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.h	2021-10-28 23:46:21 UTC (rev 285007)
@@ -69,6 +69,7 @@
     void persisted(const WebCore::ClientOrigin&, CompletionHandler<void(bool)>&&);
     void persist(const WebCore::ClientOrigin&, CompletionHandler<void(bool)>&&);
     void fileSystemGetDirectory(IPC::Connection&, const WebCore::ClientOrigin&, CompletionHandler<void(Expected<WebCore::FileSystemHandleIdentifier, FileSystemStorageError>)>&&);
+    void closeHandle(WebCore::FileSystemHandleIdentifier);
     void isSameEntry(WebCore::FileSystemHandleIdentifier, WebCore::FileSystemHandleIdentifier, CompletionHandler<void(bool)>&&);
     void move(WebCore::FileSystemHandleIdentifier, WebCore::FileSystemHandleIdentifier, const String& newName, CompletionHandler<void(std::optional<FileSystemStorageError>)>&&);
     void getFileHandle(IPC::Connection&, WebCore::FileSystemHandleIdentifier, String&& name, bool createIfNecessary, CompletionHandler<void(Expected<WebCore::FileSystemHandleIdentifier, FileSystemStorageError>)>&&);

Modified: trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.messages.in (285006 => 285007)


--- trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.messages.in	2021-10-28 23:36:36 UTC (rev 285006)
+++ trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.messages.in	2021-10-28 23:46:21 UTC (rev 285007)
@@ -27,6 +27,7 @@
     Persisted(struct WebCore::ClientOrigin origin) -> (bool persisted) Async
     Persist(struct WebCore::ClientOrigin origin) -> (bool persisted) Async
     FileSystemGetDirectory(struct WebCore::ClientOrigin origin) -> (Expected<WebCore::FileSystemHandleIdentifier, WebKit::FileSystemStorageError> result) Async WantsConnection
+    CloseHandle(WebCore::FileSystemHandleIdentifier identifier)
     IsSameEntry(WebCore::FileSystemHandleIdentifier identifier, WebCore::FileSystemHandleIdentifier targetIdentifier) -> (bool result) Async
     GetFileHandle(WebCore::FileSystemHandleIdentifier identifier, String name, bool createIfNecessary) -> (Expected<WebCore::FileSystemHandleIdentifier, WebKit::FileSystemStorageError> result) Async WantsConnection
     GetDirectoryHandle(WebCore::FileSystemHandleIdentifier identifier, String name, bool createIfNecessary) -> (Expected<WebCore::FileSystemHandleIdentifier, WebKit::FileSystemStorageError> result) Async WantsConnection

Modified: trunk/Source/WebKit/WebProcess/WebCoreSupport/WebFileSystemStorageConnection.cpp (285006 => 285007)


--- trunk/Source/WebKit/WebProcess/WebCoreSupport/WebFileSystemStorageConnection.cpp	2021-10-28 23:36:36 UTC (rev 285006)
+++ trunk/Source/WebKit/WebProcess/WebCoreSupport/WebFileSystemStorageConnection.cpp	2021-10-28 23:46:21 UTC (rev 285007)
@@ -48,6 +48,14 @@
     m_connection = nullptr;
 }
 
+void WebFileSystemStorageConnection::closeHandle(WebCore::FileSystemHandleIdentifier identifier)
+{
+    if (!m_connection)
+        return;
+
+    m_connection->send(Messages::NetworkStorageManager::CloseHandle(identifier), 0);
+}
+
 void WebFileSystemStorageConnection::isSameEntry(WebCore::FileSystemHandleIdentifier identifier, WebCore::FileSystemHandleIdentifier otherIdentifier, WebCore::FileSystemStorageConnection::SameEntryCallback&& completionHandler)
 {
     if (!m_connection)

Modified: trunk/Source/WebKit/WebProcess/WebCoreSupport/WebFileSystemStorageConnection.h (285006 => 285007)


--- trunk/Source/WebKit/WebProcess/WebCoreSupport/WebFileSystemStorageConnection.h	2021-10-28 23:36:36 UTC (rev 285006)
+++ trunk/Source/WebKit/WebProcess/WebCoreSupport/WebFileSystemStorageConnection.h	2021-10-28 23:46:21 UTC (rev 285007)
@@ -72,6 +72,7 @@
     explicit WebFileSystemStorageConnection(IPC::Connection&);
 
     // FileSystemStorageConnection
+    void closeHandle(WebCore::FileSystemHandleIdentifier) final;
     void isSameEntry(WebCore::FileSystemHandleIdentifier, WebCore::FileSystemHandleIdentifier, WebCore::FileSystemStorageConnection::SameEntryCallback&&) final;
     void move(WebCore::FileSystemHandleIdentifier, WebCore::FileSystemHandleIdentifier, const String& newName, VoidCallback&&) final;
     void getFileHandle(WebCore::FileSystemHandleIdentifier, const String& name, bool createIfNecessary, WebCore::FileSystemStorageConnection::GetHandleCallback&&) final;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to