clipboard_aura.cc revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
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)#include "ui/base/clipboard/clipboard.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/clipboard/custom_data_helper.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMimeTypeFilename[] = "chromium/filename";
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMimeTypeBitmap[] = "image/bmp";
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMimeTypePepperCustomData[] = "chromium/x-pepper-custom-data";
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMimeTypeWebkitSmartPaste[] = "chromium/x-webkit-paste";
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t kMaxClipboardSize = 1;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Clipboard data format used by AuraClipboard.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum AuraClipboardFormat {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TEXT      = 1 << 0,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTML      = 1 << 1,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RTF       = 1 << 2,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BOOKMARK  = 1 << 3,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BITMAP    = 1 << 4,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CUSTOM    = 1 << 5,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WEB       = 1 << 6,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ClipboardData contains data copied to the Clipboard for a variety of formats.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It mostly just provides APIs to cleanly access and manipulate this data.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ClipboardData {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClipboardData()
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : bitmap_data_(),
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        web_smart_paste_(false),
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        format_(0) {}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ClipboardData() {}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bitmask of AuraClipboardFormat types.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int format() const { return format_; }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& text() const { return text_; }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_text(const std::string& text) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text_ = text;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    format_ |= TEXT;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& markup_data() const { return markup_data_; }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_markup_data(const std::string& markup_data) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    markup_data_ = markup_data;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    format_ |= HTML;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& rtf_data() const { return rtf_data_; }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetRTFData(const std::string& rtf_data) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rtf_data_ = rtf_data;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    format_ |= RTF;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& url() const { return url_; }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_url(const std::string& url) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_ = url;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    format_ |= HTML;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& bookmark_title() const { return bookmark_title_; }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_bookmark_title(const std::string& bookmark_title) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bookmark_title_ = bookmark_title;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    format_ |= BOOKMARK;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& bookmark_url() const { return bookmark_url_; }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_bookmark_url(const std::string& bookmark_url) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bookmark_url_ = bookmark_url;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    format_ |= BOOKMARK;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8_t* bitmap_data() const { return bitmap_data_.get(); }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Size& bitmap_size() const { return bitmap_size_; }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetBitmapData(const char* pixel_data, const char* size_data) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bitmap_size_ = *reinterpret_cast<const gfx::Size*>(size_data);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We assume 4-byte pixel data.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t bitmap_data_len = 4 * bitmap_size_.width() * bitmap_size_.height();
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bitmap_data_.reset(new uint8_t[bitmap_data_len]);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(bitmap_data_.get(), pixel_data, bitmap_data_len);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    format_ |= BITMAP;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& custom_data_format() const { return custom_data_format_; }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& custom_data_data() const { return custom_data_data_; }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetCustomData(const std::string& data_format,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const std::string& data_data) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (data_data.size() == 0) {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      custom_data_data_.clear();
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      custom_data_format_.clear();
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    custom_data_data_ = data_data;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    custom_data_format_ = data_format;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    format_ |= CUSTOM;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool web_smart_paste() const { return web_smart_paste_; }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_web_smart_paste(bool web_smart_paste) {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_smart_paste_ = web_smart_paste;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    format_ |= WEB;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Plain text in UTF8 format.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string text_;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HTML markup data in UTF8 format.
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string markup_data_;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string url_;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // RTF data.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string rtf_data_;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bookmark title in UTF8 format.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string bookmark_title_;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string bookmark_url_;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Filenames.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> files_;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bitmap images.
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<uint8_t[]> bitmap_data_;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size bitmap_size_;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Data with custom format.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string custom_data_format_;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string custom_data_data_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebKit smart paste data.
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool web_smart_paste_;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int format_;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ClipboardData);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Platform clipboard implementation for Aura. This handles things like format
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// conversion, versioning of clipboard items etc. The goal is to roughly provide
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a substitute to platform clipboards on other platforms such as GtkClipboard
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// on gtk or winapi clipboard on win.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AuraClipboard {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AuraClipboard() {}
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~AuraClipboard() {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Clear();
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Clear() {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STLDeleteContainerPointers(data_list_.begin(), data_list_.end());
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data_list_.clear();
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the number of entries currently in the clipboard stack.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t GetNumClipboardEntries() {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return data_list_.size();
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the data currently on the top of the clipboard stack, NULL if the
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // clipboard stack is empty.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ClipboardData* GetData() const {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (data_list_.empty())
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return data_list_.front();
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the data on top of the clipboard stack has format |format|
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // or another format that can be converted to |format|.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsFormatAvailable(AuraClipboardFormat format) const {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (format) {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case TEXT:
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return HasFormat(TEXT) || HasFormat(BOOKMARK);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return HasFormat(format);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads text from the data at the top of clipboard stack.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReadText(string16* result) const {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string utf8_result;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReadAsciiText(&utf8_result);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *result = UTF8ToUTF16(utf8_result);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads ascii text from the data at the top of clipboard stack.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReadAsciiText(std::string* result) const {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result->clear();
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ClipboardData* data = GetData();
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!data)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (HasFormat(TEXT))
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *result = data->text();
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (HasFormat(HTML))
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *result = data->markup_data();
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (HasFormat(BOOKMARK))
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *result = data->bookmark_url();
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads HTML from the data at the top of clipboard stack.
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReadHTML(string16* markup,
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                std::string* src_url,
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                uint32* fragment_start,
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                uint32* fragment_end) const {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    markup->clear();
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (src_url)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      src_url->clear();
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *fragment_start = 0;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *fragment_end = 0;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!HasFormat(HTML))
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ClipboardData* data = GetData();
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *markup = UTF8ToUTF16(data->markup_data());
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *src_url = data->url();
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *fragment_start = 0;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_LE(markup->length(), kuint32max);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *fragment_end = static_cast<uint32>(markup->length());
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads RTF from the data at the top of clipboard stack.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReadRTF(std::string* result) const {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result->clear();
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ClipboardData* data = GetData();
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!HasFormat(RTF))
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *result = data->rtf_data();
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads image from the data at the top of clipboard stack.
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkBitmap ReadImage() const {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkBitmap img;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!HasFormat(BITMAP))
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return img;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ClipboardData* data = GetData();
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Size size = data->bitmap_size();
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint8_t* bitmap = data->bitmap_data();
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    img.setConfig(SkBitmap::kARGB_8888_Config, size.width(), size.height(), 0);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    img.allocPixels();
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    img.eraseARGB(0, 0, 0, 0);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(img.getPixels(), bitmap, size.width() * size.height() * 4);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return img;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads data of type |type| from the data at the top of clipboard stack.
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReadCustomData(const string16& type, string16* result) const {
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result->clear();
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ClipboardData* data = GetData();
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!HasFormat(CUSTOM))
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::ReadCustomDataForType(data->custom_data_data().c_str(),
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        data->custom_data_data().size(),
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        type, result);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads bookmark from the data at the top of clipboard stack.
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReadBookmark(string16* title, std::string* url) const {
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    title->clear();
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url->clear();
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!HasFormat(BOOKMARK))
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ClipboardData* data = GetData();
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *title = UTF8ToUTF16(data->bookmark_title());
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *url = data->bookmark_url();
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReadData(const std::string& type, std::string* result) const {
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result->clear();
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ClipboardData* data = GetData();
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!HasFormat(CUSTOM) || type != data->custom_data_format())
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *result = data->custom_data_data();
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Writes |data| to the top of the clipboard stack.
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WriteData(ClipboardData* data) {
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(data);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddToListEnsuringSize(data);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if the data on top of the clipboard stack has format |format|.
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasFormat(AuraClipboardFormat format) const {
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ClipboardData* data = GetData();
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!data)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return data->format() & format;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddToListEnsuringSize(ClipboardData* data) {
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(data);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data_list_.push_front(data);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If the size of list becomes more than the maximum allowed, we delete the
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // last element.
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (data_list_.size() > kMaxClipboardSize) {
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ClipboardData* last = data_list_.back();
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_list_.pop_back();
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete last;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stack containing various versions of ClipboardData.
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::list<ClipboardData*> data_list_;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AuraClipboard);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AuraClipboard* aura_clipboard = NULL;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AuraClipboard* GetClipboard() {
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!aura_clipboard)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura_clipboard = new AuraClipboard();
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return aura_clipboard;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeleteClipboard() {
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (aura_clipboard)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete aura_clipboard;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura_clipboard = NULL;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper class to build a ClipboardData object and write it to clipboard.
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ClipboardDataBuilder {
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void CommitToClipboard() {
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(current_data_);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetClipboard()->WriteData(current_data_);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    current_data_ = NULL;
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void WriteText(const char* text_data, size_t text_len) {
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClipboardData* data = GetCurrentData();
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data->set_text(std::string(text_data, text_len));
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void WriteHTML(const char* markup_data,
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        size_t markup_len,
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const char* url_data,
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        size_t url_len) {
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClipboardData* data = GetCurrentData();
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data->set_markup_data(std::string(markup_data, markup_len));
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data->set_url(std::string(url_data, url_len));
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void WriteRTF(const char* rtf_data, size_t rtf_len) {
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClipboardData* data = GetCurrentData();
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data->SetRTFData(std::string(rtf_data, rtf_len));
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void WriteBookmark(const char* title_data,
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            size_t title_len,
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const char* url_data,
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            size_t url_len) {
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClipboardData* data = GetCurrentData();
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data->set_bookmark_title(std::string(title_data, title_len));
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data->set_bookmark_url(std::string(url_data, url_len));
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void WriteWebSmartPaste() {
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClipboardData* data = GetCurrentData();
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data->set_web_smart_paste(true);
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void WriteBitmap(const char* pixel_data, const char* size_data) {
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClipboardData* data = GetCurrentData();
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data->SetBitmapData(pixel_data, size_data);
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void WriteData(const std::string& format,
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const char* data_data,
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        size_t data_len) {
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClipboardData* data = GetCurrentData();
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data->SetCustomData(format, std::string(data_data, data_len));
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static ClipboardData* GetCurrentData() {
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!current_data_)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      current_data_ = new ClipboardData;
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return current_data_;
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static ClipboardData* current_data_;
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ClipboardData* ClipboardDataBuilder::current_data_ = NULL;
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Clipboard::FormatType::FormatType() {
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Clipboard::FormatType::FormatType(const std::string& native_format)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : data_(native_format) {
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Clipboard::FormatType::~FormatType() {
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string Clipboard::FormatType::Serialize() const {
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return data_;
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Clipboard::FormatType Clipboard::FormatType::Deserialize(
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& serialization) {
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return FormatType(serialization);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool Clipboard::FormatType::operator<(const FormatType& other) const {
43790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return data_ < other.data_;
43890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
43990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Clipboard::FormatType::Equals(const FormatType& other) const {
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return data_ == other.data_;
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Clipboard::Clipboard() {
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure clipboard is created.
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClipboard();
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Clipboard::~Clipboard() {
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteClipboard();
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void Clipboard::WriteObjects(ClipboardType type, const ObjectMap& objects) {
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
4574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(IsSupportedClipboardType(type));
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ObjectMap::const_iterator iter = objects.begin();
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       iter != objects.end(); ++iter) {
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DispatchObject(static_cast<ObjectType>(iter->first), iter->second);
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClipboardDataBuilder::CommitToClipboard();
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Clipboard::IsFormatAvailable(const FormatType& format,
4664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                  ClipboardType type) const {
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
4684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(IsSupportedClipboardType(type));
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AuraClipboard* clipboard = GetClipboard();
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetPlainTextFormatType().Equals(format) ||
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetUrlFormatType().Equals(format))
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return clipboard->IsFormatAvailable(TEXT);
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (GetHtmlFormatType().Equals(format))
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return clipboard->IsFormatAvailable(HTML);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (GetRtfFormatType().Equals(format))
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return clipboard->IsFormatAvailable(RTF);
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (GetBitmapFormatType().Equals(format))
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return clipboard->IsFormatAvailable(BITMAP);
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (GetWebKitSmartPasteFormatType().Equals(format))
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return clipboard->IsFormatAvailable(WEB);
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else {
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ClipboardData* data = clipboard->GetData();
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (data && data->custom_data_format() == format.ToString())
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void Clipboard::Clear(ClipboardType type) {
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
4914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(IsSupportedClipboardType(type));
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AuraClipboard* clipboard = GetClipboard();
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  clipboard->Clear();
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void Clipboard::ReadAvailableTypes(ClipboardType type,
4974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   std::vector<string16>* types,
4984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   bool* contains_filenames) const {
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!types || !contains_filenames) {
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types->clear();
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *contains_filenames = false;
5074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (IsFormatAvailable(GetPlainTextFormatType(), type))
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    types->push_back(UTF8ToUTF16(GetPlainTextFormatType().ToString()));
5094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (IsFormatAvailable(GetHtmlFormatType(), type))
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    types->push_back(UTF8ToUTF16(GetHtmlFormatType().ToString()));
5114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (IsFormatAvailable(GetRtfFormatType(), type))
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    types->push_back(UTF8ToUTF16(GetRtfFormatType().ToString()));
5134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (IsFormatAvailable(GetBitmapFormatType(), type))
514b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    types->push_back(UTF8ToUTF16(kMimeTypePNG));
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AuraClipboard* clipboard = GetClipboard();
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (clipboard->IsFormatAvailable(CUSTOM) && clipboard->GetData()) {
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::ReadCustomDataTypes(clipboard->GetData()->custom_data_data().c_str(),
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        clipboard->GetData()->custom_data_data().size(), types);
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void Clipboard::ReadText(ClipboardType type, string16* result) const {
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClipboard()->ReadText(result);
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void Clipboard::ReadAsciiText(ClipboardType type, std::string* result) const {
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClipboard()->ReadAsciiText(result);
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void Clipboard::ReadHTML(ClipboardType type,
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         string16* markup,
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         std::string* src_url,
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         uint32* fragment_start,
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         uint32* fragment_end) const {
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClipboard()->ReadHTML(markup, src_url, fragment_start, fragment_end);
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void Clipboard::ReadRTF(ClipboardType type, std::string* result) const {
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClipboard()->ReadRTF(result);
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SkBitmap Clipboard::ReadImage(ClipboardType type) const {
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetClipboard()->ReadImage();
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void Clipboard::ReadCustomData(ClipboardType clipboard_type,
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const string16& type,
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               string16* result) const {
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClipboard()->ReadCustomData(type, result);
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::ReadBookmark(string16* title, std::string* url) const {
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClipboard()->ReadBookmark(title, url);
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::ReadData(const FormatType& format, std::string* result) const {
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClipboard()->ReadData(format.ToString(), result);
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)uint64 Clipboard::GetSequenceNumber(ClipboardType type) {
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetClipboard()->GetNumClipboardEntries();
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::WriteText(const char* text_data, size_t text_len) {
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClipboardDataBuilder::WriteText(text_data, text_len);
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::WriteHTML(const char* markup_data,
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          size_t markup_len,
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const char* url_data,
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          size_t url_len) {
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClipboardDataBuilder::WriteHTML(markup_data, markup_len, url_data, url_len);
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::WriteRTF(const char* rtf_data, size_t data_len) {
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClipboardDataBuilder::WriteRTF(rtf_data, data_len);
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::WriteBookmark(const char* title_data,
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              size_t title_len,
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const char* url_data,
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              size_t url_len) {
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClipboardDataBuilder::WriteBookmark(title_data, title_len, url_data, url_len);
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::WriteWebSmartPaste() {
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClipboardDataBuilder::WriteWebSmartPaste();
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::WriteBitmap(const char* pixel_data, const char* size_data) {
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClipboardDataBuilder::WriteBitmap(pixel_data, size_data);
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::WriteData(const FormatType& format,
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const char* data_data,
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          size_t data_len) {
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClipboardDataBuilder::WriteData(format.ToString(), data_data, data_len);
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Clipboard::FormatType Clipboard::GetFormatType(
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& format_string) {
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return FormatType::Deserialize(format_string);
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetUrlFormatType() {
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeURIList));
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type;
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetUrlWFormatType() {
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetUrlFormatType();
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetPlainTextFormatType() {
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeText));
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type;
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetPlainTextWFormatType() {
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetPlainTextFormatType();
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetFilenameFormatType() {
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeFilename));
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type;
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetFilenameWFormatType() {
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Clipboard::GetFilenameFormatType();
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetHtmlFormatType() {
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeHTML));
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type;
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetRtfFormatType() {
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeRTF));
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type;
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetBitmapFormatType() {
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeBitmap));
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type;
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetWebKitSmartPasteFormatType() {
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeWebkitSmartPaste));
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type;
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetWebCustomDataFormatType() {
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeWebCustomData));
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type;
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetPepperCustomDataFormatType() {
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypePepperCustomData));
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type;
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
686