1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef HEADLESS_LIB_BROWSER_HEADLESS_CLIPBOARD_H_
6 #define HEADLESS_LIB_BROWSER_HEADLESS_CLIPBOARD_H_
7 
8 #include <stddef.h>
9 #include <stdint.h>
10 
11 #include <map>
12 
13 #include "base/macros.h"
14 #include "third_party/skia/include/core/SkBitmap.h"
15 #include "ui/base/clipboard/clipboard.h"
16 #include "ui/base/data_transfer_policy/data_transfer_endpoint.h"
17 
18 namespace headless {
19 
20 class HeadlessClipboard : public ui::Clipboard {
21  public:
22   HeadlessClipboard();
23   ~HeadlessClipboard() override;
24 
25  private:
26   // Clipboard overrides.
27   void OnPreShutdown() override;
28   uint64_t GetSequenceNumber(ui::ClipboardBuffer buffer) const override;
29   bool IsFormatAvailable(
30       const ui::ClipboardFormatType& format,
31       ui::ClipboardBuffer buffer,
32       const ui::DataTransferEndpoint* data_dst) const override;
33   void Clear(ui::ClipboardBuffer buffer) override;
34   void ReadAvailableTypes(ui::ClipboardBuffer buffer,
35                           const ui::DataTransferEndpoint* data_dst,
36                           std::vector<base::string16>* types) const override;
37   std::vector<base::string16> ReadAvailablePlatformSpecificFormatNames(
38       ui::ClipboardBuffer buffer,
39       const ui::DataTransferEndpoint* data_dst) const override;
40   void ReadText(ui::ClipboardBuffer buffer,
41                 const ui::DataTransferEndpoint* data_dst,
42                 base::string16* result) const override;
43   void ReadAsciiText(ui::ClipboardBuffer buffer,
44                      const ui::DataTransferEndpoint* data_dst,
45                      std::string* result) const override;
46   void ReadHTML(ui::ClipboardBuffer buffer,
47                 const ui::DataTransferEndpoint* data_dst,
48                 base::string16* markup,
49                 std::string* src_url,
50                 uint32_t* fragment_start,
51                 uint32_t* fragment_end) const override;
52   void ReadSvg(ui::ClipboardBuffer buffer,
53                const ui::DataTransferEndpoint* data_dst,
54                base::string16* result) const override;
55   void ReadRTF(ui::ClipboardBuffer buffer,
56                const ui::DataTransferEndpoint* data_dst,
57                std::string* result) const override;
58   void ReadImage(ui::ClipboardBuffer buffer,
59                  const ui::DataTransferEndpoint* data_dst,
60                  ReadImageCallback callback) const override;
61   void ReadCustomData(ui::ClipboardBuffer clipboard_buffer,
62                       const base::string16& type,
63                       const ui::DataTransferEndpoint* data_dst,
64                       base::string16* result) const override;
65   void ReadBookmark(const ui::DataTransferEndpoint* data_dst,
66                     base::string16* title,
67                     std::string* url) const override;
68   void ReadData(const ui::ClipboardFormatType& format,
69                 const ui::DataTransferEndpoint* data_dst,
70                 std::string* result) const override;
71 #if defined(USE_OZONE)
72   bool IsSelectionBufferAvailable() const override;
73 #endif  // defined(USE_OZONE)
74   void WritePortableRepresentations(
75       ui::ClipboardBuffer buffer,
76       const ObjectMap& objects,
77       std::unique_ptr<ui::DataTransferEndpoint> data_src) override;
78   void WritePlatformRepresentations(
79       ui::ClipboardBuffer buffer,
80       std::vector<Clipboard::PlatformRepresentation> platform_representations,
81       std::unique_ptr<ui::DataTransferEndpoint> data_src) override;
82   void WriteText(const char* text_data, size_t text_len) override;
83   void WriteHTML(const char* markup_data,
84                  size_t markup_len,
85                  const char* url_data,
86                  size_t url_len) override;
87   void WriteSvg(const char* markup_data, size_t markup_len) override;
88   void WriteRTF(const char* rtf_data, size_t data_len) override;
89   void WriteBookmark(const char* title_data,
90                      size_t title_len,
91                      const char* url_data,
92                      size_t url_len) override;
93   void WriteWebSmartPaste() override;
94   void WriteBitmap(const SkBitmap& bitmap) override;
95   void WriteData(const ui::ClipboardFormatType& format,
96                  const char* data_data,
97                  size_t data_len) override;
98 
99   struct DataStore {
100     DataStore();
101     DataStore(const DataStore& other);
102     ~DataStore();
103     void Clear();
104     uint64_t sequence_number;
105     std::map<ui::ClipboardFormatType, std::string> data;
106     std::string url_title;
107     std::string html_src_url;
108     SkBitmap image;
109   };
110 
111   // The non-const versions increment the sequence number as a side effect.
112   const DataStore& GetStore(ui::ClipboardBuffer buffer) const;
113   const DataStore& GetDefaultStore() const;
114   DataStore& GetStore(ui::ClipboardBuffer buffer);
115   DataStore& GetDefaultStore();
116 
117   ui::ClipboardBuffer default_store_buffer_;
118   mutable std::map<ui::ClipboardBuffer, DataStore> stores_;
119 
120   DISALLOW_COPY_AND_ASSIGN(HeadlessClipboard);
121 };
122 
123 }  // namespace headless
124 
125 #endif  // HEADLESS_LIB_BROWSER_HEADLESS_CLIPBOARD_H_
126