diff --git a/content/shell/test_runner/event_sender.cc b/content/shell/test_runner/event_sender.cc index 081d63af64ace7..3f20c735df0425 100644 --- a/content/shell/test_runner/event_sender.cc +++ b/content/shell/test_runner/event_sender.cc @@ -616,7 +616,7 @@ class EventSenderBindings : public gin::Wrappable { void GestureTwoFingerTap(gin::Arguments* args); void ContinuousMouseScrollBy(gin::Arguments* args); void MouseMoveTo(gin::Arguments* args); - void MouseLeave(); + void MouseLeave(gin::Arguments* args); void MouseScrollBy(gin::Arguments* args); void ScheduleAsynchronousClick(gin::Arguments* args); void ScheduleAsynchronousKeyDown(gin::Arguments* args); @@ -1015,9 +1015,24 @@ void EventSenderBindings::MouseMoveTo(gin::Arguments* args) { sender_->MouseMoveTo(args); } -void EventSenderBindings::MouseLeave() { - if (sender_) - sender_->MouseLeave(); +void EventSenderBindings::MouseLeave(gin::Arguments* args) { + if (!sender_) + return; + + WebPointerProperties::PointerType pointerType = + WebPointerProperties::PointerType::kMouse; + int pointerId = kRawMousePointerId; + + // Only allow pen or mouse through this API. + if (!getPointerType(args, false, pointerType)) + return; + if (!args->PeekNext().IsEmpty()) { + if (!args->GetNext(&pointerId)) { + args->ThrowError(); + return; + } + } + sender_->MouseLeave(pointerType, pointerId); } void EventSenderBindings::MouseScrollBy(gin::Arguments* args) { @@ -2211,16 +2226,18 @@ void EventSender::MouseMoveTo(gin::Arguments* args) { } } -void EventSender::MouseLeave() { +void EventSender::MouseLeave( + blink::WebPointerProperties::PointerType pointerType, + int pointerId) { if (force_layout_on_events_) widget()->UpdateAllLifecyclePhases(); WebMouseEvent event(WebInputEvent::kMouseLeave, - ModifiersForPointer(kRawMousePointerId), - GetCurrentEventTimeSec()); - InitMouseEvent(WebMouseEvent::Button::kNoButton, 0, - current_pointer_state_[kRawMousePointerId].last_pos_, - click_count_, &event); + ModifiersForPointer(pointerId), GetCurrentEventTimeSec()); + InitMouseEventGeneric(WebMouseEvent::Button::kNoButton, 0, + current_pointer_state_[kRawMousePointerId].last_pos_, + click_count_, pointerType, pointerId, 0.0, 0, 0, + &event); HandleInputEventOnViewOrPopup(event); } diff --git a/content/shell/test_runner/event_sender.h b/content/shell/test_runner/event_sender.h index f8b4cd33f10cc0..9871739ccd0d69 100644 --- a/content/shell/test_runner/event_sender.h +++ b/content/shell/test_runner/event_sender.h @@ -167,7 +167,7 @@ class EventSender { void MouseScrollBy(gin::Arguments* args, MouseScrollType scroll_type); void MouseMoveTo(gin::Arguments* args); - void MouseLeave(); + void MouseLeave(blink::WebPointerProperties::PointerType, int pointerId); void ScheduleAsynchronousClick(int button_number, int modifiers); void ScheduleAsynchronousKeyDown(const std::string& code_str, int modifiers, diff --git a/third_party/WebKit/LayoutTests/fast/events/pointerevents/mouse-pointer-event-properties.html b/third_party/WebKit/LayoutTests/fast/events/pointerevents/mouse-pointer-event-properties.html index d27610183c3aee..4f63e4ceda5f67 100644 --- a/third_party/WebKit/LayoutTests/fast/events/pointerevents/mouse-pointer-event-properties.html +++ b/third_party/WebKit/LayoutTests/fast/events/pointerevents/mouse-pointer-event-properties.html @@ -212,7 +212,7 @@ debug("--- move pen out of target ---"); eventSender.mouseMoveTo(x - 5, y - 5, [], inputPointerType, penId, penPressure, penTiltX, penTiltY); - + eventSender.mouseLeave(inputPointerType, penId); debug(""); } diff --git a/third_party/WebKit/Source/core/events/PointerEventFactory.cpp b/third_party/WebKit/Source/core/events/PointerEventFactory.cpp index 2bbb8654d16dd9..0e96f0fbfc63ed 100644 --- a/third_party/WebKit/Source/core/events/PointerEventFactory.cpp +++ b/third_party/WebKit/Source/core/events/PointerEventFactory.cpp @@ -17,20 +17,20 @@ inline int ToInt(WebPointerProperties::PointerType t) { const char* PointerTypeNameForWebPointPointerType( WebPointerProperties::PointerType type) { + // TODO(mustaq): Fix when the spec starts supporting hovering erasers. switch (type) { case WebPointerProperties::PointerType::kUnknown: return ""; case WebPointerProperties::PointerType::kTouch: return "touch"; case WebPointerProperties::PointerType::kPen: - case WebPointerProperties::PointerType::kEraser: - // TODO(mustaq): Fix when the spec starts supporting hovering erasers. return "pen"; case WebPointerProperties::PointerType::kMouse: return "mouse"; + default: + NOTREACHED(); + return ""; } - NOTREACHED(); - return ""; } const AtomicString& PointerEventNameForMouseEventName( @@ -188,21 +188,22 @@ void PointerEventFactory::SetIdTypeButtons( PointerEventInit& pointer_event_init, const WebPointerProperties& pointer_properties, unsigned buttons) { - const WebPointerProperties::PointerType pointer_type = + WebPointerProperties::PointerType pointer_type = pointer_properties.pointer_type; - const IncomingId incoming_id(pointer_type, pointer_properties.id); - int pointer_id = AddIdAndActiveButtons(incoming_id, buttons != 0); - // Tweak the |buttons| to reflect pen eraser mode only if the pen is in // active buttons state w/o even considering the eraser button. // TODO(mustaq): Fix when the spec starts supporting hovering erasers. - if (pointer_type == WebPointerProperties::PointerType::kEraser && - buttons != 0) { - buttons |= static_cast(WebPointerProperties::Buttons::kEraser); - buttons &= ~static_cast(WebPointerProperties::Buttons::kLeft); + if (pointer_type == WebPointerProperties::PointerType::kEraser) { + if (buttons != 0) { + buttons |= static_cast(WebPointerProperties::Buttons::kEraser); + buttons &= ~static_cast(WebPointerProperties::Buttons::kLeft); + } + pointer_type = WebPointerProperties::PointerType::kPen; } pointer_event_init.setButtons(buttons); + const IncomingId incoming_id(pointer_type, pointer_properties.id); + int pointer_id = AddIdAndActiveButtons(incoming_id, buttons != 0); pointer_event_init.setPointerId(pointer_id); pointer_event_init.setPointerType( PointerTypeNameForWebPointPointerType(pointer_type)); @@ -515,6 +516,8 @@ bool PointerEventFactory::Remove(const int mapped_id) { return true; } +// This function does not work with pointer type of eraser, because we save +// them as pen type in the pointer id map. Vector PointerEventFactory::GetPointerIdsOfType( WebPointerProperties::PointerType pointer_type) const { Vector mapped_ids; diff --git a/third_party/WebKit/Source/core/events/PointerEventFactoryTest.cpp b/third_party/WebKit/Source/core/events/PointerEventFactoryTest.cpp index 8d705c7883d955..2f110f1cc81a42 100644 --- a/third_party/WebKit/Source/core/events/PointerEventFactoryTest.cpp +++ b/third_party/WebKit/Source/core/events/PointerEventFactoryTest.cpp @@ -22,13 +22,13 @@ const char* PointerTypeNameForWebPointPointerType( case WebPointerProperties::PointerType::kTouch: return "touch"; case WebPointerProperties::PointerType::kPen: - case WebPointerProperties::PointerType::kEraser: return "pen"; case WebPointerProperties::PointerType::kMouse: return "mouse"; + default: + NOTREACHED(); + return ""; } - NOTREACHED(); - return ""; } }