Title: [284900] trunk/Source/WebCore
Revision
284900
Author
[email protected]
Date
2021-10-26 14:42:08 -0700 (Tue, 26 Oct 2021)

Log Message

FileSystemHandle should be ContextDestructionObserver
https://bugs.webkit.org/show_bug.cgi?id=231250
<rdar://problem/84164797>

Reviewed by Youenn Fablet.

Make FileSystemHandle and FileSystemSyncAccessHandle ActiveDOMObject to close them when context stops.

* Modules/filesystemaccess/FileSystemDirectoryHandle.cpp:
(WebCore::FileSystemDirectoryHandle::create):
(WebCore::FileSystemDirectoryHandle::FileSystemDirectoryHandle):
(WebCore::FileSystemDirectoryHandle::getFileHandle):
(WebCore::FileSystemDirectoryHandle::getDirectoryHandle):
(WebCore::FileSystemDirectoryHandle::removeEntry):
(WebCore::FileSystemDirectoryHandle::resolve):
(WebCore::FileSystemDirectoryHandle::getHandleNames):
(WebCore::FileSystemDirectoryHandle::getHandle):
* Modules/filesystemaccess/FileSystemDirectoryHandle.h:
* Modules/filesystemaccess/FileSystemFileHandle.cpp:
(WebCore::FileSystemFileHandle::create):
(WebCore::FileSystemFileHandle::FileSystemFileHandle):
(WebCore::FileSystemFileHandle::createSyncAccessHandle):
(WebCore::FileSystemFileHandle::getSize):
(WebCore::FileSystemFileHandle::truncate):
(WebCore::FileSystemFileHandle::flush):
(WebCore::FileSystemFileHandle::close):
* Modules/filesystemaccess/FileSystemFileHandle.h:
* Modules/filesystemaccess/FileSystemHandle.cpp:
(WebCore::FileSystemHandle::FileSystemHandle):
(WebCore::FileSystemHandle::isSameEntry const):
(WebCore::FileSystemHandle::move):
(WebCore::FileSystemHandle::activeDOMObjectName const):
(WebCore::FileSystemHandle::stop):
* Modules/filesystemaccess/FileSystemHandle.h:
(WebCore::FileSystemHandle::isClosed const):
* Modules/filesystemaccess/FileSystemHandle.idl:
* Modules/filesystemaccess/FileSystemSyncAccessHandle.cpp:
(WebCore::FileSystemSyncAccessHandle::create):
(WebCore::FileSystemSyncAccessHandle::FileSystemSyncAccessHandle):
(WebCore::FileSystemSyncAccessHandle::~FileSystemSyncAccessHandle):
(WebCore::FileSystemSyncAccessHandle::isClosingOrClosed const):
(WebCore::FileSystemSyncAccessHandle::close):
(WebCore::FileSystemSyncAccessHandle::closeInternal):
(WebCore::FileSystemSyncAccessHandle::didClose):
(WebCore::FileSystemSyncAccessHandle::activeDOMObjectName const):
(WebCore::FileSystemSyncAccessHandle::stop):
* Modules/filesystemaccess/FileSystemSyncAccessHandle.h:
* Modules/filesystemaccess/FileSystemSyncAccessHandle.idl:
* Modules/storage/StorageManager.cpp:
(WebCore::StorageManager::fileSystemAccessGetDirectory):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (284899 => 284900)


