1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright (c) 2013 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)
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/renderer/webclipboard_impl.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/pickle.h"
95e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
1123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "content/common/clipboard_format.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/common/drop_data.h"
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/renderer/clipboard_utils.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/renderer/drop_data_builder.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/renderer/scoped_clipboard_writer_glue.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebData.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebDragData.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebImage.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebSize.h"
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebString.h"
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURL.h"
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebVector.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/clipboard/clipboard.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/clipboard/custom_data_helper.h"
267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebClipboard;
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebData;
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebDragData;
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebImage;
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebString;
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURL;
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebVector;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace content {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebClipboardImpl::WebClipboardImpl(ClipboardClient* client)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : client_(client) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebClipboardImpl::~WebClipboardImpl() {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint64 WebClipboardImpl::sequenceNumber(Buffer buffer) {
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ui::ClipboardType clipboard_type;
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!ConvertBufferType(buffer, &clipboard_type))
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return client_->GetSequenceNumber(clipboard_type);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebClipboardImpl::isFormatAvailable(Format format, Buffer buffer) {
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ui::ClipboardType clipboard_type = ui::CLIPBOARD_TYPE_COPY_PASTE;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!ConvertBufferType(buffer, &clipboard_type))
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (format) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case FormatPlainText:
6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      return client_->IsFormatAvailable(CLIPBOARD_FORMAT_PLAINTEXT,
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                        clipboard_type);
6323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    case FormatHTML:
6423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      return client_->IsFormatAvailable(CLIPBOARD_FORMAT_HTML, clipboard_type);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case FormatSmartPaste:
6623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      return client_->IsFormatAvailable(CLIPBOARD_FORMAT_SMART_PASTE,
6723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                        clipboard_type);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case FormatBookmark:
6923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      return client_->IsFormatAvailable(CLIPBOARD_FORMAT_BOOKMARK,
704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                        clipboard_type);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebVector<WebString> WebClipboardImpl::readAvailableTypes(
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Buffer buffer, bool* contains_filenames) {
804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ui::ClipboardType clipboard_type;
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> types;
824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (ConvertBufferType(buffer, &clipboard_type)) {
834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    client_->ReadAvailableTypes(clipboard_type, &types, contains_filenames);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return types;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebString WebClipboardImpl::readPlainText(Buffer buffer) {
894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ui::ClipboardType clipboard_type;
904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!ConvertBufferType(buffer, &clipboard_type))
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return WebString();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  base::string16 text;
9423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  client_->ReadText(clipboard_type, &text);
9523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return text;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebString WebClipboardImpl::readHTML(Buffer buffer, WebURL* source_url,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     unsigned* fragment_start,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     unsigned* fragment_end) {
1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ui::ClipboardType clipboard_type;
1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!ConvertBufferType(buffer, &clipboard_type))
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return WebString();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 html_stdstr;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL gurl;
1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  client_->ReadHTML(clipboard_type, &html_stdstr, &gurl,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    static_cast<uint32*>(fragment_start),
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    static_cast<uint32*>(fragment_end));
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *source_url = gurl;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return html_stdstr;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebData WebClipboardImpl::readImage(Buffer buffer) {
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ui::ClipboardType clipboard_type;
1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!ConvertBufferType(buffer, &clipboard_type))
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return WebData();
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string png_data;
1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  client_->ReadImage(clipboard_type, &png_data);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WebData(png_data);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebString WebClipboardImpl::readCustomData(Buffer buffer,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           const WebString& type) {
1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ui::ClipboardType clipboard_type;
1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!ConvertBufferType(buffer, &clipboard_type))
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return WebString();
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 data;
1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  client_->ReadCustomData(clipboard_type, type, &data);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return data;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void WebClipboardImpl::writePlainText(const WebString& plain_text) {
1361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ScopedClipboardWriterGlue scw(client_);
1371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scw.WriteText(plain_text);
1381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebClipboardImpl::writeHTML(
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebString& html_text, const WebURL& source_url,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebString& plain_text, bool write_smart_paste) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedClipboardWriterGlue scw(client_);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scw.WriteHTML(html_text, source_url.spec());
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scw.WriteText(plain_text);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (write_smart_paste)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scw.WriteWebSmartPaste();
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void WebClipboardImpl::writeImage(const WebImage& image,
1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                  const WebURL& url,
1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                  const WebString& title) {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedClipboardWriterGlue scw(client_);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!image.isNull()) {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SkBitmap& bitmap = image.getSkBitmap();
158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // WriteBitmapFromPixels expects 32-bit data.
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DCHECK_EQ(bitmap.colorType(), kN32_SkColorType);
160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkAutoLockPixels locked(bitmap);
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    void *pixels = bitmap.getPixels();
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // TODO(piman): this should not be NULL, but it is. crbug.com/369621
164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (!pixels)
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return;
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    scw.WriteBitmapFromPixels(pixels, image.size());
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!url.isEmpty()) {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scw.WriteBookmark(title, url.spec());
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // When writing the image, we also write the image markup so that pasting
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // into rich text editors, such as Gmail, reveals the image. We also don't
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // want to call writeText(), since some applications (WordPad) don't pick
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the image if there is also a text format on the clipboard.
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We also don't want to write HTML on a Mac, since Mail.app prefers to use
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the image markup over attaching the actual image. See
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // http://crbug.com/33016 for details.
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scw.WriteHTML(base::UTF8ToUTF16(URLToImageMarkup(url, title)),
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  std::string());
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebClipboardImpl::writeDataObject(const WebDragData& data) {
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedClipboardWriterGlue scw(client_);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const DropData& data_object = DropDataBuilder::Build(data);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(dcheng): Properly support text/uri-list here.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!data_object.text.is_null())
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scw.WriteText(data_object.text.string());
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!data_object.html.is_null())
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scw.WriteHTML(data_object.html.string(), std::string());
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If there is no custom data, avoid calling WritePickledData. This ensures
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that ScopedClipboardWriterGlue's dtor remains a no-op if the page didn't
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // modify the DataTransfer object, which is important to avoid stomping on
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // any clipboard contents written by extension functions such as
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // chrome.bookmarkManagerPrivate.copy.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!data_object.custom_data.empty()) {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Pickle pickle;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::WriteCustomDataToPickle(data_object.custom_data, &pickle);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scw.WritePickledData(pickle, ui::Clipboard::GetWebCustomDataFormatType());
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebClipboardImpl::ConvertBufferType(Buffer buffer,
2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                         ui::ClipboardType* result) {
2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  *result = ui::CLIPBOARD_TYPE_COPY_PASTE;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (buffer) {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case BufferStandard:
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case BufferSelection:
213a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(USE_X11) && !defined(OS_CHROMEOS)
2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      *result = ui::CLIPBOARD_TYPE_SELECTION;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
216a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#else
217a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      // Chrome OS and non-X11 unix builds do not support
218a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      // the X selection clipboad.
219a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      // TODO: remove the need for this case, see http://crbug.com/361753
220a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      return false;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace content
230