#include "content/browser/renderer_host/clipboard_host_impl.h"
#include <memory>
#include <set>
#include <utility>
#include "base/files/file_path.h"
#include "base/functional/bind.h"
#include "base/location.h"
#include "base/memory/ptr_util.h"
#include "base/memory/raw_ptr_exclusion.h"
#include "base/notreached.h"
#include "base/pickle.h"
#include "base/ranges/algorithm.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "base/task/sequenced_task_runner.h"
#include "base/types/optional_util.h"
#include "build/build_config.h"
#include "content/browser/file_system/browser_file_system_helper.h"
#include "content/browser/file_system_access/file_system_access_manager_impl.h"
#include "content/browser/permissions/permission_controller_impl.h"
#include "content/browser/renderer_host/data_transfer_util.h"
#include "content/browser/renderer_host/render_frame_host_delegate.h"
#include "content/browser/storage_partition_impl.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/child_process_host.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/common/content_client.h"
#include "content/public/common/drop_data.h"
#include "ipc/ipc_message.h"
#include "mojo/public/cpp/bindings/self_owned_receiver.h"
#include "mojo/public/cpp/system/platform_handle.h"
#include "skia/ext/skia_utils_base.h"
#include "third_party/abseil-cpp/absl/types/variant.h"
#include "third_party/blink/public/mojom/clipboard/clipboard.mojom.h"
#include "third_party/blink/public/mojom/drag/drag.mojom-forward.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/base/clipboard/clipboard.h"
#include "ui/base/clipboard/clipboard_constants.h"
#include "ui/base/clipboard/clipboard_format_type.h"
#include "ui/base/clipboard/clipboard_monitor.h"
#include "ui/base/clipboard/clipboard_observer.h"
#include "ui/base/clipboard/custom_data_helper.h"
#include "ui/base/clipboard/file_info.h"
#include "ui/base/clipboard/scoped_clipboard_writer.h"
#include "ui/base/data_transfer_policy/data_transfer_endpoint.h"
#include "ui/base/data_transfer_policy/data_transfer_policy_controller.h"
#include "url/gurl.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "content/public/common/url_constants.h"
#endif
namespace content {
namespace {
struct LastClipboardWriterInfo { … };
LastClipboardWriterInfo& LastClipboardWriterInfoStorage() { … }
class CopyObserver : public ui::ClipboardObserver { … };
void ClearIfLastClipboardWriterIs(const RenderFrameHost& rfh) { … }
std::u16string ExtractText(ui::ClipboardBuffer clipboard_buffer,
std::unique_ptr<ui::DataTransferEndpoint> data_dst) { … }
}
bool IsLastClipboardWrite(const RenderFrameHost& rfh,
ui::ClipboardSequenceNumberToken seqno) { … }
void SetLastClipboardWrite(const RenderFrameHost& rfh,
ui::ClipboardSequenceNumberToken seqno) { … }
ClipboardEndpoint GetSourceClipboardEndpoint(
ui::ClipboardSequenceNumberToken seqno,
ui::ClipboardBuffer clipboard_buffer) { … }
ClipboardHostImpl::ClipboardHostImpl(
RenderFrameHost& render_frame_host,
mojo::PendingReceiver<blink::mojom::ClipboardHost> receiver)
: … { … }
void ClipboardHostImpl::Create(
RenderFrameHost* render_frame_host,
mojo::PendingReceiver<blink::mojom::ClipboardHost> receiver) { … }
ClipboardHostImpl::~ClipboardHostImpl() { … }
void ClipboardHostImpl::GetSequenceNumber(ui::ClipboardBuffer clipboard_buffer,
GetSequenceNumberCallback callback) { … }
void ClipboardHostImpl::ReadAvailableTypes(
ui::ClipboardBuffer clipboard_buffer,
ReadAvailableTypesCallback callback) { … }
void ClipboardHostImpl::IsFormatAvailable(blink::mojom::ClipboardFormat format,
ui::ClipboardBuffer clipboard_buffer,
IsFormatAvailableCallback callback) { … }
void ClipboardHostImpl::ReadText(ui::ClipboardBuffer clipboard_buffer,
ReadTextCallback callback) { … }
void ClipboardHostImpl::ReadHtml(ui::ClipboardBuffer clipboard_buffer,
ReadHtmlCallback callback) { … }
void ClipboardHostImpl::ReadSvg(ui::ClipboardBuffer clipboard_buffer,
ReadSvgCallback callback) { … }
void ClipboardHostImpl::ReadRtf(ui::ClipboardBuffer clipboard_buffer,
ReadRtfCallback callback) { … }
void ClipboardHostImpl::ReadPng(ui::ClipboardBuffer clipboard_buffer,
ReadPngCallback callback) { … }
void ClipboardHostImpl::OnReadPng(ui::ClipboardBuffer clipboard_buffer,
ReadPngCallback callback,
const std::vector<uint8_t>& data) { … }
void ClipboardHostImpl::ReadFiles(ui::ClipboardBuffer clipboard_buffer,
ReadFilesCallback callback) { … }
void ClipboardHostImpl::ReadDataTransferCustomData(
ui::ClipboardBuffer clipboard_buffer,
const std::u16string& type,
ReadDataTransferCustomDataCallback callback) { … }
void ClipboardHostImpl::WriteText(const std::u16string& text) { … }
void ClipboardHostImpl::WriteHtml(const std::u16string& markup,
const GURL& url) { … }
void ClipboardHostImpl::WriteSvg(const std::u16string& markup) { … }
void ClipboardHostImpl::WriteSmartPasteMarker() { … }
void ClipboardHostImpl::WriteDataTransferCustomData(
const base::flat_map<std::u16string, std::u16string>& data) { … }
void ClipboardHostImpl::WriteBookmark(const std::string& url,
const std::u16string& title) { … }
void ClipboardHostImpl::WriteImage(const SkBitmap& bitmap) { … }
void ClipboardHostImpl::CommitWrite() { … }
bool ClipboardHostImpl::IsRendererPasteAllowed(
ui::ClipboardBuffer clipboard_buffer,
RenderFrameHost& render_frame_host) { … }
void ClipboardHostImpl::ReadAvailableCustomAndStandardFormats(
ReadAvailableCustomAndStandardFormatsCallback callback) { … }
void ClipboardHostImpl::ReadUnsanitizedCustomFormat(
const std::u16string& format,
ReadUnsanitizedCustomFormatCallback callback) { … }
void ClipboardHostImpl::WriteUnsanitizedCustomFormat(
const std::u16string& format,
mojo_base::BigBuffer data) { … }
void ClipboardHostImpl::PasteIfPolicyAllowed(
ui::ClipboardBuffer clipboard_buffer,
const ui::ClipboardFormatType& data_type,
ClipboardPasteData clipboard_paste_data,
IsClipboardPasteAllowedCallback callback) { … }
void ClipboardHostImpl::OnCopyHtmlAllowedResult(
const GURL& source_url,
const ui::ClipboardFormatType& data_type,
const ClipboardPasteData& data,
std::optional<std::u16string> replacement_data) { … }
void ClipboardHostImpl::OnCopyAllowedResult(
const ui::ClipboardFormatType& data_type,
const ClipboardPasteData& data,
std::optional<std::u16string> replacement_data) { … }
std::unique_ptr<ui::DataTransferEndpoint>
ClipboardHostImpl::CreateDataEndpoint() { … }
ClipboardEndpoint ClipboardHostImpl::CreateClipboardEndpoint() { … }
}