Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(47)

Unified Diff: components/test_runner/event_sender.cc

Issue 1855513002: Consider isPrimary and pointerType when preventing compat mouse (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;

Powered by Google App Engine
This is Rietveld 408576698