Index: content/renderer/webclipboard_impl.cc |
diff --git a/content/renderer/webclipboard_impl.cc b/content/renderer/webclipboard_impl.cc |
index e248c517a06a67d52c683b2af78d12a7d2c1d834..930663a14ac24889625d4644de23919204334a72 100644 |
--- a/content/renderer/webclipboard_impl.cc |
+++ b/content/renderer/webclipboard_impl.cc |
@@ -5,14 +5,13 @@ |
#include "content/renderer/webclipboard_impl.h" |
#include "base/logging.h" |
-#include "base/pickle.h" |
#include "base/strings/string_util.h" |
#include "base/strings/utf_string_conversions.h" |
#include "content/common/clipboard_format.h" |
#include "content/public/common/drop_data.h" |
#include "content/renderer/clipboard_utils.h" |
#include "content/renderer/drop_data_builder.h" |
-#include "content/renderer/scoped_clipboard_writer_glue.h" |
+#include "content/renderer/renderer_clipboard_delegate.h" |
#include "third_party/WebKit/public/platform/WebData.h" |
#include "third_party/WebKit/public/platform/WebDragData.h" |
#include "third_party/WebKit/public/platform/WebImage.h" |
@@ -20,9 +19,6 @@ |
#include "third_party/WebKit/public/platform/WebString.h" |
#include "third_party/WebKit/public/platform/WebURL.h" |
#include "third_party/WebKit/public/platform/WebVector.h" |
-#include "third_party/skia/include/core/SkBitmap.h" |
-#include "ui/base/clipboard/clipboard.h" |
-#include "ui/base/clipboard/custom_data_helper.h" |
#include "url/gurl.h" |
using blink::WebClipboard; |
@@ -35,8 +31,9 @@ using blink::WebVector; |
namespace content { |
-WebClipboardImpl::WebClipboardImpl(ClipboardClient* client) |
- : client_(client) { |
+WebClipboardImpl::WebClipboardImpl(RendererClipboardDelegate* delegate) |
+ : delegate_(delegate) { |
+ DCHECK(delegate); |
} |
WebClipboardImpl::~WebClipboardImpl() { |
@@ -47,7 +44,7 @@ uint64 WebClipboardImpl::sequenceNumber(Buffer buffer) { |
if (!ConvertBufferType(buffer, &clipboard_type)) |
return 0; |
- return client_->GetSequenceNumber(clipboard_type); |
+ return delegate_->GetSequenceNumber(clipboard_type); |
} |
bool WebClipboardImpl::isFormatAvailable(Format format, Buffer buffer) { |
@@ -58,16 +55,17 @@ bool WebClipboardImpl::isFormatAvailable(Format format, Buffer buffer) { |
switch (format) { |
case FormatPlainText: |
- return client_->IsFormatAvailable(CLIPBOARD_FORMAT_PLAINTEXT, |
- clipboard_type); |
+ return delegate_->IsFormatAvailable(CLIPBOARD_FORMAT_PLAINTEXT, |
+ clipboard_type); |
case FormatHTML: |
- return client_->IsFormatAvailable(CLIPBOARD_FORMAT_HTML, clipboard_type); |
+ return delegate_->IsFormatAvailable(CLIPBOARD_FORMAT_HTML, |
+ clipboard_type); |
case FormatSmartPaste: |
- return client_->IsFormatAvailable(CLIPBOARD_FORMAT_SMART_PASTE, |
- clipboard_type); |
+ return delegate_->IsFormatAvailable(CLIPBOARD_FORMAT_SMART_PASTE, |
+ clipboard_type); |
case FormatBookmark: |
- return client_->IsFormatAvailable(CLIPBOARD_FORMAT_BOOKMARK, |
- clipboard_type); |
+ return delegate_->IsFormatAvailable(CLIPBOARD_FORMAT_BOOKMARK, |
+ clipboard_type); |
default: |
NOTREACHED(); |
} |
@@ -80,7 +78,7 @@ WebVector<WebString> WebClipboardImpl::readAvailableTypes( |
ui::ClipboardType clipboard_type; |
std::vector<base::string16> types; |
if (ConvertBufferType(buffer, &clipboard_type)) { |
- client_->ReadAvailableTypes(clipboard_type, &types, contains_filenames); |
+ delegate_->ReadAvailableTypes(clipboard_type, &types, contains_filenames); |
} |
return types; |
} |
@@ -91,7 +89,7 @@ WebString WebClipboardImpl::readPlainText(Buffer buffer) { |
return WebString(); |
base::string16 text; |
- client_->ReadText(clipboard_type, &text); |
+ delegate_->ReadText(clipboard_type, &text); |
return text; |
} |
@@ -104,9 +102,11 @@ WebString WebClipboardImpl::readHTML(Buffer buffer, WebURL* source_url, |
base::string16 html_stdstr; |
GURL gurl; |
- client_->ReadHTML(clipboard_type, &html_stdstr, &gurl, |
- static_cast<uint32*>(fragment_start), |
- static_cast<uint32*>(fragment_end)); |
+ delegate_->ReadHTML(clipboard_type, |
+ &html_stdstr, |
+ &gurl, |
+ static_cast<uint32*>(fragment_start), |
+ static_cast<uint32*>(fragment_end)); |
*source_url = gurl; |
return html_stdstr; |
} |
@@ -117,7 +117,7 @@ WebData WebClipboardImpl::readImage(Buffer buffer) { |
return WebData(); |
std::string png_data; |
- client_->ReadImage(clipboard_type, &png_data); |
+ delegate_->ReadImage(clipboard_type, &png_data); |
return WebData(png_data); |
} |
@@ -128,46 +128,36 @@ WebString WebClipboardImpl::readCustomData(Buffer buffer, |
return WebString(); |
base::string16 data; |
- client_->ReadCustomData(clipboard_type, type, &data); |
+ delegate_->ReadCustomData(clipboard_type, type, &data); |
return data; |
} |
void WebClipboardImpl::writePlainText(const WebString& plain_text) { |
- ScopedClipboardWriterGlue scw(client_); |
- scw.WriteText(plain_text); |
+ delegate_->WriteText(ui::CLIPBOARD_TYPE_COPY_PASTE, plain_text); |
+ delegate_->CommitWrite(ui::CLIPBOARD_TYPE_COPY_PASTE); |
} |
void WebClipboardImpl::writeHTML( |
const WebString& html_text, const WebURL& source_url, |
const WebString& plain_text, bool write_smart_paste) { |
- ScopedClipboardWriterGlue scw(client_); |
- scw.WriteHTML(html_text, source_url.spec()); |
- scw.WriteText(plain_text); |
+ delegate_->WriteHTML(ui::CLIPBOARD_TYPE_COPY_PASTE, html_text, source_url); |
+ delegate_->WriteText(ui::CLIPBOARD_TYPE_COPY_PASTE, plain_text); |
if (write_smart_paste) |
- scw.WriteWebSmartPaste(); |
+ delegate_->WriteSmartPasteMarker(ui::CLIPBOARD_TYPE_COPY_PASTE); |
+ delegate_->CommitWrite(ui::CLIPBOARD_TYPE_COPY_PASTE); |
} |
void WebClipboardImpl::writeImage(const WebImage& image, |
const WebURL& url, |
const WebString& title) { |
- ScopedClipboardWriterGlue scw(client_); |
- |
- if (!image.isNull()) { |
- const SkBitmap& bitmap = image.getSkBitmap(); |
- // WriteBitmapFromPixels expects 32-bit data. |
- DCHECK_EQ(bitmap.colorType(), kN32_SkColorType); |
- |
- SkAutoLockPixels locked(bitmap); |
- void *pixels = bitmap.getPixels(); |
- // TODO(piman): this should not be NULL, but it is. crbug.com/369621 |
- if (!pixels) |
- return; |
- scw.WriteBitmapFromPixels(pixels, image.size()); |
- } |
+ DCHECK(!image.isNull()); |
+ const SkBitmap& bitmap = image.getSkBitmap(); |
+ if (!delegate_->WriteImage(ui::CLIPBOARD_TYPE_COPY_PASTE, bitmap)) |
+ return; |
if (!url.isEmpty()) { |
- scw.WriteBookmark(title, url.spec()); |
+ delegate_->WriteBookmark(ui::CLIPBOARD_TYPE_COPY_PASTE, url, title); |
#if !defined(OS_MACOSX) |
// When writing the image, we also write the image markup so that pasting |
// into rich text editors, such as Gmail, reveals the image. We also don't |
@@ -176,31 +166,30 @@ void WebClipboardImpl::writeImage(const WebImage& image, |
// We also don't want to write HTML on a Mac, since Mail.app prefers to use |
// the image markup over attaching the actual image. See |
// http://crbug.com/33016 for details. |
- scw.WriteHTML(base::UTF8ToUTF16(URLToImageMarkup(url, title)), |
- std::string()); |
+ delegate_->WriteHTML(ui::CLIPBOARD_TYPE_COPY_PASTE, |
+ base::UTF8ToUTF16(URLToImageMarkup(url, title)), |
+ GURL()); |
#endif |
} |
+ delegate_->CommitWrite(ui::CLIPBOARD_TYPE_COPY_PASTE); |
} |
void WebClipboardImpl::writeDataObject(const WebDragData& data) { |
- ScopedClipboardWriterGlue scw(client_); |
- |
const DropData& data_object = DropDataBuilder::Build(data); |
// TODO(dcheng): Properly support text/uri-list here. |
+ // Avoid calling the WriteFoo functions if there is no data associated with a |
+ // type. This prevents stomping on clipboard contents that might have been |
+ // written by extension functions such as chrome.bookmarkManagerPrivate.copy. |
if (!data_object.text.is_null()) |
- scw.WriteText(data_object.text.string()); |
+ delegate_->WriteText(ui::CLIPBOARD_TYPE_COPY_PASTE, |
+ data_object.text.string()); |
if (!data_object.html.is_null()) |
- scw.WriteHTML(data_object.html.string(), std::string()); |
- // If there is no custom data, avoid calling WritePickledData. This ensures |
- // that ScopedClipboardWriterGlue's dtor remains a no-op if the page didn't |
- // modify the DataTransfer object, which is important to avoid stomping on |
- // any clipboard contents written by extension functions such as |
- // chrome.bookmarkManagerPrivate.copy. |
- if (!data_object.custom_data.empty()) { |
- Pickle pickle; |
- ui::WriteCustomDataToPickle(data_object.custom_data, &pickle); |
- scw.WritePickledData(pickle, ui::Clipboard::GetWebCustomDataFormatType()); |
- } |
+ delegate_->WriteHTML( |
+ ui::CLIPBOARD_TYPE_COPY_PASTE, data_object.html.string(), GURL()); |
+ if (!data_object.custom_data.empty()) |
+ delegate_->WriteCustomData(ui::CLIPBOARD_TYPE_COPY_PASTE, |
+ data_object.custom_data); |
+ delegate_->CommitWrite(ui::CLIPBOARD_TYPE_COPY_PASTE); |
} |
bool WebClipboardImpl::ConvertBufferType(Buffer buffer, |