Index: chrome/renderer/chrome_render_view_observer.cc |
diff --git a/chrome/renderer/chrome_render_view_observer.cc b/chrome/renderer/chrome_render_view_observer.cc |
index 48651a7b8370133c3b8fac0b6ab1831db5e609d7..020979a3710c207c28ebc86058bb83875bfbdc12 100644 |
--- a/chrome/renderer/chrome_render_view_observer.cc |
+++ b/chrome/renderer/chrome_render_view_observer.cc |
@@ -194,6 +194,7 @@ bool ChromeRenderViewObserver::OnMessageReceived(const IPC::Message& message) { |
bool handled = true; |
IPC_BEGIN_MESSAGE_MAP(ChromeRenderViewObserver, message) |
IPC_MESSAGE_HANDLER(ChromeViewMsg_WebUIJavaScript, OnWebUIJavaScript) |
+ IPC_MESSAGE_HANDLER(ChromeViewMsg_CaptureSnapshot, OnCaptureSnapshot) |
IPC_MESSAGE_HANDLER(ChromeViewMsg_HandleMessageFromExternalHost, |
OnHandleMessageFromExternalHost) |
IPC_MESSAGE_HANDLER(ChromeViewMsg_JavaScriptStressTestControl, |
@@ -235,6 +236,24 @@ void ChromeRenderViewObserver::OnWebUIJavaScript( |
webui_javascript_->notify_result = notify_result; |
} |
+void ChromeRenderViewObserver::OnCaptureSnapshot() { |
+ SkBitmap snapshot; |
+ bool error = false; |
+ |
+ WebFrame* main_frame = render_view()->GetWebView()->mainFrame(); |
+ if (!main_frame) |
+ error = true; |
+ |
+ if (!error && !CaptureSnapshot(render_view()->GetWebView(), &snapshot)) |
+ error = true; |
+ |
+ DCHECK(error == snapshot.empty()) << |
+ "Snapshot should be empty on error, non-empty otherwise."; |
+ |
+ // Send the snapshot to the browser process. |
+ Send(new ChromeViewHostMsg_Snapshot(routing_id(), snapshot)); |
+} |
+ |
void ChromeRenderViewObserver::OnHandleMessageFromExternalHost( |
const std::string& message, |
const std::string& origin, |
@@ -776,6 +795,35 @@ void ChromeRenderViewObserver::CaptureText(WebFrame* frame, |
} |
} |
+bool ChromeRenderViewObserver::CaptureSnapshot(WebView* view, |
+ SkBitmap* snapshot) { |
+ base::TimeTicks beginning_time = base::TimeTicks::Now(); |
+ |
+ view->layout(); |
+ const WebSize& size = view->size(); |
+ |
+ skia::RefPtr<SkCanvas> canvas = skia::AdoptRef( |
+ skia::CreatePlatformCanvas( |
+ size.width, size.height, true, NULL, skia::RETURN_NULL_ON_FAILURE)); |
+ if (!canvas) |
+ return false; |
+ |
+ view->paint(webkit_glue::ToWebCanvas(canvas.get()), |
+ WebRect(0, 0, size.width, size.height)); |
+ // TODO: Add a way to snapshot the whole page, not just the currently |
+ // visible part. |
+ |
+ SkDevice* device = skia::GetTopDevice(*canvas); |
+ |
+ const SkBitmap& bitmap = device->accessBitmap(false); |
+ if (!bitmap.copyTo(snapshot, SkBitmap::kARGB_8888_Config)) |
+ return false; |
+ |
+ UMA_HISTOGRAM_TIMES("Renderer4.Snapshot", |
+ base::TimeTicks::Now() - beginning_time); |
+ return true; |
+} |
+ |
ExternalHostBindings* ChromeRenderViewObserver::GetExternalHostBindings() { |
if (!external_host_bindings_.get()) { |
external_host_bindings_.reset(new ExternalHostBindings( |