blob: 88c66ad16f18ffda65ac0a918bf028d5eb608793 [file] [log] [blame]
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_BASE_CLIPBOARD_CLIPBOARD_NON_BACKED_H_
#define UI_BASE_CLIPBOARD_CLIPBOARD_NON_BACKED_H_
#include <stddef.h>
#include <stdint.h>
#include <string_view>
#include "base/component_export.h"
#include "base/containers/flat_map.h"
#include "base/gtest_prod_util.h"
#include "build/build_config.h"
#include "ui/base/clipboard/clipboard.h"
namespace headless {
class HeadlessClipboard;
}
namespace ui {
class ClipboardData;
class ClipboardInternal;
// In-memory clipboard implementation not backed by an underlying platform.
// This clipboard can be used where there's no need to sync the clipboard with
// an underlying platform, and can substitute platform clipboards like
// ClipboardWin on Windows or ClipboardMac on MacOS. As this isn't backed by an
// underlying platform, the clipboard data isn't persisted after an instance
// goes away.
class COMPONENT_EXPORT(UI_BASE_CLIPBOARD) ClipboardNonBacked
: public Clipboard {
public:
// Returns the in-memory clipboard for the current thread. This
// method must *only* be used when the caller is sure that the clipboard for
// the current thread is in fact an instance of ClipboardNonBacked.
static ClipboardNonBacked* GetForCurrentThread();
ClipboardNonBacked(const ClipboardNonBacked&) = delete;
ClipboardNonBacked& operator=(const ClipboardNonBacked&) = delete;
// Returns the current ClipboardData.
const ClipboardData* GetClipboardData(
DataTransferEndpoint* data_dst,
ClipboardBuffer buffer = ClipboardBuffer::kCopyPaste) const;
// Writes the current ClipboardData and returns the previous data.
// The data source is expected to be set in `data`.
std::unique_ptr<ClipboardData> WriteClipboardData(
std::unique_ptr<ClipboardData> data,
ClipboardBuffer buffer = ClipboardBuffer::kCopyPaste);
// Clipboard overrides:
std::optional<DataTransferEndpoint> GetSource(
ClipboardBuffer buffer) const override;
const ClipboardSequenceNumberToken& GetSequenceNumber(
ClipboardBuffer buffer) const override;
int NumImagesEncodedForTesting(
ClipboardBuffer buffer = ClipboardBuffer::kCopyPaste) const;
private:
friend class Clipboard;
friend class ClipboardNonBackedTestBase;
friend class headless::HeadlessClipboard;
FRIEND_TEST_ALL_PREFIXES(ClipboardNonBackedTest, PlainText);
FRIEND_TEST_ALL_PREFIXES(ClipboardNonBackedTest, BookmarkURL);
FRIEND_TEST_ALL_PREFIXES(ClipboardNonBackedTest, TextURIList);
FRIEND_TEST_ALL_PREFIXES(ClipboardNonBackedTest, ImageEncoding);
FRIEND_TEST_ALL_PREFIXES(ClipboardNonBackedTest, EncodeImageOnce);
FRIEND_TEST_ALL_PREFIXES(ClipboardNonBackedTest, EncodeMultipleImages);
FRIEND_TEST_ALL_PREFIXES(ClipboardNonBackedTest, ClipboardBufferTypes);
FRIEND_TEST_ALL_PREFIXES(ClipboardNonBackedMockTimeTest,
RecordsTimeIntervalBetweenCommitAndRead);
ClipboardNonBacked();
~ClipboardNonBacked() override;
// Clipboard overrides:
void OnPreShutdown() override;
std::vector<std::u16string> GetStandardFormats(
ClipboardBuffer buffer,
const DataTransferEndpoint* data_dst) const override;
bool IsFormatAvailable(const ClipboardFormatType& format,
ClipboardBuffer buffer,
const DataTransferEndpoint* data_dst) const override;
void Clear(ClipboardBuffer buffer) override;
void ReadAvailableTypes(ClipboardBuffer buffer,
const DataTransferEndpoint* data_dst,
std::vector<std::u16string>* types) const override;
void ReadText(ClipboardBuffer buffer,
const DataTransferEndpoint* data_dst,
std::u16string* result) const override;
void ReadAsciiText(ClipboardBuffer buffer,
const DataTransferEndpoint* data_dst,
std::string* result) const override;
void ReadHTML(ClipboardBuffer buffer,
const DataTransferEndpoint* data_dst,
std::u16string* markup,
std::string* src_url,
uint32_t* fragment_start,
uint32_t* fragment_end) const override;
void ReadSvg(ClipboardBuffer buffer,
const DataTransferEndpoint* data_dst,
std::u16string* result) const override;
void ReadRTF(ClipboardBuffer buffer,
const DataTransferEndpoint* data_dst,
std::string* result) const override;
void ReadPng(ClipboardBuffer buffer,
const DataTransferEndpoint* data_dst,
ReadPngCallback callback) const override;
void ReadDataTransferCustomData(ClipboardBuffer buffer,
const std::u16string& type,
const DataTransferEndpoint* data_dst,
std::u16string* result) const override;
void ReadFilenames(ClipboardBuffer buffer,
const DataTransferEndpoint* data_dst,
std::vector<ui::FileInfo>* result) const override;
void ReadBookmark(const DataTransferEndpoint* data_dst,
std::u16string* title,
std::string* url) const override;
void ReadData(const ClipboardFormatType& format,
const DataTransferEndpoint* data_dst,
std::string* result) const override;
#if BUILDFLAG(IS_OZONE)
bool IsSelectionBufferAvailable() const override;
#endif // BUILDFLAG(IS_OZONE)
void WritePortableAndPlatformRepresentations(
ClipboardBuffer buffer,
const ObjectMap& objects,
const std::vector<RawData>& raw_objects,
std::vector<Clipboard::PlatformRepresentation> platform_representations,
std::unique_ptr<DataTransferEndpoint> data_src,
uint32_t privacy_types) override;
void WriteText(std::string_view text) override;
void WriteHTML(std::string_view markup,
std::optional<std::string_view> source_url) override;
void WriteSvg(std::string_view markup) override;
void WriteRTF(std::string_view rtf) override;
void WriteFilenames(std::vector<ui::FileInfo> filenames) override;
void WriteBookmark(std::string_view title, std::string_view url) override;
void WriteWebSmartPaste() override;
void WriteBitmap(const SkBitmap& bitmap) override;
void WriteData(const ClipboardFormatType& format,
base::span<const uint8_t> data) override;
const ClipboardInternal& GetInternalClipboard(ClipboardBuffer buffer) const;
ClipboardInternal& GetInternalClipboard(ClipboardBuffer buffer);
base::flat_map<ClipboardBuffer, std::unique_ptr<ClipboardInternal>>
internal_clipboards_;
};
} // namespace ui
#endif // UI_BASE_CLIPBOARD_CLIPBOARD_NON_BACKED_H_