Index: components/test_runner/event_sender.cc |
diff --git a/components/test_runner/event_sender.cc b/components/test_runner/event_sender.cc |
index 359aa00257dc96f993a983ed46be26b639e4b887..393572482957e5cc3f4162a6fbb5fb366717c278 100644 |
--- a/components/test_runner/event_sender.cc |
+++ b/components/test_runner/event_sender.cc |
@@ -6,6 +6,7 @@ |
#include <stddef.h> |
+#include "base/command_line.h" |
#include "base/logging.h" |
#include "base/macros.h" |
#include "base/strings/string16.h" |
@@ -115,6 +116,19 @@ void InitMouseEvent(WebInputEvent::Type t, |
e->clickCount = click_count; |
} |
+void InitGestureEventFromMouseWheel(WebInputEvent::Type type, |
+ double time_stamp, |
+ const WebMouseWheelEvent& wheel_event, |
+ WebGestureEvent* gesture_event) { |
+ gesture_event->type = type; |
+ gesture_event->sourceDevice = blink::WebGestureDeviceTouchpad; |
+ gesture_event->x = wheel_event.x; |
+ gesture_event->y = wheel_event.y; |
+ gesture_event->globalX = wheel_event.globalX; |
+ gesture_event->globalY = wheel_event.globalY; |
+ gesture_event->timeStampSeconds = time_stamp; |
+} |
+ |
int GetKeyModifier(const std::string& modifier_name) { |
const char* characters = modifier_name.c_str(); |
if (!strcmp(characters, "ctrlKey") |
@@ -500,8 +514,6 @@ class EventSenderBindings : public gin::Wrappable<EventSenderBindings> { |
double LastEventTimestamp(); |
void BeginDragWithFiles(const std::vector<std::string>& files); |
void AddTouchPoint(double x, double y, gin::Arguments* args); |
- void MouseDragBegin(); |
- void MouseDragEnd(); |
void GestureScrollBegin(gin::Arguments* args); |
void GestureScrollEnd(gin::Arguments* args); |
void GestureScrollUpdate(gin::Arguments* args); |
@@ -518,9 +530,6 @@ class EventSenderBindings : public gin::Wrappable<EventSenderBindings> { |
void ContinuousMouseScrollBy(gin::Arguments* args); |
void MouseMoveTo(gin::Arguments* args); |
void MouseLeave(); |
- void TrackpadScrollBegin(); |
- void TrackpadScroll(gin::Arguments* args); |
- void TrackpadScrollEnd(); |
void MouseScrollBy(gin::Arguments* args); |
void ScheduleAsynchronousClick(gin::Arguments* args); |
void ScheduleAsynchronousKeyDown(gin::Arguments* args); |
@@ -630,8 +639,6 @@ EventSenderBindings::GetObjectTemplateBuilder(v8::Isolate* isolate) { |
.SetMethod("lastEventTimestamp", &EventSenderBindings::LastEventTimestamp) |
.SetMethod("beginDragWithFiles", &EventSenderBindings::BeginDragWithFiles) |
.SetMethod("addTouchPoint", &EventSenderBindings::AddTouchPoint) |
- .SetMethod("mouseDragBegin", &EventSenderBindings::MouseDragBegin) |
- .SetMethod("mouseDragEnd", &EventSenderBindings::MouseDragEnd) |
.SetMethod("gestureScrollBegin", &EventSenderBindings::GestureScrollBegin) |
.SetMethod("gestureScrollEnd", &EventSenderBindings::GestureScrollEnd) |
.SetMethod("gestureScrollUpdate", |
@@ -653,10 +660,6 @@ EventSenderBindings::GetObjectTemplateBuilder(v8::Isolate* isolate) { |
.SetMethod("mouseDown", &EventSenderBindings::MouseDown) |
.SetMethod("mouseMoveTo", &EventSenderBindings::MouseMoveTo) |
.SetMethod("mouseLeave", &EventSenderBindings::MouseLeave) |
- .SetMethod("trackpadScrollBegin", |
- &EventSenderBindings::TrackpadScrollBegin) |
- .SetMethod("trackpadScroll", &EventSenderBindings::TrackpadScroll) |
- .SetMethod("trackpadScrollEnd", &EventSenderBindings::TrackpadScrollEnd) |
.SetMethod("mouseScrollBy", &EventSenderBindings::MouseScrollBy) |
.SetMethod("mouseUp", &EventSenderBindings::MouseUp) |
.SetMethod("setMouseButtonState", |
@@ -851,16 +854,6 @@ void EventSenderBindings::AddTouchPoint(double x, |
sender_->AddTouchPoint(static_cast<float>(x), static_cast<float>(y), args); |
} |
-void EventSenderBindings::MouseDragBegin() { |
- if (sender_) |
- sender_->MouseDragBegin(); |
-} |
- |
-void EventSenderBindings::MouseDragEnd() { |
- if (sender_) |
- sender_->MouseDragEnd(); |
-} |
- |
void EventSenderBindings::GestureScrollBegin(gin::Arguments* args) { |
if (sender_) |
sender_->GestureScrollBegin(args); |
@@ -928,7 +921,7 @@ void EventSenderBindings::GestureTwoFingerTap(gin::Arguments* args) { |
void EventSenderBindings::ContinuousMouseScrollBy(gin::Arguments* args) { |
if (sender_) |
- sender_->ContinuousMouseScrollBy(args); |
+ sender_->MouseScrollBy(args, EventSender::MouseScrollType::PIXEL); |
} |
void EventSenderBindings::MouseMoveTo(gin::Arguments* args) { |
@@ -941,24 +934,9 @@ void EventSenderBindings::MouseLeave() { |
sender_->MouseLeave(); |
} |
-void EventSenderBindings::TrackpadScrollBegin() { |
- if (sender_) |
- sender_->TrackpadScrollBegin(); |
-} |
- |
-void EventSenderBindings::TrackpadScroll(gin::Arguments* args) { |
- if (sender_) |
- sender_->TrackpadScroll(args); |
-} |
- |
-void EventSenderBindings::TrackpadScrollEnd() { |
- if (sender_) |
- sender_->TrackpadScrollEnd(); |
-} |
- |
void EventSenderBindings::MouseScrollBy(gin::Arguments* args) { |
if (sender_) |
- sender_->MouseScrollBy(args); |
+ sender_->MouseScrollBy(args, EventSender::MouseScrollType::TICK); |
} |
void EventSenderBindings::ScheduleAsynchronousClick(gin::Arguments* args) { |
@@ -1202,6 +1180,7 @@ EventSender::EventSender(TestInterfaces* interfaces) |
interfaces_(interfaces), |
delegate_(NULL), |
view_(NULL), |
+ send_wheel_gestures_(false), |
force_layout_on_events_(false), |
is_drag_mode_(true), |
touch_modifiers_(0), |
@@ -1921,36 +1900,6 @@ void EventSender::AddTouchPoint(float x, float y, gin::Arguments* args) { |
touch_points_.push_back(touch_point); |
} |
-void EventSender::MouseDragBegin() { |
- WebMouseWheelEvent event; |
- InitMouseEvent(WebInputEvent::MouseWheel, |
- WebMouseEvent::ButtonNone, |
- 0, |
- last_mouse_pos_, |
- GetCurrentEventTimeSec(), |
- click_count_, |
- 0, |
- &event); |
- event.phase = WebMouseWheelEvent::PhaseBegan; |
- event.hasPreciseScrollingDeltas = true; |
- HandleInputEventOnViewOrPopup(event); |
-} |
- |
-void EventSender::MouseDragEnd() { |
- WebMouseWheelEvent event; |
- InitMouseEvent(WebInputEvent::MouseWheel, |
- WebMouseEvent::ButtonNone, |
- 0, |
- last_mouse_pos_, |
- GetCurrentEventTimeSec(), |
- click_count_, |
- 0, |
- &event); |
- event.phase = WebMouseWheelEvent::PhaseEnded; |
- event.hasPreciseScrollingDeltas = true; |
- HandleInputEventOnViewOrPopup(event); |
-} |
- |
void EventSender::GestureScrollBegin(gin::Arguments* args) { |
GestureEvent(WebInputEvent::GestureScrollBegin, args); |
} |
@@ -2003,10 +1952,19 @@ void EventSender::GestureTwoFingerTap(gin::Arguments* args) { |
GestureEvent(WebInputEvent::GestureTwoFingerTap, args); |
} |
-void EventSender::ContinuousMouseScrollBy(gin::Arguments* args) { |
- WebMouseWheelEvent event; |
- InitMouseWheelEvent(args, true, &event); |
- HandleInputEventOnViewOrPopup(event); |
+void EventSender::MouseScrollBy(gin::Arguments* args, |
+ MouseScrollType scroll_type) { |
+ WebMouseWheelEvent wheel_event; |
+ // TODO(dtapuska): Gestures really should be sent by the MouseWheelEventQueue |
+ // class in the browser. But since the event doesn't propogate up into |
+ // the browser generate the events here. See crbug.com/596095. |
+ bool send_gestures = false; |
+ InitMouseWheelEvent(args, scroll_type, &wheel_event, &send_gestures); |
+ if (HandleInputEventOnViewOrPopup(wheel_event) == |
+ WebInputEventResult::NotHandled && |
+ send_gestures) { |
+ SendGesturesForMouseWheelEvent(wheel_event); |
+ } |
} |
void EventSender::MouseMoveTo(gin::Arguments* args) { |
@@ -2063,50 +2021,6 @@ void EventSender::MouseLeave() { |
} |
-void EventSender::TrackpadScrollBegin() { |
- WebMouseWheelEvent event; |
- InitMouseEvent(WebInputEvent::MouseWheel, |
- WebMouseEvent::ButtonNone, |
- 0, |
- last_mouse_pos_, |
- GetCurrentEventTimeSec(), |
- click_count_, |
- 0, |
- &event); |
- event.phase = blink::WebMouseWheelEvent::PhaseBegan; |
- event.hasPreciseScrollingDeltas = true; |
- HandleInputEventOnViewOrPopup(event); |
-} |
- |
-void EventSender::TrackpadScroll(gin::Arguments* args) { |
- WebMouseWheelEvent event; |
- InitMouseWheelEvent(args, true, &event); |
- event.phase = blink::WebMouseWheelEvent::PhaseChanged; |
- event.hasPreciseScrollingDeltas = true; |
- HandleInputEventOnViewOrPopup(event); |
-} |
- |
-void EventSender::TrackpadScrollEnd() { |
- WebMouseWheelEvent event; |
- InitMouseEvent(WebInputEvent::MouseWheel, |
- WebMouseEvent::ButtonNone, |
- 0, |
- last_mouse_pos_, |
- GetCurrentEventTimeSec(), |
- click_count_, |
- 0, |
- &event); |
- event.phase = WebMouseWheelEvent::PhaseEnded; |
- event.hasPreciseScrollingDeltas = true; |
- HandleInputEventOnViewOrPopup(event); |
-} |
- |
-void EventSender::MouseScrollBy(gin::Arguments* args) { |
- WebMouseWheelEvent event; |
- InitMouseWheelEvent(args, false, &event); |
- HandleInputEventOnViewOrPopup(event); |
-} |
- |
void EventSender::ScheduleAsynchronousClick(int button_number, int modifiers) { |
delegate_->PostTask(new MouseDownTask(this, button_number, modifiers)); |
delegate_->PostTask(new MouseUpTask(this, button_number, modifiers)); |
@@ -2440,8 +2354,9 @@ void EventSender::UpdateClickCountForButton( |
} |
void EventSender::InitMouseWheelEvent(gin::Arguments* args, |
- bool continuous, |
- WebMouseWheelEvent* event) { |
+ MouseScrollType scroll_type, |
+ WebMouseWheelEvent* event, |
+ bool* send_gestures) { |
// Force a layout here just to make sure every position has been |
// determined before we send events (as well as all the other methods |
// that send an event do). |
@@ -2471,11 +2386,16 @@ void EventSender::InitMouseWheelEvent(gin::Arguments* args, |
v8::Local<v8::Value> value; |
args->GetNext(&value); |
modifiers = GetKeyModifiersFromV8(args->isolate(), value); |
- if (!args->PeekNext().IsEmpty()) |
+ if (!args->PeekNext().IsEmpty()) { |
args->GetNext(&can_scroll); |
+ } |
} |
} |
} |
+ if (can_scroll && send_wheel_gestures_) { |
+ can_scroll = false; |
+ *send_gestures = true; |
+ } |
InitMouseEvent(WebInputEvent::MouseWheel, |
pressed_button_, |
@@ -2492,7 +2412,7 @@ void EventSender::InitMouseWheelEvent(gin::Arguments* args, |
event->scrollByPage = paged; |
event->hasPreciseScrollingDeltas = has_precise_scrolling_deltas; |
event->canScroll = can_scroll; |
- if (continuous) { |
+ if (scroll_type == MouseScrollType::PIXEL) { |
event->wheelTicksX /= kScrollbarPixelsPerTick; |
event->wheelTicksY /= kScrollbarPixelsPerTick; |
} else { |
@@ -2684,4 +2604,61 @@ WebInputEventResult EventSender::HandleInputEventOnViewOrPopup( |
return view_->handleInputEvent(event); |
} |
+void EventSender::SendGesturesForMouseWheelEvent( |
+ const WebMouseWheelEvent wheel_event) { |
+ WebGestureEvent begin_event; |
+ InitGestureEventFromMouseWheel(WebInputEvent::GestureScrollBegin, |
+ GetCurrentEventTimeSec(), wheel_event, |
+ &begin_event); |
+ begin_event.data.scrollBegin.deltaXHint = wheel_event.deltaX; |
+ begin_event.data.scrollBegin.deltaYHint = wheel_event.deltaY; |
+ if (wheel_event.scrollByPage) { |
+ begin_event.data.scrollBegin.deltaHintUnits = blink::WebGestureEvent::Page; |
+ if (begin_event.data.scrollBegin.deltaXHint) { |
+ begin_event.data.scrollBegin.deltaXHint = |
+ begin_event.data.scrollBegin.deltaXHint > 0 ? 1 : -1; |
+ } |
+ if (begin_event.data.scrollBegin.deltaYHint) { |
+ begin_event.data.scrollBegin.deltaYHint = |
+ begin_event.data.scrollBegin.deltaYHint > 0 ? 1 : -1; |
+ } |
+ } else { |
+ begin_event.data.scrollBegin.deltaHintUnits = |
+ wheel_event.hasPreciseScrollingDeltas |
+ ? blink::WebGestureEvent::PrecisePixels |
+ : blink::WebGestureEvent::Pixels; |
+ } |
+ |
+ if (force_layout_on_events_) |
+ view_->updateAllLifecyclePhases(); |
+ |
+ HandleInputEventOnViewOrPopup(begin_event); |
+ |
+ WebGestureEvent update_event; |
+ InitGestureEventFromMouseWheel(WebInputEvent::GestureScrollUpdate, |
+ GetCurrentEventTimeSec(), wheel_event, |
+ &update_event); |
+ update_event.data.scrollUpdate.deltaX = |
+ begin_event.data.scrollBegin.deltaXHint; |
+ update_event.data.scrollUpdate.deltaY = |
+ begin_event.data.scrollBegin.deltaYHint; |
+ update_event.data.scrollUpdate.deltaUnits = |
+ begin_event.data.scrollBegin.deltaHintUnits; |
+ |
+ if (force_layout_on_events_) |
+ view_->updateAllLifecyclePhases(); |
+ HandleInputEventOnViewOrPopup(update_event); |
+ |
+ WebGestureEvent end_event; |
+ InitGestureEventFromMouseWheel(WebInputEvent::GestureScrollEnd, |
+ GetCurrentEventTimeSec(), wheel_event, |
+ &end_event); |
+ end_event.data.scrollEnd.deltaUnits = |
+ begin_event.data.scrollBegin.deltaHintUnits; |
+ |
+ if (force_layout_on_events_) |
+ view_->updateAllLifecyclePhases(); |
+ HandleInputEventOnViewOrPopup(end_event); |
+} |
+ |
} // namespace test_runner |