Commit 9fd61633 authored by Alex Newcomer's avatar Alex Newcomer Committed by Chromium LUCI CQ

[multipaste]One CH entry for files app

Files app copies raw images onto the clipboard by:
1. In JS, save files app metadata.
2. Later, on the chrome side, add raw image data by:
  - Reading step 1's data from Clipboard.
  - Add raw image data.
  - Write to clipboard a second time.

In a way, files app uses the clipboard as a temp variable.

This results in two entries to ClipboardHistory.
Delete the old one, then allow the second Write to create
a new entry in history.

Bug: 1150155
Change-Id: I90649d9b56ebfc538ab962e4c769a869b9d5d082
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2630405Reviewed-by: default avatarXiyuan Xia <xiyuan@chromium.org>
Commit-Queue: Alex Newcomer <newcomer@chromium.org>
Cr-Commit-Position: refs/heads/master@{#844272}
parent 9f03826b
......@@ -373,6 +373,17 @@ bool ClipboardHistoryControllerImpl::DeleteClipboardItemById(
return false;
}
bool ClipboardHistoryControllerImpl::DeleteClipboardItemByClipboardData(
ui::ClipboardData* data) {
for (const auto& item : history()->GetItems()) {
if (item.data() == *data) {
DeleteClipboardHistoryItem(item);
return true;
}
}
return false;
}
void ClipboardHistoryControllerImpl::OnClipboardHistoryItemAdded(
const ClipboardHistoryItem& item,
bool is_duplicate) {
......
......@@ -95,6 +95,7 @@ class ASH_EXPORT ClipboardHistoryControllerImpl
std::vector<std::string> GetHistoryItemIds() const override;
bool PasteClipboardItemById(const std::string& item_id) override;
bool DeleteClipboardItemById(const std::string& item_id) override;
bool DeleteClipboardItemByClipboardData(ui::ClipboardData* data) override;
// ClipboardHistory::Observer:
void OnClipboardHistoryItemAdded(const ClipboardHistoryItem& item,
......
......@@ -21,6 +21,10 @@ namespace gfx {
class Rect;
} // namespace gfx
namespace ui {
class ClipboardData;
} // namespace ui
namespace ash {
class ScopedClipboardHistoryPause;
......@@ -96,6 +100,9 @@ class ASH_PUBLIC_EXPORT ClipboardHistoryController {
// Deletes the clipboard item specified by the item id.
virtual bool DeleteClipboardItemById(const std::string& item_id) = 0;
// Deletes the clipboard item that matches `data`.
virtual bool DeleteClipboardItemByClipboardData(ui::ClipboardData* data) = 0;
protected:
ClipboardHistoryController();
virtual ~ClipboardHistoryController();
......
......@@ -7,6 +7,7 @@
#include <stdint.h>
#include <memory>
#include "ash/public/cpp/clipboard_history_controller.h"
#include "base/base64.h"
#include "base/callback.h"
#include "base/files/file_util.h"
......@@ -91,6 +92,12 @@ void CopyImageToClipboard(bool maintain_clipboard,
std::make_unique<ui::ClipboardData>(
*ui::ClipboardNonBacked::GetForCurrentThread()->GetClipboardData(
nullptr));
// Before modifying the clipboard, remove the old entry in ClipboardHistory.
// CopyAndMaintainClipboard will write to the clipboard a second time,
// creating a new entry in clipboard history.
ash::ClipboardHistoryController::Get()->DeleteClipboardItemByClipboardData(
current_data.get());
CopyAndMaintainClipboard(std::move(current_data), html, png_data,
decoded_image);
std::move(callback).Run(true);
......
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