clipboard_aura.cc revision b2df76ea8fec9e32f6f3718986dba0d95315b29c
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"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/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,
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SOURCETAG = 1 << 7,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ClipboardData contains data copied to the Clipboard for a variety of formats.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It mostly just provides APIs to cleanly access and manipulate this data.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ClipboardData {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClipboardData()
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : bitmap_data_(),
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        source_tag_(),
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        web_smart_paste_(false),
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        format_(0) {}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ClipboardData() {}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bitmask of AuraClipboardFormat types.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int format() const { return format_; }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& text() const { return text_; }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_text(const std::string& text) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text_ = text;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    format_ |= TEXT;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& markup_data() const { return markup_data_; }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_markup_data(const std::string& markup_data) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    markup_data_ = markup_data;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    format_ |= HTML;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& rtf_data() const { return rtf_data_; }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetRTFData(const std::string& rtf_data) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rtf_data_ = rtf_data;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    format_ |= RTF;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& url() const { return url_; }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_url(const std::string& url) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_ = url;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    format_ |= HTML;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& bookmark_title() const { return bookmark_title_; }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_bookmark_title(const std::string& bookmark_title) {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bookmark_title_ = bookmark_title;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    format_ |= BOOKMARK;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& bookmark_url() const { return bookmark_url_; }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_bookmark_url(const std::string& bookmark_url) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bookmark_url_ = bookmark_url;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    format_ |= BOOKMARK;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8_t* bitmap_data() const { return bitmap_data_.get(); }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Size& bitmap_size() const { return bitmap_size_; }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetBitmapData(const char* pixel_data, const char* size_data) {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bitmap_size_ = *reinterpret_cast<const gfx::Size*>(size_data);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We assume 4-byte pixel data.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t bitmap_data_len = 4 * bitmap_size_.width() * bitmap_size_.height();
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bitmap_data_.reset(new uint8_t[bitmap_data_len]);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(bitmap_data_.get(), pixel_data, bitmap_data_len);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    format_ |= BITMAP;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& custom_data_format() const { return custom_data_format_; }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& custom_data_data() const { return custom_data_data_; }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetCustomData(const std::string& data_format,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const std::string& data_data) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (data_data.size() == 0) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      custom_data_data_.clear();
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      custom_data_format_.clear();
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    custom_data_data_ = data_data;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    custom_data_format_ = data_format;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    format_ |= CUSTOM;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool web_smart_paste() const { return web_smart_paste_; }
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_web_smart_paste(bool web_smart_paste) {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_smart_paste_ = web_smart_paste;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    format_ |= WEB;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SourceTag source_tag() const { return source_tag_; }
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void set_source_tag(SourceTag tag) {
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    source_tag_ = tag;
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    format_ |= SOURCETAG;
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Plain text in UTF8 format.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string text_;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HTML markup data in UTF8 format.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string markup_data_;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string url_;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // RTF data.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string rtf_data_;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bookmark title in UTF8 format.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string bookmark_title_;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string bookmark_url_;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Filenames.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> files_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bitmap images.
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<uint8_t[]> bitmap_data_;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size bitmap_size_;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Data with custom format.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string custom_data_format_;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string custom_data_data_;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // SourceTag.
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SourceTag source_tag_;
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebKit smart paste data.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool web_smart_paste_;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int format_;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ClipboardData);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Platform clipboard implementation for Aura. This handles things like format
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// conversion, versioning of clipboard items etc. The goal is to roughly provide
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a substitute to platform clipboards on other platforms such as GtkClipboard
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// on gtk or winapi clipboard on win.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AuraClipboard {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AuraClipboard() {}
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~AuraClipboard() {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Clear();
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Clear() {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STLDeleteContainerPointers(data_list_.begin(), data_list_.end());
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data_list_.clear();
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the number of entries currently in the clipboard stack.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t GetNumClipboardEntries() {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return data_list_.size();
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the data currently on the top of the clipboard stack, NULL if the
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // clipboard stack is empty.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ClipboardData* GetData() const {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (data_list_.empty())
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return data_list_.front();
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the data on top of the clipboard stack has format |format|
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // or another format that can be converted to |format|.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsFormatAvailable(AuraClipboardFormat format) const {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (format) {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case TEXT:
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return HasFormat(TEXT) || HasFormat(BOOKMARK);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return HasFormat(format);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads text from the data at the top of clipboard stack.
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReadText(string16* result) const {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string utf8_result;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReadAsciiText(&utf8_result);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *result = UTF8ToUTF16(utf8_result);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads ascii text from the data at the top of clipboard stack.
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReadAsciiText(std::string* result) const {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result->clear();
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ClipboardData* data = GetData();
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!data)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (HasFormat(TEXT))
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *result = data->text();
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (HasFormat(HTML))
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *result = data->markup_data();
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (HasFormat(BOOKMARK))
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *result = data->bookmark_url();
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads HTML from the data at the top of clipboard stack.
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReadHTML(string16* markup,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                std::string* src_url,
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                uint32* fragment_start,
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                uint32* fragment_end) const {
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    markup->clear();
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (src_url)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      src_url->clear();
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *fragment_start = 0;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *fragment_end = 0;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!HasFormat(HTML))
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ClipboardData* data = GetData();
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *markup = UTF8ToUTF16(data->markup_data());
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *src_url = data->url();
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *fragment_start = 0;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_LE(markup->length(), kuint32max);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *fragment_end = static_cast<uint32>(markup->length());
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads RTF from the data at the top of clipboard stack.
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReadRTF(std::string* result) const {
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result->clear();
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ClipboardData* data = GetData();
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!HasFormat(RTF))
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *result = data->rtf_data();
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads image from the data at the top of clipboard stack.
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkBitmap ReadImage() const {
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkBitmap img;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!HasFormat(BITMAP))
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return img;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ClipboardData* data = GetData();
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Size size = data->bitmap_size();
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint8_t* bitmap = data->bitmap_data();
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    img.setConfig(SkBitmap::kARGB_8888_Config, size.width(), size.height(), 0);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    img.allocPixels();
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    img.eraseARGB(0, 0, 0, 0);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(img.getPixels(), bitmap, size.width() * size.height() * 4);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return img;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads data of type |type| from the data at the top of clipboard stack.
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReadCustomData(const string16& type, string16* result) const {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result->clear();
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ClipboardData* data = GetData();
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!HasFormat(CUSTOM))
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::ReadCustomDataForType(data->custom_data_data().c_str(),
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        data->custom_data_data().size(),
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        type, result);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads bookmark from the data at the top of clipboard stack.
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReadBookmark(string16* title, std::string* url) const {
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    title->clear();
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url->clear();
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!HasFormat(BOOKMARK))
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ClipboardData* data = GetData();
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *title = UTF8ToUTF16(data->bookmark_title());
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *url = data->bookmark_url();
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReadData(const std::string& type, std::string* result) const {
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result->clear();
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ClipboardData* data = GetData();
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!HasFormat(CUSTOM) || type != data->custom_data_format())
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *result = data->custom_data_data();
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SourceTag ReadSourceTag() const {
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!HasFormat(SOURCETAG))
312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return SourceTag();
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ClipboardData* data = GetData();
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return data->source_tag();
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Writes |data| to the top of the clipboard stack.
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WriteData(ClipboardData* data) {
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(data);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddToListEnsuringSize(data);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if the data on top of the clipboard stack has format |format|.
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasFormat(AuraClipboardFormat format) const {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ClipboardData* data = GetData();
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!data)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return data->format() & format;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddToListEnsuringSize(ClipboardData* data) {
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(data);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data_list_.push_front(data);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If the size of list becomes more than the maximum allowed, we delete the
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // last element.
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (data_list_.size() > kMaxClipboardSize) {
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ClipboardData* last = data_list_.back();
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_list_.pop_back();
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete last;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stack containing various versions of ClipboardData.
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::list<ClipboardData*> data_list_;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AuraClipboard);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AuraClipboard* aura_clipboard = NULL;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AuraClipboard* GetClipboard() {
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!aura_clipboard)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura_clipboard = new AuraClipboard();
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return aura_clipboard;
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeleteClipboard() {
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (aura_clipboard)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete aura_clipboard;
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura_clipboard = NULL;
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper class to build a ClipboardData object and write it to clipboard.
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ClipboardDataBuilder {
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void CommitToClipboard() {
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(current_data_);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetClipboard()->WriteData(current_data_);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    current_data_ = NULL;
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void WriteText(const char* text_data, size_t text_len) {
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClipboardData* data = GetCurrentData();
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data->set_text(std::string(text_data, text_len));
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void WriteHTML(const char* markup_data,
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        size_t markup_len,
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const char* url_data,
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        size_t url_len) {
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClipboardData* data = GetCurrentData();
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data->set_markup_data(std::string(markup_data, markup_len));
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data->set_url(std::string(url_data, url_len));
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void WriteRTF(const char* rtf_data, size_t rtf_len) {
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClipboardData* data = GetCurrentData();
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data->SetRTFData(std::string(rtf_data, rtf_len));
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void WriteBookmark(const char* title_data,
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            size_t title_len,
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const char* url_data,
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            size_t url_len) {
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClipboardData* data = GetCurrentData();
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data->set_bookmark_title(std::string(title_data, title_len));
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data->set_bookmark_url(std::string(url_data, url_len));
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void WriteWebSmartPaste() {
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClipboardData* data = GetCurrentData();
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data->set_web_smart_paste(true);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void WriteBitmap(const char* pixel_data, const char* size_data) {
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClipboardData* data = GetCurrentData();
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data->SetBitmapData(pixel_data, size_data);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void WriteData(const std::string& format,
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const char* data_data,
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        size_t data_len) {
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClipboardData* data = GetCurrentData();
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data->SetCustomData(format, std::string(data_data, data_len));
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static void WriteSourceTag(SourceTag tag) {
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ClipboardData* data = GetCurrentData();
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    data->set_source_tag(tag);
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static ClipboardData* GetCurrentData() {
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!current_data_)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      current_data_ = new ClipboardData;
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return current_data_;
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static ClipboardData* current_data_;
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ClipboardData* ClipboardDataBuilder::current_data_ = NULL;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Clipboard::FormatType::FormatType() {
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Clipboard::FormatType::FormatType(const std::string& native_format)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : data_(native_format) {
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Clipboard::FormatType::~FormatType() {
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string Clipboard::FormatType::Serialize() const {
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return data_;
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Clipboard::FormatType Clipboard::FormatType::Deserialize(
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& serialization) {
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return FormatType(serialization);
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Clipboard::FormatType::Equals(const FormatType& other) const {
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return data_ == other.data_;
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Clipboard::Clipboard() {
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure clipboard is created.
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClipboard();
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Clipboard::~Clipboard() {
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteClipboard();
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Clipboard::WriteObjectsImpl(Buffer buffer,
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 const ObjectMap& objects,
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 SourceTag tag) {
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(IsValidBuffer(buffer));
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ObjectMap::const_iterator iter = objects.begin();
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       iter != objects.end(); ++iter) {
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DispatchObject(static_cast<ObjectType>(iter->first), iter->second);
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WriteSourceTag(tag);
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClipboardDataBuilder::CommitToClipboard();
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Clipboard::IsFormatAvailable(const FormatType& format,
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  Buffer buffer) const {
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(IsValidBuffer(buffer));
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AuraClipboard* clipboard = GetClipboard();
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetPlainTextFormatType().Equals(format) ||
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetUrlFormatType().Equals(format))
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return clipboard->IsFormatAvailable(TEXT);
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (GetHtmlFormatType().Equals(format))
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return clipboard->IsFormatAvailable(HTML);
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (GetRtfFormatType().Equals(format))
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return clipboard->IsFormatAvailable(RTF);
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (GetBitmapFormatType().Equals(format))
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return clipboard->IsFormatAvailable(BITMAP);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (GetWebKitSmartPasteFormatType().Equals(format))
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return clipboard->IsFormatAvailable(WEB);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else {
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ClipboardData* data = clipboard->GetData();
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (data && data->custom_data_format() == format.ToString())
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::Clear(Buffer buffer) {
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(IsValidBuffer(buffer));
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AuraClipboard* clipboard = GetClipboard();
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  clipboard->Clear();
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::ReadAvailableTypes(Buffer buffer, std::vector<string16>* types,
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool* contains_filenames) const {
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!types || !contains_filenames) {
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types->clear();
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *contains_filenames = false;
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsFormatAvailable(GetPlainTextFormatType(), buffer))
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    types->push_back(UTF8ToUTF16(GetPlainTextFormatType().ToString()));
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsFormatAvailable(GetHtmlFormatType(), buffer))
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    types->push_back(UTF8ToUTF16(GetHtmlFormatType().ToString()));
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsFormatAvailable(GetRtfFormatType(), buffer))
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    types->push_back(UTF8ToUTF16(GetRtfFormatType().ToString()));
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsFormatAvailable(GetBitmapFormatType(), buffer))
535b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    types->push_back(UTF8ToUTF16(kMimeTypePNG));
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AuraClipboard* clipboard = GetClipboard();
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (clipboard->IsFormatAvailable(CUSTOM) && clipboard->GetData()) {
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::ReadCustomDataTypes(clipboard->GetData()->custom_data_data().c_str(),
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        clipboard->GetData()->custom_data_data().size(), types);
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::ReadText(Buffer buffer, string16* result) const {
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClipboard()->ReadText(result);
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::ReadAsciiText(Buffer buffer, std::string* result) const {
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClipboard()->ReadAsciiText(result);
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::ReadHTML(Buffer buffer,
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         string16* markup,
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         std::string* src_url,
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         uint32* fragment_start,
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         uint32* fragment_end) const {
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClipboard()->ReadHTML(markup, src_url, fragment_start, fragment_end);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::ReadRTF(Buffer buffer, std::string* result) const {
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClipboard()->ReadRTF(result);
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkBitmap Clipboard::ReadImage(Buffer buffer) const {
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetClipboard()->ReadImage();
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::ReadCustomData(Buffer buffer,
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const string16& type,
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               string16* result) const {
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClipboard()->ReadCustomData(type, result);
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::ReadBookmark(string16* title, std::string* url) const {
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClipboard()->ReadBookmark(title, url);
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::ReadData(const FormatType& format, std::string* result) const {
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClipboard()->ReadData(format.ToString(), result);
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SourceTag Clipboard::ReadSourceTag(Buffer buffer) const {
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(CalledOnValidThread());
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_EQ(BUFFER_STANDARD, buffer);
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return GetClipboard()->ReadSourceTag();
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint64 Clipboard::GetSequenceNumber(Buffer buffer) {
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetClipboard()->GetNumClipboardEntries();
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::WriteText(const char* text_data, size_t text_len) {
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClipboardDataBuilder::WriteText(text_data, text_len);
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::WriteHTML(const char* markup_data,
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          size_t markup_len,
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const char* url_data,
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          size_t url_len) {
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClipboardDataBuilder::WriteHTML(markup_data, markup_len, url_data, url_len);
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::WriteRTF(const char* rtf_data, size_t data_len) {
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClipboardDataBuilder::WriteRTF(rtf_data, data_len);
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::WriteBookmark(const char* title_data,
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              size_t title_len,
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const char* url_data,
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              size_t url_len) {
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClipboardDataBuilder::WriteBookmark(title_data, title_len, url_data, url_len);
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::WriteWebSmartPaste() {
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClipboardDataBuilder::WriteWebSmartPaste();
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::WriteBitmap(const char* pixel_data, const char* size_data) {
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClipboardDataBuilder::WriteBitmap(pixel_data, size_data);
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Clipboard::WriteData(const FormatType& format,
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const char* data_data,
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          size_t data_len) {
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClipboardDataBuilder::WriteData(format.ToString(), data_data, data_len);
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Clipboard::WriteSourceTag(SourceTag tag) {
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (tag != SourceTag())
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ClipboardDataBuilder::WriteSourceTag(tag);
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Clipboard::FormatType Clipboard::GetFormatType(
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& format_string) {
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return FormatType::Deserialize(format_string);
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetUrlFormatType() {
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeURIList));
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type;
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetUrlWFormatType() {
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetUrlFormatType();
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetPlainTextFormatType() {
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeText));
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type;
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetPlainTextWFormatType() {
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetPlainTextFormatType();
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetFilenameFormatType() {
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeFilename));
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type;
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetFilenameWFormatType() {
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Clipboard::GetFilenameFormatType();
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetHtmlFormatType() {
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeHTML));
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type;
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetRtfFormatType() {
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeRTF));
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type;
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetBitmapFormatType() {
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeBitmap));
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type;
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetWebKitSmartPasteFormatType() {
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeWebkitSmartPaste));
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type;
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetWebCustomDataFormatType() {
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeWebCustomData));
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type;
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Clipboard::FormatType& Clipboard::GetPepperCustomDataFormatType() {
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypePepperCustomData));
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return type;
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
718