summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/chrome_render_view_observer.cc
diff options
context:
space:
mode:
authorjustinlin@chromium.org <justinlin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-23 16:30:49 +0000
committerjustinlin@chromium.org <justinlin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-23 16:30:49 +0000
commit44f774648086e268e81b5d386102bfd6f08b219f (patch)
tree495e7914f1804c4904a4778644f9a90418615a57 /chrome/renderer/chrome_render_view_observer.cc
parent4710df256c5d79d6144d807fd2459065521b0f3d (diff)
downloadchromium_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.cc48
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(