| 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, | 
|  |