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