Commit f895fe6d authored by David Black's avatar David Black Committed by Commit Bot

Rough in custom data support.

After this change, clipboard history will support custom data.
Follow up changes will make it look pretty.

Bug: 1104352
Change-Id: I018494a117f0d4d909500fd0be12e1ceb803ebb6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2315922
Commit-Queue: David Black <dmblack@google.com>
Reviewed-by: default avatarDarwin Huang <huangdarwin@chromium.org>
Reviewed-by: default avatarAlex Newcomer <newcomer@chromium.org>
Cr-Commit-Position: refs/heads/master@{#791560}
parent a0debfb3
......@@ -114,7 +114,6 @@ void ClipboardHistory::OnClipboardDataChanged() {
} else if (type == ui::ClipboardFormatType::GetBitmapType().GetName()) {
contains_bitmap = true;
}
// TODO(newcomer): Handle custom data, which could be files.
}
if (contains_bitmap) {
......@@ -125,6 +124,13 @@ void ClipboardHistory::OnClipboardDataChanged() {
std::move(new_data)));
return;
}
std::string custom_data;
const auto& custom_format = ui::ClipboardFormatType::GetWebCustomDataType();
clipboard->ReadData(custom_format, /* data_dst = */ nullptr, &custom_data);
if (!custom_data.empty())
new_data.SetCustomData(custom_format.GetName(), custom_data);
CommitData(GetActiveAccountId(), std::move(new_data));
}
......
......@@ -60,6 +60,11 @@ base::string16 GetLabelForClipboardData(const ui::ClipboardData& item) {
return ui::ResourceBundle::GetSharedInstance().GetLocalizedString(
IDS_CLIPBOARD_MENU_WEB_SMART_PASTE);
}
if (item.format() & static_cast<int>(ui::ClipboardInternalFormat::kCustom)) {
// TODO(crbug/1108901): Handle file manager case.
// TODO(crbug/1108902): Handle fallback case.
return base::UTF8ToUTF16("<CUSTOM DATA>");
}
return base::string16();
}
......@@ -80,7 +85,11 @@ ui::ImageModel GetImageModelForClipboardData(const ui::ClipboardData& item) {
return ui::ImageModel::FromVectorIcon(ash::kRtfIcon);
if (item.format() & static_cast<int>(ui::ClipboardInternalFormat::kText))
return ui::ImageModel::FromVectorIcon(ash::kTextIcon);
// TODO(newcomer): Handle custom data types, which could be files.
if (item.format() & static_cast<int>(ui::ClipboardInternalFormat::kCustom)) {
// TODO(crbug/1108901): Handle file manager case.
// TODO(crbug/1108902): Handle fallback case.
return ui::ImageModel();
}
return ui::ImageModel();
}
......@@ -99,7 +108,13 @@ void WriteClipboardDataToClipboard(const ui::ClipboardData& data) {
writer.WriteBookmark(base::UTF8ToUTF16(data.bookmark_title()),
data.bookmark_url());
}
// TODO(newcomer): Handle custom data types, which could be files.
if (data.format() & static_cast<int>(ui::ClipboardInternalFormat::kCustom)) {
const auto& custom_format = ui::ClipboardFormatType::GetWebCustomDataType();
DCHECK_EQ(data.custom_data_format(), custom_format.GetName());
writer.WritePickledData(base::Pickle(data.custom_data_data().c_str(),
data.custom_data_data().size()),
custom_format);
}
}
class ClipboardHistoryMenuDelegate : public ui::SimpleMenuModel::Delegate {
......
......@@ -4,6 +4,9 @@
#include "ash/clipboard/clipboard_history.h"
#include <unordered_map>
#include <vector>
#include "ash/clipboard/clipboard_history_controller.h"
#include "ash/shell.h"
#include "ash/test/ash_test_base.h"
......@@ -13,6 +16,7 @@
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/base/clipboard/clipboard_buffer.h"
#include "ui/base/clipboard/custom_data_helper.h"
#include "ui/base/clipboard/scoped_clipboard_writer.h"
namespace ash {
......@@ -74,6 +78,29 @@ class ClipboardHistoryTest : public AshTestBase {
}
}
void WriteAndEnsureCustomDataHistory(
const std::unordered_map<base::string16, base::string16>& input_data,
const std::unordered_map<base::string16, base::string16>& expected_data) {
base::Pickle input_data_pickle;
ui::WriteCustomDataToPickle(input_data, &input_data_pickle);
{
ui::ScopedClipboardWriter scw(ui::ClipboardBuffer::kCopyPaste);
scw.WritePickledData(input_data_pickle,
ui::ClipboardFormatType::GetWebCustomDataType());
}
const std::vector<ui::ClipboardData> datas = GetClipboardHistoryData();
EXPECT_EQ(1u, datas.size());
std::unordered_map<base::string16, base::string16> actual_data;
ui::ReadCustomDataIntoMap(datas.at(0).custom_data_data().c_str(),
datas.at(0).custom_data_data().size(),
&actual_data);
EXPECT_EQ(expected_data, actual_data);
}
ClipboardHistory* clipboard_history() { return clipboard_history_; }
private:
......@@ -207,4 +234,18 @@ TEST_F(ClipboardHistoryTest, DuplicateBitmap) {
WriteAndEnsureBitmapHistory(input_bitmaps, expected_bitmaps);
}
// Tests that custom data is recorded in clipboard history.
TEST_F(ClipboardHistoryTest, BasicCustomData) {
const std::unordered_map<base::string16, base::string16> input_data = {
{base::UTF8ToUTF16("custom-format-1"),
base::UTF8ToUTF16("custom-data-1")},
{base::UTF8ToUTF16("custom-format-2"),
base::UTF8ToUTF16("custom-data-2")}};
const std::unordered_map<base::string16, base::string16> expected_data =
input_data;
WriteAndEnsureCustomDataHistory(input_data, expected_data);
}
} // namespace ash
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment