blob: 48b630de971219c22b83e4a65d1401730f4bdfb4 [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/modules/file_system_access/data_transfer_item_file_system_access.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "third_party/blink/public/common/browser_interface_broker_proxy.h"
#include "third_party/blink/public/mojom/file_system_access/file_system_access_data_transfer_token.mojom-blink.h"
#include "third_party/blink/public/mojom/file_system_access/file_system_access_directory_handle.mojom-blink.h"
#include "third_party/blink/public/mojom/file_system_access/file_system_access_error.mojom-blink.h"
#include "third_party/blink/public/mojom/file_system_access/file_system_access_file_handle.mojom-blink.h"
#include "third_party/blink/public/mojom/file_system_access/file_system_access_manager.mojom-blink.h"
#include "third_party/blink/public/mojom/file_system_access/file_system_access_transfer_token.mojom-blink.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
#include "third_party/blink/renderer/core/clipboard/data_object_item.h"
#include "third_party/blink/renderer/core/clipboard/data_transfer.h"
#include "third_party/blink/renderer/core/clipboard/data_transfer_item.h"
#include "third_party/blink/renderer/core/execution_context/execution_context.h"
#include "third_party/blink/renderer/modules/file_system_access/file_system_access_error.h"
#include "third_party/blink/renderer/modules/file_system_access/file_system_directory_handle.h"
#include "third_party/blink/renderer/modules/file_system_access/file_system_file_handle.h"
#include "third_party/blink/renderer/platform/bindings/script_state.h"
#include "third_party/blink/renderer/platform/heap/heap.h"
#include "third_party/blink/renderer/platform/wtf/functional.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
namespace blink {
// static
ScriptPromise DataTransferItemFileSystemAccess::getAsFileSystemHandle(
ScriptState* script_state,
DataTransferItem& data_transfer_item) {
if (!data_transfer_item.GetDataTransfer()->CanReadData()) {
return ScriptPromise::CastUndefined(script_state);
}
// If the DataObjectItem doesn't have an associated FileSystemAccessEntry,
// return nullptr.
if (!data_transfer_item.GetDataObjectItem()->HasFileSystemAccessEntry()) {
return ScriptPromise::CastUndefined(script_state);
}
mojo::Remote<mojom::blink::FileSystemAccessManager> nfs_manager;
ExecutionContext* execution_context = ExecutionContext::From(script_state);
execution_context->GetBrowserInterfaceBroker().GetInterface(
nfs_manager.BindNewPipeAndPassReceiver());
const DataObjectItem& data_object_item =
*data_transfer_item.GetDataObjectItem();
// Since tokens are move-only, we need to create a clone in order
// to preserve the state of `data_object_item` for future calls.
mojo::PendingRemote<mojom::blink::FileSystemAccessDataTransferToken>
token_remote = data_object_item.CloneFileSystemAccessEntryToken();
auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
ScriptPromise result = resolver->Promise();
// We need to move `nfs_manager` into GetEntryFromDataTransferToken in order
// to keep it in scope long enough for the callback to be executed. To do this
// we extract `raw_nfs_manager` from `nfs_manager` and move `nfs_manager` into
// the GetEntryFromDataTransferToken callback.
auto* raw_nfs_manager = nfs_manager.get();
raw_nfs_manager->GetEntryFromDataTransferToken(
std::move(token_remote),
WTF::Bind(
[](mojo::Remote<mojom::blink::FileSystemAccessManager>,
ScriptPromiseResolver* resolver,
mojom::blink::FileSystemAccessEntryPtr entry) {
ScriptState* script_state = resolver->GetScriptState();
if (!script_state)
return;
resolver->Resolve(FileSystemHandle::CreateFromMojoEntry(
std::move(entry), ExecutionContext::From(script_state)));
},
std::move(nfs_manager), WrapPersistent(resolver)));
return result;
}
} // namespace blink