summaryrefslogtreecommitdiff
path: root/chromium/headless/lib/browser/headless_clipboard.h
blob: 0c1e285aca8941ecdff84f8a1d2a454feaee4eda (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef HEADLESS_LIB_BROWSER_HEADLESS_CLIPBOARD_H_
#define HEADLESS_LIB_BROWSER_HEADLESS_CLIPBOARD_H_

#include <stddef.h>
#include <stdint.h>

#include <map>

#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/base/clipboard/clipboard.h"
#include "ui/base/data_transfer_policy/data_transfer_endpoint.h"

namespace headless {

// TODO(crbug.com/1213221): Add tests. This class is mostly untested.
class HeadlessClipboard : public ui::Clipboard {
 public:
  HeadlessClipboard();
  HeadlessClipboard(const HeadlessClipboard&) = delete;
  HeadlessClipboard& operator=(const HeadlessClipboard&) = delete;
  ~HeadlessClipboard() override;

 private:
  // Clipboard overrides.
  void OnPreShutdown() override;
  ui::DataTransferEndpoint* GetSource(
      ui::ClipboardBuffer buffer) const override;
  const ui::ClipboardSequenceNumberToken& GetSequenceNumber(
      ui::ClipboardBuffer buffer) const override;
  std::vector<std::u16string> GetStandardFormats(
      ui::ClipboardBuffer buffer,
      const ui::DataTransferEndpoint* data_dst) const override;
  bool IsFormatAvailable(
      const ui::ClipboardFormatType& format,
      ui::ClipboardBuffer buffer,
      const ui::DataTransferEndpoint* data_dst) const override;
  void Clear(ui::ClipboardBuffer buffer) override;
  void ReadAvailableTypes(ui::ClipboardBuffer buffer,
                          const ui::DataTransferEndpoint* data_dst,
                          std::vector<std::u16string>* types) const override;
  void ReadText(ui::ClipboardBuffer buffer,
                const ui::DataTransferEndpoint* data_dst,
                std::u16string* result) const override;
  void ReadAsciiText(ui::ClipboardBuffer buffer,
                     const ui::DataTransferEndpoint* data_dst,
                     std::string* result) const override;
  void ReadHTML(ui::ClipboardBuffer buffer,
                const ui::DataTransferEndpoint* data_dst,
                std::u16string* markup,
                std::string* src_url,
                uint32_t* fragment_start,
                uint32_t* fragment_end) const override;
  void ReadSvg(ui::ClipboardBuffer buffer,
               const ui::DataTransferEndpoint* data_dst,
               std::u16string* result) const override;
  void ReadRTF(ui::ClipboardBuffer buffer,
               const ui::DataTransferEndpoint* data_dst,
               std::string* result) const override;
  void ReadPng(ui::ClipboardBuffer buffer,
               const ui::DataTransferEndpoint* data_dst,
               ReadPngCallback callback) const override;
  void ReadCustomData(ui::ClipboardBuffer clipboard_buffer,
                      const std::u16string& type,
                      const ui::DataTransferEndpoint* data_dst,
                      std::u16string* result) const override;
  void ReadFilenames(ui::ClipboardBuffer buffer,
                     const ui::DataTransferEndpoint* data_dst,
                     std::vector<ui::FileInfo>* result) const override;
  void ReadBookmark(const ui::DataTransferEndpoint* data_dst,
                    std::u16string* title,
                    std::string* url) const override;
  void ReadData(const ui::ClipboardFormatType& format,
                const ui::DataTransferEndpoint* data_dst,
                std::string* result) const override;
#if defined(USE_OZONE)
  bool IsSelectionBufferAvailable() const override;
#endif  // defined(USE_OZONE)
  void WritePortableAndPlatformRepresentations(
      ui::ClipboardBuffer buffer,
      const ObjectMap& objects,
      std::vector<Clipboard::PlatformRepresentation> platform_representations,
      std::unique_ptr<ui::DataTransferEndpoint> data_src) override;
  void WriteText(const char* text_data, size_t text_len) override;
  void WriteHTML(const char* markup_data,
                 size_t markup_len,
                 const char* url_data,
                 size_t url_len) override;
  void WriteSvg(const char* markup_data, size_t markup_len) override;
  void WriteRTF(const char* rtf_data, size_t data_len) override;
  void WriteFilenames(std::vector<ui::FileInfo> filenames) override;
  void WriteBookmark(const char* title_data,
                     size_t title_len,
                     const char* url_data,
                     size_t url_len) override;
  void WriteWebSmartPaste() override;
  void WriteBitmap(const SkBitmap& bitmap) override;
  void WriteData(const ui::ClipboardFormatType& format,
                 const char* data_data,
                 size_t data_len) override;

  struct DataStore {
    DataStore();
    DataStore(const DataStore& other);
    ~DataStore();
    void Clear();
    ui::ClipboardSequenceNumberToken sequence_number;
    std::map<ui::ClipboardFormatType, std::string> data;
    std::string url_title;
    std::string html_src_url;
    std::vector<uint8_t> png;
    std::vector<ui::FileInfo> filenames;
  };

  // The non-const versions increment the sequence number as a side effect.
  const DataStore& GetStore(ui::ClipboardBuffer buffer) const;
  const DataStore& GetDefaultStore() const;
  DataStore& GetStore(ui::ClipboardBuffer buffer);
  DataStore& GetDefaultStore();

  ui::ClipboardBuffer default_store_buffer_;
  mutable std::map<ui::ClipboardBuffer, DataStore> stores_;
};

}  // namespace headless

#endif  // HEADLESS_LIB_BROWSER_HEADLESS_CLIPBOARD_H_