--- trunk/Source/WebCore/ChangeLog	2021-10-26 21:39:45 UTC (rev 284899)
+++ trunk/Source/WebCore/ChangeLog	2021-10-26 21:42:08 UTC (rev 284900)
@@ -1,3 +1,56 @@
+2021-10-26  Sihui Liu  <[email protected]>
+
+        FileSystemHandle should be ContextDestructionObserver
+        https://bugs.webkit.org/show_bug.cgi?id=231250
+        <rdar://problem/84164797>
+
+        Reviewed by Youenn Fablet.
+
+        Make FileSystemHandle and FileSystemSyncAccessHandle ActiveDOMObject to close them when context stops.
+
+        * Modules/filesystemaccess/FileSystemDirectoryHandle.cpp:
+        (WebCore::FileSystemDirectoryHandle::create):
+        (WebCore::FileSystemDirectoryHandle::FileSystemDirectoryHandle):
+        (WebCore::FileSystemDirectoryHandle::getFileHandle):
+        (WebCore::FileSystemDirectoryHandle::getDirectoryHandle):
+        (WebCore::FileSystemDirectoryHandle::removeEntry):
+        (WebCore::FileSystemDirectoryHandle::resolve):
+        (WebCore::FileSystemDirectoryHandle::getHandleNames):
+        (WebCore::FileSystemDirectoryHandle::getHandle):
+        * Modules/filesystemaccess/FileSystemDirectoryHandle.h:
+        * Modules/filesystemaccess/FileSystemFileHandle.cpp:
+        (WebCore::FileSystemFileHandle::create):
+        (WebCore::FileSystemFileHandle::FileSystemFileHandle):
+        (WebCore::FileSystemFileHandle::createSyncAccessHandle):
+        (WebCore::FileSystemFileHandle::getSize):
+        (WebCore::FileSystemFileHandle::truncate):
+        (WebCore::FileSystemFileHandle::flush):
+        (WebCore::FileSystemFileHandle::close):
+        * Modules/filesystemaccess/FileSystemFileHandle.h:
+        * Modules/filesystemaccess/FileSystemHandle.cpp:
+        (WebCore::FileSystemHandle::FileSystemHandle):
+        (WebCore::FileSystemHandle::isSameEntry const):
+        (WebCore::FileSystemHandle::move):
+        (WebCore::FileSystemHandle::activeDOMObjectName const):
+        (WebCore::FileSystemHandle::stop):
+        * Modules/filesystemaccess/FileSystemHandle.h:
+        (WebCore::FileSystemHandle::isClosed const):
+        * Modules/filesystemaccess/FileSystemHandle.idl:
+        * Modules/filesystemaccess/FileSystemSyncAccessHandle.cpp:
+        (WebCore::FileSystemSyncAccessHandle::create):
+        (WebCore::FileSystemSyncAccessHandle::FileSystemSyncAccessHandle):
+        (WebCore::FileSystemSyncAccessHandle::~FileSystemSyncAccessHandle):
+        (WebCore::FileSystemSyncAccessHandle::isClosingOrClosed const):
+        (WebCore::FileSystemSyncAccessHandle::close):
+        (WebCore::FileSystemSyncAccessHandle::closeInternal):
+        (WebCore::FileSystemSyncAccessHandle::didClose):
+        (WebCore::FileSystemSyncAccessHandle::activeDOMObjectName const):
+        (WebCore::FileSystemSyncAccessHandle::stop):
+        * Modules/filesystemaccess/FileSystemSyncAccessHandle.h:
+        * Modules/filesystemaccess/FileSystemSyncAccessHandle.idl:
+        * Modules/storage/StorageManager.cpp:
+        (WebCore::StorageManager::fileSystemAccessGetDirectory):
+
 2021-10-26  Chris Dumez  <[email protected]>
 
         error event should be fired at <style> element when @import rule fails parsing due to MIME type

Modified: trunk/Source/WebCore/Modules/filesystemaccess/FileSystemDirectoryHandle.cpp (284899 => 284900)


--- trunk/Source/WebCore/Modules/filesystemaccess/FileSystemDirectoryHandle.cpp	2021-10-26 21:39:45 UTC (rev 284899)
+++ trunk/Source/WebCore/Modules/filesystemaccess/FileSystemDirectoryHandle.cpp	2021-10-26 21:42:08 UTC (rev 284900)
@@ -36,40 +36,51 @@
 
 WTF_MAKE_ISO_ALLOCATED_IMPL(FileSystemDirectoryHandle);
 
-Ref<FileSystemDirectoryHandle> FileSystemDirectoryHandle::create(String&& name, FileSystemHandleIdentifier identifier, Ref<FileSystemStorageConnection>&& connection)
+Ref<FileSystemDirectoryHandle> FileSystemDirectoryHandle::create(ScriptExecutionContext* context, String&& name, FileSystemHandleIdentifier identifier, Ref<FileSystemStorageConnection>&& connection)
 {
-    return adoptRef(*new FileSystemDirectoryHandle(WTFMove(name), identifier, WTFMove(connection)));
+    return adoptRef(*new FileSystemDirectoryHandle(context, WTFMove(name), identifier, WTFMove(connection)));
 }
 
