| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/renderer/chrome_render_view_observer.h" | 5 #include "chrome/renderer/chrome_render_view_observer.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 187 OnSetClientSidePhishingDetection(true); | 187 OnSetClientSidePhishingDetection(true); |
| 188 } | 188 } |
| 189 | 189 |
| 190 ChromeRenderViewObserver::~ChromeRenderViewObserver() { | 190 ChromeRenderViewObserver::~ChromeRenderViewObserver() { |
| 191 } | 191 } |
| 192 | 192 |
| 193 bool ChromeRenderViewObserver::OnMessageReceived(const IPC::Message& message) { | 193 bool ChromeRenderViewObserver::OnMessageReceived(const IPC::Message& message) { |
| 194 bool handled = true; | 194 bool handled = true; |
| 195 IPC_BEGIN_MESSAGE_MAP(ChromeRenderViewObserver, message) | 195 IPC_BEGIN_MESSAGE_MAP(ChromeRenderViewObserver, message) |
| 196 IPC_MESSAGE_HANDLER(ChromeViewMsg_WebUIJavaScript, OnWebUIJavaScript) | 196 IPC_MESSAGE_HANDLER(ChromeViewMsg_WebUIJavaScript, OnWebUIJavaScript) |
| 197 IPC_MESSAGE_HANDLER(ChromeViewMsg_CaptureSnapshot, OnCaptureSnapshot) | |
| 198 IPC_MESSAGE_HANDLER(ChromeViewMsg_HandleMessageFromExternalHost, | 197 IPC_MESSAGE_HANDLER(ChromeViewMsg_HandleMessageFromExternalHost, |
| 199 OnHandleMessageFromExternalHost) | 198 OnHandleMessageFromExternalHost) |
| 200 IPC_MESSAGE_HANDLER(ChromeViewMsg_JavaScriptStressTestControl, | 199 IPC_MESSAGE_HANDLER(ChromeViewMsg_JavaScriptStressTestControl, |
| 201 OnJavaScriptStressTestControl) | 200 OnJavaScriptStressTestControl) |
| 202 IPC_MESSAGE_HANDLER(ChromeViewMsg_SetAllowDisplayingInsecureContent, | 201 IPC_MESSAGE_HANDLER(ChromeViewMsg_SetAllowDisplayingInsecureContent, |
| 203 OnSetAllowDisplayingInsecureContent) | 202 OnSetAllowDisplayingInsecureContent) |
| 204 IPC_MESSAGE_HANDLER(ChromeViewMsg_SetAllowRunningInsecureContent, | 203 IPC_MESSAGE_HANDLER(ChromeViewMsg_SetAllowRunningInsecureContent, |
| 205 OnSetAllowRunningInsecureContent) | 204 OnSetAllowRunningInsecureContent) |
| 206 IPC_MESSAGE_HANDLER(ChromeViewMsg_SetClientSidePhishingDetection, | 205 IPC_MESSAGE_HANDLER(ChromeViewMsg_SetClientSidePhishingDetection, |
| 207 OnSetClientSidePhishingDetection) | 206 OnSetClientSidePhishingDetection) |
| (...skipping 21 matching lines...) Expand all Loading... |
| 229 const string16& jscript, | 228 const string16& jscript, |
| 230 int id, | 229 int id, |
| 231 bool notify_result) { | 230 bool notify_result) { |
| 232 webui_javascript_.reset(new WebUIJavaScript()); | 231 webui_javascript_.reset(new WebUIJavaScript()); |
| 233 webui_javascript_->frame_xpath = frame_xpath; | 232 webui_javascript_->frame_xpath = frame_xpath; |
| 234 webui_javascript_->jscript = jscript; | 233 webui_javascript_->jscript = jscript; |
| 235 webui_javascript_->id = id; | 234 webui_javascript_->id = id; |
| 236 webui_javascript_->notify_result = notify_result; | 235 webui_javascript_->notify_result = notify_result; |
| 237 } | 236 } |
| 238 | 237 |
| 239 void ChromeRenderViewObserver::OnCaptureSnapshot() { | |
| 240 SkBitmap snapshot; | |
| 241 bool error = false; | |
| 242 | |
| 243 WebFrame* main_frame = render_view()->GetWebView()->mainFrame(); | |
| 244 if (!main_frame) | |
| 245 error = true; | |
| 246 | |
| 247 if (!error && !CaptureSnapshot(render_view()->GetWebView(), &snapshot)) | |
| 248 error = true; | |
| 249 | |
| 250 DCHECK(error == snapshot.empty()) << | |
| 251 "Snapshot should be empty on error, non-empty otherwise."; | |
| 252 | |
| 253 // Send the snapshot to the browser process. | |
| 254 Send(new ChromeViewHostMsg_Snapshot(routing_id(), snapshot)); | |
| 255 } | |
| 256 | |
| 257 void ChromeRenderViewObserver::OnHandleMessageFromExternalHost( | 238 void ChromeRenderViewObserver::OnHandleMessageFromExternalHost( |
| 258 const std::string& message, | 239 const std::string& message, |
| 259 const std::string& origin, | 240 const std::string& origin, |
| 260 const std::string& target) { | 241 const std::string& target) { |
| 261 if (message.empty()) | 242 if (message.empty()) |
| 262 return; | 243 return; |
| 263 GetExternalHostBindings()->ForwardMessageFromExternalHost(message, origin, | 244 GetExternalHostBindings()->ForwardMessageFromExternalHost(message, origin, |
| 264 target); | 245 target); |
| 265 } | 246 } |
| 266 | 247 |
| (...skipping 521 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 788 // partial word indexed at the end that might have been clipped. Therefore, | 769 // partial word indexed at the end that might have been clipped. Therefore, |
| 789 // terminate the string at the last space to ensure no words are clipped. | 770 // terminate the string at the last space to ensure no words are clipped. |
| 790 if (contents->size() == kMaxIndexChars) { | 771 if (contents->size() == kMaxIndexChars) { |
| 791 size_t last_space_index = contents->find_last_of(kWhitespaceUTF16); | 772 size_t last_space_index = contents->find_last_of(kWhitespaceUTF16); |
| 792 if (last_space_index == std::wstring::npos) | 773 if (last_space_index == std::wstring::npos) |
| 793 return; // don't index if we got a huge block of text with no spaces | 774 return; // don't index if we got a huge block of text with no spaces |
| 794 contents->resize(last_space_index); | 775 contents->resize(last_space_index); |
| 795 } | 776 } |
| 796 } | 777 } |
| 797 | 778 |
| 798 bool ChromeRenderViewObserver::CaptureSnapshot(WebView* view, | |
| 799 SkBitmap* snapshot) { | |
| 800 base::TimeTicks beginning_time = base::TimeTicks::Now(); | |
| 801 | |
| 802 view->layout(); | |
| 803 const WebSize& size = view->size(); | |
| 804 | |
| 805 skia::RefPtr<SkCanvas> canvas = skia::AdoptRef( | |
| 806 skia::CreatePlatformCanvas( | |
| 807 size.width, size.height, true, NULL, skia::RETURN_NULL_ON_FAILURE)); | |
| 808 if (!canvas) | |
| 809 return false; | |
| 810 | |
| 811 view->paint(webkit_glue::ToWebCanvas(canvas.get()), | |
| 812 WebRect(0, 0, size.width, size.height)); | |
| 813 // TODO: Add a way to snapshot the whole page, not just the currently | |
| 814 // visible part. | |
| 815 | |
| 816 SkDevice* device = skia::GetTopDevice(*canvas); | |
| 817 | |
| 818 const SkBitmap& bitmap = device->accessBitmap(false); | |
| 819 if (!bitmap.copyTo(snapshot, SkBitmap::kARGB_8888_Config)) | |
| 820 return false; | |
| 821 | |
| 822 UMA_HISTOGRAM_TIMES("Renderer4.Snapshot", | |
| 823 base::TimeTicks::Now() - beginning_time); | |
| 824 return true; | |
| 825 } | |
| 826 | |
| 827 ExternalHostBindings* ChromeRenderViewObserver::GetExternalHostBindings() { | 779 ExternalHostBindings* ChromeRenderViewObserver::GetExternalHostBindings() { |
| 828 if (!external_host_bindings_.get()) { | 780 if (!external_host_bindings_.get()) { |
| 829 external_host_bindings_.reset(new ExternalHostBindings( | 781 external_host_bindings_.reset(new ExternalHostBindings( |
| 830 render_view(), routing_id())); | 782 render_view(), routing_id())); |
| 831 } | 783 } |
| 832 return external_host_bindings_.get(); | 784 return external_host_bindings_.get(); |
| 833 } | 785 } |
| 834 | 786 |
| 835 bool ChromeRenderViewObserver::IsStrictSecurityHost(const std::string& host) { | 787 bool ChromeRenderViewObserver::IsStrictSecurityHost(const std::string& host) { |
| 836 return (strict_security_hosts_.find(host) != strict_security_hosts_.end()); | 788 return (strict_security_hosts_.find(host) != strict_security_hosts_.end()); |
| 837 } | 789 } |
| OLD | NEW |