| Index: content/renderer/render_view_impl.cc
|
| diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
|
| index 6578cd88cc32fd13c51f6a9b28eb23dc2ec6a2cd..7bdf278df97fc50af28fc2877cb3b22982d8e7cd 100644
|
| --- a/content/renderer/render_view_impl.cc
|
| +++ b/content/renderer/render_view_impl.cc
|
| @@ -1116,6 +1116,7 @@ bool RenderViewImpl::OnMessageReceived(const IPC::Message& message) {
|
| OnReleaseDisambiguationPopupDIB)
|
| IPC_MESSAGE_HANDLER(ViewMsg_WindowSnapshotCompleted,
|
| OnWindowSnapshotCompleted)
|
| + IPC_MESSAGE_HANDLER(ViewMsg_Snapshot, OnSnapshot)
|
|
|
| // Have the super handle all other messages.
|
| IPC_MESSAGE_UNHANDLED(handled = RenderWidget::OnMessageReceived(message))
|
| @@ -1899,6 +1900,55 @@ void RenderViewImpl::OnWindowSnapshotCompleted(const int snapshot_id,
|
| pending_snapshots_.erase(it);
|
| }
|
|
|
| +namespace {
|
| +
|
| +bool CaptureSnapshot(WebView* view,
|
| + const gfx::Rect& src_subrect,
|
| + SkBitmap* snapshot) {
|
| + base::TimeTicks beginning_time = base::TimeTicks::Now();
|
| +
|
| + view->layout();
|
| + const WebSize& size = view->size();
|
| + gfx::Rect viewport_size = gfx::IntersectRects(
|
| + src_subrect, gfx::Rect(size.width, size.height));
|
| +
|
| + skia::RefPtr<SkCanvas> canvas = skia::AdoptRef(
|
| + skia::CreatePlatformCanvas(viewport_size.width(),
|
| + viewport_size.height(),
|
| + true,
|
| + NULL,
|
| + skia::RETURN_NULL_ON_FAILURE));
|
| + if (!canvas)
|
| + return false;
|
| +
|
| + view->paint(webkit_glue::ToWebCanvas(canvas.get()), viewport_size);
|
| +
|
| + const SkBitmap& bitmap = skia::GetTopDevice(*canvas)->accessBitmap(false);
|
| + if (!bitmap.copyTo(snapshot, SkBitmap::kARGB_8888_Config))
|
| + return false;
|
| +
|
| + UMA_HISTOGRAM_TIMES("Renderer4.Snapshot",
|
| + base::TimeTicks::Now() - beginning_time);
|
| + return true;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +void RenderViewImpl::OnSnapshot(const gfx::Rect& src_subrect) {
|
| + SkBitmap snapshot;
|
| + bool error = false;
|
| +
|
| + if (!webview()->mainFrame() || !CaptureSnapshot(webview(),
|
| + src_subrect,
|
| + &snapshot))
|
| + error = true;
|
| +
|
| + DCHECK(error == snapshot.empty()) <<
|
| + "Snapshot should be empty on error, non-empty otherwise.";
|
| +
|
| + Send(new ViewHostMsg_Snapshot(routing_id_, !error, snapshot));
|
| +}
|
| +
|
| // WebKit::WebViewClient ------------------------------------------------------
|
|
|
| WebView* RenderViewImpl::createView(
|
|
|