| 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());
|
| }
|
|
|
|
|