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 
17 namespace headless {
18 
19 class HeadlessClipboard : public ui::Clipboard {
20  public:
21   HeadlessClipboard();
22   ~HeadlessClipboard() override;
23 
24  private:
25   // Clipboard overrides.
26   void OnPreShutdown() override;
27   uint64_t GetSequenceNumber(ui::ClipboardBuffer buffer) const override;
28   bool IsFormatAvailable(const ui::ClipboardFormatType& format,
29                          ui::ClipboardBuffer buffer) const override;
30   void Clear(ui::ClipboardBuffer buffer) override;
31   void ReadAvailableTypes(ui::ClipboardBuffer buffer,
32                           std::vector<base::string16>* types,
33                           bool* contains_filenames) const override;
34   std::vector<base::string16> ReadAvailablePlatformSpecificFormatNames(
35       ui::ClipboardBuffer buffer) const override;
36   void ReadText(ui::ClipboardBuffer buffer,
37                 base::string16* result) const override;
38   void ReadAsciiText(ui::ClipboardBuffer buffer,
39                      std::string* result) const override;
40   void ReadHTML(ui::ClipboardBuffer buffer,
41                 base::string16* markup,
42                 std::string* src_url,
43                 uint32_t* fragment_start,
44                 uint32_t* fragment_end) const override;
45   void ReadRTF(ui::ClipboardBuffer buffer, std::string* result) const override;
46   void ReadImage(ui::ClipboardBuffer buffer,
47                  ReadImageCallback callback) const override;
48   void ReadCustomData(ui::ClipboardBuffer clipboard_buffer,
49                       const base::string16& type,
50                       base::string16* result) const override;
51   void ReadBookmark(base::string16* title, std::string* url) const override;
52   void ReadData(const ui::ClipboardFormatType& format,
53                 std::string* result) const override;
54   void WritePortableRepresentations(ui::ClipboardBuffer buffer,
55                                     const ObjectMap& objects) override;
56   void WritePlatformRepresentations(
57       ui::ClipboardBuffer buffer,
58       std::vector<Clipboard::PlatformRepresentation> platform_representations)
59       override;
60   void WriteText(const char* text_data, size_t text_len) override;
61   void WriteHTML(const char* markup_data,
62                  size_t markup_len,
63                  const char* url_data,
64                  size_t url_len) override;
65   void WriteRTF(const char* rtf_data, size_t data_len) override;
66   void WriteBookmark(const char* title_data,
67                      size_t title_len,
68                      const char* url_data,
69                      size_t url_len) override;
70   void WriteWebSmartPaste() override;
71   void WriteBitmap(const SkBitmap& bitmap) override;
72   void WriteData(const ui::ClipboardFormatType& format,
73                  const char* data_data,
74                  size_t data_len) override;
75 
76   struct DataStore {
77     DataStore();
78     DataStore(const DataStore& other);
79     ~DataStore();
80     void Clear();
81     uint64_t sequence_number;
82     std::map<ui::ClipboardFormatType, std::string> data;
83     std::string url_title;
84     std::string html_src_url;
85     SkBitmap image;
86   };
87 
88   // The non-const versions increment the sequence number as a side effect.
89   const DataStore& GetStore(ui::ClipboardBuffer buffer) const;
90   const DataStore& GetDefaultStore() const;
91   DataStore& GetStore(ui::ClipboardBuffer buffer);
92   DataStore& GetDefaultStore();
93 
94   ui::ClipboardBuffer default_store_buffer_;
95   mutable std::map<ui::ClipboardBuffer, DataStore> stores_;
96 
97   DISALLOW_COPY_AND_ASSIGN(HeadlessClipboard);
98 };
99 
100 }  // namespace headless
101 
102 #endif  // HEADLESS_LIB_BROWSER_HEADLESS_CLIPBOARD_H_
103