| Index: third_party/WebKit/Source/modules/filesystem/LocalFileSystem.cpp
|
| diff --git a/third_party/WebKit/Source/modules/filesystem/LocalFileSystem.cpp b/third_party/WebKit/Source/modules/filesystem/LocalFileSystem.cpp
|
| index 094898ea4b7f41b93682400142578ba2540849c6..69865d341e7b36c69e1630ce6d5649046300991c 100644
|
| --- a/third_party/WebKit/Source/modules/filesystem/LocalFileSystem.cpp
|
| +++ b/third_party/WebKit/Source/modules/filesystem/LocalFileSystem.cpp
|
| @@ -36,13 +36,15 @@
|
| #include "core/dom/TaskRunnerHelper.h"
|
| #include "core/fileapi/FileError.h"
|
| #include "core/frame/LocalFrame.h"
|
| +#include "core/workers/WorkerClients.h"
|
| #include "core/workers/WorkerGlobalScope.h"
|
| #include "modules/filesystem/FileSystemClient.h"
|
| #include "platform/AsyncFileSystemCallbacks.h"
|
| #include "platform/ContentSettingCallbacks.h"
|
| +#include "platform/Supplementable.h"
|
| +#include "platform/heap/Handle.h"
|
| #include "public/platform/Platform.h"
|
| #include "public/platform/WebFileSystem.h"
|
| -#include "wtf/Functional.h"
|
| #include <memory>
|
|
|
| namespace blink {
|
| @@ -59,9 +61,10 @@ void reportFailure(std::unique_ptr<AsyncFileSystemCallbacks> callbacks,
|
| class CallbackWrapper final
|
| : public GarbageCollectedFinalized<CallbackWrapper> {
|
| public:
|
| - CallbackWrapper(std::unique_ptr<AsyncFileSystemCallbacks> c)
|
| + explicit CallbackWrapper(std::unique_ptr<AsyncFileSystemCallbacks> c)
|
| : m_callbacks(std::move(c)) {}
|
| - virtual ~CallbackWrapper() {}
|
| + ~CallbackWrapper() {}
|
| +
|
| std::unique_ptr<AsyncFileSystemCallbacks> release() {
|
| return std::move(m_callbacks);
|
| }
|
| @@ -72,37 +75,59 @@ class CallbackWrapper final
|
| std::unique_ptr<AsyncFileSystemCallbacks> m_callbacks;
|
| };
|
|
|
| -LocalFileSystem::~LocalFileSystem() {}
|
| +template <typename T>
|
| +class LocalFileSystemImpl final
|
| + : public GarbageCollectedFinalized<LocalFileSystemImpl<T>>,
|
| + public LocalFileSystem,
|
| + public Supplement<T> {
|
| + WTF_MAKE_NONCOPYABLE(LocalFileSystemImpl);
|
| + USING_GARBAGE_COLLECTED_MIXIN(LocalFileSystemImpl);
|
|
|
| -void LocalFileSystem::resolveURL(
|
| - ExecutionContext* context,
|
| - const KURL& fileSystemURL,
|
| - std::unique_ptr<AsyncFileSystemCallbacks> callbacks) {
|
| - CallbackWrapper* wrapper = new CallbackWrapper(std::move(callbacks));
|
| - requestFileSystemAccessInternal(
|
| - context,
|
| - WTF::bind(&LocalFileSystem::resolveURLInternal,
|
| - wrapCrossThreadPersistent(this), wrapPersistent(context),
|
| - fileSystemURL, wrapPersistent(wrapper)),
|
| - WTF::bind(&LocalFileSystem::fileSystemNotAllowedInternal,
|
| - wrapCrossThreadPersistent(this), wrapPersistent(context),
|
| - wrapPersistent(wrapper)));
|
| -}
|
| + public:
|
| + LocalFileSystemImpl(T& supplementable,
|
| + std::unique_ptr<FileSystemClient> client)
|
| + : LocalFileSystem(std::move(client)), Supplement<T>(supplementable) {}
|
| + ~LocalFileSystemImpl() = default;
|
| +
|
| + void resolveURL(
|
| + ExecutionContext* context,
|
| + const KURL& fileSystemURL,
|
| + std::unique_ptr<AsyncFileSystemCallbacks> callbacks) override {
|
| + CallbackWrapper* wrapper = new CallbackWrapper(std::move(callbacks));
|
| + requestFileSystemAccessInternal(
|
| + context,
|
| + WTF::bind(&LocalFileSystemImpl::resolveURLInternal,
|
| + wrapCrossThreadPersistent(this), wrapPersistent(context),
|
| + fileSystemURL, wrapPersistent(wrapper)),
|
| + WTF::bind(&LocalFileSystemImpl::fileSystemNotAllowedInternal,
|
| + wrapCrossThreadPersistent(this), wrapPersistent(context),
|
| + wrapPersistent(wrapper)));
|
| + }
|
|
|
| -void LocalFileSystem::requestFileSystem(
|
| - ExecutionContext* context,
|
| - FileSystemType type,
|
| - long long size,
|
| - std::unique_ptr<AsyncFileSystemCallbacks> callbacks) {
|
| - CallbackWrapper* wrapper = new CallbackWrapper(std::move(callbacks));
|
| - requestFileSystemAccessInternal(
|
| - context,
|
| - WTF::bind(&LocalFileSystem::fileSystemAllowedInternal,
|
| - wrapCrossThreadPersistent(this), wrapPersistent(context), type,
|
| - wrapPersistent(wrapper)),
|
| - WTF::bind(&LocalFileSystem::fileSystemNotAllowedInternal,
|
| - wrapCrossThreadPersistent(this), wrapPersistent(context),
|
| - wrapPersistent(wrapper)));
|
| + void requestFileSystem(
|
| + ExecutionContext* context,
|
| + FileSystemType type,
|
| + long long size,
|
| + std::unique_ptr<AsyncFileSystemCallbacks> callbacks) override {
|
| + CallbackWrapper* wrapper = new CallbackWrapper(std::move(callbacks));
|
| + requestFileSystemAccessInternal(
|
| + context,
|
| + WTF::bind(&LocalFileSystemImpl::fileSystemAllowedInternal,
|
| + wrapCrossThreadPersistent(this), wrapPersistent(context),
|
| + type, wrapPersistent(wrapper)),
|
| + WTF::bind(&LocalFileSystemImpl::fileSystemNotAllowedInternal,
|
| + wrapCrossThreadPersistent(this), wrapPersistent(context),
|
| + wrapPersistent(wrapper)));
|
| + }
|
| +};
|
| +
|
| +LocalFileSystem::LocalFileSystem(std::unique_ptr<FileSystemClient> client)
|
| + : m_client(std::move(client)) {}
|
| +
|
| +LocalFileSystem::~LocalFileSystem() {}
|
| +
|
| +const char* LocalFileSystem::supplementName() {
|
| + return "LocalFileSystem";
|
| }
|
|
|
| WebFileSystem* LocalFileSystem::getFileSystem() const {
|
| @@ -176,35 +201,18 @@ void LocalFileSystem::resolveURLInternal(ExecutionContext* context,
|
| fileSystem->resolveURL(fileSystemURL, callbacks->release());
|
| }
|
|
|
| -LocalFileSystem::LocalFileSystem(LocalFrame& frame,
|
| - std::unique_ptr<FileSystemClient> client)
|
| - : Supplement<LocalFrame>(frame), m_client(std::move(client)) {}
|
| -
|
| -LocalFileSystem::LocalFileSystem(WorkerClients& workerClients,
|
| - std::unique_ptr<FileSystemClient> client)
|
| - : Supplement<WorkerClients>(workerClients), m_client(std::move(client)) {}
|
| -
|
| -DEFINE_TRACE(LocalFileSystem) {
|
| - Supplement<LocalFrame>::trace(visitor);
|
| - Supplement<WorkerClients>::trace(visitor);
|
| -}
|
| -
|
| -const char* LocalFileSystem::supplementName() {
|
| - return "LocalFileSystem";
|
| -}
|
| -
|
| LocalFileSystem* LocalFileSystem::from(ExecutionContext& context) {
|
| if (context.isDocument()) {
|
| - LocalFileSystem* fileSystem =
|
| - static_cast<LocalFileSystem*>(Supplement<LocalFrame>::from(
|
| - toDocument(context).frame(), supplementName()));
|
| + auto fileSystem = static_cast<LocalFileSystemImpl<LocalFrame>*>(
|
| + Supplement<LocalFrame>::from(toDocument(context).frame(),
|
| + supplementName()));
|
| DCHECK(fileSystem);
|
| return fileSystem;
|
| }
|
|
|
| WorkerClients* clients = toWorkerGlobalScope(context).clients();
|
| ASSERT(clients);
|
| - LocalFileSystem* fileSystem = static_cast<LocalFileSystem*>(
|
| + auto fileSystem = static_cast<LocalFileSystemImpl<WorkerClients>*>(
|
| Supplement<WorkerClients>::from(clients, supplementName()));
|
| DCHECK(fileSystem);
|
| return fileSystem;
|
| @@ -212,15 +220,16 @@ LocalFileSystem* LocalFileSystem::from(ExecutionContext& context) {
|
|
|
| void provideLocalFileSystemTo(LocalFrame& frame,
|
| std::unique_ptr<FileSystemClient> client) {
|
| - frame.provideSupplement(LocalFileSystem::supplementName(),
|
| - new LocalFileSystem(frame, std::move(client)));
|
| + Supplement<LocalFrame>::provideTo(
|
| + frame, LocalFileSystem::supplementName(),
|
| + new LocalFileSystemImpl<LocalFrame>(frame, std::move(client)));
|
| }
|
|
|
| -void provideLocalFileSystemToWorker(WorkerClients* workerClients,
|
| +void provideLocalFileSystemToWorker(WorkerClients* clients,
|
| std::unique_ptr<FileSystemClient> client) {
|
| Supplement<WorkerClients>::provideTo(
|
| - *workerClients, LocalFileSystem::supplementName(),
|
| - new LocalFileSystem(*workerClients, std::move(client)));
|
| + *clients, LocalFileSystem::supplementName(),
|
| + new LocalFileSystemImpl<WorkerClients>(*clients, std::move(client)));
|
| }
|
|
|
| } // namespace blink
|
|
|