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 1d0cf5a2b16ace73fc5f8261d50c84d592f15b9f..cbec8c396012fae62cccae442029604673398fce 100644 |
--- a/content/browser/devtools/renderer_overrides_handler.cc |
+++ b/content/browser/devtools/renderer_overrides_handler.cc |
@@ -75,6 +75,8 @@ RendererOverridesHandler::RendererOverridesHandler() |
: has_last_compositor_frame_metadata_(false), |
capture_retry_count_(0), |
color_picker_enabled_(false), |
+ last_cursor_x_(-1), |
+ last_cursor_y_(-1), |
weak_factory_(this) { |
RegisterCommandHandler( |
devtools::DOM::setFileInputFiles::kName, |
@@ -189,7 +191,9 @@ void RendererOverridesHandler::OnVisibilityChanged(bool visible) { |
void RendererOverridesHandler::SetRenderViewHost( |
RenderViewHostImpl* host) { |
host_ = host; |
- if (screencast_command_ && host) |
+ if (!host) |
+ return; |
+ if (screencast_command_) |
host->SetTouchEventEmulationEnabled(true, true); |
if (color_picker_enabled_) |
host->AddMouseEventCallback(mouse_event_callback_); |
@@ -904,6 +908,8 @@ void RendererOverridesHandler::SetColorPickerEnabled(bool enabled) { |
cursor_info.type = blink::WebCursorInfo::TypePointer; |
pointer_cursor.InitFromCursorInfo(cursor_info); |
host_->SetCursor(pointer_cursor); |
+ last_cursor_x_ = -1; |
+ last_cursor_y_ = -1; |
} |
} |
@@ -926,19 +932,30 @@ void RendererOverridesHandler::UpdateColorPickerFrame() { |
void RendererOverridesHandler::ColorPickerFrameUpdated( |
bool succeeded, |
const SkBitmap& bitmap) { |
- if (succeeded) |
+ if (!color_picker_enabled_) |
+ return; |
+ |
+ if (succeeded) { |
color_picker_frame_ = bitmap; |
+ UpdateColorPickerCursor(); |
+ } |
} |
bool RendererOverridesHandler::HandleMouseEvent( |
const blink::WebMouseEvent& event) { |
+ last_cursor_x_ = event.x; |
+ last_cursor_y_ = event.y; |
if (color_picker_frame_.drawsNothing()) |
return true; |
if (event.button == blink::WebMouseEvent::ButtonLeft) { |
- color_picker_frame_.lockPixels(); |
+ if (last_cursor_x_ < 0 || last_cursor_x_ >= color_picker_frame_.width() || |
+ last_cursor_y_ < 0 || last_cursor_y_ >= color_picker_frame_.height()) { |
+ return true; |
+ } |
+ |
+ SkAutoLockPixels lock_image(color_picker_frame_); |
SkColor color = color_picker_frame_.getColor(event.x, event.y); |
dgozman
2014/08/18 13:50:52
last_cursor_x_, last_cursor_y_
pfeldman
2014/08/18 14:20:38
Done.
|
- color_picker_frame_.unlockPixels(); |
base::DictionaryValue* color_dict = new base::DictionaryValue(); |
color_dict->SetInteger("r", SkColorGetR(color)); |
color_dict->SetInteger("g", SkColorGetG(color)); |
@@ -948,13 +965,23 @@ bool RendererOverridesHandler::HandleMouseEvent( |
response->Set(devtools::Page::colorPicked::kParamColor, color_dict); |
SendNotification(devtools::Page::colorPicked::kName, response); |
} |
+ UpdateColorPickerCursor(); |
+ 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; |
+ } |
- if (!host_) |
- return true; |
RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( |
host_->GetView()); |
if (!view) |
- return true; |
+ return; |
// Due to platform limitations, we are using two different cursors |
// depending on the platform. Mac and Win have large cursors with two circles |
@@ -1011,8 +1038,8 @@ bool RendererOverridesHandler::HandleMouseEvent( |
// Project pixels. |
int pixel_count = kDiameter / kPixelSize; |
- SkRect src_rect = SkRect::MakeXYWH(event.x - pixel_count / 2, |
- event.y - pixel_count / 2, |
+ SkRect src_rect = SkRect::MakeXYWH(last_cursor_x_ - pixel_count / 2, |
+ last_cursor_y_ - pixel_count / 2, |
pixel_count, pixel_count); |
SkRect dst_rect = SkRect::MakeXYWH(padding, padding, kDiameter, kDiameter); |
canvas->drawBitmapRectToRect(color_picker_frame_, &src_rect, dst_rect); |
@@ -1033,13 +1060,13 @@ bool RendererOverridesHandler::HandleMouseEvent( |
(kCursorSize - kPixelSize) / 2, |
kPixelSize, kPixelSize); |
paint.setColor(SK_ColorRED); |
+ paint.setStyle(SkPaint::kStroke_Style); |
canvas->drawRect(pixel, paint); |
// Paint outline. |
paint.setStrokeWidth(2); |
paint.setColor(SK_ColorDKGRAY); |
paint.setAntiAlias(true); |
- paint.setStyle(SkPaint::kStroke_Style); |
canvas->drawCircle(kCursorSize / 2, kCursorSize / 2, kDiameter / 2, paint); |
SkBitmap result; |
@@ -1062,7 +1089,6 @@ bool RendererOverridesHandler::HandleMouseEvent( |
cursor.InitFromCursorInfo(cursor_info); |
DCHECK(host_); |
host_->SetCursor(cursor); |
- return true; |
} |
// Input agent handlers ------------------------------------------------------ |