Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(124)

Side by Side Diff: content/browser/devtools/renderer_overrides_handler.cc

Issue 481483002: DevTools: backend part of the color picker (behind experiment). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698