| Index: chrome/renderer/renderer_glue.cc
|
| ===================================================================
|
| --- chrome/renderer/renderer_glue.cc (revision 4189)
|
| +++ chrome/renderer/renderer_glue.cc (working copy)
|
| @@ -7,6 +7,8 @@
|
| #include <windows.h>
|
| #include <wininet.h>
|
|
|
| +#include "base/clipboard.h"
|
| +#include "base/scoped_clipboard_writer.h"
|
| #include "chrome/renderer/net/render_dns_master.h"
|
| #include "chrome/common/resource_bundle.h"
|
| #include "chrome/plugin/npobject_util.h"
|
| @@ -14,9 +16,12 @@
|
| #include "chrome/renderer/visitedlink_slave.h"
|
| #include "googleurl/src/url_util.h"
|
| #include "net/base/mime_util.h"
|
| +#include "webkit/glue/scoped_clipboard_writer_glue.h"
|
| #include "webkit/glue/webframe.h"
|
| #include "webkit/glue/webkit_glue.h"
|
|
|
| +#include <vector>
|
| +
|
| #include "SkBitmap.h"
|
|
|
| #include <strsafe.h> // note: per msdn docs, this must *follow* other includes
|
| @@ -66,6 +71,66 @@
|
| size_t cur_capacity_;
|
| };
|
|
|
| +#if defined(OS_WIN)
|
| +// This definition of WriteBitmap uses shared memory to communicate across
|
| +// processes.
|
| +void ScopedClipboardWriterGlue::WriteBitmap(const SkBitmap& bitmap) {
|
| + // do not try to write a bitmap more than once
|
| + if (shared_buf_)
|
| + return;
|
| +
|
| + size_t buf_size = bitmap.getSize();
|
| + gfx::Size size(bitmap.width(), bitmap.height());
|
| +
|
| + // Allocate a shared memory buffer to hold the bitmap bits
|
| + shared_buf_ = RenderProcess::AllocSharedMemory(buf_size);
|
| + if (!shared_buf_ || !shared_buf_->Map(buf_size)) {
|
| + NOTREACHED();
|
| + return;
|
| + }
|
| +
|
| + // Copy the bits into shared memory
|
| + SkAutoLockPixels bitmap_lock(bitmap);
|
| + memcpy(shared_buf_->memory(), bitmap.getPixels(), buf_size);
|
| + shared_buf_->Unmap();
|
| +
|
| + Clipboard::ObjectMapParam param1, param2;
|
| + SharedMemoryHandle smh = shared_buf_->handle();
|
| +
|
| + const char* shared_handle = reinterpret_cast<const char*>(&smh);
|
| + for (size_t i = 0; i < sizeof SharedMemoryHandle; i++)
|
| + param1.push_back(shared_handle[i]);
|
| +
|
| + const char* size_data = reinterpret_cast<const char*>(&size);
|
| + for (size_t i = 0; i < sizeof gfx::Size; i++)
|
| + param2.push_back(size_data[i]);
|
| +
|
| + Clipboard::ObjectMapParams params;
|
| + params.push_back(param1);
|
| + params.push_back(param2);
|
| + objects_[Clipboard::CBF_SMBITMAP] = params;
|
| +}
|
| +#endif
|
| +
|
| +// Define a destructor that makes IPCs to flush the contents to the
|
| +// system clipboard.
|
| +ScopedClipboardWriterGlue::~ScopedClipboardWriterGlue() {
|
| + if (objects_.empty())
|
| + return;
|
| +
|
| +#if defined(OS_WIN)
|
| + if (shared_buf_) {
|
| + RenderThread::current()->Send(
|
| + new ViewHostMsg_ClipboardWriteObjectsSync(objects_));
|
| + RenderProcess::FreeSharedMemory(shared_buf_);
|
| + return;
|
| + }
|
| +#endif
|
| +
|
| + RenderThread::current()->Send(
|
| + new ViewHostMsg_ClipboardWriteObjectsAsync(objects_));
|
| +}
|
| +
|
| namespace webkit_glue {
|
|
|
| void PrefetchDns(const std::string& hostname) {
|
| @@ -141,60 +206,10 @@
|
|
|
| // Clipboard glue
|
|
|
| -void webkit_glue::ClipboardClear() {
|
| - RenderThread::current()->Send(new ViewHostMsg_ClipboardClear());
|
| +Clipboard* webkit_glue::ClipboardGetClipboard(){
|
| + return NULL;
|
| }
|
|
|
| -void webkit_glue::ClipboardWriteText(const std::wstring& text) {
|
| - RenderThread::current()->Send(new ViewHostMsg_ClipboardWriteText(text));
|
| -}
|
| -
|
| -void webkit_glue::ClipboardWriteHTML(const std::wstring& html,
|
| - const GURL& url) {
|
| - RenderThread::current()->Send(new ViewHostMsg_ClipboardWriteHTML(html, url));
|
| -}
|
| -
|
| -void webkit_glue::ClipboardWriteBookmark(const std::wstring& title,
|
| - const GURL& url) {
|
| - RenderThread::current()->Send(
|
| - new ViewHostMsg_ClipboardWriteBookmark(title, url));
|
| -}
|
| -
|
| -// Here we need to do some work to marshal the bitmap through shared memory
|
| -void webkit_glue::ClipboardWriteBitmap(const SkBitmap& bitmap) {
|
| - size_t buf_size = bitmap.getSize();
|
| - gfx::Size size(bitmap.width(), bitmap.height());
|
| -
|
| - // Allocate a shared memory buffer to hold the bitmap bits
|
| - SharedMemory* shared_buf =
|
| - RenderProcess::AllocSharedMemory(buf_size);
|
| - if (!shared_buf) {
|
| - NOTREACHED();
|
| - return;
|
| - }
|
| - if (!shared_buf->Map(buf_size)) {
|
| - NOTREACHED();
|
| - return;
|
| - }
|
| -
|
| - // Copy the bits into shared memory
|
| - SkAutoLockPixels bitmap_lock(bitmap);
|
| - memcpy(shared_buf->memory(), bitmap.getPixels(), buf_size);
|
| - shared_buf->Unmap();
|
| -
|
| - // Send the handle over synchronous IPC
|
| - RenderThread::current()->Send(
|
| - new ViewHostMsg_ClipboardWriteBitmap(shared_buf->handle(), size));
|
| -
|
| - // The browser should be done with the bitmap now. It's our job to free
|
| - // the shared memory.
|
| - RenderProcess::FreeSharedMemory(shared_buf);
|
| -}
|
| -
|
| -void webkit_glue::ClipboardWriteWebSmartPaste() {
|
| - RenderThread::current()->Send(new ViewHostMsg_ClipboardWriteWebSmartPaste());
|
| -}
|
| -
|
| bool webkit_glue::ClipboardIsFormatAvailable(unsigned int format) {
|
| bool result;
|
| RenderThread::current()->Send(
|
|
|