blob: 8eca5a96c4d4db18afed11824baf3b855c9da002 [file] [log] [blame]
[email protected]bb7538f2013-06-21 00:40:281// Copyright (c) 2013 The Chromium Authors. All rights reserved.
[email protected]2dfeaf92011-01-10 21:08:212// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
[email protected]c62ce3e2009-02-26 00:15:204
[email protected]bb7538f2013-06-21 00:40:285#include "content/renderer/webclipboard_impl.h"
[email protected]c62ce3e2009-02-26 00:15:206
[email protected]c62ce3e2009-02-26 00:15:207#include "base/logging.h"
[email protected]e464fee2013-06-11 12:42:208#include "base/strings/string_util.h"
[email protected]906265872013-06-07 22:40:459#include "base/strings/utf_string_conversions.h"
avi1023d012015-12-25 02:39:1410#include "build/build_config.h"
[email protected]5c2f32e72014-03-20 20:22:1711#include "content/common/clipboard_format.h"
[email protected]dc293a72013-07-01 11:11:2212#include "content/public/common/drop_data.h"
[email protected]f9866fa2013-10-02 16:30:4513#include "content/renderer/clipboard_utils.h"
[email protected]dc293a72013-07-01 11:11:2214#include "content/renderer/drop_data_builder.h"
dcheng112adc892014-11-20 07:16:4915#include "content/renderer/renderer_clipboard_delegate.h"
[email protected]c10884462013-05-30 00:22:0916#include "third_party/WebKit/public/platform/WebData.h"
17#include "third_party/WebKit/public/platform/WebDragData.h"
18#include "third_party/WebKit/public/platform/WebImage.h"
19#include "third_party/WebKit/public/platform/WebSize.h"
20#include "third_party/WebKit/public/platform/WebString.h"
21#include "third_party/WebKit/public/platform/WebURL.h"
22#include "third_party/WebKit/public/platform/WebVector.h"
[email protected]707e1c42013-07-09 21:18:5823#include "url/gurl.h"
[email protected]c62ce3e2009-02-26 00:15:2024
[email protected]180ef242013-11-07 06:50:4625using blink::WebClipboard;
26using blink::WebData;
27using blink::WebDragData;
28using blink::WebImage;
29using blink::WebString;
30using blink::WebURL;
31using blink::WebVector;
[email protected]c62ce3e2009-02-26 00:15:2032
[email protected]bb7538f2013-06-21 00:40:2833namespace content {
[email protected]c62ce3e2009-02-26 00:15:2034
dcheng112adc892014-11-20 07:16:4935WebClipboardImpl::WebClipboardImpl(RendererClipboardDelegate* delegate)
36 : delegate_(delegate) {
37 DCHECK(delegate);
[email protected]0de5d8602011-11-22 03:48:5238}
39
[email protected]04bf3ad2010-08-27 21:23:4840WebClipboardImpl::~WebClipboardImpl() {
41}
42
avi1023d012015-12-25 02:39:1443uint64_t WebClipboardImpl::sequenceNumber(Buffer buffer) {
[email protected]d68334c2013-10-12 17:02:0344 ui::ClipboardType clipboard_type;
45 if (!ConvertBufferType(buffer, &clipboard_type))
[email protected]9cf12c32011-11-10 19:28:0746 return 0;
47
dcheng112adc892014-11-20 07:16:4948 return delegate_->GetSequenceNumber(clipboard_type);
[email protected]36780a12011-11-04 18:16:4449}
50
[email protected]65a6150d2009-09-08 22:16:0551bool WebClipboardImpl::isFormatAvailable(Format format, Buffer buffer) {
[email protected]d68334c2013-10-12 17:02:0352 ui::ClipboardType clipboard_type = ui::CLIPBOARD_TYPE_COPY_PASTE;
[email protected]c62ce3e2009-02-26 00:15:2053
[email protected]d68334c2013-10-12 17:02:0354 if (!ConvertBufferType(buffer, &clipboard_type))
[email protected]606876c2011-03-24 17:13:3855 return false;
56
[email protected]c62ce3e2009-02-26 00:15:2057 switch (format) {
[email protected]606876c2011-03-24 17:13:3858 case FormatPlainText:
dcheng112adc892014-11-20 07:16:4959 return delegate_->IsFormatAvailable(CLIPBOARD_FORMAT_PLAINTEXT,
60 clipboard_type);
[email protected]c62ce3e2009-02-26 00:15:2061 case FormatHTML:
dcheng112adc892014-11-20 07:16:4962 return delegate_->IsFormatAvailable(CLIPBOARD_FORMAT_HTML,
63 clipboard_type);
[email protected]c62ce3e2009-02-26 00:15:2064 case FormatSmartPaste:
dcheng112adc892014-11-20 07:16:4965 return delegate_->IsFormatAvailable(CLIPBOARD_FORMAT_SMART_PASTE,
66 clipboard_type);
[email protected]5c2f32e72014-03-20 20:22:1767 case FormatBookmark:
dcheng112adc892014-11-20 07:16:4968 return delegate_->IsFormatAvailable(CLIPBOARD_FORMAT_BOOKMARK,
69 clipboard_type);
[email protected]c62ce3e2009-02-26 00:15:2070 default:
71 NOTREACHED();
[email protected]c62ce3e2009-02-26 00:15:2072 }
73
[email protected]ff53be62011-12-07 23:28:2974 return false;
[email protected]c62ce3e2009-02-26 00:15:2075}
76
[email protected]36780a12011-11-04 18:16:4477WebVector<WebString> WebClipboardImpl::readAvailableTypes(
78 Buffer buffer, bool* contains_filenames) {
[email protected]d68334c2013-10-12 17:02:0379 ui::ClipboardType clipboard_type;
[email protected]82758352013-03-29 19:21:3180 std::vector<base::string16> types;
[email protected]d68334c2013-10-12 17:02:0381 if (ConvertBufferType(buffer, &clipboard_type)) {
dcheng112adc892014-11-20 07:16:4982 delegate_->ReadAvailableTypes(clipboard_type, &types, contains_filenames);
[email protected]36780a12011-11-04 18:16:4483 }
84 return types;
85}
86
[email protected]65a6150d2009-09-08 22:16:0587WebString WebClipboardImpl::readPlainText(Buffer buffer) {
[email protected]d68334c2013-10-12 17:02:0388 ui::ClipboardType clipboard_type;
89 if (!ConvertBufferType(buffer, &clipboard_type))
[email protected]65a6150d2009-09-08 22:16:0590 return WebString();
91
[email protected]5c2f32e72014-03-20 20:22:1792 base::string16 text;
dcheng112adc892014-11-20 07:16:4993 delegate_->ReadText(clipboard_type, &text);
[email protected]5c2f32e72014-03-20 20:22:1794 return text;
[email protected]c62ce3e2009-02-26 00:15:2095}
96
[email protected]a96790b2011-10-06 22:24:1097WebString WebClipboardImpl::readHTML(Buffer buffer, WebURL* source_url,
98 unsigned* fragment_start,
99 unsigned* fragment_end) {
[email protected]d68334c2013-10-12 17:02:03100 ui::ClipboardType clipboard_type;
101 if (!ConvertBufferType(buffer, &clipboard_type))
[email protected]a96790b2011-10-06 22:24:10102 return WebString();
103
[email protected]82758352013-03-29 19:21:31104 base::string16 html_stdstr;
[email protected]a96790b2011-10-06 22:24:10105 GURL gurl;
dcheng112adc892014-11-20 07:16:49106 delegate_->ReadHTML(clipboard_type, &html_stdstr, &gurl,
avi1023d012015-12-25 02:39:14107 static_cast<uint32_t*>(fragment_start),
108 static_cast<uint32_t*>(fragment_end));
[email protected]c62ce3e2009-02-26 00:15:20109 *source_url = gurl;
[email protected]3a2a5d22009-03-04 03:36:36110 return html_stdstr;
[email protected]c62ce3e2009-02-26 00:15:20111}
112
[email protected]3d4a6912011-03-15 20:56:19113WebData WebClipboardImpl::readImage(Buffer buffer) {
[email protected]d68334c2013-10-12 17:02:03114 ui::ClipboardType clipboard_type;
115 if (!ConvertBufferType(buffer, &clipboard_type))
[email protected]3d4a6912011-03-15 20:56:19116 return WebData();
117
118 std::string png_data;
dcheng112adc892014-11-20 07:16:49119 delegate_->ReadImage(clipboard_type, &png_data);
[email protected]3d4a6912011-03-15 20:56:19120 return WebData(png_data);
121}
122
[email protected]c6562f42011-12-04 06:19:37123WebString WebClipboardImpl::readCustomData(Buffer buffer,
124 const WebString& type) {
[email protected]d68334c2013-10-12 17:02:03125 ui::ClipboardType clipboard_type;
126 if (!ConvertBufferType(buffer, &clipboard_type))
[email protected]c6562f42011-12-04 06:19:37127 return WebString();
128
[email protected]82758352013-03-29 19:21:31129 base::string16 data;
dcheng112adc892014-11-20 07:16:49130 delegate_->ReadCustomData(clipboard_type, type, &data);
[email protected]c6562f42011-12-04 06:19:37131 return data;
132}
133
[email protected]d9a0eae92013-10-25 16:38:55134void WebClipboardImpl::writePlainText(const WebString& plain_text) {
dcheng112adc892014-11-20 07:16:49135 delegate_->WriteText(ui::CLIPBOARD_TYPE_COPY_PASTE, plain_text);
136 delegate_->CommitWrite(ui::CLIPBOARD_TYPE_COPY_PASTE);
[email protected]d9a0eae92013-10-25 16:38:55137}
138
[email protected]c62ce3e2009-02-26 00:15:20139void WebClipboardImpl::writeHTML(
140 const WebString& html_text, const WebURL& source_url,
141 const WebString& plain_text, bool write_smart_paste) {
dcheng112adc892014-11-20 07:16:49142 delegate_->WriteHTML(ui::CLIPBOARD_TYPE_COPY_PASTE, html_text, source_url);
143 delegate_->WriteText(ui::CLIPBOARD_TYPE_COPY_PASTE, plain_text);
[email protected]c62ce3e2009-02-26 00:15:20144
145 if (write_smart_paste)
dcheng112adc892014-11-20 07:16:49146 delegate_->WriteSmartPasteMarker(ui::CLIPBOARD_TYPE_COPY_PASTE);
147 delegate_->CommitWrite(ui::CLIPBOARD_TYPE_COPY_PASTE);
[email protected]c62ce3e2009-02-26 00:15:20148}
149
[email protected]f9866fa2013-10-02 16:30:45150void WebClipboardImpl::writeImage(const WebImage& image,
151 const WebURL& url,
152 const WebString& title) {
dcheng112adc892014-11-20 07:16:49153 DCHECK(!image.isNull());
154 const SkBitmap& bitmap = image.getSkBitmap();
155 if (!delegate_->WriteImage(ui::CLIPBOARD_TYPE_COPY_PASTE, bitmap))
156 return;
[email protected]c62ce3e2009-02-26 00:15:20157
[email protected]59d9aacf2009-11-30 22:59:25158 if (!url.isEmpty()) {
dcheng112adc892014-11-20 07:16:49159 delegate_->WriteBookmark(ui::CLIPBOARD_TYPE_COPY_PASTE, url, title);
[email protected]09303232011-06-09 19:28:31160#if !defined(OS_MACOSX)
161 // When writing the image, we also write the image markup so that pasting
162 // into rich text editors, such as Gmail, reveals the image. We also don't
163 // want to call writeText(), since some applications (WordPad) don't pick
164 // the image if there is also a text format on the clipboard.
165 // We also don't want to write HTML on a Mac, since Mail.app prefers to use
166 // the image markup over attaching the actual image. See
167 // http://crbug.com/33016 for details.
dcheng112adc892014-11-20 07:16:49168 delegate_->WriteHTML(ui::CLIPBOARD_TYPE_COPY_PASTE,
169 base::UTF8ToUTF16(URLToImageMarkup(url, title)),
170 GURL());
[email protected]09303232011-06-09 19:28:31171#endif
[email protected]59d9aacf2009-11-30 22:59:25172 }
dcheng112adc892014-11-20 07:16:49173 delegate_->CommitWrite(ui::CLIPBOARD_TYPE_COPY_PASTE);
[email protected]c62ce3e2009-02-26 00:15:20174}
175
[email protected]3f0318292011-11-18 21:49:00176void WebClipboardImpl::writeDataObject(const WebDragData& data) {
[email protected]dc293a72013-07-01 11:11:22177 const DropData& data_object = DropDataBuilder::Build(data);
[email protected]3f0318292011-11-18 21:49:00178 // TODO(dcheng): Properly support text/uri-list here.
dcheng112adc892014-11-20 07:16:49179 // Avoid calling the WriteFoo functions if there is no data associated with a
180 // type. This prevents stomping on clipboard contents that might have been
181 // written by extension functions such as chrome.bookmarkManagerPrivate.copy.
[email protected]da41ae92012-06-16 01:28:17182 if (!data_object.text.is_null())
dcheng112adc892014-11-20 07:16:49183 delegate_->WriteText(ui::CLIPBOARD_TYPE_COPY_PASTE,
184 data_object.text.string());
[email protected]da41ae92012-06-16 01:28:17185 if (!data_object.html.is_null())
dcheng112adc892014-11-20 07:16:49186 delegate_->WriteHTML(ui::CLIPBOARD_TYPE_COPY_PASTE,
187 data_object.html.string(), GURL());
188 if (!data_object.custom_data.empty())
189 delegate_->WriteCustomData(ui::CLIPBOARD_TYPE_COPY_PASTE,
190 data_object.custom_data);
191 delegate_->CommitWrite(ui::CLIPBOARD_TYPE_COPY_PASTE);
[email protected]3f0318292011-11-18 21:49:00192}
193
[email protected]65a6150d2009-09-08 22:16:05194bool WebClipboardImpl::ConvertBufferType(Buffer buffer,
[email protected]d68334c2013-10-12 17:02:03195 ui::ClipboardType* result) {
196 *result = ui::CLIPBOARD_TYPE_COPY_PASTE;
[email protected]65a6150d2009-09-08 22:16:05197 switch (buffer) {
198 case BufferStandard:
[email protected]65a6150d2009-09-08 22:16:05199 break;
200 case BufferSelection:
[email protected]3e3d5202014-04-12 00:06:59201#if defined(USE_X11) && !defined(OS_CHROMEOS)
[email protected]d68334c2013-10-12 17:02:03202 *result = ui::CLIPBOARD_TYPE_SELECTION;
[email protected]65a6150d2009-09-08 22:16:05203 break;
[email protected]3e3d5202014-04-12 00:06:59204#else
205 // Chrome OS and non-X11 unix builds do not support
206 // the X selection clipboad.
207 // TODO: remove the need for this case, see http://crbug.com/361753
208 return false;
[email protected]264b3192012-08-10 21:56:46209#endif
[email protected]65a6150d2009-09-08 22:16:05210 default:
211 NOTREACHED();
212 return false;
213 }
214 return true;
215}
216
[email protected]bb7538f2013-06-21 00:40:28217} // namespace content