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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/devtools/renderer_overrides_handler.cc
diff --git a/content/browser/devtools/renderer_overrides_handler.cc b/content/browser/devtools/renderer_overrides_handler.cc
index d700dee9459362adad5459477dd16d4503bf795a..74c5462c73799589ca6525a9d09083eb568f84f8 100644
--- a/content/browser/devtools/renderer_overrides_handler.cc
+++ b/content/browser/devtools/renderer_overrides_handler.cc
@@ -22,6 +22,8 @@
#include "content/browser/renderer_host/render_view_host_delegate.h"
#include "content/browser/renderer_host/render_view_host_impl.h"
#include "content/browser/renderer_host/render_widget_host_view_base.h"
+#include "content/browser/web_contents/web_contents_impl.h"
+#include "content/common/cursors/webcursor.h"
#include "content/common/view_messages.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/content_browser_client.h"
@@ -40,6 +42,7 @@
#include "content/public/common/referrer.h"
#include "ipc/ipc_sender.h"
#include "net/base/net_util.h"
+#include "third_party/WebKit/public/platform/WebCursorInfo.h"
#include "third_party/WebKit/public/platform/WebScreenInfo.h"
#include "third_party/WebKit/public/web/WebInputEvent.h"
#include "ui/gfx/codec/jpeg_codec.h"
@@ -71,6 +74,7 @@ RendererOverridesHandler::RendererOverridesHandler(DevToolsAgentHost* agent)
: agent_(agent),
has_last_compositor_frame_metadata_(false),
capture_retry_count_(0),
+ color_picker_enabled_(false),
weak_factory_(this) {
RegisterCommandHandler(
devtools::DOM::setFileInputFiles::kName,
@@ -142,6 +146,11 @@ RendererOverridesHandler::RendererOverridesHandler(DevToolsAgentHost* agent)
&RendererOverridesHandler::PageQueryUsageAndQuota,
base::Unretained(this)));
RegisterCommandHandler(
+ devtools::Page::setColorPickerEnabled::kName,
+ base::Bind(
+ &RendererOverridesHandler::PageSetColorPickerEnabled,
+ base::Unretained(this)));
+ RegisterCommandHandler(
devtools::Input::emulateTouchFromMouseEvent::kName,
base::Bind(
&RendererOverridesHandler::InputEmulateTouchFromMouseEvent,
@@ -164,6 +173,8 @@ void RendererOverridesHandler::OnSwapCompositorFrame(
if (screencast_command_)
InnerSwapCompositorFrame();
+ if (color_picker_enabled_)
+ UpdateColorPickerFrame();
}
void RendererOverridesHandler::OnVisibilityChanged(bool visible) {
@@ -833,6 +844,165 @@ void RendererOverridesHandler::NotifyScreencastVisibility(bool visible) {
devtools::Page::screencastVisibilityChanged::kName, params);
}
+scoped_refptr<DevToolsProtocol::Response>
+RendererOverridesHandler::PageSetColorPickerEnabled(
+ scoped_refptr<DevToolsProtocol::Command> command) {
+ base::DictionaryValue* params = command->params();
+ bool color_picker_enabled;
+ if (!params || !params->GetBoolean(
+ devtools::Page::setColorPickerEnabled::kParamEnabled,
+ &color_picker_enabled)) {
+ return command->InvalidParamResponse(
+ devtools::Page::setColorPickerEnabled::kParamEnabled);
+ }
+ RenderViewHostImpl* host = GetRenderViewHostImpl();
+ if (!host)
+ return command->InternalErrorResponse("Could not connect to view");
+
+ SetColorPickerEnabled(color_picker_enabled);
+ return command->SuccessResponse(NULL);
+}
+
+void RendererOverridesHandler::SetColorPickerEnabled(bool enabled) {
+ if (color_picker_enabled_ == enabled)
+ return;
+
+ RenderViewHostImpl* host = GetRenderViewHostImpl();
+ color_picker_enabled_ = enabled;
+
+ if (enabled) {
+ UpdateColorPickerFrame();
+ host->SetInterceptingMouseCallback(
+ base::Bind(&RendererOverridesHandler::HandleMouseEvent,
+ weak_factory_.GetWeakPtr()));
+ } else {
+ color_picker_frame_.reset();
+ host->SetInterceptingMouseCallback(
+ RenderWidgetHostImpl::InterceptingMouseCallback());
+ }
+
+ WebCursor pointer_cursor;
+ WebCursor::CursorInfo cursor_info;
+ cursor_info.type = blink::WebCursorInfo::TypePointer;
+ pointer_cursor.InitFromCursorInfo(cursor_info);
+
+ host->SetCursor(pointer_cursor);
+}
+
+void RendererOverridesHandler::UpdateColorPickerFrame() {
+ RenderViewHostImpl* host = GetRenderViewHostImpl();
+ if (!host)
+ return;
+ RenderWidgetHostViewBase* view =
+ static_cast<RenderWidgetHostViewBase*>(host->GetView());
+ gfx::Size size = view->GetViewBounds().size();
+ view->CopyFromCompositingSurface(
+ gfx::Rect(size), size,
+ base::Bind(&RendererOverridesHandler::ColorPickerFrameUpdated,
+ weak_factory_.GetWeakPtr()),
+ kN32_SkColorType);
+}
+
+void RendererOverridesHandler::ColorPickerFrameUpdated(
+ bool succeeded,
+ const SkBitmap& bitmap) {
+ if (succeeded)
+ color_picker_frame_ = bitmap;
+}
+
+void RendererOverridesHandler::HandleMouseEvent(
+ const blink::WebMouseEvent& event) {
+
+ if (color_picker_frame_.drawsNothing()) {
+ if (event.button == blink::WebMouseEvent::ButtonLeft)
+ SetColorPickerEnabled(false);
+ return;
+ }
+
+ if (event.button == blink::WebMouseEvent::ButtonLeft) {
+ color_picker_frame_.lockPixels();
+ SkColor color = color_picker_frame_.getColor(event.x, event.y);
+ color_picker_frame_.unlockPixels();
+ base::DictionaryValue* color_dict = new base::DictionaryValue();
+ color_dict->SetInteger("r", SkColorGetR(color));
+ color_dict->SetInteger("g", SkColorGetG(color));
+ color_dict->SetInteger("b", SkColorGetB(color));
+ color_dict->SetInteger("a", SkColorGetA(color));
+ base::DictionaryValue* response = new base::DictionaryValue();
+ response->Set(devtools::Page::colorPicked::kParamColor, color_dict);
+ SendNotification(devtools::Page::colorPicked::kName, response);
+ }
+
+ const int kCursorSize = 150;
+ const int kDiameter = 110;
+ const int kHotspotRadius = 5;
+ const int kPixelSize = 10;
+ int padding = (kCursorSize - kDiameter) / 2;
+ int hotspot = padding + kHotspotRadius;
+
+ skia::RefPtr<SkCanvas> canvas =
+ skia::AdoptRef(SkCanvas::NewRasterN32(kCursorSize, kCursorSize));
+
+ SkPaint paint;
+ paint.setStrokeWidth(2);
+ paint.setColor(SK_ColorDKGRAY);
+ paint.setStyle(SkPaint::kStroke_Style);
+ paint.setAntiAlias(true);
+ canvas->drawCircle(hotspot, hotspot, kHotspotRadius, paint);
+ canvas->drawLine(hotspot + kHotspotRadius - 1,
+ hotspot + kHotspotRadius - 1,
+ kCursorSize / 2, kCursorSize / 2,
+ paint);
+
+ SkPath clip_path;
+ clip_path.addOval(SkRect::MakeXYWH(padding, padding, kDiameter, kDiameter));
+ clip_path.close();
+ canvas->clipPath(clip_path, SkRegion::kIntersect_Op, true);
+
+ SkRect src_rect = SkRect::MakeXYWH(event.x - 5, event.y - 5, 11, 11);
+ SkRect dst_rect = SkRect::MakeXYWH(padding, padding, kDiameter, kDiameter);
+ canvas->drawBitmapRectToRect(color_picker_frame_, &src_rect, dst_rect);
+
+ paint.setStrokeWidth(1);
+ paint.setAntiAlias(false);
+ paint.setColor(SK_ColorGRAY);
+ for (int i = padding; i < kCursorSize - padding; i += kPixelSize) {
+ canvas->drawLine(i, padding, i, kCursorSize - padding, paint);
+ canvas->drawLine(padding, i, kCursorSize - padding, i, paint);
+ }
+
+ SkRect pixel = SkRect::MakeXYWH(kCursorSize / 2 - kHotspotRadius,
+ kCursorSize / 2 - kHotspotRadius,
+ kPixelSize, kPixelSize);
+ paint.setColor(SK_ColorRED);
+ canvas->drawRect(pixel, paint);
+
+ paint.setStrokeWidth(2);
+ paint.setColor(SK_ColorDKGRAY);
+ paint.setAntiAlias(true);
+ canvas->drawCircle(kCursorSize / 2, kCursorSize / 2, kDiameter / 2, paint);
+
+ SkBitmap result;
+ result.allocN32Pixels(kCursorSize, kCursorSize);
+ canvas->readPixels(&result, 0, 0);
+
+ WebCursor cursor;
+ WebCursor::CursorInfo cursor_info;
+ cursor_info.type = blink::WebCursorInfo::TypeCustom;
+ cursor_info.image_scale_factor = 1;
+ cursor_info.custom_image = result;
+ cursor_info.hotspot =
+ gfx::Point(hotspot, hotspot);
+#if defined(OS_WIN)
+ cursor_info.external_handle = 0;
+#endif
+
+ cursor.InitFromCursorInfo(cursor_info);
+ RenderViewHostImpl* rvh = GetRenderViewHostImpl();
+ if (rvh)
+ rvh->SetCursor(cursor);
+}
+
// Input agent handlers ------------------------------------------------------
scoped_refptr<DevToolsProtocol::Response>

Powered by Google App Engine
This is Rietveld 408576698