blob: bbf707298bde32f492d0b2bc356792e3fdb39b61 [file] [log] [blame]
// Copyright 2018 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 "content/test/mock_clipboard_host.h"
#include <vector>
#include "base/containers/contains.h"
#include "base/notreached.h"
#include "base/strings/utf_string_conversions.h"
#include "mojo/public/cpp/base/big_buffer.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/base/clipboard/clipboard.h"
#include "ui/gfx/codec/png_codec.h"
namespace content {
MockClipboardHost::MockClipboardHost() = default;
MockClipboardHost::~MockClipboardHost() = default;
void MockClipboardHost::Bind(
mojo::PendingReceiver<blink::mojom::ClipboardHost> receiver) {
receivers_.Add(this, std::move(receiver));
}
void MockClipboardHost::Reset() {
plain_text_ = std::u16string();
html_text_ = std::u16string();
svg_text_ = std::u16string();
url_ = GURL();
png_.clear();
custom_data_.clear();
write_smart_paste_ = false;
needs_reset_ = false;
}
void MockClipboardHost::GetSequenceNumber(ui::ClipboardBuffer clipboard_buffer,
GetSequenceNumberCallback callback) {
std::move(callback).Run(sequence_number_);
}
void MockClipboardHost::ReadAvailableTypes(
ui::ClipboardBuffer clipboard_buffer,
ReadAvailableTypesCallback callback) {
std::vector<std::u16string> types;
if (!plain_text_.empty())
types.push_back(u"text/plain");
if (!html_text_.empty())
types.push_back(u"text/html");
if (!svg_text_.empty())
types.push_back(u"image/svg+xml");
if (!png_.empty())
types.push_back(u"image/png");
for (auto& it : custom_data_) {
CHECK(!base::Contains(types, it.first));
types.push_back(it.first);
}
std::move(callback).Run(types);
}
void MockClipboardHost::IsFormatAvailable(blink::mojom::ClipboardFormat format,
ui::ClipboardBuffer clipboard_buffer,
IsFormatAvailableCallback callback) {
bool result = false;
switch (format) {
case blink::mojom::ClipboardFormat::kPlaintext:
result = !plain_text_.empty();
break;
case blink::mojom::ClipboardFormat::kHtml:
result = !html_text_.empty();
break;
case blink::mojom::ClipboardFormat::kSmartPaste:
result = write_smart_paste_;
break;
case blink::mojom::ClipboardFormat::kBookmark:
result = false;
break;
}
std::move(callback).Run(result);
}
void MockClipboardHost::ReadText(ui::ClipboardBuffer clipboard_buffer,
ReadTextCallback callback) {
std::move(callback).Run(plain_text_);
}
void MockClipboardHost::ReadHtml(ui::ClipboardBuffer clipboard_buffer,
ReadHtmlCallback callback) {
std::move(callback).Run(html_text_, url_, 0, html_text_.length());
}
void MockClipboardHost::ReadSvg(ui::ClipboardBuffer clipboard_buffer,
ReadSvgCallback callback) {
std::move(callback).Run(svg_text_);
}
void MockClipboardHost::ReadRtf(ui::ClipboardBuffer clipboard_buffer,
ReadRtfCallback callback) {
std::move(callback).Run(std::string());
}
void MockClipboardHost::ReadPng(ui::ClipboardBuffer clipboard_buffer,
ReadPngCallback callback) {
std::move(callback).Run(mojo_base::BigBuffer(png_));
}
void MockClipboardHost::ReadFiles(ui::ClipboardBuffer clipboard_buffer,
ReadFilesCallback callback) {
std::move(callback).Run(blink::mojom::ClipboardFiles::New());
}
void MockClipboardHost::ReadCustomData(ui::ClipboardBuffer clipboard_buffer,
const std::u16string& type,
ReadCustomDataCallback callback) {
auto it = custom_data_.find(type);
std::move(callback).Run(it != custom_data_.end() ? it->second
: std::u16string());
}
void MockClipboardHost::WriteText(const std::u16string& text) {
if (needs_reset_)
Reset();
plain_text_ = text;
}
void MockClipboardHost::WriteHtml(const std::u16string& markup,
const GURL& url) {
if (needs_reset_)
Reset();
html_text_ = markup;
url_ = url;
}
void MockClipboardHost::WriteSvg(const std::u16string& markup) {
if (needs_reset_)
Reset();
svg_text_ = markup;
}
void MockClipboardHost::WriteSmartPasteMarker() {
if (needs_reset_)
Reset();
write_smart_paste_ = true;
}
void MockClipboardHost::WriteCustomData(
const base::flat_map<std::u16string, std::u16string>& data) {
if (needs_reset_)
Reset();
for (auto& it : data)
custom_data_[it.first] = it.second;
}
void MockClipboardHost::WriteBookmark(const std::string& url,
const std::u16string& title) {}
void MockClipboardHost::WriteImage(const SkBitmap& bitmap) {
if (needs_reset_)
Reset();
gfx::PNGCodec::EncodeBGRASkBitmap(bitmap, false, &png_);
}
void MockClipboardHost::CommitWrite() {
sequence_number_ = ui::ClipboardSequenceNumberToken();
needs_reset_ = true;
}
void MockClipboardHost::ReadAvailableCustomAndStandardFormats(
ReadAvailableCustomAndStandardFormatsCallback callback) {
std::vector<std::u16string> format_names;
for (const auto& item : unsanitized_custom_data_map_)
format_names.emplace_back(item.first);
std::move(callback).Run(format_names);
}
void MockClipboardHost::ReadUnsanitizedCustomFormat(
const std::u16string& format,
ReadUnsanitizedCustomFormatCallback callback) {
const auto it = unsanitized_custom_data_map_.find(format);
if (it == unsanitized_custom_data_map_.end())
return;
mojo_base::BigBuffer buffer = mojo_base::BigBuffer(
base::make_span(it->second.data(), it->second.size()));
std::move(callback).Run(std::move(buffer));
}
void MockClipboardHost::WriteUnsanitizedCustomFormat(
const std::u16string& format,
mojo_base::BigBuffer data) {
if (needs_reset_)
Reset();
// Simulate the underlying platform copying this data.
std::vector<uint8_t> data_copy(data.data(), data.data() + data.size());
unsanitized_custom_data_map_[format] = data_copy;
}
#if defined(OS_MAC)
void MockClipboardHost::WriteStringToFindPboard(const std::u16string& text) {}
#endif
} // namespace content