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;