-FileSystemDirectoryHandle::FileSystemDirectoryHandle(String&& name, FileSystemHandleIdentifier identifier, Ref<FileSystemStorageConnection>&& connection)
-    : FileSystemHandle(FileSystemHandle::Kind::Directory, WTFMove(name), identifier, WTFMove(connection))
+FileSystemDirectoryHandle::FileSystemDirectoryHandle(ScriptExecutionContext* context, String&& name, FileSystemHandleIdentifier identifier, Ref<FileSystemStorageConnection>&& connection)
+    : FileSystemHandle(context, FileSystemHandle::Kind::Directory, WTFMove(name), identifier, WTFMove(connection))
 {
 }
 
 void FileSystemDirectoryHandle::getFileHandle(const String& name, std::optional<FileSystemDirectoryHandle::GetFileOptions> options, DOMPromiseDeferred<IDLInterface<FileSystemFileHandle>>&& promise)
 {
+    if (isClosed())
+        return promise.reject(Exception { InvalidStateError, "Handle is closed"_s });
+
     bool createIfNecessary = options ? options->create : false;
-    connection().getFileHandle(identifier(), name, createIfNecessary, [connection = Ref { connection() }, name, promise = WTFMove(promise)](auto result) mutable {
+    connection().getFileHandle(identifier(), name, createIfNecessary, [weakThis = WeakPtr { *this }, connection = Ref { connection() }, name, promise = WTFMove(promise)](auto result) mutable {
         if (result.hasException())
             return promise.reject(result.releaseException());
 
-        promise.settle(FileSystemFileHandle::create(String { name }, result.returnValue(), WTFMove(connection)));
+        auto* context = weakThis ? weakThis->scriptExecutionContext() : nullptr;
+        promise.settle(FileSystemFileHandle::create(context, String { name }, result.returnValue(), WTFMove(connection)));
     });
 }
 
 void FileSystemDirectoryHandle::getDirectoryHandle(const String& name, std::optional<FileSystemDirectoryHandle::GetDirectoryOptions> options, DOMPromiseDeferred<IDLInterface<FileSystemDirectoryHandle>>&& promise)
 {
+    if (isClosed())
+        return promise.reject(Exception { InvalidStateError, "Handle is closed"_s });
+
     bool createIfNecessary = options ? options->create : false;
-    connection().getDirectoryHandle(identifier(), name, createIfNecessary, [connection = Ref { connection() }, name, promise = WTFMove(promise)](auto result) mutable {
+    connection().getDirectoryHandle(identifier(), name, createIfNecessary, [weakThis = WeakPtr { *this }, connection = Ref { connection() }, name, promise = WTFMove(promise)](auto result) mutable {
         if (result.hasException())
             return promise.reject(result.releaseException());
 
-        promise.settle(FileSystemDirectoryHandle::create(String { name }, result.returnValue(), WTFMove(connection)));
+        auto* context = weakThis ? weakThis->scriptExecutionContext() : nullptr;
+        promise.settle(FileSystemDirectoryHandle::create(context, String { name }, result.returnValue(), WTFMove(connection)));
     });
 }
 
 void FileSystemDirectoryHandle::removeEntry(const String& name, std::optional<FileSystemDirectoryHandle::RemoveOptions> options, DOMPromiseDeferred<void>&& promise)
 {
+    if (isClosed())
+        return promise.reject(Exception { InvalidStateError, "Handle is closed"_s });
+
     bool deleteRecursively = options ? options->recursive : false;
     connection().removeEntry(identifier(), name, deleteRecursively, [promise = WTFMove(promise)](auto result) mutable {
         promise.settle(WTFMove(result));
@@ -78,6 +89,9 @@
 
 void FileSystemDirectoryHandle::resolve(const FileSystemHandle& handle, DOMPromiseDeferred<IDLSequence<IDLUSVString>>&& promise)
 {
+    if (isClosed())
+        return promise.reject(Exception { InvalidStateError, "Handle is closed"_s });
+
     connection().resolve(identifier(), handle.identifier(), [promise = WTFMove(promise)](auto result) mutable {
         if (result.hasException())
             return promise.reject(result.releaseException());
@@ -88,22 +102,29 @@
 
 void FileSystemDirectoryHandle::getHandleNames(CompletionHandler<void(ExceptionOr<Vector<String>>&&)>&& completionHandler)
 {
+    if (isClosed())
+        return completionHandler(Exception { InvalidStateError, "Handle is closed"_s });
+
     connection().getHandleNames(identifier(), WTFMove(completionHandler));
 }
 
 void FileSystemDirectoryHandle::getHandle(const String& name, CompletionHandler<void(ExceptionOr<Ref<FileSystemHandle>>&&)>&& completionHandler)
 {
-    connection().getHandle(identifier(), name, [name, connection = Ref { connection() }, completionHandler = WTFMove(completionHandler)](auto result) mutable {
+    if (isClosed())
+        return completionHandler(Exception { InvalidStateError, "Handle is closed"_s });
+
+    connection().getHandle(identifier(), name, [weakThis = WeakPtr { *this }, name, connection = Ref { connection() }, completionHandler = WTFMove(completionHandler)](auto result) mutable {
         if (result.hasException())
             return completionHandler(result.releaseException());
 
         auto [identifier, isDirectory] = result.releaseReturnValue();
+        auto* context = weakThis ? weakThis->scriptExecutionContext() : nullptr;
         if (isDirectory) {
-            Ref<FileSystemHandle> handle = FileSystemDirectoryHandle::create(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(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 (284899 => 284900)


--- trunk/Source/WebCore/Modules/filesystemaccess/FileSystemDirectoryHandle.h	2021-10-26 21:39:45 UTC (rev 284899)
+++ trunk/Source/WebCore/Modules/filesystemaccess/FileSystemDirectoryHandle.h	2021-10-26 21:42:08 UTC (rev 284900)
@@ -47,7 +47,7 @@
         bool recursive { false };
     };
 
-    WEBCORE_EXPORT static Ref<FileSystemDirectoryHandle> create(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(String&&, FileSystemHandleIdentifier, Ref<FileSystemStorageConnection>&&);
+    FileSystemDirectoryHandle(ScriptExecutionContext*, String&&, FileSystemHandleIdentifier, Ref<FileSystemStorageConnection>&&);
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/Modules/filesystemaccess/FileSystemFileHandle.cpp (284899 => 284900)


--- trunk/Source/WebCore/Modules/filesystemaccess/FileSystemFileHandle.cpp	2021-10-26 21:39:45 UTC (rev 284899)
+++ trunk/Source/WebCore/Modules/filesystemaccess/FileSystemFileHandle.cpp	2021-10-26 21:42:08 UTC (rev 284900)
@@ -36,13 +36,13 @@
 
 WTF_MAKE_ISO_ALLOCATED_IMPL(FileSystemFileHandle);
 
-Ref<FileSystemFileHandle> FileSystemFileHandle::create(String&& name, FileSystemHandleIdentifier identifier, Ref<FileSystemStorageConnection>&& connection)
+Ref<FileSystemFileHandle> FileSystemFileHandle::create(ScriptExecutionContext* context, String&& name, FileSystemHandleIdentifier identifier, Ref<FileSystemStorageConnection>&& connection)
 {
-    return adoptRef(*new FileSystemFileHandle(WTFMove(name), identifier, WTFMove(connection)));
+    return adoptRef(*new FileSystemFileHandle(context, WTFMove(name), identifier, WTFMove(connection)));
 }
 
-FileSystemFileHandle::FileSystemFileHandle(String&& name, FileSystemHandleIdentifier identifier, Ref<FileSystemStorageConnection>&& connection)
-    : FileSystemHandle(FileSystemHandle::Kind::File, WTFMove(name), identifier, WTFMove(connection))
+FileSystemFileHandle::FileSystemFileHandle(ScriptExecutionContext* context, String&& name, FileSystemHandleIdentifier identifier, Ref<FileSystemStorageConnection>&& connection)
+    : FileSystemHandle(context, FileSystemHandle::Kind::File, WTFMove(name), identifier, WTFMove(connection))
 {
 }
 
@@ -53,6 +53,9 @@
 
 void FileSystemFileHandle::createSyncAccessHandle(DOMPromiseDeferred<IDLInterface<FileSystemSyncAccessHandle>>&& promise)
 {
+    if (isClosed())
+        return promise.reject(Exception { InvalidStateError, "Handle is closed" });
+
     connection().createSyncAccessHandle(identifier(), [protectedThis = Ref { *this }, promise = WTFMove(promise)](auto result) mutable {
         if (result.hasException())
             return promise.reject(result.releaseException());
@@ -61,27 +64,39 @@
         if (resultValue.second == FileSystem::invalidPlatformFileHandle)
             return promise.reject(Exception { UnknownError, "Invalid platform file handle"_s });
 
-        promise.settle(FileSystemSyncAccessHandle::create(protectedThis.get(), resultValue.first, resultValue.second));
+        promise.settle(FileSystemSyncAccessHandle::create(protectedThis->scriptExecutionContext(), protectedThis.get(), resultValue.first, resultValue.second));
     });
 }
 
 void FileSystemFileHandle::getSize(FileSystemSyncAccessHandleIdentifier accessHandleIdentifier, CompletionHandler<void(ExceptionOr<uint64_t>&&)>&& completionHandler)
 {
+    if (isClosed())
+        return completionHandler(Exception { InvalidStateError, "Handle is closed"_s });
+
     connection().getSize(identifier(), accessHandleIdentifier, WTFMove(completionHandler));
 }
 
 void FileSystemFileHandle::truncate(FileSystemSyncAccessHandleIdentifier accessHandleIdentifier, unsigned long long size, CompletionHandler<void(ExceptionOr<void>&&)>&& completionHandler)
 {
+    if (isClosed())
+        return completionHandler(Exception { InvalidStateError, "Handle is closed"_s });
+
     connection().truncate(identifier(), accessHandleIdentifier, size, WTFMove(completionHandler));
 }
 
 void FileSystemFileHandle::flush(FileSystemSyncAccessHandleIdentifier accessHandleIdentifier, CompletionHandler<void(ExceptionOr<void>&&)>&& completionHandler)
 {
+    if (isClosed())
+        return completionHandler(Exception { InvalidStateError, "Handle is closed"_s });
+
     connection().flush(identifier(), accessHandleIdentifier, WTFMove(completionHandler));
 }
 
 void FileSystemFileHandle::close(FileSystemSyncAccessHandleIdentifier accessHandleIdentifier, CompletionHandler<void(ExceptionOr<void>&&)>&& completionHandler)
 {
+    if (isClosed())
+        return completionHandler(Exception { InvalidStateError, "Handle is closed"_s });
+
     connection().close(identifier(), accessHandleIdentifier, WTFMove(completionHandler));
 }
 

Modified: trunk/Source/WebCore/Modules/filesystemaccess/FileSystemFileHandle.h (284899 => 284900)


--- trunk/Source/WebCore/Modules/filesystemaccess/FileSystemFileHandle.h	2021-10-26 21:39:45 UTC (rev 284899)
+++ trunk/Source/WebCore/Modules/filesystemaccess/FileSystemFileHandle.h	2021-10-26 21:42:08 UTC (rev 284900)
@@ -37,7 +37,7 @@
 class FileSystemFileHandle final : public FileSystemHandle {
     WTF_MAKE_ISO_ALLOCATED(FileSystemFileHandle);
 public:
-    WEBCORE_EXPORT static Ref<FileSystemFileHandle> create(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(String&&, FileSystemHandleIdentifier, Ref<FileSystemStorageConnection>&&);
+    FileSystemFileHandle(ScriptExecutionContext*, String&&, FileSystemHandleIdentifier, Ref<FileSystemStorageConnection>&&);
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/Modules/filesystemaccess/FileSystemHandle.cpp (284899 => 284900)


--- trunk/Source/WebCore/Modules/filesystemaccess/FileSystemHandle.cpp	2021-10-26 21:39:45 UTC (rev 284899)
+++ trunk/Source/WebCore/Modules/filesystemaccess/FileSystemHandle.cpp	2021-10-26 21:42:08 UTC (rev 284900)
@@ -34,12 +34,14 @@
 
 WTF_MAKE_ISO_ALLOCATED_IMPL(FileSystemHandle);
 
-FileSystemHandle::FileSystemHandle(FileSystemHandle::Kind kind, String&& name, FileSystemHandleIdentifier identifier, Ref<FileSystemStorageConnection>&& connection)
-    : m_kind(kind)
+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)
     , m_connection(WTFMove(connection))
 {
+    suspendIfNeeded();
 }
 
 FileSystemHandle::~FileSystemHandle() = default;
@@ -46,6 +48,9 @@
 
 void FileSystemHandle::isSameEntry(FileSystemHandle& handle, DOMPromiseDeferred<IDLBoolean>&& promise) const
 {
+    if (isClosed())
+        return promise.reject(Exception { InvalidStateError, "Handle is closed" });
+
     if (m_kind != handle.kind() || m_name != handle.name())
         return promise.resolve(false);
 
@@ -56,6 +61,9 @@
 
 void FileSystemHandle::move(FileSystemHandle& destinationHandle, const String& newName, DOMPromiseDeferred<void>&& promise)
 {
+    if (isClosed())
+        return promise.reject(Exception { InvalidStateError, "Handle is closed" });
+
     if (destinationHandle.kind() != Kind::Directory)
         return promise.reject(Exception { TypeMismatchError });
 
@@ -67,4 +75,14 @@
     });
 }
 
+const char* FileSystemHandle::activeDOMObjectName() const
+{
+    return "FileSystemHandle";
+}
+
+void FileSystemHandle::stop()
+{
+    m_isClosed = true;
+}
+
 } // namespace WebCore

Modified: trunk/Source/WebCore/Modules/filesystemaccess/FileSystemHandle.h (284899 => 284900)


--- trunk/Source/WebCore/Modules/filesystemaccess/FileSystemHandle.h	2021-10-26 21:39:45 UTC (rev 284899)
+++ trunk/Source/WebCore/Modules/filesystemaccess/FileSystemHandle.h	2021-10-26 21:42:08 UTC (rev 284900)
@@ -25,6 +25,7 @@
 
 #pragma once
 
+#include "ActiveDOMObject.h"
 #include "FileSystemHandleIdentifier.h"
 #include "IDLTypes.h"
 #include <wtf/IsoMalloc.h>
@@ -35,7 +36,7 @@
 
 class FileSystemStorageConnection;
 
-class FileSystemHandle : public RefCounted<FileSystemHandle> {
+class FileSystemHandle : public ActiveDOMObject, public CanMakeWeakPtr<FileSystemHandle>, public RefCounted<FileSystemHandle> {
     WTF_MAKE_ISO_ALLOCATED(FileSystemHandle);
 public:
     virtual ~FileSystemHandle();
@@ -47,19 +48,25 @@
     Kind kind() const { return m_kind; }
     const String& name() const { return m_name; }
     FileSystemHandleIdentifier identifier() const { return m_identifier; }
+    bool isClosed() const { return m_isClosed; }
 
     void isSameEntry(FileSystemHandle&, DOMPromiseDeferred<IDLBoolean>&&) const;
     void move(FileSystemHandle&, const String& newName, DOMPromiseDeferred<void>&&);
 
 protected:
-    FileSystemHandle(Kind, String&& name, FileSystemHandleIdentifier, Ref<FileSystemStorageConnection>&&);
+    FileSystemHandle(ScriptExecutionContext*, Kind, String&& name, FileSystemHandleIdentifier, Ref<FileSystemStorageConnection>&&);
     FileSystemStorageConnection& connection() { return m_connection.get(); }
 
 private:
+    // ActiveDOMObject
+    const char* activeDOMObjectName() const final;
+    void stop() final;
+
     Kind m_kind { Kind::File };
     String m_name;
     FileSystemHandleIdentifier m_identifier;
     Ref<FileSystemStorageConnection> m_connection;
+    bool m_isClosed { false };
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/Modules/filesystemaccess/FileSystemHandle.idl (284899 => 284900)


--- trunk/Source/WebCore/Modules/filesystemaccess/FileSystemHandle.idl	2021-10-26 21:39:45 UTC (rev 284899)
+++ trunk/Source/WebCore/Modules/filesystemaccess/FileSystemHandle.idl	2021-10-26 21:42:08 UTC (rev 284900)
@@ -29,6 +29,7 @@
 };
 
 [
+    ActiveDOMObject,
     CustomToJSObject,
     Exposed=(Window,Worker),
     EnabledBySetting=FileSystemAccessEnabled,

Modified: trunk/Source/WebCore/Modules/filesystemaccess/FileSystemSyncAccessHandle.cpp (284899 => 284900)


--- trunk/Source/WebCore/Modules/filesystemaccess/FileSystemSyncAccessHandle.cpp	2021-10-26 21:39:45 UTC (rev 284899)
+++ trunk/Source/WebCore/Modules/filesystemaccess/FileSystemSyncAccessHandle.cpp	2021-10-26 21:42:08 UTC (rev 284900)
@@ -33,39 +33,31 @@
 
 namespace WebCore {
 
-Ref<FileSystemSyncAccessHandle> FileSystemSyncAccessHandle::create(FileSystemFileHandle& source, FileSystemSyncAccessHandleIdentifier identifier, FileSystem::PlatformFileHandle file)
+Ref<FileSystemSyncAccessHandle> FileSystemSyncAccessHandle::create(ScriptExecutionContext* context, FileSystemFileHandle& source, FileSystemSyncAccessHandleIdentifier identifier, FileSystem::PlatformFileHandle file)
 {
-    return adoptRef(*new FileSystemSyncAccessHandle(source, identifier, file));
+    return adoptRef(*new FileSystemSyncAccessHandle(context, source, identifier, file));
 }
 
-FileSystemSyncAccessHandle::FileSystemSyncAccessHandle(FileSystemFileHandle& source, FileSystemSyncAccessHandleIdentifier identifier, FileSystem::PlatformFileHandle file)
-    : m_source(source)
+FileSystemSyncAccessHandle::FileSystemSyncAccessHandle(ScriptExecutionContext* context, FileSystemFileHandle& source, FileSystemSyncAccessHandleIdentifier identifier, FileSystem::PlatformFileHandle file)
+    : ActiveDOMObject(context)
+    , m_source(source)
     , m_identifier(identifier)
     , m_file(file)
 {
     ASSERT(m_file != FileSystem::invalidPlatformFileHandle);
+    suspendIfNeeded();
 }
 
 FileSystemSyncAccessHandle::~FileSystemSyncAccessHandle()
 {
-    if (m_closeResult)
-        return;
-
-    ASSERT(m_closePromises.isEmpty());
-    closeInternal([](auto) { });
+    ASSERT(m_closeResult);
 }
 
 bool FileSystemSyncAccessHandle::isClosingOrClosed() const
 {
-    return m_closeResult || !m_closePromises.isEmpty();
+    return m_closeResult || !m_closeCallbacks.isEmpty();
 }
 
-void FileSystemSyncAccessHandle::closeInternal(CompletionHandler<void(ExceptionOr<void>&&)>&& completionHandler)
-{
-    FileSystem::closeFile(m_file);
-    m_source->close(m_identifier, WTFMove(completionHandler));
-}
-
 void FileSystemSyncAccessHandle::truncate(unsigned long long size, DOMPromiseDeferred<void>&& promise)
 {
     if (isClosingOrClosed())
@@ -110,17 +102,25 @@
 
 void FileSystemSyncAccessHandle::close(DOMPromiseDeferred<void>&& promise)
 {
+    m_pendingOperationCount++;
+    closeInternal([weakThis = WeakPtr { *this }, promise = WTFMove(promise)](auto result) mutable {
+        weakThis->m_pendingOperationCount--;
+        promise.settle(WTFMove(result));
+    });
+}
+
+void FileSystemSyncAccessHandle::closeInternal(CloseCallback&& callback)
+{
     if (m_closeResult)
-        return promise.settle(ExceptionOr<void> { *m_closeResult });
-    
-    auto isClosing = !m_closePromises.isEmpty();
-    m_closePromises.append(WTFMove(promise));
+        return callback(ExceptionOr<void> { *m_closeResult });
+
+    auto isClosing = !m_closeCallbacks.isEmpty();
+    m_closeCallbacks.append(WTFMove(callback));
     if (isClosing)
         return;
 
-    m_pendingOperationCount++;
-    closeInternal([this, protectedThis = Ref { *this }](auto result) mutable {
-        m_pendingOperationCount--;
+    FileSystem::closeFile(m_file);
+    m_source->close(m_identifier, [this, protectedThis = Ref { *this }](auto result) {
         didClose(WTFMove(result));
     });
 }
@@ -127,11 +127,12 @@
 
 void FileSystemSyncAccessHandle::didClose(ExceptionOr<void>&& result)
 {
+    ASSERT(!m_closeResult);
+
     m_closeResult = WTFMove(result);
-
-    auto promises = std::exchange(m_closePromises, { });
-    for (auto promise : promises)
-        promise.settle(ExceptionOr<void> { *m_closeResult });
+    auto callbacks = std::exchange(m_closeCallbacks, { });
+    for (auto& callback : callbacks)
+        callback(ExceptionOr<void> { *m_closeResult });
 }
 
 ExceptionOr<unsigned long long> FileSystemSyncAccessHandle::read(BufferSource&& buffer, FileSystemSyncAccessHandle::FilesystemReadWriteOptions options)
@@ -176,4 +177,14 @@
     return result;
 }
 
+const char* FileSystemSyncAccessHandle::activeDOMObjectName() const
+{
+    return "FileSystemSyncAccessHandle";
+}
+
+void FileSystemSyncAccessHandle::stop()
+{
+    closeInternal([](auto) { });
+}
+
 } // namespace WebCore

Modified: trunk/Source/WebCore/Modules/filesystemaccess/FileSystemSyncAccessHandle.h (284899 => 284900)


--- trunk/Source/WebCore/Modules/filesystemaccess/FileSystemSyncAccessHandle.h	2021-10-26 21:39:45 UTC (rev 284899)
+++ trunk/Source/WebCore/Modules/filesystemaccess/FileSystemSyncAccessHandle.h	2021-10-26 21:42:08 UTC (rev 284900)
@@ -25,6 +25,7 @@
 
 #pragma once
 
+#include "ActiveDOMObject.h"
 #include "BufferSource.h"
 #include "ExceptionOr.h"
 #include "FileSystemSyncAccessHandleIdentifier.h"
@@ -37,13 +38,13 @@
 class FileSystemFileHandle;
 template<typename> class DOMPromiseDeferred;
 
-class FileSystemSyncAccessHandle : public RefCounted<FileSystemSyncAccessHandle>, public CanMakeWeakPtr<FileSystemSyncAccessHandle> {
+class FileSystemSyncAccessHandle : public ActiveDOMObject, public RefCounted<FileSystemSyncAccessHandle>, public CanMakeWeakPtr<FileSystemSyncAccessHandle> {
 public:
     struct FilesystemReadWriteOptions {
         unsigned long long at;
     };
 
-    static Ref<FileSystemSyncAccessHandle> create(FileSystemFileHandle&, FileSystemSyncAccessHandleIdentifier, FileSystem::PlatformFileHandle);
+    static Ref<FileSystemSyncAccessHandle> create(ScriptExecutionContext*, FileSystemFileHandle&, FileSystemSyncAccessHandleIdentifier, FileSystem::PlatformFileHandle);
     ~FileSystemSyncAccessHandle();
 
     void truncate(unsigned long long size, DOMPromiseDeferred<void>&&);
@@ -55,16 +56,21 @@
     ExceptionOr<unsigned long long> write(BufferSource&&, FilesystemReadWriteOptions);
 
 private:
-    FileSystemSyncAccessHandle(FileSystemFileHandle&, FileSystemSyncAccessHandleIdentifier, FileSystem::PlatformFileHandle);
+    FileSystemSyncAccessHandle(ScriptExecutionContext*, FileSystemFileHandle&, FileSystemSyncAccessHandleIdentifier, FileSystem::PlatformFileHandle);
     bool isClosingOrClosed() const;
-    void closeInternal(CompletionHandler<void(ExceptionOr<void>&&)>&&);
+    using CloseCallback = CompletionHandler<void(ExceptionOr<void>&&)>;
+    void closeInternal(CloseCallback&&);
 
+    // ActiveDOMObject
+    const char* activeDOMObjectName() const final;
+    void stop() final;
+
     Ref<FileSystemFileHandle> m_source;
     FileSystemSyncAccessHandleIdentifier m_identifier;
     uint64_t m_pendingOperationCount { 0 };
     FileSystem::PlatformFileHandle m_file;
     std::optional<ExceptionOr<void>> m_closeResult;
-    Vector<DOMPromiseDeferred<void>> m_closePromises;
+    Vector<CloseCallback> m_closeCallbacks;
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/Modules/filesystemaccess/FileSystemSyncAccessHandle.idl (284899 => 284900)


--- trunk/Source/WebCore/Modules/filesystemaccess/FileSystemSyncAccessHandle.idl	2021-10-26 21:39:45 UTC (rev 284899)
+++ trunk/Source/WebCore/Modules/filesystemaccess/FileSystemSyncAccessHandle.idl	2021-10-26 21:42:08 UTC (rev 284900)
@@ -24,8 +24,8 @@
  */
 
 [
+    ActiveDOMObject,
     EnabledBySetting=AccessHandleEnabled,
-    ImplementationLacksVTable,
     Exposed=DedicatedWorker,
     SecureContext
 ] interface FileSystemSyncAccessHandle {

Modified: trunk/Source/WebCore/Modules/storage/StorageManager.cpp (284899 => 284900)


--- trunk/Source/WebCore/Modules/storage/StorageManager.cpp	2021-10-26 21:39:45 UTC (rev 284899)
+++ trunk/Source/WebCore/Modules/storage/StorageManager.cpp	2021-10-26 21:42:08 UTC (rev 284900)
@@ -115,12 +115,13 @@
         return promise.reject(connectionInfoOrException.releaseException());
 
     auto connectionInfo = connectionInfoOrException.releaseReturnValue();
-    connectionInfo.connection.fileSystemGetDirectory(connectionInfo.origin, [promise = WTFMove(promise)](auto result) mutable {
+    connectionInfo.connection.fileSystemGetDirectory(connectionInfo.origin, [promise = WTFMove(promise), weakNavigator = m_navigator](auto result) mutable {
         if (result.hasException())
             return promise.reject(result.releaseException());
 
+        auto* context = weakNavigator ? weakNavigator->scriptExecutionContext() : nullptr;
         auto identifierConnectionPair = result.releaseReturnValue();
-        promise.resolve(FileSystemDirectoryHandle::create({ }, identifierConnectionPair.first, Ref { * identifierConnectionPair.second }));
+        promise.resolve(FileSystemDirectoryHandle::create(context, { }, identifierConnectionPair.first, Ref { * identifierConnectionPair.second }));
     });
 }
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to