Commit 108d896a authored by pfeldman@chromium.org's avatar pfeldman@chromium.org

DevTools: make eye dropper live (refresh on frame update).

BUG=404375

Review URL: https://codereview.chromium.org/474243003

Cr-Commit-Position: refs/heads/master@{#290258}
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@290258 0039d316-1c4b-4281-b951-d872f2087c98
parent af4b8b72
...@@ -75,6 +75,8 @@ RendererOverridesHandler::RendererOverridesHandler() ...@@ -75,6 +75,8 @@ RendererOverridesHandler::RendererOverridesHandler()
: has_last_compositor_frame_metadata_(false), : has_last_compositor_frame_metadata_(false),
capture_retry_count_(0), capture_retry_count_(0),
color_picker_enabled_(false), color_picker_enabled_(false),
last_cursor_x_(-1),
last_cursor_y_(-1),
weak_factory_(this) { weak_factory_(this) {
RegisterCommandHandler( RegisterCommandHandler(
devtools::DOM::setFileInputFiles::kName, devtools::DOM::setFileInputFiles::kName,
...@@ -189,7 +191,9 @@ void RendererOverridesHandler::OnVisibilityChanged(bool visible) { ...@@ -189,7 +191,9 @@ void RendererOverridesHandler::OnVisibilityChanged(bool visible) {
void RendererOverridesHandler::SetRenderViewHost( void RendererOverridesHandler::SetRenderViewHost(
RenderViewHostImpl* host) { RenderViewHostImpl* host) {
host_ = host; host_ = host;
if (screencast_command_ && host) if (!host)
return;
if (screencast_command_)
host->SetTouchEventEmulationEnabled(true, true); host->SetTouchEventEmulationEnabled(true, true);
if (color_picker_enabled_) if (color_picker_enabled_)
host->AddMouseEventCallback(mouse_event_callback_); host->AddMouseEventCallback(mouse_event_callback_);
...@@ -199,6 +203,7 @@ void RendererOverridesHandler::ClearRenderViewHost() { ...@@ -199,6 +203,7 @@ void RendererOverridesHandler::ClearRenderViewHost() {
if (host_) if (host_)
host_->RemoveMouseEventCallback(mouse_event_callback_); host_->RemoveMouseEventCallback(mouse_event_callback_);
host_ = NULL; host_ = NULL;
ResetColorPickerFrame();
} }
bool RendererOverridesHandler::OnSetTouchEventEmulationEnabled() { bool RendererOverridesHandler::OnSetTouchEventEmulationEnabled() {
...@@ -897,7 +902,7 @@ void RendererOverridesHandler::SetColorPickerEnabled(bool enabled) { ...@@ -897,7 +902,7 @@ void RendererOverridesHandler::SetColorPickerEnabled(bool enabled) {
UpdateColorPickerFrame(); UpdateColorPickerFrame();
} else { } else {
host_->RemoveMouseEventCallback(mouse_event_callback_); host_->RemoveMouseEventCallback(mouse_event_callback_);
color_picker_frame_.reset(); ResetColorPickerFrame();
WebCursor pointer_cursor; WebCursor pointer_cursor;
WebCursor::CursorInfo cursor_info; WebCursor::CursorInfo cursor_info;
...@@ -923,22 +928,40 @@ void RendererOverridesHandler::UpdateColorPickerFrame() { ...@@ -923,22 +928,40 @@ void RendererOverridesHandler::UpdateColorPickerFrame() {
kN32_SkColorType); kN32_SkColorType);
} }
void RendererOverridesHandler::ResetColorPickerFrame() {
color_picker_frame_.reset();
last_cursor_x_ = -1;
last_cursor_y_ = -1;
}
void RendererOverridesHandler::ColorPickerFrameUpdated( void RendererOverridesHandler::ColorPickerFrameUpdated(
bool succeeded, bool succeeded,
const SkBitmap& bitmap) { const SkBitmap& bitmap) {
if (succeeded) if (!color_picker_enabled_)
return;
if (succeeded) {
color_picker_frame_ = bitmap; color_picker_frame_ = bitmap;
UpdateColorPickerCursor();
}
} }
bool RendererOverridesHandler::HandleMouseEvent( bool RendererOverridesHandler::HandleMouseEvent(
const blink::WebMouseEvent& event) { const blink::WebMouseEvent& event) {
last_cursor_x_ = event.x;
last_cursor_y_ = event.y;
if (color_picker_frame_.drawsNothing()) if (color_picker_frame_.drawsNothing())
return true; return true;
if (event.button == blink::WebMouseEvent::ButtonLeft) { if (event.button == blink::WebMouseEvent::ButtonLeft) {
color_picker_frame_.lockPixels(); if (last_cursor_x_ < 0 || last_cursor_x_ >= color_picker_frame_.width() ||
SkColor color = color_picker_frame_.getColor(event.x, event.y); last_cursor_y_ < 0 || last_cursor_y_ >= color_picker_frame_.height()) {
color_picker_frame_.unlockPixels(); return true;
}
SkAutoLockPixels lock_image(color_picker_frame_);
SkColor color = color_picker_frame_.getColor(last_cursor_x_,
last_cursor_y_);
base::DictionaryValue* color_dict = new base::DictionaryValue(); base::DictionaryValue* color_dict = new base::DictionaryValue();
color_dict->SetInteger("r", SkColorGetR(color)); color_dict->SetInteger("r", SkColorGetR(color));
color_dict->SetInteger("g", SkColorGetG(color)); color_dict->SetInteger("g", SkColorGetG(color));
...@@ -948,13 +971,23 @@ bool RendererOverridesHandler::HandleMouseEvent( ...@@ -948,13 +971,23 @@ bool RendererOverridesHandler::HandleMouseEvent(
response->Set(devtools::Page::colorPicked::kParamColor, color_dict); response->Set(devtools::Page::colorPicked::kParamColor, color_dict);
SendNotification(devtools::Page::colorPicked::kName, response); SendNotification(devtools::Page::colorPicked::kName, response);
} }
UpdateColorPickerCursor();
if (!host_)
return true; return true;
}
void RendererOverridesHandler::UpdateColorPickerCursor() {
if (!host_ || color_picker_frame_.drawsNothing())
return;
if (last_cursor_x_ < 0 || last_cursor_x_ >= color_picker_frame_.width() ||
last_cursor_y_ < 0 || last_cursor_y_ >= color_picker_frame_.height()) {
return;
}
RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>(
host_->GetView()); host_->GetView());
if (!view) if (!view)
return true; return;
// Due to platform limitations, we are using two different cursors // Due to platform limitations, we are using two different cursors
// depending on the platform. Mac and Win have large cursors with two circles // depending on the platform. Mac and Win have large cursors with two circles
...@@ -1011,8 +1044,8 @@ bool RendererOverridesHandler::HandleMouseEvent( ...@@ -1011,8 +1044,8 @@ bool RendererOverridesHandler::HandleMouseEvent(
// Project pixels. // Project pixels.
int pixel_count = kDiameter / kPixelSize; int pixel_count = kDiameter / kPixelSize;
SkRect src_rect = SkRect::MakeXYWH(event.x - pixel_count / 2, SkRect src_rect = SkRect::MakeXYWH(last_cursor_x_ - pixel_count / 2,
event.y - pixel_count / 2, last_cursor_y_ - pixel_count / 2,
pixel_count, pixel_count); pixel_count, pixel_count);
SkRect dst_rect = SkRect::MakeXYWH(padding, padding, kDiameter, kDiameter); SkRect dst_rect = SkRect::MakeXYWH(padding, padding, kDiameter, kDiameter);
canvas->drawBitmapRectToRect(color_picker_frame_, &src_rect, dst_rect); canvas->drawBitmapRectToRect(color_picker_frame_, &src_rect, dst_rect);
...@@ -1033,13 +1066,13 @@ bool RendererOverridesHandler::HandleMouseEvent( ...@@ -1033,13 +1066,13 @@ bool RendererOverridesHandler::HandleMouseEvent(
(kCursorSize - kPixelSize) / 2, (kCursorSize - kPixelSize) / 2,
kPixelSize, kPixelSize); kPixelSize, kPixelSize);
paint.setColor(SK_ColorRED); paint.setColor(SK_ColorRED);
paint.setStyle(SkPaint::kStroke_Style);
canvas->drawRect(pixel, paint); canvas->drawRect(pixel, paint);
// Paint outline. // Paint outline.
paint.setStrokeWidth(2); paint.setStrokeWidth(2);
paint.setColor(SK_ColorDKGRAY); paint.setColor(SK_ColorDKGRAY);
paint.setAntiAlias(true); paint.setAntiAlias(true);
paint.setStyle(SkPaint::kStroke_Style);
canvas->drawCircle(kCursorSize / 2, kCursorSize / 2, kDiameter / 2, paint); canvas->drawCircle(kCursorSize / 2, kCursorSize / 2, kDiameter / 2, paint);
SkBitmap result; SkBitmap result;
...@@ -1062,7 +1095,6 @@ bool RendererOverridesHandler::HandleMouseEvent( ...@@ -1062,7 +1095,6 @@ bool RendererOverridesHandler::HandleMouseEvent(
cursor.InitFromCursorInfo(cursor_info); cursor.InitFromCursorInfo(cursor_info);
DCHECK(host_); DCHECK(host_);
host_->SetCursor(cursor); host_->SetCursor(cursor);
return true;
} }
// Input agent handlers ------------------------------------------------------ // Input agent handlers ------------------------------------------------------
......
...@@ -107,8 +107,10 @@ class CONTENT_EXPORT RendererOverridesHandler ...@@ -107,8 +107,10 @@ class CONTENT_EXPORT RendererOverridesHandler
void NotifyScreencastVisibility(bool visible); void NotifyScreencastVisibility(bool visible);
void SetColorPickerEnabled(bool enabled); void SetColorPickerEnabled(bool enabled);
void UpdateColorPickerFrame(); void UpdateColorPickerFrame();
void ResetColorPickerFrame();
void ColorPickerFrameUpdated(bool succeeded, const SkBitmap& bitmap); void ColorPickerFrameUpdated(bool succeeded, const SkBitmap& bitmap);
bool HandleMouseEvent(const blink::WebMouseEvent& event); bool HandleMouseEvent(const blink::WebMouseEvent& event);
void UpdateColorPickerCursor();
// Input domain. // Input domain.
scoped_refptr<DevToolsProtocol::Response> InputEmulateTouchFromMouseEvent( scoped_refptr<DevToolsProtocol::Response> InputEmulateTouchFromMouseEvent(
...@@ -122,6 +124,8 @@ class CONTENT_EXPORT RendererOverridesHandler ...@@ -122,6 +124,8 @@ class CONTENT_EXPORT RendererOverridesHandler
int capture_retry_count_; int capture_retry_count_;
bool color_picker_enabled_; bool color_picker_enabled_;
SkBitmap color_picker_frame_; SkBitmap color_picker_frame_;
int last_cursor_x_;
int last_cursor_y_;
RenderWidgetHost::MouseEventCallback mouse_event_callback_; RenderWidgetHost::MouseEventCallback mouse_event_callback_;
base::WeakPtrFactory<RendererOverridesHandler> weak_factory_; base::WeakPtrFactory<RendererOverridesHandler> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(RendererOverridesHandler); DISALLOW_COPY_AND_ASSIGN(RendererOverridesHandler);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment