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( ...@@ -373,6 +373,17 @@ bool ClipboardHistoryControllerImpl::DeleteClipboardItemById(
return false; 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( void ClipboardHistoryControllerImpl::OnClipboardHistoryItemAdded(
const ClipboardHistoryItem& item, const ClipboardHistoryItem& item,
bool is_duplicate) { bool is_duplicate) {
......
...@@ -95,6 +95,7 @@ class ASH_EXPORT ClipboardHistoryControllerImpl ...@@ -95,6 +95,7 @@ class ASH_EXPORT ClipboardHistoryControllerImpl
std::vector<std::string> GetHistoryItemIds() const override; std::vector<std::string> GetHistoryItemIds() const override;
bool PasteClipboardItemById(const std::string& item_id) override; bool PasteClipboardItemById(const std::string& item_id) override;
bool DeleteClipboardItemById(const std::string& item_id) override; bool DeleteClipboardItemById(const std::string& item_id) override;
bool DeleteClipboardItemByClipboardData(ui::ClipboardData* data) override;
// ClipboardHistory::Observer: // ClipboardHistory::Observer:
void OnClipboardHistoryItemAdded(const ClipboardHistoryItem& item, void OnClipboardHistoryItemAdded(const ClipboardHistoryItem& item,
......
...@@ -21,6 +21,10 @@ namespace gfx { ...@@ -21,6 +21,10 @@ namespace gfx {
class Rect; class Rect;
} // namespace gfx } // namespace gfx
namespace ui {
class ClipboardData;
} // namespace ui
namespace ash { namespace ash {
class ScopedClipboardHistoryPause; class ScopedClipboardHistoryPause;
...@@ -96,6 +100,9 @@ class ASH_PUBLIC_EXPORT ClipboardHistoryController { ...@@ -96,6 +100,9 @@ class ASH_PUBLIC_EXPORT ClipboardHistoryController {
// Deletes the clipboard item specified by the item id. // Deletes the clipboard item specified by the item id.
virtual bool DeleteClipboardItemById(const std::string& item_id) = 0; virtual bool DeleteClipboardItemById(const std::string& item_id) = 0;
// Deletes the clipboard item that matches `data`.
virtual bool DeleteClipboardItemByClipboardData(ui::ClipboardData* data) = 0;
protected: protected:
ClipboardHistoryController(); ClipboardHistoryController();
virtual ~ClipboardHistoryController(); virtual ~ClipboardHistoryController();
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <stdint.h> #include <stdint.h>
#include <memory> #include <memory>
#include "ash/public/cpp/clipboard_history_controller.h"
#include "base/base64.h" #include "base/base64.h"
#include "base/callback.h" #include "base/callback.h"
#include "base/files/file_util.h" #include "base/files/file_util.h"
...@@ -91,6 +92,12 @@ void CopyImageToClipboard(bool maintain_clipboard, ...@@ -91,6 +92,12 @@ void CopyImageToClipboard(bool maintain_clipboard,
std::make_unique<ui::ClipboardData>( std::make_unique<ui::ClipboardData>(
*ui::ClipboardNonBacked::GetForCurrentThread()->GetClipboardData( *ui::ClipboardNonBacked::GetForCurrentThread()->GetClipboardData(
nullptr)); 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, CopyAndMaintainClipboard(std::move(current_data), html, png_data,
decoded_image); decoded_image);
std::move(callback).Run(true); 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