Chromium Code Reviews| Index: components/test_runner/event_sender.cc |
| diff --git a/components/test_runner/event_sender.cc b/components/test_runner/event_sender.cc |
| index 393572482957e5cc3f4162a6fbb5fb366717c278..abb68a48ecbb7ecdf94d619f7643beeb6e14cb5a 100644 |
| --- a/components/test_runner/event_sender.cc |
| +++ b/components/test_runner/event_sender.cc |
| @@ -58,6 +58,44 @@ namespace test_runner { |
| namespace { |
| +const char* kPointerTypeStringUnknown = ""; |
| +const char* kPointerTypeStringMouse = "mouse"; |
| +const char* kPointerTypeStringPen = "pen"; |
| +const char* kPointerTypeStringTouch = "touch"; |
| + |
|
dtapuska
2016/04/05 20:30:40
I'd invert the function to return false on failure
Navid Zolghadr
2016/04/06 15:27:10
Sure
|
| +bool getPointerType(gin::Arguments* args, |
| + blink::WebPointerProperties::PointerType &t, |
| + bool isOnlyMouseAndPenAllowed = false) { |
| + if (!args->PeekNext().IsEmpty()) { |
| + std::string pointer_type_string; |
| + if (!args->GetNext(&pointer_type_string)) { |
| + args->ThrowError(); |
| + return true; |
| + } |
| + if (pointer_type_string == kPointerTypeStringUnknown) { |
| + if (isOnlyMouseAndPenAllowed) { |
| + args->ThrowError(); |
| + return true; |
| + } |
| + t = WebMouseEvent::PointerType::Unknown; |
| + } else if (pointer_type_string == kPointerTypeStringMouse) { |
| + t = WebMouseEvent::PointerType::Mouse; |
| + } else if (pointer_type_string == kPointerTypeStringPen) { |
| + t = WebMouseEvent::PointerType::Pen; |
| + } else if (pointer_type_string == kPointerTypeStringTouch) { |
| + if (isOnlyMouseAndPenAllowed) { |
| + args->ThrowError(); |
| + return true; |
| + } |
| + t = WebMouseEvent::PointerType::Touch; |
| + } else { |
| + args->ThrowError(); |
| + return true; |
| + } |
| + } |
| + return false; |
| +} |
| + |
| WebMouseEvent::Button GetButtonTypeFromButtonNumber(int button_code) { |
| switch (button_code) { |
| case -1: |
| @@ -103,6 +141,8 @@ void InitMouseEvent(WebInputEvent::Type t, |
| double time_stamp, |
| int click_count, |
| int modifiers, |
| + blink::WebPointerProperties::PointerType pointerType, |
| + int pointerId, |
| WebMouseEvent* e) { |
| e->type = t; |
| e->button = b; |
| @@ -111,7 +151,8 @@ void InitMouseEvent(WebInputEvent::Type t, |
| e->y = pos.y; |
| e->globalX = pos.x; |
| e->globalY = pos.y; |
| - e->pointerType = blink::WebPointerProperties::PointerType::Mouse; |
| + e->pointerType = pointerType; |
| + e->id = pointerId; |
| e->timeStampSeconds = time_stamp; |
| e->clickCount = click_count; |
| } |
| @@ -455,11 +496,6 @@ bool GetScrollUnits(gin::Arguments* args, WebGestureEvent::ScrollUnits* units) { |
| const char* kSourceDeviceStringTouchpad = "touchpad"; |
| const char* kSourceDeviceStringTouchscreen = "touchscreen"; |
| -const char* kPointerTypeStringUnknown = ""; |
| -const char* kPointerTypeStringMouse = "mouse"; |
| -const char* kPointerTypeStringPen = "pen"; |
| -const char* kPointerTypeStringTouch = "touch"; |
| - |
| } // namespace |
| class EventSenderBindings : public gin::Wrappable<EventSenderBindings> { |
| @@ -978,12 +1014,31 @@ void EventSenderBindings::MouseDown(gin::Arguments* args) { |
| int button_number = 0; |
| int modifiers = 0; |
| + blink::WebPointerProperties::PointerType pointerType = |
| + blink::WebPointerProperties::PointerType::Mouse; |
| + int pointerId = 0; |
| if (!args->PeekNext().IsEmpty()) { |
| - args->GetNext(&button_number); |
| - if (!args->PeekNext().IsEmpty()) |
| + if (!args->GetNext(&button_number)) { |
| + args->ThrowError(); |
| + return; |
| + } |
| + if (!args->PeekNext().IsEmpty()) { |
| modifiers = GetKeyModifiersFromV8(args->isolate(), args->PeekNext()); |
| + args->Skip(); |
| + } |
| + } |
| + |
| + // Only allow pen or mouse through this API. |
| + if (getPointerType(args, pointerType, true)) |
| + return; |
| + if (!args->PeekNext().IsEmpty()) { |
| + if (!args->GetNext(&pointerId)) { |
| + args->ThrowError(); |
| + return; |
| + } |
| } |
| - sender_->MouseDown(button_number, modifiers); |
| + |
| + sender_->MouseDown(button_number, modifiers, pointerType, pointerId); |
| } |
| void EventSenderBindings::MouseUp(gin::Arguments* args) { |
| @@ -992,12 +1047,31 @@ void EventSenderBindings::MouseUp(gin::Arguments* args) { |
| int button_number = 0; |
| int modifiers = 0; |
| + blink::WebPointerProperties::PointerType pointerType = |
| + blink::WebPointerProperties::PointerType::Mouse; |
| + int pointerId = 0; |
| if (!args->PeekNext().IsEmpty()) { |
| - args->GetNext(&button_number); |
| - if (!args->PeekNext().IsEmpty()) |
| + if (!args->GetNext(&button_number)) { |
| + args->ThrowError(); |
| + return; |
| + } |
| + if (!args->PeekNext().IsEmpty()) { |
| modifiers = GetKeyModifiersFromV8(args->isolate(), args->PeekNext()); |
| + args->Skip(); |
| + } |
| } |
| - sender_->MouseUp(button_number, modifiers); |
| + |
| + // Only allow pen or mouse through this API. |
| + if (getPointerType(args, pointerType)) |
| + return; |
| + if (!args->PeekNext().IsEmpty()) { |
| + if (!args->GetNext(&pointerId)) { |
| + args->ThrowError(); |
| + return; |
| + } |
| + } |
| + |
| + sender_->MouseUp(button_number, modifiers, pointerType, pointerId); |
| } |
| void EventSenderBindings::SetMouseButtonState(gin::Arguments* args) { |
| @@ -1203,6 +1277,7 @@ void EventSender::Reset() { |
| current_drag_effects_allowed_ = blink::WebDragOperationNone; |
| if (view_ && pressed_button_ != WebMouseEvent::ButtonNone) |
| view_->mouseCaptureLost(); |
| + current_pen_state_.clear(); |
| pressed_button_ = WebMouseEvent::ButtonNone; |
| current_buttons_ = 0; |
| modifiers_ = 0; |
| @@ -1264,6 +1339,8 @@ void EventSender::DoDragDrop(const WebDragData& drag_data, |
| GetCurrentEventTimeSec(), |
| click_count_, |
| modifiers_, |
| + blink::WebPointerProperties::PointerType::Mouse, |
| + 0, |
| &event); |
| WebPoint client_point(event.x, event.y); |
| WebPoint screen_point(event.globalX, event.globalY); |
| @@ -1280,7 +1357,8 @@ void EventSender::DoDragDrop(const WebDragData& drag_data, |
| ReplaySavedEvents(); |
| } |
| -void EventSender::MouseDown(int button_number, int modifiers) { |
| +void EventSender::MouseDown(int button_number, int modifiers, |
| + blink::WebPointerProperties::PointerType pointerType, int pointerId) { |
| if (force_layout_on_events_) |
| view_->updateAllLifecyclePhases(); |
| @@ -1289,25 +1367,45 @@ void EventSender::MouseDown(int button_number, int modifiers) { |
| WebMouseEvent::Button button_type = |
| GetButtonTypeFromButtonNumber(button_number); |
| - UpdateClickCountForButton(button_type); |
| + WebMouseEvent event; |
| + if (pointerType == blink::WebPointerProperties::PointerType::Mouse) { |
| + UpdateClickCountForButton(button_type); |
| - pressed_button_ = button_type; |
| - current_buttons_ |= GetWebMouseEventModifierForButton(pressed_button_); |
| - modifiers_ = modifiers; |
| + pressed_button_ = button_type; |
| + current_buttons_ |= GetWebMouseEventModifierForButton(pressed_button_); |
| + modifiers_ = modifiers; |
| + InitMouseEvent(WebInputEvent::MouseDown, |
| + pressed_button_, |
| + current_buttons_, |
| + last_mouse_pos_, |
| + GetCurrentEventTimeSec(), |
| + click_count_, |
| + modifiers_, |
| + pointerType, |
| + 0, |
| + &event); |
| + } else { |
| + current_pen_state_[pointerId].pressed_button_ = button_type; |
| + current_pen_state_[pointerId].current_buttons_ |= |
| + GetWebMouseEventModifierForButton(pressed_button_); |
| + current_pen_state_[pointerId].modifiers_ = modifiers; |
| + InitMouseEvent(WebInputEvent::MouseDown, |
| + current_pen_state_[pointerId].pressed_button_, |
| + current_pen_state_[pointerId].current_buttons_, |
| + current_pen_state_[pointerId].last_pos_, |
| + GetCurrentEventTimeSec(), |
| + 0, |
| + modifiers_, |
| + pointerType, |
| + pointerId, |
| + &event); |
| + } |
| - WebMouseEvent event; |
| - InitMouseEvent(WebInputEvent::MouseDown, |
| - pressed_button_, |
| - current_buttons_, |
| - last_mouse_pos_, |
| - GetCurrentEventTimeSec(), |
| - click_count_, |
| - modifiers_, |
| - &event); |
| HandleInputEventOnViewOrPopup(event); |
| } |
| -void EventSender::MouseUp(int button_number, int modifiers) { |
| +void EventSender::MouseUp(int button_number, int modifiers, |
| + blink::WebPointerProperties::PointerType pointerType, int pointerId) { |
| if (force_layout_on_events_) |
| view_->updateAllLifecyclePhases(); |
| @@ -1316,27 +1414,48 @@ void EventSender::MouseUp(int button_number, int modifiers) { |
| WebMouseEvent::Button button_type = |
| GetButtonTypeFromButtonNumber(button_number); |
| - if (is_drag_mode_ && !replaying_saved_events_) { |
| - SavedEvent saved_event; |
| - saved_event.type = SavedEvent::TYPE_MOUSE_UP; |
| - saved_event.button_type = button_type; |
| - saved_event.modifiers = modifiers; |
| - mouse_event_queue_.push_back(saved_event); |
| - ReplaySavedEvents(); |
| + if (pointerType == blink::WebPointerProperties::PointerType::Mouse) { |
| + if (is_drag_mode_ && !replaying_saved_events_) { |
| + SavedEvent saved_event; |
| + saved_event.type = SavedEvent::TYPE_MOUSE_UP; |
| + saved_event.button_type = button_type; |
| + saved_event.modifiers = modifiers; |
| + mouse_event_queue_.push_back(saved_event); |
| + ReplaySavedEvents(); |
| + } else { |
| + current_buttons_ &= ~GetWebMouseEventModifierForButton(button_type); |
| + pressed_button_ = WebMouseEvent::ButtonNone; |
| + |
| + WebMouseEvent event; |
| + InitMouseEvent(WebInputEvent::MouseUp, |
| + button_type, |
| + current_buttons_, |
| + last_mouse_pos_, |
| + GetCurrentEventTimeSec(), |
| + click_count_, |
| + modifiers, |
| + pointerType, |
| + 0, |
| + &event); |
| + DoMouseUp(event); |
| + } |
| } else { |
| - current_buttons_ &= ~GetWebMouseEventModifierForButton(button_type); |
| - pressed_button_ = WebMouseEvent::ButtonNone; |
| - |
| - WebMouseEvent event; |
| - InitMouseEvent(WebInputEvent::MouseUp, |
| - button_type, |
| - current_buttons_, |
| - last_mouse_pos_, |
| - GetCurrentEventTimeSec(), |
| - click_count_, |
| - modifiers, |
| - &event); |
| - DoMouseUp(event); |
| + current_pen_state_[pointerId].current_buttons_ &= |
| + ~GetWebMouseEventModifierForButton(button_type); |
| + current_pen_state_[pointerId].pressed_button_ = WebMouseEvent::ButtonNone; |
| + |
| + WebMouseEvent event; |
| + InitMouseEvent(WebInputEvent::MouseUp, |
| + button_type, |
| + current_pen_state_[pointerId].current_buttons_, |
| + current_pen_state_[pointerId].last_pos_, |
| + GetCurrentEventTimeSec(), |
| + 0, |
| + modifiers, |
| + pointerType, |
| + pointerId, |
| + &event); |
| + HandleInputEventOnViewOrPopup(event); |
| } |
| } |
| @@ -1550,6 +1669,8 @@ void EventSender::KeyDown(const std::string& code_str, |
| GetCurrentEventTimeSec(), |
| click_count_, |
| 0, |
| + blink::WebPointerProperties::PointerType::Mouse, |
| + 0, |
| &event); |
| FinishDragAndDrop(event, blink::WebDragOperationNone); |
| } |
| @@ -1605,6 +1726,8 @@ std::vector<std::string> EventSender::ContextClick() { |
| GetCurrentEventTimeSec(), |
| click_count_, |
| 0, |
| + blink::WebPointerProperties::PointerType::Mouse, |
| + 0, |
| &event); |
| HandleInputEventOnViewOrPopup(event); |
| @@ -1620,6 +1743,8 @@ std::vector<std::string> EventSender::ContextClick() { |
| GetCurrentEventTimeSec(), |
| click_count_, |
| 0, |
| + blink::WebPointerProperties::PointerType::Mouse, |
| + 0, |
| &event); |
| HandleInputEventOnViewOrPopup(event); |
| #endif |
| @@ -1973,6 +2098,9 @@ void EventSender::MouseMoveTo(gin::Arguments* args) { |
| double x; |
| double y; |
| + blink::WebPointerProperties::PointerType pointerType = |
| + blink::WebPointerProperties::PointerType::Mouse; |
| + int pointerId = 0; |
| if (!args->GetNext(&x) || !args->GetNext(&y)) { |
| args->ThrowError(); |
| return; |
| @@ -1980,27 +2108,58 @@ void EventSender::MouseMoveTo(gin::Arguments* args) { |
| WebPoint mouse_pos(static_cast<int>(x), static_cast<int>(y)); |
| int modifiers = 0; |
| - if (!args->PeekNext().IsEmpty()) |
| + if (!args->PeekNext().IsEmpty()) { |
| modifiers = GetKeyModifiersFromV8(args->isolate(), args->PeekNext()); |
| + args->Skip(); |
| + } |
| - if (is_drag_mode_ && pressed_button_ == WebMouseEvent::ButtonLeft && |
| - !replaying_saved_events_) { |
| - SavedEvent saved_event; |
| - saved_event.type = SavedEvent::TYPE_MOUSE_MOVE; |
| - saved_event.pos = mouse_pos; |
| - saved_event.modifiers = modifiers; |
| - mouse_event_queue_.push_back(saved_event); |
| + // Only allow pen or mouse through this API. |
| + if (getPointerType(args, pointerType, true)) |
| + return; |
| + if (!args->PeekNext().IsEmpty()) { |
| + if (!args->GetNext(&pointerId)) { |
| + args->ThrowError(); |
| + return; |
| + } |
| + } |
| + |
| + if (pointerType == blink::WebPointerProperties::PointerType::Mouse) { |
| + if (is_drag_mode_ && pressed_button_ == WebMouseEvent::ButtonLeft && |
| + !replaying_saved_events_) { |
| + SavedEvent saved_event; |
| + saved_event.type = SavedEvent::TYPE_MOUSE_MOVE; |
| + saved_event.pos = mouse_pos; |
| + saved_event.modifiers = modifiers; |
| + mouse_event_queue_.push_back(saved_event); |
| + } else { |
| + WebMouseEvent event; |
| + InitMouseEvent(WebInputEvent::MouseMove, |
| + pressed_button_, |
| + current_buttons_, |
| + mouse_pos, |
| + GetCurrentEventTimeSec(), |
| + click_count_, |
| + modifiers, |
| + pointerType, |
| + 0, |
| + &event); |
| + DoMouseMove(event); |
| + } |
| } else { |
| - WebMouseEvent event; |
| - InitMouseEvent(WebInputEvent::MouseMove, |
| - pressed_button_, |
| - current_buttons_, |
| - mouse_pos, |
| - GetCurrentEventTimeSec(), |
| - click_count_, |
| - modifiers, |
| - &event); |
| - DoMouseMove(event); |
| + current_pen_state_[pointerId].last_pos_ = mouse_pos; |
| + |
| + WebMouseEvent event; |
| + InitMouseEvent(WebInputEvent::MouseMove, |
| + current_pen_state_[pointerId].pressed_button_, |
| + current_pen_state_[pointerId].current_buttons_, |
| + mouse_pos, |
| + GetCurrentEventTimeSec(), |
| + 0, |
| + modifiers, |
| + pointerType, |
| + pointerId, |
| + &event); |
| + HandleInputEventOnViewOrPopup(event); |
| } |
| } |
| @@ -2016,6 +2175,8 @@ void EventSender::MouseLeave() { |
| GetCurrentEventTimeSec(), |
| click_count_, |
| 0, |
| + blink::WebPointerProperties::PointerType::Mouse, |
| + 0, |
| &event); |
| HandleInputEventOnViewOrPopup(event); |
| } |
| @@ -2333,6 +2494,8 @@ void EventSender::GestureEvent(WebInputEvent::Type type, |
| GetCurrentEventTimeSec(), |
| click_count_, |
| modifiers_, |
| + blink::WebPointerProperties::PointerType::Mouse, |
| + 0, |
| &mouse_event); |
| FinishDragAndDrop(mouse_event, blink::WebDragOperationNone); |
| @@ -2404,6 +2567,8 @@ void EventSender::InitMouseWheelEvent(gin::Arguments* args, |
| GetCurrentEventTimeSec(), |
| click_count_, |
| modifiers, |
| + blink::WebPointerProperties::PointerType::Mouse, |
| + 0, |
| event); |
| event->wheelTicksX = static_cast<float>(horizontal); |
| event->wheelTicksY = static_cast<float>(vertical); |
| @@ -2466,25 +2631,8 @@ void EventSender::InitPointerProperties(gin::Arguments* args, |
| e->tiltY = tiltY; |
| } |
| - if (!args->PeekNext().IsEmpty()) { |
| - std::string pointer_type_string; |
| - if (!args->GetNext(&pointer_type_string)) { |
| - args->ThrowError(); |
| - return; |
| - } |
| - if (pointer_type_string == kPointerTypeStringUnknown) { |
| - e->pointerType = WebMouseEvent::PointerType::Unknown; |
| - } else if (pointer_type_string == kPointerTypeStringMouse) { |
| - e->pointerType = WebMouseEvent::PointerType::Mouse; |
| - } else if (pointer_type_string == kPointerTypeStringPen) { |
| - e->pointerType = WebMouseEvent::PointerType::Pen; |
| - } else if (pointer_type_string == kPointerTypeStringTouch) { |
| - e->pointerType = WebMouseEvent::PointerType::Touch; |
| - } else { |
| - args->ThrowError(); |
| - return; |
| - } |
| - } |
| + if (getPointerType(args, e->pointerType)) |
| + return; |
| } |
| void EventSender::FinishDragAndDrop(const WebMouseEvent& e, |
| @@ -2562,6 +2710,8 @@ void EventSender::ReplaySavedEvents() { |
| GetCurrentEventTimeSec(), |
| click_count_, |
| e.modifiers, |
| + blink::WebPointerProperties::PointerType::Mouse, |
| + 0, |
| &event); |
| DoMouseMove(event); |
| break; |
| @@ -2581,6 +2731,8 @@ void EventSender::ReplaySavedEvents() { |
| GetCurrentEventTimeSec(), |
| click_count_, |
| e.modifiers, |
| + blink::WebPointerProperties::PointerType::Mouse, |
| + 0, |
| &event); |
| DoMouseUp(event); |
| break; |