Index: content/browser/renderer_host/input/mouse_wheel_event_queue_unittest.cc |
diff --git a/content/browser/renderer_host/input/mouse_wheel_event_queue_unittest.cc b/content/browser/renderer_host/input/mouse_wheel_event_queue_unittest.cc |
index f9e10a901301818fb9270dc1fc3056c222353374..f14b6e6e2aabb6a2e6c1ed38a9b74a04ec81151f 100644 |
--- a/content/browser/renderer_host/input/mouse_wheel_event_queue_unittest.cc |
+++ b/content/browser/renderer_host/input/mouse_wheel_event_queue_unittest.cc |
@@ -34,6 +34,81 @@ base::TimeDelta DefaultScrollEndTimeoutDelay() { |
return base::TimeDelta::FromMilliseconds(kScrollEndTimeoutMs); |
} |
+#define EXPECT_GESTURE_SCROLL_BEGIN_IMPL(event) \ |
+ EXPECT_EQ(WebInputEvent::GestureScrollBegin, event->type); \ |
+ EXPECT_EQ(kWheelScrollX, event->x); \ |
+ EXPECT_EQ(kWheelScrollY, event->y); \ |
+ EXPECT_EQ(kWheelScrollGlobalX, event->globalX); \ |
+ EXPECT_EQ(kWheelScrollGlobalY, event->globalY); \ |
+ EXPECT_EQ(scroll_units, event->data.scrollBegin.deltaHintUnits); |
+ |
+#define EXPECT_GESTURE_SCROLL_BEGIN(event) \ |
+ EXPECT_GESTURE_SCROLL_BEGIN_IMPL(event); \ |
+ EXPECT_FALSE(event->data.scrollBegin.synthetic); \ |
+ EXPECT_FALSE(event->data.scrollBegin.inertial); |
+ |
+#define EXPECT_SYNTHETIC_GESTURE_SCROLL_BEGIN(event) \ |
+ EXPECT_GESTURE_SCROLL_BEGIN_IMPL(event); \ |
+ EXPECT_TRUE(event->data.scrollBegin.synthetic); \ |
+ EXPECT_FALSE(event->data.scrollBegin.inertial); |
+ |
+#define EXPECT_INERTIAL_GESTURE_SCROLL_BEGIN(event) \ |
+ EXPECT_GESTURE_SCROLL_BEGIN_IMPL(event); \ |
+ EXPECT_FALSE(event->data.scrollBegin.synthetic); \ |
+ EXPECT_TRUE(event->data.scrollBegin.inertial); |
+ |
+#define EXPECT_SYNTHETIC_INERTIAL_GESTURE_SCROLL_BEGIN(event) \ |
+ EXPECT_GESTURE_SCROLL_BEGIN_IMPL(event); \ |
+ EXPECT_TRUE(event->data.scrollBegin.synthetic); \ |
+ EXPECT_TRUE(event->data.scrollBegin.inertial); |
+ |
+#define EXPECT_GESTURE_SCROLL_UPDATE_IMPL(event) \ |
+ EXPECT_EQ(WebInputEvent::GestureScrollUpdate, event->type); \ |
+ EXPECT_EQ(scroll_units, event->data.scrollUpdate.deltaUnits); \ |
+ EXPECT_EQ(kWheelScrollX, event->x); \ |
+ EXPECT_EQ(kWheelScrollY, event->y); \ |
+ EXPECT_EQ(kWheelScrollGlobalX, event->globalX); \ |
+ EXPECT_EQ(kWheelScrollGlobalY, event->globalY); |
+ |
+#define EXPECT_GESTURE_SCROLL_UPDATE(event) \ |
+ EXPECT_GESTURE_SCROLL_UPDATE_IMPL(event); \ |
+ EXPECT_FALSE(event->data.scrollUpdate.inertial); |
+ |
+#define EXPECT_INERTIAL_GESTURE_SCROLL_UPDATE(event) \ |
+ EXPECT_GESTURE_SCROLL_UPDATE_IMPL(event); \ |
+ EXPECT_TRUE(event->data.scrollUpdate.inertial); |
+ |
+#define EXPECT_GESTURE_SCROLL_END_IMPL(event) \ |
+ EXPECT_EQ(WebInputEvent::GestureScrollEnd, event->type); \ |
+ EXPECT_EQ(scroll_units, event->data.scrollEnd.deltaUnits); \ |
+ EXPECT_EQ(kWheelScrollX, event->x); \ |
+ EXPECT_EQ(kWheelScrollY, event->y); \ |
+ EXPECT_EQ(kWheelScrollGlobalX, event->globalX); \ |
+ EXPECT_EQ(kWheelScrollGlobalY, event->globalY); |
+ |
+#define EXPECT_GESTURE_SCROLL_END(event) \ |
+ EXPECT_GESTURE_SCROLL_END_IMPL(event); \ |
+ EXPECT_FALSE(event->data.scrollEnd.synthetic); \ |
+ EXPECT_FALSE(event->data.scrollEnd.inertial); |
+ |
+#define EXPECT_SYNTHETIC_GESTURE_SCROLL_END(event) \ |
+ EXPECT_GESTURE_SCROLL_END_IMPL(event); \ |
+ EXPECT_TRUE(event->data.scrollEnd.synthetic); \ |
+ EXPECT_FALSE(event->data.scrollEnd.inertial); |
+ |
+#define EXPECT_INERTIAL_GESTURE_SCROLL_END(event) \ |
+ EXPECT_GESTURE_SCROLL_END_IMPL(event); \ |
+ EXPECT_FALSE(event->data.scrollEnd.synthetic); \ |
+ EXPECT_TRUE(event->data.scrollEnd.inertial); |
+ |
+#define EXPECT_SYNTHETIC_INERTIAL_GESTURE_SCROLL_END(event) \ |
+ EXPECT_GESTURE_SCROLL_END_IMPL(event); \ |
+ EXPECT_TRUE(event->data.scrollEnd.synthetic); \ |
+ EXPECT_TRUE(event->data.scrollEnd.inertial); |
+ |
+#define EXPECT_MOUSE_WHEEL(event) \ |
+ EXPECT_EQ(WebInputEvent::MouseWheel, event->type); |
+ |
} // namespace |
class MouseWheelEventQueueTest : public testing::Test, |
@@ -50,12 +125,17 @@ class MouseWheelEventQueueTest : public testing::Test, |
// MouseWheelEventQueueClient |
void SendMouseWheelEventImmediately( |
const MouseWheelEventWithLatencyInfo& event) override { |
- sent_events_.push_back(event.event); |
+ WebMouseWheelEvent* cloned_event = new WebMouseWheelEvent(); |
+ scoped_ptr<WebInputEvent> cloned_event_holder(cloned_event); |
+ *cloned_event = event.event; |
+ sent_events_.push_back(std::move(cloned_event_holder)); |
} |
void SendGestureEvent(const GestureEventWithLatencyInfo& event) override { |
- sent_events_.push_back(event.event); |
- sent_gesture_events_.push_back(event.event); |
+ WebGestureEvent* cloned_event = new WebGestureEvent(); |
+ scoped_ptr<WebInputEvent> cloned_event_holder(cloned_event); |
+ *cloned_event = event.event; |
+ sent_events_.push_back(std::move(cloned_event_holder)); |
} |
void OnMouseWheelEventAck(const MouseWheelEventWithLatencyInfo& event, |
@@ -75,10 +155,15 @@ class MouseWheelEventQueueTest : public testing::Test, |
bool event_in_flight() const { return queue_->event_in_flight(); } |
- std::vector<WebInputEvent>& all_sent_events() { return sent_events_; } |
+ std::vector<scoped_ptr<WebInputEvent>>& all_sent_events() { |
+ return sent_events_; |
+ } |
- std::vector<WebGestureEvent>& sent_gesture_events() { |
- return sent_gesture_events_; |
+ const scoped_ptr<WebInputEvent>& sent_input_event(size_t index) { |
+ return sent_events_[index]; |
+ } |
+ const WebGestureEvent* sent_gesture_event(size_t index) { |
+ return static_cast<WebGestureEvent*>(sent_events_[index].get()); |
} |
const WebMouseWheelEvent& acked_event() const { return last_acked_event_; } |
@@ -86,7 +171,6 @@ class MouseWheelEventQueueTest : public testing::Test, |
size_t GetAndResetSentEventCount() { |
size_t count = sent_events_.size(); |
sent_events_.clear(); |
- sent_gesture_events_.clear(); |
return count; |
} |
@@ -113,6 +197,24 @@ class MouseWheelEventQueueTest : public testing::Test, |
x, y, global_x, global_y, dX, dY, modifiers, high_precision))); |
} |
+ void SendMouseWheelWithPhase( |
+ float x, |
+ float y, |
+ float global_x, |
+ float global_y, |
+ float dX, |
+ float dY, |
+ int modifiers, |
+ bool high_precision, |
+ blink::WebMouseWheelEvent::Phase phase, |
+ blink::WebMouseWheelEvent::Phase momentum_phase) { |
+ WebMouseWheelEvent event = SyntheticWebMouseWheelEventBuilder::Build( |
+ x, y, global_x, global_y, dX, dY, modifiers, high_precision); |
+ event.phase = phase; |
+ event.momentumPhase = momentum_phase; |
+ queue_->QueueEvent(MouseWheelEventWithLatencyInfo(event)); |
+ } |
+ |
void SendGestureEvent(WebInputEvent::Type type) { |
WebGestureEvent event; |
event.type = type; |
@@ -137,7 +239,8 @@ class MouseWheelEventQueueTest : public testing::Test, |
EXPECT_TRUE(event_in_flight()); |
EXPECT_EQ(1U, GetAndResetSentEventCount()); |
- // The second mouse wheel should not be sent since one is already in queue. |
+ // The second mouse wheel should not be sent since one is already in |
+ // queue. |
SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, |
kWheelScrollGlobalY, 5, 5, 0, high_precision); |
EXPECT_EQ(1U, queued_event_count()); |
@@ -152,36 +255,104 @@ class MouseWheelEventQueueTest : public testing::Test, |
EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); |
EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
EXPECT_EQ(3U, all_sent_events().size()); |
- EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type); |
- EXPECT_EQ(scroll_units, |
- sent_gesture_events()[0].data.scrollBegin.deltaHintUnits); |
- EXPECT_EQ(kWheelScrollX, sent_gesture_events()[0].x); |
- EXPECT_EQ(kWheelScrollY, sent_gesture_events()[0].y); |
- EXPECT_EQ(kWheelScrollGlobalX, sent_gesture_events()[0].globalX); |
- EXPECT_EQ(kWheelScrollGlobalY, sent_gesture_events()[0].globalY); |
- EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type); |
- EXPECT_EQ(scroll_units, |
- sent_gesture_events()[1].data.scrollUpdate.deltaUnits); |
- EXPECT_EQ(kWheelScrollX, sent_gesture_events()[1].x); |
- EXPECT_EQ(kWheelScrollY, sent_gesture_events()[1].y); |
- EXPECT_EQ(kWheelScrollGlobalX, sent_gesture_events()[1].globalX); |
- EXPECT_EQ(kWheelScrollGlobalY, sent_gesture_events()[1].globalY); |
- EXPECT_EQ(WebInputEvent::MouseWheel, all_sent_events()[2].type); |
+ EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); |
+ EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1)); |
+ EXPECT_MOUSE_WHEEL(sent_input_event(2)); |
EXPECT_EQ(3U, GetAndResetSentEventCount()); |
RunTasksAndWait(DefaultScrollEndTimeoutDelay() * 2); |
EXPECT_EQ(1U, all_sent_events().size()); |
- EXPECT_EQ(WebInputEvent::GestureScrollEnd, all_sent_events()[0].type); |
- EXPECT_EQ(scroll_units, sent_gesture_events()[0].data.scrollEnd.deltaUnits); |
- EXPECT_EQ(kWheelScrollX, sent_gesture_events()[0].x); |
- EXPECT_EQ(kWheelScrollY, sent_gesture_events()[0].y); |
- EXPECT_EQ(kWheelScrollGlobalX, sent_gesture_events()[0].globalX); |
- EXPECT_EQ(kWheelScrollGlobalY, sent_gesture_events()[0].globalY); |
+ EXPECT_GESTURE_SCROLL_END(sent_gesture_event(0)); |
+ } |
+ |
+ void PhaseGestureSendingTest(bool high_precision) { |
+ const WebGestureEvent::ScrollUnits scroll_units = |
+ high_precision ? WebGestureEvent::PrecisePixels |
+ : WebGestureEvent::Pixels; |
+ |
+ SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, |
+ kWheelScrollGlobalY, 1, 1, 0, high_precision, |
+ WebMouseWheelEvent::PhaseBegan, |
+ WebMouseWheelEvent::PhaseNone); |
+ EXPECT_EQ(1U, GetAndResetSentEventCount()); |
+ SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(3U, all_sent_events().size()); |
+ EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); |
+ EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1)); |
+ EXPECT_SYNTHETIC_GESTURE_SCROLL_END(sent_gesture_event(2)); |
+ EXPECT_EQ(3U, GetAndResetSentEventCount()); |
+ |
+ SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, |
+ kWheelScrollGlobalY, 5, 5, 0, high_precision, |
+ WebMouseWheelEvent::PhaseChanged, |
+ WebMouseWheelEvent::PhaseNone); |
+ EXPECT_EQ(1U, GetAndResetSentEventCount()); |
+ SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(3U, all_sent_events().size()); |
+ EXPECT_SYNTHETIC_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); |
+ EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1)); |
+ EXPECT_SYNTHETIC_GESTURE_SCROLL_END(sent_gesture_event(2)); |
+ EXPECT_EQ(3U, GetAndResetSentEventCount()); |
+ |
+ SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, |
+ kWheelScrollGlobalY, 0, 0, 0, high_precision, |
+ WebMouseWheelEvent::PhaseEnded, |
+ WebMouseWheelEvent::PhaseNone); |
+ EXPECT_EQ(1U, GetAndResetSentEventCount()); |
+ SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(2U, all_sent_events().size()); |
+ EXPECT_SYNTHETIC_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); |
+ EXPECT_GESTURE_SCROLL_END(sent_gesture_event(1)); |
+ EXPECT_EQ(2U, GetAndResetSentEventCount()); |
+ |
+ // Send a double phase end; OSX does it consistently. |
+ SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, |
+ kWheelScrollGlobalY, 0, 0, 0, high_precision, |
+ WebMouseWheelEvent::PhaseEnded, |
+ WebMouseWheelEvent::PhaseNone); |
+ EXPECT_EQ(1U, GetAndResetSentEventCount()); |
+ SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(0U, all_sent_events().size()); |
+ EXPECT_EQ(0U, GetAndResetSentEventCount()); |
+ |
+ SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, |
+ kWheelScrollGlobalY, 5, 5, 0, high_precision, |
+ WebMouseWheelEvent::PhaseNone, |
+ WebMouseWheelEvent::PhaseBegan); |
+ EXPECT_EQ(1U, GetAndResetSentEventCount()); |
+ SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(3U, all_sent_events().size()); |
+ EXPECT_INERTIAL_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); |
+ EXPECT_INERTIAL_GESTURE_SCROLL_UPDATE(sent_gesture_event(1)); |
+ EXPECT_SYNTHETIC_INERTIAL_GESTURE_SCROLL_END(sent_gesture_event(2)); |
+ EXPECT_EQ(3U, GetAndResetSentEventCount()); |
+ |
+ SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, |
+ kWheelScrollGlobalY, 5, 5, 0, high_precision, |
+ WebMouseWheelEvent::PhaseNone, |
+ WebMouseWheelEvent::PhaseChanged); |
+ EXPECT_EQ(1U, GetAndResetSentEventCount()); |
+ SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(3U, all_sent_events().size()); |
+ EXPECT_SYNTHETIC_INERTIAL_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); |
+ EXPECT_INERTIAL_GESTURE_SCROLL_UPDATE(sent_gesture_event(1)); |
+ EXPECT_SYNTHETIC_INERTIAL_GESTURE_SCROLL_END(sent_gesture_event(2)); |
+ EXPECT_EQ(3U, GetAndResetSentEventCount()); |
+ |
+ SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, |
+ kWheelScrollGlobalY, 0, 0, 0, high_precision, |
+ WebMouseWheelEvent::PhaseNone, |
+ WebMouseWheelEvent::PhaseEnded); |
+ EXPECT_EQ(1U, GetAndResetSentEventCount()); |
+ SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(2U, all_sent_events().size()); |
+ EXPECT_SYNTHETIC_INERTIAL_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); |
+ EXPECT_INERTIAL_GESTURE_SCROLL_END(sent_gesture_event(1)); |
+ EXPECT_EQ(2U, GetAndResetSentEventCount()); |
} |
scoped_ptr<MouseWheelEventQueue> queue_; |
- std::vector<WebInputEvent> sent_events_; |
- std::vector<WebGestureEvent> sent_gesture_events_; |
+ std::vector<scoped_ptr<WebInputEvent>> sent_events_; |
size_t acked_event_count_; |
InputEventAckState last_acked_event_state_; |
base::MessageLoopForUI message_loop_; |
@@ -230,8 +401,21 @@ TEST_F(MouseWheelEventQueueTest, GestureSendingPrecisePixels) { |
GestureSendingTest(false); |
} |
+TEST_F(MouseWheelEventQueueTest, GestureSendingWithPhaseInformation) { |
+ SetUpForGestureTesting(true); |
+ PhaseGestureSendingTest(false); |
+} |
+ |
+TEST_F(MouseWheelEventQueueTest, |
+ GestureSendingWithPhaseInformationPrecisePixels) { |
+ SetUpForGestureTesting(true); |
+ PhaseGestureSendingTest(true); |
+} |
+ |
TEST_F(MouseWheelEventQueueTest, GestureSendingInterrupted) { |
SetUpForGestureTesting(true); |
+ const WebGestureEvent::ScrollUnits scroll_units = WebGestureEvent::Pixels; |
+ |
SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, |
kWheelScrollGlobalY, 1, 1, 0, false); |
EXPECT_EQ(0U, queued_event_count()); |
@@ -245,14 +429,14 @@ TEST_F(MouseWheelEventQueueTest, GestureSendingInterrupted) { |
EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); |
EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
EXPECT_EQ(2U, all_sent_events().size()); |
- EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type); |
- EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type); |
+ EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); |
+ EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1)); |
EXPECT_EQ(2U, GetAndResetSentEventCount()); |
// Ensure that a gesture scroll begin terminates the current scroll event. |
SendGestureEvent(WebInputEvent::GestureScrollBegin); |
EXPECT_EQ(1U, all_sent_events().size()); |
- EXPECT_EQ(WebInputEvent::GestureScrollEnd, all_sent_events()[0].type); |
+ EXPECT_GESTURE_SCROLL_END(sent_gesture_event(0)); |
EXPECT_EQ(1U, GetAndResetSentEventCount()); |
SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, |
@@ -286,8 +470,8 @@ TEST_F(MouseWheelEventQueueTest, GestureSendingInterrupted) { |
EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); |
EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
EXPECT_EQ(2U, all_sent_events().size()); |
- EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type); |
- EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type); |
+ EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); |
+ EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1)); |
EXPECT_EQ(2U, GetAndResetSentEventCount()); |
} |