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..a690fced43f9114017f5f260e1f36c65d275cf2d 100644 |
--- a/components/test_runner/event_sender.cc |
+++ b/components/test_runner/event_sender.cc |
@@ -58,6 +58,35 @@ namespace test_runner { |
namespace { |
+const char* kPointerTypeStringUnknown = ""; |
+const char* kPointerTypeStringMouse = "mouse"; |
+const char* kPointerTypeStringPen = "pen"; |
+const char* kPointerTypeStringTouch = "touch"; |
+ |
+bool getPointerType(gin::Arguments* args, |
+ blink::WebPointerProperties::PointerType &t) { |
+ if (!args->PeekNext().IsEmpty()) { |
+ std::string pointer_type_string; |
+ if (!args->GetNext(&pointer_type_string)) { |
+ args->ThrowError(); |
+ return true; |
+ } |
+ if (pointer_type_string == kPointerTypeStringUnknown) { |
+ 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) { |
+ t = WebMouseEvent::PointerType::Touch; |
+ } else { |
+ args->ThrowError(); |
+ return true; |
+ } |
+ } |
+ return false; |
+} |
+ |
WebMouseEvent::Button GetButtonTypeFromButtonNumber(int button_code) { |
switch (button_code) { |
case -1: |
@@ -103,6 +132,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 +142,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 +487,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 +1005,26 @@ void EventSenderBindings::MouseDown(gin::Arguments* args) { |
int button_number = 0; |
int modifiers = 0; |
+ blink::WebPointerProperties::PointerType type = |
+ blink::WebPointerProperties::PointerType::Mouse; |
+ int pointerId = 0; |
if (!args->PeekNext().IsEmpty()) { |
args->GetNext(&button_number); |
- if (!args->PeekNext().IsEmpty()) |
+ if (!args->PeekNext().IsEmpty()) { |
modifiers = GetKeyModifiersFromV8(args->isolate(), args->PeekNext()); |
+ args->Skip(); |
+ } |
} |
- sender_->MouseDown(button_number, modifiers); |
+ getPointerType(args, type); |
+ if (!args->PeekNext().IsEmpty()) |
+ args->GetNext(&pointerId); |
+ |
+ // Only allow pen or mouse through this API; |
+ if (type != blink::WebPointerProperties::PointerType::Mouse |
+ && type != blink::WebPointerProperties::PointerType::Pen) |
+ type = blink::WebPointerProperties::PointerType::Mouse; |
+ |
+ sender_->MouseDown(button_number, modifiers, type, pointerId); |
} |
void EventSenderBindings::MouseUp(gin::Arguments* args) { |
@@ -992,12 +1033,26 @@ void EventSenderBindings::MouseUp(gin::Arguments* args) { |
int button_number = 0; |
int modifiers = 0; |
+ blink::WebPointerProperties::PointerType type = |
+ blink::WebPointerProperties::PointerType::Mouse; |
+ int pointerId = 0; |
if (!args->PeekNext().IsEmpty()) { |
args->GetNext(&button_number); |
- if (!args->PeekNext().IsEmpty()) |
+ if (!args->PeekNext().IsEmpty()) { |
modifiers = GetKeyModifiersFromV8(args->isolate(), args->PeekNext()); |
+ args->Skip(); |
+ } |
} |
- sender_->MouseUp(button_number, modifiers); |
+ getPointerType(args, type); |
dtapuska
2016/04/05 19:21:25
This API returns a bool... should we handle the re
Navid Zolghadr
2016/04/05 20:17:25
I wanted to do that too. However this function was
dtapuska
2016/04/05 20:30:40
looks good.
|
+ if (!args->PeekNext().IsEmpty()) |
+ args->GetNext(&pointerId); |
+ |
+ // Only allow pen or mouse through this API; |
+ if (type != blink::WebPointerProperties::PointerType::Mouse |
dtapuska
2016/04/05 19:21:24
Personally I think a switch is easier to read. Als
Navid Zolghadr
2016/04/05 20:17:25
I changed the way I handle this. I moved it to get
dtapuska
2016/04/05 20:30:40
Seems reasonable to me.
|
+ && type != blink::WebPointerProperties::PointerType::Pen) |
+ type = blink::WebPointerProperties::PointerType::Mouse; |
+ |
+ sender_->MouseUp(button_number, modifiers, type, pointerId); |
} |
void EventSenderBindings::SetMouseButtonState(gin::Arguments* args) { |
@@ -1203,6 +1258,7 @@ void EventSender::Reset() { |
current_drag_effects_allowed_ = blink::WebDragOperationNone; |
if (view_ && pressed_button_ != WebMouseEvent::ButtonNone) |
view_->mouseCaptureLost(); |
+ stateOfPen.clear(); |
pressed_button_ = WebMouseEvent::ButtonNone; |
current_buttons_ = 0; |
modifiers_ = 0; |
@@ -1264,6 +1320,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 +1338,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 +1348,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_, |
dtapuska
2016/04/05 19:21:25
Would it make sense to store some of this in the s
Navid Zolghadr
2016/04/05 20:17:25
I'd like to do that too as it is pretty much the s
dtapuska
2016/04/05 20:30:40
The current_pen_state_ is a unordered_map; so I'd
|
+ current_buttons_, |
+ last_mouse_pos_, |
+ GetCurrentEventTimeSec(), |
+ click_count_, |
+ modifiers_, |
+ pointerType, |
+ 0, |
+ &event); |
+ } else { |
+ stateOfPen[pointerId].pressed_button_ = button_type; |
+ stateOfPen[pointerId].current_buttons_ |= |
+ GetWebMouseEventModifierForButton(pressed_button_); |
+ stateOfPen[pointerId].modifiers_ = modifiers; |
+ InitMouseEvent(WebInputEvent::MouseDown, |
+ stateOfPen[pointerId].pressed_button_, |
+ stateOfPen[pointerId].current_buttons_, |
+ stateOfPen[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 +1395,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); |
+ stateOfPen[pointerId].current_buttons_ &= |
+ ~GetWebMouseEventModifierForButton(button_type); |
+ stateOfPen[pointerId].pressed_button_ = WebMouseEvent::ButtonNone; |
+ |
+ WebMouseEvent event; |
+ InitMouseEvent(WebInputEvent::MouseUp, |
+ button_type, |
+ stateOfPen[pointerId].current_buttons_, |
+ stateOfPen[pointerId].last_pos_, |
+ GetCurrentEventTimeSec(), |
+ 0, |
+ modifiers, |
+ pointerType, |
+ pointerId, |
+ &event); |
+ HandleInputEventOnViewOrPopup(event); |
} |
} |
@@ -1550,6 +1650,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 +1707,8 @@ std::vector<std::string> EventSender::ContextClick() { |
GetCurrentEventTimeSec(), |
click_count_, |
0, |
+ blink::WebPointerProperties::PointerType::Mouse, |
+ 0, |
&event); |
HandleInputEventOnViewOrPopup(event); |
@@ -1620,6 +1724,8 @@ std::vector<std::string> EventSender::ContextClick() { |
GetCurrentEventTimeSec(), |
click_count_, |
0, |
+ blink::WebPointerProperties::PointerType::Mouse, |
+ 0, |
&event); |
HandleInputEventOnViewOrPopup(event); |
#endif |
@@ -1973,6 +2079,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 +2089,53 @@ 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); |
+ getPointerType(args, pointerType); |
dtapuska
2016/04/05 19:21:25
same comments regarding return type.
Navid Zolghadr
2016/04/05 20:17:25
Done.
|
+ |
+ if (!args->PeekNext().IsEmpty()) |
+ args->GetNext(&pointerId); |
+ |
+ 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); |
+ stateOfPen[pointerId].last_pos_ = mouse_pos; |
+ |
+ WebMouseEvent event; |
+ InitMouseEvent(WebInputEvent::MouseMove, |
+ stateOfPen[pointerId].pressed_button_, |
+ stateOfPen[pointerId].current_buttons_, |
+ mouse_pos, |
+ GetCurrentEventTimeSec(), |
+ 0, |
+ modifiers, |
+ pointerType, |
+ pointerId, |
+ &event); |
+ HandleInputEventOnViewOrPopup(event); |
} |
} |
@@ -2016,6 +2151,8 @@ void EventSender::MouseLeave() { |
GetCurrentEventTimeSec(), |
click_count_, |
0, |
+ blink::WebPointerProperties::PointerType::Mouse, |
+ 0, |
&event); |
HandleInputEventOnViewOrPopup(event); |
} |
@@ -2333,6 +2470,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 +2543,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,24 +2607,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(); |
+ if (getPointerType(args, e->pointerType)) { |
return; |
- } |
} |
} |
@@ -2562,6 +2687,8 @@ void EventSender::ReplaySavedEvents() { |
GetCurrentEventTimeSec(), |
click_count_, |
e.modifiers, |
+ blink::WebPointerProperties::PointerType::Mouse, |
+ 0, |
&event); |
DoMouseMove(event); |
break; |
@@ -2581,6 +2708,8 @@ void EventSender::ReplaySavedEvents() { |
GetCurrentEventTimeSec(), |
click_count_, |
e.modifiers, |
+ blink::WebPointerProperties::PointerType::Mouse, |
+ 0, |
&event); |
DoMouseUp(event); |
break; |