diff options
author | justinlin@chromium.org <justinlin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-23 16:30:49 +0000 |
---|---|---|
committer | justinlin@chromium.org <justinlin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-23 16:30:49 +0000 |
commit | 44f774648086e268e81b5d386102bfd6f08b219f (patch) | |
tree | 495e7914f1804c4904a4778644f9a90418615a57 /chrome/renderer/chrome_render_view_observer.cc | |
parent | 4710df256c5d79d6144d807fd2459065521b0f3d (diff) | |
download | chromium_src-44f774648086e268e81b5d386102bfd6f08b219f.zip chromium_src-44f774648086e268e81b5d386102bfd6f08b219f.tar.gz chromium_src-44f774648086e268e81b5d386102bfd6f08b219f.tar.bz2 |
Restore SnapshotTabHelper temporarily until dependencies are fixed (reverts deletions in r189969). Do not use this class in Chrome.
BUG=223374
TBR=jam@, sky@
Review URL: https://codereview.chromium.org/12770014
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@190027 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer/chrome_render_view_observer.cc')
-rw-r--r-- | chrome/renderer/chrome_render_view_observer.cc | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/chrome/renderer/chrome_render_view_observer.cc b/chrome/renderer/chrome_render_view_observer.cc index 48651a7..020979a 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( |