| 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 |