15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef UI_BASE_CLIPBOARD_CLIPBOARD_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UI_BASE_CLIPBOARD_CLIPBOARD_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/memory/scoped_ptr.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/shared_memory.h"
16a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/process/process.h"
175e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string16.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/platform_thread.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/threading/thread_checker.h"
204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/base/clipboard/clipboard_types.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_export.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TOOLKIT_GTK)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <gdk/gdk.h>
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_WIN)
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include <objidl.h>
2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#elif defined(OS_ANDROID)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <jni.h>
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_android.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/scoped_java_ref.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) && defined(USE_X11)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FilePath;
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace win {
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass MessageWindow;
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace win
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace base
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Size;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkBitmap;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TOOLKIT_GTK)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _GtkClipboard GtkClipboard;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef __OBJC__
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class NSString;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NSString;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ClipboardTest;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UI_EXPORT Clipboard : NON_EXPORTED_BASE(public base::ThreadChecker) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // MIME type constants.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kMimeTypeText[];
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kMimeTypeURIList[];
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kMimeTypeDownloadURL[];
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kMimeTypeHTML[];
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kMimeTypeRTF[];
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kMimeTypePNG[];
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Platform neutral holder for native data representation of a clipboard type.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct UI_EXPORT FormatType {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FormatType();
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~FormatType();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Serializes and deserializes a FormatType for use in IPC messages.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string Serialize() const;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static FormatType Deserialize(const std::string& serialization);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) || defined(USE_AURA)
8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // FormatType can be used in a set on some platforms.
8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    bool operator<(const FormatType& other) const;
8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif
9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_WIN)
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const FORMATETC& ToFormatEtc() const { return data_; }
9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#elif defined(OS_MACOSX)
9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Custom copy and assignment constructor to handle NSString.
9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    FormatType(const FormatType& other);
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    FormatType& operator=(const FormatType& other);
9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#elif defined(USE_AURA)
9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const std::string& ToString() const { return data_; }
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    friend class Clipboard;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool Equals(const FormatType& other) const;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Platform-specific glue used internally by the Clipboard class. Each
10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // plaform should define,at least one of each of the following:
10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // 1. A constructor that wraps that native clipboard format descriptor.
10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // 2. An accessor to retrieve the wrapped descriptor.
11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // 3. A data member to hold the wrapped descriptor.
11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    //
11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Note that in some cases, the accessor for the wrapped descriptor may be
11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // public, as these format types can be used by drag and drop code as well.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit FormatType(UINT native_format);
11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    FormatType(UINT native_format, LONG index);
11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    UINT ToUINT() const { return data_.cfFormat; }
11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    FORMATETC data_;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit FormatType(NSString* native_format);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NSString* ToNSString() const { return data_; }
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NSString* data_;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(USE_AURA)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit FormatType(const std::string& native_format);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string data_;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(TOOLKIT_GTK)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit FormatType(const std::string& native_format);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit FormatType(const GdkAtom& native_format);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GdkAtom& ToGdkAtom() const { return data_; }
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GdkAtom data_;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_ANDROID)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit FormatType(const std::string& native_format);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& data() const { return data_; }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string data_;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#error No FormatType definition.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Copyable and assignable, since this is essentially an opaque value type.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ObjectType designates the type of data to be stored in the clipboard. This
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // designation is shared across all OSes. The system-specific designation
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is defined by FormatType. A single ObjectType might be represented by
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // several system-specific FormatTypes. For example, on Linux the CBF_TEXT
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ObjectType maps to "text/plain", "STRING", and several other formats. On
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // windows it maps to CF_UNICODETEXT.
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum ObjectType {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CBF_TEXT,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CBF_HTML,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CBF_RTF,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CBF_BOOKMARK,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CBF_WEBKIT,
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CBF_SMBITMAP,  // Bitmap from shared memory.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CBF_DATA,  // Arbitrary block of bytes.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ObjectMap is a map from ObjectType to associated data.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The data is organized differently for each ObjectType. The following
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // table summarizes what kind of data is stored for each key.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // * indicates an optional argument.
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Key           Arguments    Type
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // -------------------------------------
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CBF_TEXT      text         char array
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CBF_HTML      html         char array
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //               url*         char array
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CBF_RTF       data         byte array
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CBF_BOOKMARK  html         char array
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //               url          char array
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CBF_WEBKIT    none         empty vector
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CBF_SMBITMAP  shared_mem   A pointer to an unmapped base::SharedMemory
173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  //                            object containing the bitmap data. The bitmap
174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  //                            data should be premultiplied.
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //               size         gfx::Size struct
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CBF_DATA      format       char array
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //               data         byte array
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::vector<char> ObjectMapParam;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::vector<ObjectMapParam> ObjectMapParams;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<int /* ObjectType */, ObjectMapParams> ObjectMap;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  static bool IsSupportedClipboardType(int32 type) {
1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    switch (type) {
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case CLIPBOARD_TYPE_COPY_PASTE:
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return true;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11) && !defined(OS_CHROMEOS)
1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case CLIPBOARD_TYPE_SELECTION:
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return true;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  static ClipboardType FromInt(int32 type) {
1954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return static_cast<ClipboardType>(type);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the list of threads that are allowed to access the clipboard.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void SetAllowedThreads(
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<base::PlatformThreadId>& allowed_threads);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the clipboard object for the current thread.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Most implementations will have at most one clipboard which will live on
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the main UI thread, but Windows has tricky semantics where there have to
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be two clipboards: one that lives on the UI thread and one that lives on
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the IO thread.
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static Clipboard* GetForCurrentThread();
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Destroys the clipboard for the current thread. Usually, this will clean up
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // all clipboards, except on Windows. (Previous code leaks the IO thread
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // clipboard, so it shouldn't be a problem.)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void DestroyClipboardForCurrentThread();
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Write a bunch of objects to the system clipboard. Copies are made of the
216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // contents of |objects|.
217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Note: If you're thinking about calling this, you should probably be using
218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // ScopedClipboardWriter instead.
2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void WriteObjects(ClipboardType type, const ObjectMap& objects);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a sequence number which uniquely identifies clipboard state.
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This can be used to version the data on the clipboard and determine
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // whether it has changed.
2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  uint64 GetSequenceNumber(ClipboardType type);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tests whether the clipboard contains a certain format
2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool IsFormatAvailable(const FormatType& format, ClipboardType type) const;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear the clipboard data.
2304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void Clear(ClipboardType type);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void ReadAvailableTypes(ClipboardType type,
233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                          std::vector<base::string16>* types,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          bool* contains_filenames) const;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads UNICODE text from the clipboard, if available.
237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void ReadText(ClipboardType type, base::string16* result) const;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads ASCII text from the clipboard, if available.
2404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void ReadAsciiText(ClipboardType type, std::string* result) const;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads HTML from the clipboard, if available. If the HTML fragment requires
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // context to parse, |fragment_start| and |fragment_end| are indexes into
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // markup indicating the beginning and end of the actual fragment. Otherwise,
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // they will contain 0 and markup->size().
2464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void ReadHTML(ClipboardType type,
247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                base::string16* markup,
2484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                std::string* src_url,
2494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                uint32* fragment_start,
2504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                uint32* fragment_end) const;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads RTF from the clipboard, if available. Stores the result as a byte
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // vector.
2544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void ReadRTF(ClipboardType type, std::string* result) const;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads an image from the clipboard, if available.
2574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SkBitmap ReadImage(ClipboardType type) const;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void ReadCustomData(ClipboardType clipboard_type,
260a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                      const base::string16& type,
261a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                      base::string16* result) const;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads a bookmark from the clipboard, if available.
264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void ReadBookmark(base::string16* title, std::string* url) const;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads raw data from the clipboard with the given format type. Stores result
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // as a byte vector.
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReadData(const FormatType& format, std::string* result) const;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the FormatType corresponding to an arbitrary format string,
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // registering it with the system if needed. Due to Windows/Linux
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // limitiations, |format_string| must never be controlled by the user.
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static FormatType GetFormatType(const std::string& format_string);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get format identifiers for various types.
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const FormatType& GetUrlFormatType();
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const FormatType& GetUrlWFormatType();
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const FormatType& GetMozUrlFormatType();
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const FormatType& GetPlainTextFormatType();
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const FormatType& GetPlainTextWFormatType();
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const FormatType& GetFilenameFormatType();
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const FormatType& GetFilenameWFormatType();
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const FormatType& GetWebKitSmartPasteFormatType();
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Win: MS HTML Format, Other: Generic HTML format
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const FormatType& GetHtmlFormatType();
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const FormatType& GetRtfFormatType();
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const FormatType& GetBitmapFormatType();
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(raymes): Unify web custom data and pepper custom data:
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // crbug.com/158399.
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const FormatType& GetWebCustomDataFormatType();
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const FormatType& GetPepperCustomDataFormatType();
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Embeds a pointer to a SharedMemory object pointed to by |bitmap_handle|
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // belonging to |process| into a shared bitmap [CBF_SMBITMAP] slot in
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |objects|.  The pointer is deleted by DispatchObjects().
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // On non-Windows platforms, |process| is ignored.
298f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  static bool ReplaceSharedMemHandle(ObjectMap* objects,
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     base::SharedMemoryHandle bitmap_handle,
300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                     base::ProcessHandle process)
301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      WARN_UNUSED_RESULT;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Firefox text/html
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const FormatType& GetTextHtmlFormatType();
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const FormatType& GetCFHDropFormatType();
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const FormatType& GetFileDescriptorFormatType();
30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static const FormatType& GetFileContentZeroFormatType();
3087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  static const FormatType& GetIDListFormatType();
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(ClipboardTest, SharedBitmapTest);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(ClipboardTest, EmptyHTMLTest);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class ClipboardTest;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Clipboard();
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~Clipboard();
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DispatchObject(ObjectType type, const ObjectMapParams& params);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WriteText(const char* text_data, size_t text_len);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WriteHTML(const char* markup_data,
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 size_t markup_len,
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const char* url_data,
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 size_t url_len);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WriteRTF(const char* rtf_data, size_t data_len);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WriteBookmark(const char* title_data,
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     size_t title_len,
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const char* url_data,
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     size_t url_len);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WriteWebSmartPaste();
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
337f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void WriteBitmap(const SkBitmap& bitmap);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WriteData(const FormatType& format,
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const char* data_data,
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 size_t data_len);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WriteBitmapFromHandle(HBITMAP source_hbitmap,
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const gfx::Size& size);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Safely write to system clipboard. Free |handle| on failure.
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WriteToClipboard(unsigned int format, HANDLE handle);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
349a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  static void ParseBookmarkClipboardFormat(const base::string16& bookmark,
350a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                           base::string16* title,
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           std::string* url);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Free a handle depending on its type (as intuited from format)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void FreeData(unsigned int format, HANDLE data);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return the window that should be the clipboard owner, creating it
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if neccessary.  Marked const for lazily initialization by const methods.
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HWND GetClipboardWindow() const;
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Mark this as mutable so const methods can still do lazy initialization.
361eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  mutable scoped_ptr<base::win::MessageWindow> clipboard_owner_;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(TOOLKIT_GTK)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The public API is via WriteObjects() which dispatches to multiple
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Write*() calls, but on GTK we must write all the clipboard types
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in a single GTK call.  To support this we store the current set
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of data we intend to put on the clipboard on clipboard_data_ as
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WriteObjects is running, and then at the end call SetGtkClipboard
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // which replaces whatever is on the system clipboard with the
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // contents of clipboard_data_.
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<std::string, std::pair<char*, size_t> > TargetMap;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Write changes to gtk clipboard.
3774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void SetGtkClipboard(ClipboardType type);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Insert a mapping into clipboard_data_.
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InsertMapping(const char* key, char* data, size_t data_len);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Find the gtk clipboard for the passed type enum.
3824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  GtkClipboard* LookupBackingClipboard(ClipboardType type) const;
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TargetMap* clipboard_data_;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkClipboard* clipboard_;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkClipboard* primary_selection_;
387d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#elif defined(USE_CLIPBOARD_AURAX11)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We keep our implementation details private because otherwise we bring in
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the X11 headers and break chrome compile.
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class AuraX11Details;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<AuraX11Details> aurax11_details_;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(Clipboard);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // UI_BASE_CLIPBOARD_CLIPBOARD_H_
401