| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef UI_BASE_CLIPBOARD_CLIPBOARD_H_ | 5 #ifndef UI_BASE_CLIPBOARD_CLIPBOARD_H_ |
| 6 #define UI_BASE_CLIPBOARD_CLIPBOARD_H_ | 6 #define UI_BASE_CLIPBOARD_CLIPBOARD_H_ |
| 7 | 7 |
| 8 #include <map> | 8 #include <map> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| 11 | 11 |
| 12 #include "base/compiler_specific.h" | 12 #include "base/compiler_specific.h" |
| 13 #include "base/gtest_prod_util.h" | 13 #include "base/gtest_prod_util.h" |
| 14 #include "base/memory/scoped_ptr.h" | |
| 15 #include "base/memory/shared_memory.h" | 14 #include "base/memory/shared_memory.h" |
| 16 #include "base/process/process.h" | 15 #include "base/process/process.h" |
| 17 #include "base/strings/string16.h" | 16 #include "base/strings/string16.h" |
| 18 #include "base/threading/platform_thread.h" | 17 #include "base/threading/platform_thread.h" |
| 19 #include "base/threading/thread_checker.h" | 18 #include "base/threading/thread_checker.h" |
| 20 #include "ui/base/clipboard/clipboard_types.h" | 19 #include "ui/base/clipboard/clipboard_types.h" |
| 21 #include "ui/base/ui_base_export.h" | 20 #include "ui/base/ui_base_export.h" |
| 22 | 21 |
| 23 #if defined(OS_WIN) | 22 #if defined(OS_WIN) |
| 24 #include <objidl.h> | 23 #include <objidl.h> |
| 25 #elif defined(OS_ANDROID) | |
| 26 #include <jni.h> | |
| 27 | |
| 28 #include "base/android/jni_android.h" | |
| 29 #include "base/android/scoped_java_ref.h" | |
| 30 #endif | |
| 31 | |
| 32 #if defined(USE_AURA) && defined(USE_X11) | |
| 33 #include "base/memory/scoped_ptr.h" | |
| 34 #endif | 24 #endif |
| 35 | 25 |
| 36 namespace base { | 26 namespace base { |
| 37 class FilePath; | 27 class FilePath; |
| 38 | 28 |
| 39 namespace win { | 29 namespace win { |
| 40 class MessageWindow; | 30 class MessageWindow; |
| 41 } // namespace win | 31 } // namespace win |
| 42 } // namespace base | 32 } // namespace base |
| 43 | 33 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 std::string Serialize() const; | 71 std::string Serialize() const; |
| 82 static FormatType Deserialize(const std::string& serialization); | 72 static FormatType Deserialize(const std::string& serialization); |
| 83 | 73 |
| 84 #if defined(USE_AURA) | 74 #if defined(USE_AURA) |
| 85 // FormatType can be used in a set on some platforms. | 75 // FormatType can be used in a set on some platforms. |
| 86 bool operator<(const FormatType& other) const; | 76 bool operator<(const FormatType& other) const; |
| 87 #endif | 77 #endif |
| 88 | 78 |
| 89 #if defined(OS_WIN) | 79 #if defined(OS_WIN) |
| 90 const FORMATETC& ToFormatEtc() const { return data_; } | 80 const FORMATETC& ToFormatEtc() const { return data_; } |
| 91 #elif defined(USE_AURA) | 81 #elif defined(USE_AURA) || defined(OS_ANDROID) |
| 92 const std::string& ToString() const { return data_; } | 82 const std::string& ToString() const { return data_; } |
| 93 #elif defined(OS_MACOSX) | 83 #elif defined(OS_MACOSX) |
| 94 NSString* ToNSString() const { return data_; } | 84 NSString* ToNSString() const { return data_; } |
| 95 // Custom copy and assignment constructor to handle NSString. | 85 // Custom copy and assignment constructor to handle NSString. |
| 96 FormatType(const FormatType& other); | 86 FormatType(const FormatType& other); |
| 97 FormatType& operator=(const FormatType& other); | 87 FormatType& operator=(const FormatType& other); |
| 98 #endif | 88 #endif |
| 99 | 89 |
| 100 bool Equals(const FormatType& other) const; | 90 bool Equals(const FormatType& other) const; |
| 101 | 91 |
| 102 private: | 92 private: |
| 103 friend class Clipboard; | 93 friend class Clipboard; |
| 104 | 94 |
| 105 // Platform-specific glue used internally by the Clipboard class. Each | 95 // Platform-specific glue used internally by the Clipboard class. Each |
| 106 // plaform should define,at least one of each of the following: | 96 // plaform should define,at least one of each of the following: |
| 107 // 1. A constructor that wraps that native clipboard format descriptor. | 97 // 1. A constructor that wraps that native clipboard format descriptor. |
| 108 // 2. An accessor to retrieve the wrapped descriptor. | 98 // 2. An accessor to retrieve the wrapped descriptor. |
| 109 // 3. A data member to hold the wrapped descriptor. | 99 // 3. A data member to hold the wrapped descriptor. |
| 110 // | 100 // |
| 111 // Note that in some cases, the accessor for the wrapped descriptor may be | 101 // Note that in some cases, the accessor for the wrapped descriptor may be |
| 112 // public, as these format types can be used by drag and drop code as well. | 102 // public, as these format types can be used by drag and drop code as well. |
| 113 #if defined(OS_WIN) | 103 #if defined(OS_WIN) |
| 114 explicit FormatType(UINT native_format); | 104 explicit FormatType(UINT native_format); |
| 115 FormatType(UINT native_format, LONG index); | 105 FormatType(UINT native_format, LONG index); |
| 116 UINT ToUINT() const { return data_.cfFormat; } | |
| 117 FORMATETC data_; | 106 FORMATETC data_; |
| 118 #elif defined(USE_AURA) | 107 #elif defined(USE_AURA) || defined(OS_ANDROID) |
| 119 explicit FormatType(const std::string& native_format); | 108 explicit FormatType(const std::string& native_format); |
| 120 const std::string& data() const { return data_; } | |
| 121 std::string data_; | 109 std::string data_; |
| 122 #elif defined(OS_MACOSX) | 110 #elif defined(OS_MACOSX) |
| 123 explicit FormatType(NSString* native_format); | 111 explicit FormatType(NSString* native_format); |
| 124 NSString* data_; | 112 NSString* data_; |
| 125 #elif defined(OS_ANDROID) | |
| 126 explicit FormatType(const std::string& native_format); | |
| 127 const std::string& data() const { return data_; } | |
| 128 std::string data_; | |
| 129 #else | 113 #else |
| 130 #error No FormatType definition. | 114 #error No FormatType definition. |
| 131 #endif | 115 #endif |
| 132 | 116 |
| 133 // Copyable and assignable, since this is essentially an opaque value type. | 117 // Copyable and assignable, since this is essentially an opaque value type. |
| 134 }; | 118 }; |
| 135 | 119 |
| 136 // TODO(dcheng): Make this private once the IPC layer no longer needs to | 120 // TODO(dcheng): Make this private once the IPC layer no longer needs to |
| 137 // serialize this information. | 121 // serialize this information. |
| 138 // ObjectType designates the type of data to be stored in the clipboard. This | 122 // ObjectType designates the type of data to be stored in the clipboard. This |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 204 static Clipboard* GetForCurrentThread(); | 188 static Clipboard* GetForCurrentThread(); |
| 205 | 189 |
| 206 // Destroys the clipboard for the current thread. Usually, this will clean up | 190 // Destroys the clipboard for the current thread. Usually, this will clean up |
| 207 // all clipboards, except on Windows. (Previous code leaks the IO thread | 191 // all clipboards, except on Windows. (Previous code leaks the IO thread |
| 208 // clipboard, so it shouldn't be a problem.) | 192 // clipboard, so it shouldn't be a problem.) |
| 209 static void DestroyClipboardForCurrentThread(); | 193 static void DestroyClipboardForCurrentThread(); |
| 210 | 194 |
| 211 // Returns a sequence number which uniquely identifies clipboard state. | 195 // Returns a sequence number which uniquely identifies clipboard state. |
| 212 // This can be used to version the data on the clipboard and determine | 196 // This can be used to version the data on the clipboard and determine |
| 213 // whether it has changed. | 197 // whether it has changed. |
| 214 uint64 GetSequenceNumber(ClipboardType type); | 198 virtual uint64 GetSequenceNumber(ClipboardType type) = 0; |
| 215 | 199 |
| 216 // Tests whether the clipboard contains a certain format | 200 // Tests whether the clipboard contains a certain format |
| 217 bool IsFormatAvailable(const FormatType& format, ClipboardType type) const; | 201 virtual bool IsFormatAvailable(const FormatType& format, |
| 202 ClipboardType type) const = 0; |
| 218 | 203 |
| 219 // Clear the clipboard data. | 204 // Clear the clipboard data. |
| 220 void Clear(ClipboardType type); | 205 virtual void Clear(ClipboardType type) = 0; |
| 221 | 206 |
| 222 void ReadAvailableTypes(ClipboardType type, | 207 virtual void ReadAvailableTypes(ClipboardType type, |
| 223 std::vector<base::string16>* types, | 208 std::vector<base::string16>* types, |
| 224 bool* contains_filenames) const; | 209 bool* contains_filenames) const = 0; |
| 225 | 210 |
| 226 // Reads UNICODE text from the clipboard, if available. | 211 // Reads UNICODE text from the clipboard, if available. |
| 227 void ReadText(ClipboardType type, base::string16* result) const; | 212 virtual void ReadText(ClipboardType type, base::string16* result) const = 0; |
| 228 | 213 |
| 229 // Reads ASCII text from the clipboard, if available. | 214 // Reads ASCII text from the clipboard, if available. |
| 230 void ReadAsciiText(ClipboardType type, std::string* result) const; | 215 virtual void ReadAsciiText(ClipboardType type, std::string* result) const = 0; |
| 231 | 216 |
| 232 // Reads HTML from the clipboard, if available. If the HTML fragment requires | 217 // Reads HTML from the clipboard, if available. If the HTML fragment requires |
| 233 // context to parse, |fragment_start| and |fragment_end| are indexes into | 218 // context to parse, |fragment_start| and |fragment_end| are indexes into |
| 234 // markup indicating the beginning and end of the actual fragment. Otherwise, | 219 // markup indicating the beginning and end of the actual fragment. Otherwise, |
| 235 // they will contain 0 and markup->size(). | 220 // they will contain 0 and markup->size(). |
| 236 void ReadHTML(ClipboardType type, | 221 virtual void ReadHTML(ClipboardType type, |
| 237 base::string16* markup, | 222 base::string16* markup, |
| 238 std::string* src_url, | 223 std::string* src_url, |
| 239 uint32* fragment_start, | 224 uint32* fragment_start, |
| 240 uint32* fragment_end) const; | 225 uint32* fragment_end) const = 0; |
| 241 | 226 |
| 242 // Reads RTF from the clipboard, if available. Stores the result as a byte | 227 // Reads RTF from the clipboard, if available. Stores the result as a byte |
| 243 // vector. | 228 // vector. |
| 244 void ReadRTF(ClipboardType type, std::string* result) const; | 229 virtual void ReadRTF(ClipboardType type, std::string* result) const = 0; |
| 245 | 230 |
| 246 // Reads an image from the clipboard, if available. | 231 // Reads an image from the clipboard, if available. |
| 247 SkBitmap ReadImage(ClipboardType type) const; | 232 virtual SkBitmap ReadImage(ClipboardType type) const = 0; |
| 248 | 233 |
| 249 void ReadCustomData(ClipboardType clipboard_type, | 234 virtual void ReadCustomData(ClipboardType clipboard_type, |
| 250 const base::string16& type, | 235 const base::string16& type, |
| 251 base::string16* result) const; | 236 base::string16* result) const = 0; |
| 252 | 237 |
| 253 // Reads a bookmark from the clipboard, if available. | 238 // Reads a bookmark from the clipboard, if available. |
| 254 void ReadBookmark(base::string16* title, std::string* url) const; | 239 virtual void ReadBookmark(base::string16* title, std::string* url) const = 0; |
| 255 | 240 |
| 256 // Reads raw data from the clipboard with the given format type. Stores result | 241 // Reads raw data from the clipboard with the given format type. Stores result |
| 257 // as a byte vector. | 242 // as a byte vector. |
| 258 void ReadData(const FormatType& format, std::string* result) const; | 243 virtual void ReadData(const FormatType& format, |
| 244 std::string* result) const = 0; |
| 259 | 245 |
| 260 // Gets the FormatType corresponding to an arbitrary format string, | 246 // Gets the FormatType corresponding to an arbitrary format string, |
| 261 // registering it with the system if needed. Due to Windows/Linux | 247 // registering it with the system if needed. Due to Windows/Linux |
| 262 // limitiations, |format_string| must never be controlled by the user. | 248 // limitiations, |format_string| must never be controlled by the user. |
| 263 static FormatType GetFormatType(const std::string& format_string); | 249 static FormatType GetFormatType(const std::string& format_string); |
| 264 | 250 |
| 265 // Get format identifiers for various types. | 251 // Get format identifiers for various types. |
| 266 static const FormatType& GetUrlFormatType(); | 252 static const FormatType& GetUrlFormatType(); |
| 267 static const FormatType& GetUrlWFormatType(); | 253 static const FormatType& GetUrlWFormatType(); |
| 268 static const FormatType& GetMozUrlFormatType(); | 254 static const FormatType& GetMozUrlFormatType(); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 291 WARN_UNUSED_RESULT; | 277 WARN_UNUSED_RESULT; |
| 292 #if defined(OS_WIN) | 278 #if defined(OS_WIN) |
| 293 // Firefox text/html | 279 // Firefox text/html |
| 294 static const FormatType& GetTextHtmlFormatType(); | 280 static const FormatType& GetTextHtmlFormatType(); |
| 295 static const FormatType& GetCFHDropFormatType(); | 281 static const FormatType& GetCFHDropFormatType(); |
| 296 static const FormatType& GetFileDescriptorFormatType(); | 282 static const FormatType& GetFileDescriptorFormatType(); |
| 297 static const FormatType& GetFileContentZeroFormatType(); | 283 static const FormatType& GetFileContentZeroFormatType(); |
| 298 static const FormatType& GetIDListFormatType(); | 284 static const FormatType& GetIDListFormatType(); |
| 299 #endif | 285 #endif |
| 300 | 286 |
| 287 protected: |
| 288 static Clipboard* Create(); |
| 289 |
| 290 Clipboard() {} |
| 291 virtual ~Clipboard() {} |
| 292 |
| 293 // Write a bunch of objects to the system clipboard. Copies are made of the |
| 294 // contents of |objects|. |
| 295 virtual void WriteObjects(ClipboardType type, const ObjectMap& objects) = 0; |
| 296 |
| 297 void DispatchObject(ObjectType type, const ObjectMapParams& params); |
| 298 |
| 299 virtual void WriteText(const char* text_data, size_t text_len) = 0; |
| 300 |
| 301 virtual void WriteHTML(const char* markup_data, |
| 302 size_t markup_len, |
| 303 const char* url_data, |
| 304 size_t url_len) = 0; |
| 305 |
| 306 virtual void WriteRTF(const char* rtf_data, size_t data_len) = 0; |
| 307 |
| 308 virtual void WriteBookmark(const char* title_data, |
| 309 size_t title_len, |
| 310 const char* url_data, |
| 311 size_t url_len) = 0; |
| 312 |
| 313 virtual void WriteWebSmartPaste() = 0; |
| 314 |
| 315 virtual void WriteBitmap(const SkBitmap& bitmap) = 0; |
| 316 |
| 317 virtual void WriteData(const FormatType& format, |
| 318 const char* data_data, |
| 319 size_t data_len) = 0; |
| 320 |
| 301 private: | 321 private: |
| 302 FRIEND_TEST_ALL_PREFIXES(ClipboardTest, SharedBitmapTest); | 322 FRIEND_TEST_ALL_PREFIXES(ClipboardTest, SharedBitmapTest); |
| 303 FRIEND_TEST_ALL_PREFIXES(ClipboardTest, EmptyHTMLTest); | 323 FRIEND_TEST_ALL_PREFIXES(ClipboardTest, EmptyHTMLTest); |
| 304 friend class ClipboardTest; | 324 friend class ClipboardTest; |
| 305 // For access to WriteObjects(). | 325 // For access to WriteObjects(). |
| 306 // TODO(dcheng): Remove the temporary exception for content. | 326 // TODO(dcheng): Remove the temporary exception for content. |
| 307 friend class content::ClipboardMessageFilter; | 327 friend class content::ClipboardMessageFilter; |
| 308 friend class ScopedClipboardWriter; | 328 friend class ScopedClipboardWriter; |
| 309 | 329 |
| 310 Clipboard(); | |
| 311 ~Clipboard(); | |
| 312 | |
| 313 // Write a bunch of objects to the system clipboard. Copies are made of the | |
| 314 // contents of |objects|. | |
| 315 void WriteObjects(ClipboardType type, const ObjectMap& objects); | |
| 316 | |
| 317 void DispatchObject(ObjectType type, const ObjectMapParams& params); | |
| 318 | |
| 319 void WriteText(const char* text_data, size_t text_len); | |
| 320 | |
| 321 void WriteHTML(const char* markup_data, | |
| 322 size_t markup_len, | |
| 323 const char* url_data, | |
| 324 size_t url_len); | |
| 325 | |
| 326 void WriteRTF(const char* rtf_data, size_t data_len); | |
| 327 | |
| 328 void WriteBookmark(const char* title_data, | |
| 329 size_t title_len, | |
| 330 const char* url_data, | |
| 331 size_t url_len); | |
| 332 | |
| 333 void WriteWebSmartPaste(); | |
| 334 | |
| 335 void WriteBitmap(const SkBitmap& bitmap); | |
| 336 | |
| 337 void WriteData(const FormatType& format, | |
| 338 const char* data_data, | |
| 339 size_t data_len); | |
| 340 #if defined(OS_WIN) | |
| 341 void WriteBitmapFromHandle(HBITMAP source_hbitmap, | |
| 342 const gfx::Size& size); | |
| 343 | |
| 344 // Safely write to system clipboard. Free |handle| on failure. | |
| 345 void WriteToClipboard(unsigned int format, HANDLE handle); | |
| 346 | |
| 347 static void ParseBookmarkClipboardFormat(const base::string16& bookmark, | |
| 348 base::string16* title, | |
| 349 std::string* url); | |
| 350 | |
| 351 // Free a handle depending on its type (as intuited from format) | |
| 352 static void FreeData(unsigned int format, HANDLE data); | |
| 353 | |
| 354 // Return the window that should be the clipboard owner, creating it | |
| 355 // if neccessary. Marked const for lazily initialization by const methods. | |
| 356 HWND GetClipboardWindow() const; | |
| 357 | |
| 358 // Mark this as mutable so const methods can still do lazy initialization. | |
| 359 mutable scoped_ptr<base::win::MessageWindow> clipboard_owner_; | |
| 360 | |
| 361 #elif defined(USE_CLIPBOARD_AURAX11) | |
| 362 private: | |
| 363 // We keep our implementation details private because otherwise we bring in | |
| 364 // the X11 headers and break chrome compile. | |
| 365 class AuraX11Details; | |
| 366 scoped_ptr<AuraX11Details> aurax11_details_; | |
| 367 #endif | |
| 368 | |
| 369 DISALLOW_COPY_AND_ASSIGN(Clipboard); | 330 DISALLOW_COPY_AND_ASSIGN(Clipboard); |
| 370 }; | 331 }; |
| 371 | 332 |
| 372 } // namespace ui | 333 } // namespace ui |
| 373 | 334 |
| 374 #endif // UI_BASE_CLIPBOARD_CLIPBOARD_H_ | 335 #endif // UI_BASE_CLIPBOARD_CLIPBOARD_H_ |
| OLD | NEW |