OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 "content/browser/devtools/renderer_overrides_handler.h" | 5 #include "content/browser/devtools/renderer_overrides_handler.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/barrier_closure.h" | 10 #include "base/barrier_closure.h" |
11 #include "base/base64.h" | 11 #include "base/base64.h" |
12 #include "base/bind.h" | 12 #include "base/bind.h" |
13 #include "base/bind_helpers.h" | 13 #include "base/bind_helpers.h" |
14 #include "base/files/file_path.h" | 14 #include "base/files/file_path.h" |
15 #include "base/strings/string16.h" | 15 #include "base/strings/string16.h" |
16 #include "base/thread_task_runner_handle.h" | 16 #include "base/thread_task_runner_handle.h" |
17 #include "base/values.h" | 17 #include "base/values.h" |
18 #include "content/browser/child_process_security_policy_impl.h" | 18 #include "content/browser/child_process_security_policy_impl.h" |
19 #include "content/browser/devtools/devtools_protocol_constants.h" | 19 #include "content/browser/devtools/devtools_protocol_constants.h" |
20 #include "content/browser/devtools/devtools_tracing_handler.h" | 20 #include "content/browser/devtools/devtools_tracing_handler.h" |
21 #include "content/browser/renderer_host/dip_util.h" | 21 #include "content/browser/renderer_host/dip_util.h" |
22 #include "content/browser/renderer_host/render_view_host_delegate.h" | 22 #include "content/browser/renderer_host/render_view_host_delegate.h" |
23 #include "content/browser/renderer_host/render_view_host_impl.h" | 23 #include "content/browser/renderer_host/render_view_host_impl.h" |
24 #include "content/browser/renderer_host/render_widget_host_view_base.h" | 24 #include "content/browser/renderer_host/render_widget_host_view_base.h" |
| 25 #include "content/browser/web_contents/web_contents_impl.h" |
| 26 #include "content/common/cursors/webcursor.h" |
25 #include "content/common/view_messages.h" | 27 #include "content/common/view_messages.h" |
26 #include "content/public/browser/browser_thread.h" | 28 #include "content/public/browser/browser_thread.h" |
27 #include "content/public/browser/content_browser_client.h" | 29 #include "content/public/browser/content_browser_client.h" |
28 #include "content/public/browser/devtools_agent_host.h" | 30 #include "content/public/browser/devtools_agent_host.h" |
29 #include "content/public/browser/javascript_dialog_manager.h" | 31 #include "content/public/browser/javascript_dialog_manager.h" |
30 #include "content/public/browser/navigation_controller.h" | 32 #include "content/public/browser/navigation_controller.h" |
31 #include "content/public/browser/navigation_entry.h" | 33 #include "content/public/browser/navigation_entry.h" |
32 #include "content/public/browser/render_process_host.h" | 34 #include "content/public/browser/render_process_host.h" |
33 #include "content/public/browser/render_view_host.h" | 35 #include "content/public/browser/render_view_host.h" |
34 #include "content/public/browser/render_widget_host_view.h" | 36 #include "content/public/browser/render_widget_host_view.h" |
35 #include "content/public/browser/storage_partition.h" | 37 #include "content/public/browser/storage_partition.h" |
36 #include "content/public/browser/web_contents.h" | 38 #include "content/public/browser/web_contents.h" |
37 #include "content/public/browser/web_contents_delegate.h" | 39 #include "content/public/browser/web_contents_delegate.h" |
38 #include "content/public/common/content_client.h" | 40 #include "content/public/common/content_client.h" |
39 #include "content/public/common/page_transition_types.h" | 41 #include "content/public/common/page_transition_types.h" |
40 #include "content/public/common/referrer.h" | 42 #include "content/public/common/referrer.h" |
41 #include "ipc/ipc_sender.h" | 43 #include "ipc/ipc_sender.h" |
42 #include "net/base/net_util.h" | 44 #include "net/base/net_util.h" |
| 45 #include "third_party/WebKit/public/platform/WebCursorInfo.h" |
43 #include "third_party/WebKit/public/platform/WebScreenInfo.h" | 46 #include "third_party/WebKit/public/platform/WebScreenInfo.h" |
44 #include "third_party/WebKit/public/web/WebInputEvent.h" | 47 #include "third_party/WebKit/public/web/WebInputEvent.h" |
45 #include "ui/gfx/codec/jpeg_codec.h" | 48 #include "ui/gfx/codec/jpeg_codec.h" |
46 #include "ui/gfx/codec/png_codec.h" | 49 #include "ui/gfx/codec/png_codec.h" |
47 #include "ui/gfx/display.h" | 50 #include "ui/gfx/display.h" |
48 #include "ui/gfx/screen.h" | 51 #include "ui/gfx/screen.h" |
49 #include "ui/gfx/size_conversions.h" | 52 #include "ui/gfx/size_conversions.h" |
50 #include "ui/snapshot/snapshot.h" | 53 #include "ui/snapshot/snapshot.h" |
51 #include "url/gurl.h" | 54 #include "url/gurl.h" |
52 #include "webkit/browser/quota/quota_manager.h" | 55 #include "webkit/browser/quota/quota_manager.h" |
(...skipping 11 matching lines...) Expand all Loading... |
64 static int kDefaultScreenshotQuality = 80; | 67 static int kDefaultScreenshotQuality = 80; |
65 static int kFrameRateThresholdMs = 100; | 68 static int kFrameRateThresholdMs = 100; |
66 static int kCaptureRetryLimit = 2; | 69 static int kCaptureRetryLimit = 2; |
67 | 70 |
68 } // namespace | 71 } // namespace |
69 | 72 |
70 RendererOverridesHandler::RendererOverridesHandler(DevToolsAgentHost* agent) | 73 RendererOverridesHandler::RendererOverridesHandler(DevToolsAgentHost* agent) |
71 : agent_(agent), | 74 : agent_(agent), |
72 has_last_compositor_frame_metadata_(false), | 75 has_last_compositor_frame_metadata_(false), |
73 capture_retry_count_(0), | 76 capture_retry_count_(0), |
| 77 color_picker_enabled_(false), |
74 weak_factory_(this) { | 78 weak_factory_(this) { |
75 RegisterCommandHandler( | 79 RegisterCommandHandler( |
76 devtools::DOM::setFileInputFiles::kName, | 80 devtools::DOM::setFileInputFiles::kName, |
77 base::Bind( | 81 base::Bind( |
78 &RendererOverridesHandler::GrantPermissionsForSetFileInputFiles, | 82 &RendererOverridesHandler::GrantPermissionsForSetFileInputFiles, |
79 base::Unretained(this))); | 83 base::Unretained(this))); |
80 RegisterCommandHandler( | 84 RegisterCommandHandler( |
81 devtools::Network::clearBrowserCache::kName, | 85 devtools::Network::clearBrowserCache::kName, |
82 base::Bind( | 86 base::Bind( |
83 &RendererOverridesHandler::ClearBrowserCache, | 87 &RendererOverridesHandler::ClearBrowserCache, |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 devtools::Page::stopScreencast::kName, | 139 devtools::Page::stopScreencast::kName, |
136 base::Bind( | 140 base::Bind( |
137 &RendererOverridesHandler::PageStopScreencast, | 141 &RendererOverridesHandler::PageStopScreencast, |
138 base::Unretained(this))); | 142 base::Unretained(this))); |
139 RegisterCommandHandler( | 143 RegisterCommandHandler( |
140 devtools::Page::queryUsageAndQuota::kName, | 144 devtools::Page::queryUsageAndQuota::kName, |
141 base::Bind( | 145 base::Bind( |
142 &RendererOverridesHandler::PageQueryUsageAndQuota, | 146 &RendererOverridesHandler::PageQueryUsageAndQuota, |
143 base::Unretained(this))); | 147 base::Unretained(this))); |
144 RegisterCommandHandler( | 148 RegisterCommandHandler( |
| 149 devtools::Page::setColorPickerEnabled::kName, |
| 150 base::Bind( |
| 151 &RendererOverridesHandler::PageSetColorPickerEnabled, |
| 152 base::Unretained(this))); |
| 153 RegisterCommandHandler( |
145 devtools::Input::emulateTouchFromMouseEvent::kName, | 154 devtools::Input::emulateTouchFromMouseEvent::kName, |
146 base::Bind( | 155 base::Bind( |
147 &RendererOverridesHandler::InputEmulateTouchFromMouseEvent, | 156 &RendererOverridesHandler::InputEmulateTouchFromMouseEvent, |
148 base::Unretained(this))); | 157 base::Unretained(this))); |
149 } | 158 } |
150 | 159 |
151 RendererOverridesHandler::~RendererOverridesHandler() {} | 160 RendererOverridesHandler::~RendererOverridesHandler() {} |
152 | 161 |
153 void RendererOverridesHandler::OnClientDetached() { | 162 void RendererOverridesHandler::OnClientDetached() { |
154 RenderViewHostImpl* host = GetRenderViewHostImpl(); | 163 RenderViewHostImpl* host = GetRenderViewHostImpl(); |
155 if (screencast_command_ && host) | 164 if (screencast_command_ && host) |
156 host->SetTouchEventEmulationEnabled(false, false); | 165 host->SetTouchEventEmulationEnabled(false, false); |
157 screencast_command_ = NULL; | 166 screencast_command_ = NULL; |
158 } | 167 } |
159 | 168 |
160 void RendererOverridesHandler::OnSwapCompositorFrame( | 169 void RendererOverridesHandler::OnSwapCompositorFrame( |
161 const cc::CompositorFrameMetadata& frame_metadata) { | 170 const cc::CompositorFrameMetadata& frame_metadata) { |
162 last_compositor_frame_metadata_ = frame_metadata; | 171 last_compositor_frame_metadata_ = frame_metadata; |
163 has_last_compositor_frame_metadata_ = true; | 172 has_last_compositor_frame_metadata_ = true; |
164 | 173 |
165 if (screencast_command_) | 174 if (screencast_command_) |
166 InnerSwapCompositorFrame(); | 175 InnerSwapCompositorFrame(); |
| 176 if (color_picker_enabled_) |
| 177 UpdateColorPickerFrame(); |
167 } | 178 } |
168 | 179 |
169 void RendererOverridesHandler::OnVisibilityChanged(bool visible) { | 180 void RendererOverridesHandler::OnVisibilityChanged(bool visible) { |
170 if (!screencast_command_) | 181 if (!screencast_command_) |
171 return; | 182 return; |
172 NotifyScreencastVisibility(visible); | 183 NotifyScreencastVisibility(visible); |
173 } | 184 } |
174 | 185 |
175 void RendererOverridesHandler::OnRenderViewHostChanged() { | 186 void RendererOverridesHandler::OnRenderViewHostChanged() { |
176 RenderViewHostImpl* host = GetRenderViewHostImpl(); | 187 RenderViewHostImpl* host = GetRenderViewHostImpl(); |
(...skipping 649 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
826 void RendererOverridesHandler::NotifyScreencastVisibility(bool visible) { | 837 void RendererOverridesHandler::NotifyScreencastVisibility(bool visible) { |
827 if (visible) | 838 if (visible) |
828 capture_retry_count_ = kCaptureRetryLimit; | 839 capture_retry_count_ = kCaptureRetryLimit; |
829 base::DictionaryValue* params = new base::DictionaryValue(); | 840 base::DictionaryValue* params = new base::DictionaryValue(); |
830 params->SetBoolean( | 841 params->SetBoolean( |
831 devtools::Page::screencastVisibilityChanged::kParamVisible, visible); | 842 devtools::Page::screencastVisibilityChanged::kParamVisible, visible); |
832 SendNotification( | 843 SendNotification( |
833 devtools::Page::screencastVisibilityChanged::kName, params); | 844 devtools::Page::screencastVisibilityChanged::kName, params); |
834 } | 845 } |
835 | 846 |
| 847 scoped_refptr<DevToolsProtocol::Response> |
| 848 RendererOverridesHandler::PageSetColorPickerEnabled( |
| 849 scoped_refptr<DevToolsProtocol::Command> command) { |
| 850 base::DictionaryValue* params = command->params(); |
| 851 bool color_picker_enabled; |
| 852 if (!params || !params->GetBoolean( |
| 853 devtools::Page::setColorPickerEnabled::kParamEnabled, |
| 854 &color_picker_enabled)) { |
| 855 return command->InvalidParamResponse( |
| 856 devtools::Page::setColorPickerEnabled::kParamEnabled); |
| 857 } |
| 858 RenderViewHostImpl* host = GetRenderViewHostImpl(); |
| 859 if (!host) |
| 860 return command->InternalErrorResponse("Could not connect to view"); |
| 861 |
| 862 SetColorPickerEnabled(color_picker_enabled); |
| 863 return command->SuccessResponse(NULL); |
| 864 } |
| 865 |
| 866 void RendererOverridesHandler::SetColorPickerEnabled(bool enabled) { |
| 867 if (color_picker_enabled_ == enabled) |
| 868 return; |
| 869 |
| 870 RenderViewHostImpl* host = GetRenderViewHostImpl(); |
| 871 color_picker_enabled_ = enabled; |
| 872 |
| 873 if (enabled) { |
| 874 UpdateColorPickerFrame(); |
| 875 host->SetInterceptingMouseCallback( |
| 876 base::Bind(&RendererOverridesHandler::HandleMouseEvent, |
| 877 weak_factory_.GetWeakPtr())); |
| 878 } else { |
| 879 color_picker_frame_.reset(); |
| 880 host->SetInterceptingMouseCallback( |
| 881 RenderWidgetHostImpl::InterceptingMouseCallback()); |
| 882 } |
| 883 |
| 884 WebCursor pointer_cursor; |
| 885 WebCursor::CursorInfo cursor_info; |
| 886 cursor_info.type = blink::WebCursorInfo::TypePointer; |
| 887 pointer_cursor.InitFromCursorInfo(cursor_info); |
| 888 |
| 889 host->SetCursor(pointer_cursor); |
| 890 } |
| 891 |
| 892 void RendererOverridesHandler::UpdateColorPickerFrame() { |
| 893 RenderViewHostImpl* host = GetRenderViewHostImpl(); |
| 894 if (!host) |
| 895 return; |
| 896 RenderWidgetHostViewBase* view = |
| 897 static_cast<RenderWidgetHostViewBase*>(host->GetView()); |
| 898 gfx::Size size = view->GetViewBounds().size(); |
| 899 view->CopyFromCompositingSurface( |
| 900 gfx::Rect(size), size, |
| 901 base::Bind(&RendererOverridesHandler::ColorPickerFrameUpdated, |
| 902 weak_factory_.GetWeakPtr()), |
| 903 kN32_SkColorType); |
| 904 } |
| 905 |
| 906 void RendererOverridesHandler::ColorPickerFrameUpdated( |
| 907 bool succeeded, |
| 908 const SkBitmap& bitmap) { |
| 909 if (succeeded) |
| 910 color_picker_frame_ = bitmap; |
| 911 } |
| 912 |
| 913 void RendererOverridesHandler::HandleMouseEvent( |
| 914 const blink::WebMouseEvent& event) { |
| 915 |
| 916 if (color_picker_frame_.drawsNothing()) { |
| 917 if (event.button == blink::WebMouseEvent::ButtonLeft) |
| 918 SetColorPickerEnabled(false); |
| 919 return; |
| 920 } |
| 921 |
| 922 if (event.button == blink::WebMouseEvent::ButtonLeft) { |
| 923 color_picker_frame_.lockPixels(); |
| 924 SkColor color = color_picker_frame_.getColor(event.x, event.y); |
| 925 color_picker_frame_.unlockPixels(); |
| 926 base::DictionaryValue* color_dict = new base::DictionaryValue(); |
| 927 color_dict->SetInteger("r", SkColorGetR(color)); |
| 928 color_dict->SetInteger("g", SkColorGetG(color)); |
| 929 color_dict->SetInteger("b", SkColorGetB(color)); |
| 930 color_dict->SetInteger("a", SkColorGetA(color)); |
| 931 base::DictionaryValue* response = new base::DictionaryValue(); |
| 932 response->Set(devtools::Page::colorPicked::kParamColor, color_dict); |
| 933 SendNotification(devtools::Page::colorPicked::kName, response); |
| 934 } |
| 935 |
| 936 const int kCursorSize = 150; |
| 937 const int kDiameter = 110; |
| 938 const int kHotspotRadius = 5; |
| 939 const int kPixelSize = 10; |
| 940 int padding = (kCursorSize - kDiameter) / 2; |
| 941 int hotspot = padding + kHotspotRadius; |
| 942 |
| 943 skia::RefPtr<SkCanvas> canvas = |
| 944 skia::AdoptRef(SkCanvas::NewRasterN32(kCursorSize, kCursorSize)); |
| 945 |
| 946 SkPaint paint; |
| 947 paint.setStrokeWidth(2); |
| 948 paint.setColor(SK_ColorDKGRAY); |
| 949 paint.setStyle(SkPaint::kStroke_Style); |
| 950 paint.setAntiAlias(true); |
| 951 canvas->drawCircle(hotspot, hotspot, kHotspotRadius, paint); |
| 952 canvas->drawLine(hotspot + kHotspotRadius - 1, |
| 953 hotspot + kHotspotRadius - 1, |
| 954 kCursorSize / 2, kCursorSize / 2, |
| 955 paint); |
| 956 |
| 957 SkPath clip_path; |
| 958 clip_path.addOval(SkRect::MakeXYWH(padding, padding, kDiameter, kDiameter)); |
| 959 clip_path.close(); |
| 960 canvas->clipPath(clip_path, SkRegion::kIntersect_Op, true); |
| 961 |
| 962 SkRect src_rect = SkRect::MakeXYWH(event.x - 5, event.y - 5, 11, 11); |
| 963 SkRect dst_rect = SkRect::MakeXYWH(padding, padding, kDiameter, kDiameter); |
| 964 canvas->drawBitmapRectToRect(color_picker_frame_, &src_rect, dst_rect); |
| 965 |
| 966 paint.setStrokeWidth(1); |
| 967 paint.setAntiAlias(false); |
| 968 paint.setColor(SK_ColorGRAY); |
| 969 for (int i = padding; i < kCursorSize - padding; i += kPixelSize) { |
| 970 canvas->drawLine(i, padding, i, kCursorSize - padding, paint); |
| 971 canvas->drawLine(padding, i, kCursorSize - padding, i, paint); |
| 972 } |
| 973 |
| 974 SkRect pixel = SkRect::MakeXYWH(kCursorSize / 2 - kHotspotRadius, |
| 975 kCursorSize / 2 - kHotspotRadius, |
| 976 kPixelSize, kPixelSize); |
| 977 paint.setColor(SK_ColorRED); |
| 978 canvas->drawRect(pixel, paint); |
| 979 |
| 980 paint.setStrokeWidth(2); |
| 981 paint.setColor(SK_ColorDKGRAY); |
| 982 paint.setAntiAlias(true); |
| 983 canvas->drawCircle(kCursorSize / 2, kCursorSize / 2, kDiameter / 2, paint); |
| 984 |
| 985 SkBitmap result; |
| 986 result.allocN32Pixels(kCursorSize, kCursorSize); |
| 987 canvas->readPixels(&result, 0, 0); |
| 988 |
| 989 WebCursor cursor; |
| 990 WebCursor::CursorInfo cursor_info; |
| 991 cursor_info.type = blink::WebCursorInfo::TypeCustom; |
| 992 cursor_info.image_scale_factor = 1; |
| 993 cursor_info.custom_image = result; |
| 994 cursor_info.hotspot = |
| 995 gfx::Point(hotspot, hotspot); |
| 996 #if defined(OS_WIN) |
| 997 cursor_info.external_handle = 0; |
| 998 #endif |
| 999 |
| 1000 cursor.InitFromCursorInfo(cursor_info); |
| 1001 RenderViewHostImpl* rvh = GetRenderViewHostImpl(); |
| 1002 if (rvh) |
| 1003 rvh->SetCursor(cursor); |
| 1004 } |
| 1005 |
836 // Input agent handlers ------------------------------------------------------ | 1006 // Input agent handlers ------------------------------------------------------ |
837 | 1007 |
838 scoped_refptr<DevToolsProtocol::Response> | 1008 scoped_refptr<DevToolsProtocol::Response> |
839 RendererOverridesHandler::InputEmulateTouchFromMouseEvent( | 1009 RendererOverridesHandler::InputEmulateTouchFromMouseEvent( |
840 scoped_refptr<DevToolsProtocol::Command> command) { | 1010 scoped_refptr<DevToolsProtocol::Command> command) { |
841 if (!screencast_command_) | 1011 if (!screencast_command_) |
842 return command->InternalErrorResponse("Screencast should be turned on"); | 1012 return command->InternalErrorResponse("Screencast should be turned on"); |
843 | 1013 |
844 base::DictionaryValue* params = command->params(); | 1014 base::DictionaryValue* params = command->params(); |
845 if (!params) | 1015 if (!params) |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
961 host->ForwardMouseEvent(mouse_event); | 1131 host->ForwardMouseEvent(mouse_event); |
962 return command->SuccessResponse(NULL); | 1132 return command->SuccessResponse(NULL); |
963 } | 1133 } |
964 | 1134 |
965 RenderViewHostImpl* RendererOverridesHandler::GetRenderViewHostImpl() { | 1135 RenderViewHostImpl* RendererOverridesHandler::GetRenderViewHostImpl() { |
966 return static_cast<RenderViewHostImpl*>( | 1136 return static_cast<RenderViewHostImpl*>( |
967 agent_->GetWebContents()->GetRenderViewHost()); | 1137 agent_->GetWebContents()->GetRenderViewHost()); |
968 } | 1138 } |
969 | 1139 |
970 } // namespace content | 1140 } // namespace content |
OLD | NEW |