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()
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      : web_smart_paste_(false),
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        format_(0) {}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ClipboardData() {}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bitmask of AuraClipboardFormat types.
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int format() const { return format_; }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& text() const { return text_; }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_text(const std::string& text) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text_ = text;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    format_ |= TEXT;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& markup_data() const { return markup_data_; }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_markup_data(const std::string& markup_data) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    markup_data_ = markup_data;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    format_ |= HTML;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& rtf_data() const { return rtf_data_; }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetRTFData(const std::string& rtf_data) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rtf_data_ = rtf_data;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    format_ |= RTF;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& url() const { return url_; }
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_url(const std::string& url) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_ = url;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    format_ |= HTML;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& bookmark_title() const { return bookmark_title_; }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_bookmark_title(const std::string& bookmark_title) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bookmark_title_ = bookmark_title;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    format_ |= BOOKMARK;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& bookmark_url() const { return bookmark_url_; }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_bookmark_url(const std::string& bookmark_url) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bookmark_url_ = bookmark_url;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    format_ |= BOOKMARK;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const SkBitmap& bitmap() const { return bitmap_; }
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void SetBitmapData(const SkBitmap& bitmap) {
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    bitmap.copyTo(&bitmap_);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    format_ |= BITMAP;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& custom_data_format() const { return custom_data_format_; }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& custom_data_data() const { return custom_data_data_; }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetCustomData(const std::string& data_format,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const std::string& data_data) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (data_data.size() == 0) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      custom_data_data_.clear();
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      custom_data_format_.clear();
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    custom_data_data_ = data_data;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    custom_data_format_ = data_format;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    format_ |= CUSTOM;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool web_smart_paste() const { return web_smart_paste_; }
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_web_smart_paste(bool web_smart_paste) {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_smart_paste_ = web_smart_paste;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    format_ |= WEB;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Plain text in UTF8 format.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string text_;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HTML markup data in UTF8 format.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string markup_data_;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string url_;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // RTF data.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string rtf_data_;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bookmark title in UTF8 format.
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string bookmark_title_;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string bookmark_url_;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Filenames.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> files_;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bitmap images.
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SkBitmap bitmap_;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Data with custom format.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string custom_data_format_;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string custom_data_data_;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebKit smart paste data.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool web_smart_paste_;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int format_;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ClipboardData);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Platform clipboard implementation for Aura. This handles things like format
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// conversion, versioning of clipboard items etc. The goal is to roughly provide
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a substitute to platform clipboards on other platforms such as GtkClipboard
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// on gtk or winapi clipboard on win.
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AuraClipboard {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AuraClipboard() : sequence_number_(0) {
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~AuraClipboard() {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Clear();
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Clear() {
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    sequence_number_++;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STLDeleteContainerPointers(data_list_.begin(), data_list_.end());
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data_list_.clear();
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  uint64_t sequence_number() const {
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return sequence_number_;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the data currently on the top of the clipboard stack, NULL if the
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // clipboard stack is empty.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ClipboardData* GetData() const {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (data_list_.empty())
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return data_list_.front();
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the data on top of the clipboard stack has format |format|
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // or another format that can be converted to |format|.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsFormatAvailable(AuraClipboardFormat format) const {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (format) {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case TEXT:
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return HasFormat(TEXT) || HasFormat(BOOKMARK);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return HasFormat(format);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads text from the data at the top of clipboard stack.
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void ReadText(base::string16* result) const {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string utf8_result;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReadAsciiText(&utf8_result);
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    *result = base::UTF8ToUTF16(utf8_result);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads ascii text from the data at the top of clipboard stack.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReadAsciiText(std::string* result) const {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result->clear();
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ClipboardData* data = GetData();
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!data)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (HasFormat(TEXT))
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *result = data->text();
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (HasFormat(HTML))
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *result = data->markup_data();
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (HasFormat(BOOKMARK))
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *result = data->bookmark_url();
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads HTML from the data at the top of clipboard stack.
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void ReadHTML(base::string16* markup,
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                std::string* src_url,
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                uint32* fragment_start,
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                uint32* fragment_end) const {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    markup->clear();
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (src_url)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      src_url->clear();
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *fragment_start = 0;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *fragment_end = 0;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!HasFormat(HTML))
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ClipboardData* data = GetData();
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    *markup = base::UTF8ToUTF16(data->markup_data());
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *src_url = data->url();
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *fragment_start = 0;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_LE(markup->length(), kuint32max);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *fragment_end = static_cast<uint32>(markup->length());
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads RTF from the data at the top of clipboard stack.
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReadRTF(std::string* result) const {
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result->clear();
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ClipboardData* data = GetData();
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!HasFormat(RTF))
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *result = data->rtf_data();
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads image from the data at the top of clipboard stack.
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkBitmap ReadImage() const {
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkBitmap img;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!HasFormat(BITMAP))
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return img;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // A shallow copy should be fine here, but just to be safe...
250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const SkBitmap& clipboard_bitmap = GetData()->bitmap();
251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    clipboard_bitmap.copyTo(&img);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return img;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads data of type |type| from the data at the top of clipboard stack.
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void ReadCustomData(const base::string16& type,
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      base::string16* result) const {
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result->clear();
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ClipboardData* data = GetData();
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!HasFormat(CUSTOM))
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::ReadCustomDataForType(data->custom_data_data().c_str(),
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        data->custom_data_data().size(),
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        type, result);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads bookmark from the data at the top of clipboard stack.
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void ReadBookmark(base::string16* title, std::string* url) const {
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    title->clear();
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url->clear();
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!HasFormat(BOOKMARK))
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ClipboardData* data = GetData();
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    *title = base::UTF8ToUTF16(data->bookmark_title());
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *url = data->bookmark_url();
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReadData(const std::string& type, std::string* result) const {
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result->clear();
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ClipboardData* data = GetData();
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!HasFormat(CUSTOM) || type != data->custom_data_format())
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *result = data->custom_data_data();
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Writes |data| to the top of the clipboard stack.
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WriteData(ClipboardData* data) {
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(data);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddToListEnsuringSize(data);
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if the data on top of the clipboard stack has format |format|.
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasFormat(AuraClipboardFormat format) const {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ClipboardData* data = GetData();
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!data)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return data->format() & format;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddToListEnsuringSize(ClipboardData* data) {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(data);
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    sequence_number_++;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data_list_.push_front(data);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If the size of list becomes more than the maximum allowed, we delete the
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // last element.
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (data_list_.size() > kMaxClipboardSize) {
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ClipboardData* last = data_list_.back();
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_list_.pop_back();
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete last;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stack containing various versions of ClipboardData.
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::list<ClipboardData*> data_list_;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Sequence number uniquely identifying clipboard state.
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  uint64_t sequence_number_;
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AuraClipboard);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AuraClipboard* aura_clipboard = NULL;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AuraClipboard* GetClipboard() {
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!aura_clipboard)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura_clipboard = new AuraClipboard();
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return aura_clipboard;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeleteClipboard() {
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (aura_clipboard)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete aura_clipboard;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura_clipboard = NULL;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper class to build a ClipboardData object and write it to clipboard.
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ClipboardDataBuilder {
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void CommitToClipboard() {
346a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    GetClipboard()->WriteData(GetCurrentData());
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    current_data_ = NULL;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void WriteText(const char* text_data, size_t text_len) {
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClipboardData* data = GetCurrentData();
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data->set_text(std::string(text_data, text_len));
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void WriteHTML(const char* markup_data,
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        size_t markup_len,
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const char* url_data,
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        size_t url_len) {
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClipboardData* data = GetCurrentData();
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data->set_markup_data(std::string(markup_data, markup_len));
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data->set_url(std::string(url_data, url_len));
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void WriteRTF(const char* rtf_data, size_t rtf_len) {
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClipboardData* data = GetCurrentData();
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data->SetRTFData(std::string(rtf_data, rtf_len));
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void WriteBookmark(const char* title_data,
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            size_t title_len,
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const char* url_data,
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            size_t url_len) {
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClipboardData* data = GetCurrentData();
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data->set_bookmark_title(std::string(title_data, title_len));
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data->set_bookmark_url(std::string(url_data, url_len));
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void WriteWebSmartPaste() {
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClipboardData* data = GetCurrentData();
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data->set_web_smart_paste(true);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
383f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  static void WriteBitmap(const SkBitmap& bitmap) {
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClipboardData* data = GetCurrentData();
385f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    data->SetBitmapData(bitmap);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void WriteData(const std::string& format,
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const char* data_data,
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        size_t data_len) {
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClipboardData* data = GetCurrentData();
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data->SetCustomData(format, std::string(data_data, data_len));
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static ClipboardData* GetCurrentData() {
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!current_data_)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      current_data_ = new ClipboardData;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return current_data_;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static ClipboardData* current_data_;
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ClipboardData* ClipboardDataBuilder::current_data_ = NULL;
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Clipboard::FormatType::FormatType() {
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Clipboard::FormatType::FormatType(const std::string& native_format)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : data_(native_format) {
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Clipboard::FormatType::~FormatType() {
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string Clipboard::FormatType::Serialize() const {
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return data_;
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Clipboard::FormatType Clipboard::FormatType::Deserialize(
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& serialization) {
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return FormatType(serialization);
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool Clipboard::FormatType::operator<(const FormatType& other) const {
43090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return data_ < other.data_;
43190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
43290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Clipboard::FormatType::Equals(const FormatType& other) const {
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return data_ == other.data_;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Clipboard::Clipboard() {
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure clipboard is created.
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClipboard();
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Clipboard::~Clipboard() {
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteClipboard();
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void Clipboard::WriteObjects(ClipboardType type, const ObjectMap& objects) {
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
4504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(IsSupportedClipboardType(type));
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ObjectMap::const_iterator iter = objects.begin();
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       iter != objects.end(); ++iter) {
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DispatchObject(static_cast<ObjectType>(iter->first), iter->second);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClipboardDataBuilder::CommitToClipboard();
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Clipboard::IsFormatAvailable(const FormatType& format,
4594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                  ClipboardType type) const {
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
4614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(IsSupportedClipboardType(type));
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AuraClipboard* clipboard = GetClipboard();
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetPlainTextFormatType().Equals(format) ||
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetUrlFormatType().Equals(format))
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return clipboard->IsFormatAvailable(TEXT);
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (GetHtmlFormatType().Equals(format))
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return clipboard->IsFormatAvailable(HTML);
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (GetRtfFormatType().Equals(format))
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return clipboard->IsFormatAvailable(RTF);
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (GetBitmapFormatType().Equals(format))
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return clipboard->IsFormatAvailable(BITMAP);
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (GetWebKitSmartPasteFormatType().Equals(format))
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return clipboard->IsFormatAvailable(WEB);
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else {
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ClipboardData* data = clipboard->GetData();
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (data && data->custom_data_format() == format.ToString())
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void Clipboard::Clear(ClipboardType type) {
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
4844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(IsSupportedClipboardType(type));
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AuraClipboard* clipboard = GetClipboard();
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  clipboard->Clear();
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void Clipboard::ReadAvailableTypes(ClipboardType type,
4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   std::vector<base::string16>* types,
4914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   bool* contains_filenames) const {
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!types || !contains_filenames) {
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types->clear();
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *contains_filenames = false;
5004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (IsFormatAvailable(GetPlainTextFormatType(), type))
5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    types->push_back(base::UTF8ToUTF16(GetPlainTextFormatType().ToString()));
5024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (IsFormatAvailable(GetHtmlFormatType(), type))
5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    types->push_back(base::UTF8ToUTF16(GetHtmlFormatType().ToString()));
5044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (IsFormatAvailable(GetRtfFormatType(), type))
5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    types->push_back(base::UTF8ToUTF16(GetRtfFormatType().ToString()));
5064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (IsFormatAvailable(GetBitmapFormatType(), type))
5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    types->push_back(base::UTF8ToUTF16(kMimeTypePNG));
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AuraClipboard* clipboard = GetClipboard();
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (clipboard->IsFormatAvailable(CUSTOM) && clipboard->GetData()) {
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::ReadCustomDataTypes(clipboard->GetData()->custom_data_data().c_str(),
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        clipboard->GetData()->custom_data_data().size(), types);
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Clipboard::ReadText(ClipboardType type, base::string16* result) const {
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClipboard()->ReadText(result);
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void Clipboard::ReadAsciiText(ClipboardType type, std::string* result) const {
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClipboard()->ReadAsciiText(result);
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void Clipboard::ReadHTML(ClipboardType type,
5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         base::string16* markup,
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         std::string* src_url,
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         uint32* fragment_start,
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         uint32* fragment_end) const {
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClipboard()->ReadHTML(markup, src_url, fragment_start, fragment_end);
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void Clipboard::ReadRTF(ClipboardType type, std::string* result) const {
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClipboard()->ReadRTF(result);
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SkBitmap Clipboard::ReadImage(ClipboardType type) const {
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetClipboard()->ReadImage();
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void Clipboard::ReadCustomData(ClipboardType clipboard_type,
5465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               const base::string16& type,
5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               base::string16* result) const {
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClipboard()->ReadCustomData(type, result);
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Clipboard::ReadBookmark(base::string16* title, std::string* url) const {
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClipboard()->ReadBookmark(title, url);
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::ReadData(const FormatType& format, std::string* result) const {
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClipboard()->ReadData(format.ToString(), result);
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)uint64 Clipboard::GetSequenceNumber(ClipboardType type) {
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
5645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return GetClipboard()->sequence_number();
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::WriteText(const char* text_data, size_t text_len) {
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClipboardDataBuilder::WriteText(text_data, text_len);
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::WriteHTML(const char* markup_data,
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          size_t markup_len,
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const char* url_data,
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          size_t url_len) {
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClipboardDataBuilder::WriteHTML(markup_data, markup_len, url_data, url_len);
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::WriteRTF(const char* rtf_data, size_t data_len) {
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClipboardDataBuilder::WriteRTF(rtf_data, data_len);
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::WriteBookmark(const char* title_data,
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              size_t title_len,
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const char* url_data,
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              size_t url_len) {
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClipboardDataBuilder::WriteBookmark(title_data, title_len, url_data, url_len);
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::WriteWebSmartPaste() {
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClipboardDataBuilder::WriteWebSmartPaste();
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
593f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void Clipboard::WriteBitmap(const SkBitmap& bitmap) {
594f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ClipboardDataBuilder::WriteBitmap(bitmap);
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::WriteData(const FormatType& format,
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const char* data_data,
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          size_t data_len) {
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClipboardDataBuilder::WriteData(format.ToString(), data_data, data_len);
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Clipboard::FormatType Clipboard::GetFormatType(
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& format_string) {
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return FormatType::Deserialize(format_string);
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetUrlFormatType() {
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeURIList));
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type;
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetUrlWFormatType() {
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetUrlFormatType();
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetPlainTextFormatType() {
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeText));
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type;
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetPlainTextWFormatType() {
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetPlainTextFormatType();
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetFilenameFormatType() {
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeFilename));
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type;
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetFilenameWFormatType() {
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Clipboard::GetFilenameFormatType();
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetHtmlFormatType() {
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeHTML));
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type;
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetRtfFormatType() {
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeRTF));
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type;
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetBitmapFormatType() {
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeBitmap));
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type;
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetWebKitSmartPasteFormatType() {
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeWebkitSmartPaste));
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type;
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetWebCustomDataFormatType() {
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeWebCustomData));
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type;
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetPepperCustomDataFormatType() {
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypePepperCustomData));
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type;
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
679