OLD | NEW |
---|---|
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/renderer_host/input/mouse_wheel_event_queue.h" | 5 #include "content/browser/renderer_host/input/mouse_wheel_event_queue.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 #include <utility> | 10 #include <utility> |
(...skipping 12 matching lines...) Expand all Loading... | |
23 using blink::WebInputEvent; | 23 using blink::WebInputEvent; |
24 using blink::WebMouseWheelEvent; | 24 using blink::WebMouseWheelEvent; |
25 | 25 |
26 namespace content { | 26 namespace content { |
27 namespace { | 27 namespace { |
28 | 28 |
29 const float kWheelScrollX = 10; | 29 const float kWheelScrollX = 10; |
30 const float kWheelScrollY = 12; | 30 const float kWheelScrollY = 12; |
31 const float kWheelScrollGlobalX = 50; | 31 const float kWheelScrollGlobalX = 50; |
32 const float kWheelScrollGlobalY = 72; | 32 const float kWheelScrollGlobalY = 72; |
33 const int64_t kScrollEndTimeoutMs = 100; | |
34 | |
35 base::TimeDelta DefaultScrollEndTimeoutDelay() { | |
36 return base::TimeDelta::FromMilliseconds(kScrollEndTimeoutMs); | |
37 } | |
38 | 33 |
39 #define EXPECT_GESTURE_SCROLL_BEGIN_IMPL(event) \ | 34 #define EXPECT_GESTURE_SCROLL_BEGIN_IMPL(event) \ |
40 EXPECT_EQ(WebInputEvent::GestureScrollBegin, event->type); \ | 35 EXPECT_EQ(WebInputEvent::GestureScrollBegin, event->type); \ |
41 EXPECT_EQ(kWheelScrollX, event->x); \ | 36 EXPECT_EQ(kWheelScrollX, event->x); \ |
42 EXPECT_EQ(kWheelScrollY, event->y); \ | 37 EXPECT_EQ(kWheelScrollY, event->y); \ |
43 EXPECT_EQ(kWheelScrollGlobalX, event->globalX); \ | 38 EXPECT_EQ(kWheelScrollGlobalX, event->globalX); \ |
44 EXPECT_EQ(kWheelScrollGlobalY, event->globalY); \ | 39 EXPECT_EQ(kWheelScrollGlobalY, event->globalY); \ |
45 EXPECT_EQ(scroll_units, event->data.scrollBegin.deltaHintUnits); | 40 EXPECT_EQ(scroll_units, event->data.scrollBegin.deltaHintUnits); |
46 | 41 |
47 #define EXPECT_GESTURE_SCROLL_BEGIN(event) \ | 42 #define EXPECT_GESTURE_SCROLL_BEGIN(event) \ |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
133 EXPECT_GESTURE_SCROLL_END_IMPL(event); \ | 128 EXPECT_GESTURE_SCROLL_END_IMPL(event); \ |
134 EXPECT_TRUE(event->data.scrollEnd.synthetic); \ | 129 EXPECT_TRUE(event->data.scrollEnd.synthetic); \ |
135 EXPECT_EQ(WebGestureEvent::MomentumPhase, \ | 130 EXPECT_EQ(WebGestureEvent::MomentumPhase, \ |
136 event->data.scrollEnd.inertialPhase); | 131 event->data.scrollEnd.inertialPhase); |
137 | 132 |
138 #define EXPECT_MOUSE_WHEEL(event) \ | 133 #define EXPECT_MOUSE_WHEEL(event) \ |
139 EXPECT_EQ(WebInputEvent::MouseWheel, event->type); | 134 EXPECT_EQ(WebInputEvent::MouseWheel, event->type); |
140 | 135 |
141 } // namespace | 136 } // namespace |
142 | 137 |
143 class MouseWheelEventQueueTest : public testing::Test, | 138 class MouseWheelEventQueueTest : public testing::TestWithParam<bool>, |
144 public MouseWheelEventQueueClient { | 139 public MouseWheelEventQueueClient { |
145 public: | 140 public: |
146 MouseWheelEventQueueTest() | 141 MouseWheelEventQueueTest() |
147 : acked_event_count_(0), | 142 : acked_event_count_(0), |
148 last_acked_event_state_(INPUT_EVENT_ACK_STATE_UNKNOWN) { | 143 last_acked_event_state_(INPUT_EVENT_ACK_STATE_UNKNOWN) { |
149 queue_.reset(new MouseWheelEventQueue(this, kScrollEndTimeoutMs)); | 144 queue_.reset(new MouseWheelEventQueue(this, GetParam())); |
145 ScrollEndTimeoutMs_ = GetParam() ? 100 : 0; | |
150 } | 146 } |
151 | 147 |
152 ~MouseWheelEventQueueTest() override {} | 148 ~MouseWheelEventQueueTest() override {} |
153 | 149 |
154 // MouseWheelEventQueueClient | 150 // MouseWheelEventQueueClient |
155 void SendMouseWheelEventImmediately( | 151 void SendMouseWheelEventImmediately( |
156 const MouseWheelEventWithLatencyInfo& event) override { | 152 const MouseWheelEventWithLatencyInfo& event) override { |
157 WebMouseWheelEvent* cloned_event = new WebMouseWheelEvent(); | 153 WebMouseWheelEvent* cloned_event = new WebMouseWheelEvent(); |
158 std::unique_ptr<WebInputEvent> cloned_event_holder(cloned_event); | 154 std::unique_ptr<WebInputEvent> cloned_event_holder(cloned_event); |
159 *cloned_event = event.event; | 155 *cloned_event = event.event; |
160 sent_events_.push_back(std::move(cloned_event_holder)); | 156 sent_events_.push_back(std::move(cloned_event_holder)); |
161 } | 157 } |
162 | 158 |
163 void ForwardGestureEventWithLatencyInfo( | 159 void ForwardGestureEventWithLatencyInfo( |
164 const blink::WebGestureEvent& event, | 160 const blink::WebGestureEvent& event, |
165 const ui::LatencyInfo& latency_info) override { | 161 const ui::LatencyInfo& latency_info) override { |
166 WebGestureEvent* cloned_event = new WebGestureEvent(); | 162 WebGestureEvent* cloned_event = new WebGestureEvent(); |
167 std::unique_ptr<WebInputEvent> cloned_event_holder(cloned_event); | 163 std::unique_ptr<WebInputEvent> cloned_event_holder(cloned_event); |
168 *cloned_event = event; | 164 *cloned_event = event; |
169 sent_events_.push_back(std::move(cloned_event_holder)); | 165 sent_events_.push_back(std::move(cloned_event_holder)); |
170 } | 166 } |
171 | 167 |
172 void OnMouseWheelEventAck(const MouseWheelEventWithLatencyInfo& event, | 168 void OnMouseWheelEventAck(const MouseWheelEventWithLatencyInfo& event, |
173 InputEventAckState ack_result) override { | 169 InputEventAckState ack_result) override { |
174 ++acked_event_count_; | 170 ++acked_event_count_; |
175 last_acked_event_ = event.event; | 171 last_acked_event_ = event.event; |
176 last_acked_event_state_ = ack_result; | 172 last_acked_event_state_ = ack_result; |
177 } | 173 } |
178 | 174 |
175 base::TimeDelta DefaultScrollEndTimeoutDelay() { | |
176 return base::TimeDelta::FromMilliseconds(ScrollEndTimeoutMs_); | |
177 } | |
178 | |
179 int64_t ScrollEndTimeoutMs_; | |
180 | |
179 protected: | 181 protected: |
180 size_t queued_event_count() const { return queue_->queued_size(); } | 182 size_t queued_event_count() const { return queue_->queued_size(); } |
181 | 183 |
182 bool event_in_flight() const { return queue_->event_in_flight(); } | 184 bool event_in_flight() const { return queue_->event_in_flight(); } |
183 | 185 |
184 std::vector<std::unique_ptr<WebInputEvent>>& all_sent_events() { | 186 std::vector<std::unique_ptr<WebInputEvent>>& all_sent_events() { |
185 return sent_events_; | 187 return sent_events_; |
186 } | 188 } |
187 | 189 |
188 const std::unique_ptr<WebInputEvent>& sent_input_event(size_t index) { | 190 const std::unique_ptr<WebInputEvent>& sent_input_event(size_t index) { |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
392 | 394 |
393 std::unique_ptr<MouseWheelEventQueue> queue_; | 395 std::unique_ptr<MouseWheelEventQueue> queue_; |
394 std::vector<std::unique_ptr<WebInputEvent>> sent_events_; | 396 std::vector<std::unique_ptr<WebInputEvent>> sent_events_; |
395 size_t acked_event_count_; | 397 size_t acked_event_count_; |
396 InputEventAckState last_acked_event_state_; | 398 InputEventAckState last_acked_event_state_; |
397 base::MessageLoopForUI message_loop_; | 399 base::MessageLoopForUI message_loop_; |
398 WebMouseWheelEvent last_acked_event_; | 400 WebMouseWheelEvent last_acked_event_; |
399 }; | 401 }; |
400 | 402 |
401 // Tests that mouse wheel events are queued properly. | 403 // Tests that mouse wheel events are queued properly. |
402 TEST_F(MouseWheelEventQueueTest, Basic) { | 404 TEST_P(MouseWheelEventQueueTest, Basic) { |
tdresser
2016/07/27 14:38:11
Do we need to change all of these to TEST_P? (I'm
sahel
2016/08/11 15:57:39
Yes, because the constructor is called in these te
tdresser
2016/08/12 13:28:32
Acknowledged.
| |
403 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, | 405 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, |
404 kWheelScrollGlobalY, 1, 1, 0, false); | 406 kWheelScrollGlobalY, 1, 1, 0, false); |
405 EXPECT_EQ(0U, queued_event_count()); | 407 EXPECT_EQ(0U, queued_event_count()); |
406 EXPECT_TRUE(event_in_flight()); | 408 EXPECT_TRUE(event_in_flight()); |
407 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 409 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
408 | 410 |
409 // The second mouse wheel should not be sent since one is already in queue. | 411 // The second mouse wheel should not be sent since one is already in queue. |
410 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, | 412 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, |
411 kWheelScrollGlobalY, 5, 5, 0, false); | 413 kWheelScrollGlobalY, 5, 5, 0, false); |
412 EXPECT_EQ(1U, queued_event_count()); | 414 EXPECT_EQ(1U, queued_event_count()); |
(...skipping 10 matching lines...) Expand all Loading... | |
423 | 425 |
424 // Receive an ACK for the second mouse wheel event. | 426 // Receive an ACK for the second mouse wheel event. |
425 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); | 427 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); |
426 EXPECT_EQ(0U, queued_event_count()); | 428 EXPECT_EQ(0U, queued_event_count()); |
427 EXPECT_FALSE(event_in_flight()); | 429 EXPECT_FALSE(event_in_flight()); |
428 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 430 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
429 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 431 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
430 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); | 432 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); |
431 } | 433 } |
432 | 434 |
433 TEST_F(MouseWheelEventQueueTest, GestureSending) { | 435 TEST_P(MouseWheelEventQueueTest, GestureSending) { |
434 GestureSendingTest(false); | 436 GestureSendingTest(false); |
435 } | 437 } |
436 | 438 |
437 TEST_F(MouseWheelEventQueueTest, GestureSendingPrecisePixels) { | 439 TEST_P(MouseWheelEventQueueTest, GestureSendingPrecisePixels) { |
438 GestureSendingTest(false); | 440 GestureSendingTest(false); |
439 } | 441 } |
440 | 442 |
441 TEST_F(MouseWheelEventQueueTest, GestureSendingWithPhaseInformation) { | 443 TEST_P(MouseWheelEventQueueTest, GestureSendingWithPhaseInformation) { |
442 PhaseGestureSendingTest(false); | 444 PhaseGestureSendingTest(false); |
443 } | 445 } |
444 | 446 |
445 TEST_F(MouseWheelEventQueueTest, | 447 TEST_P(MouseWheelEventQueueTest, |
446 GestureSendingWithPhaseInformationPrecisePixels) { | 448 GestureSendingWithPhaseInformationPrecisePixels) { |
447 PhaseGestureSendingTest(true); | 449 PhaseGestureSendingTest(true); |
448 } | 450 } |
449 | 451 |
450 TEST_F(MouseWheelEventQueueTest, GestureSendingInterrupted) { | 452 TEST_P(MouseWheelEventQueueTest, GestureSendingInterrupted) { |
451 const WebGestureEvent::ScrollUnits scroll_units = WebGestureEvent::Pixels; | 453 const WebGestureEvent::ScrollUnits scroll_units = WebGestureEvent::Pixels; |
452 | 454 |
453 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, | 455 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, |
454 kWheelScrollGlobalY, 1, 1, 0, false); | 456 kWheelScrollGlobalY, 1, 1, 0, false); |
455 EXPECT_EQ(0U, queued_event_count()); | 457 EXPECT_EQ(0U, queued_event_count()); |
456 EXPECT_TRUE(event_in_flight()); | 458 EXPECT_TRUE(event_in_flight()); |
457 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 459 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
458 | 460 |
459 // Receive an ACK for the mouse wheel event. | 461 // Receive an ACK for the mouse wheel event. |
460 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 462 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
502 EXPECT_EQ(0U, queued_event_count()); | 504 EXPECT_EQ(0U, queued_event_count()); |
503 EXPECT_FALSE(event_in_flight()); | 505 EXPECT_FALSE(event_in_flight()); |
504 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); | 506 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); |
505 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 507 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
506 EXPECT_EQ(2U, all_sent_events().size()); | 508 EXPECT_EQ(2U, all_sent_events().size()); |
507 EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); | 509 EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); |
508 EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1)); | 510 EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1)); |
509 EXPECT_EQ(2U, GetAndResetSentEventCount()); | 511 EXPECT_EQ(2U, GetAndResetSentEventCount()); |
510 } | 512 } |
511 | 513 |
512 TEST_F(MouseWheelEventQueueTest, GestureRailScrolling) { | 514 TEST_P(MouseWheelEventQueueTest, GestureRailScrolling) { |
513 const WebGestureEvent::ScrollUnits scroll_units = WebGestureEvent::Pixels; | 515 const WebGestureEvent::ScrollUnits scroll_units = WebGestureEvent::Pixels; |
514 | 516 |
515 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, | 517 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, |
516 kWheelScrollGlobalY, 1, 1, 0, false, | 518 kWheelScrollGlobalY, 1, 1, 0, false, |
517 WebInputEvent::RailsModeHorizontal); | 519 WebInputEvent::RailsModeHorizontal); |
518 EXPECT_EQ(0U, queued_event_count()); | 520 EXPECT_EQ(0U, queued_event_count()); |
519 EXPECT_TRUE(event_in_flight()); | 521 EXPECT_TRUE(event_in_flight()); |
520 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 522 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
521 | 523 |
522 // Receive an ACK for the mouse wheel event. | 524 // Receive an ACK for the mouse wheel event. |
(...skipping 28 matching lines...) Expand all Loading... | |
551 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); | 553 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); |
552 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 554 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
553 EXPECT_EQ(2U, all_sent_events().size()); | 555 EXPECT_EQ(2U, all_sent_events().size()); |
554 EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); | 556 EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); |
555 EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1)); | 557 EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1)); |
556 EXPECT_EQ(0U, sent_gesture_event(1)->data.scrollUpdate.deltaX); | 558 EXPECT_EQ(0U, sent_gesture_event(1)->data.scrollUpdate.deltaX); |
557 EXPECT_EQ(1U, sent_gesture_event(1)->data.scrollUpdate.deltaY); | 559 EXPECT_EQ(1U, sent_gesture_event(1)->data.scrollUpdate.deltaY); |
558 EXPECT_EQ(2U, GetAndResetSentEventCount()); | 560 EXPECT_EQ(2U, GetAndResetSentEventCount()); |
559 } | 561 } |
560 | 562 |
563 TEST_P(MouseWheelEventQueueTest, WheelScrollLatching) { | |
tdresser
2016/07/27 14:38:12
Add a local variable equal to GetParam(), with a b
tdresser
2016/07/27 14:38:12
Great, thanks!
sahel
2016/08/11 15:57:39
Done.
sahel
2016/08/11 15:57:39
Acknowledged.
| |
564 const WebGestureEvent::ScrollUnits scroll_units = WebGestureEvent::Pixels; | |
565 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, | |
566 kWheelScrollGlobalY, 1, 1, 0, false, | |
567 WebInputEvent::RailsModeVertical); | |
568 EXPECT_EQ(0U, queued_event_count()); | |
569 EXPECT_TRUE(event_in_flight()); | |
570 EXPECT_EQ(1U, GetAndResetSentEventCount()); | |
571 | |
572 // Receive an ACK for the mouse wheel event. | |
573 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
574 EXPECT_EQ(0U, queued_event_count()); | |
575 EXPECT_FALSE(event_in_flight()); | |
576 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); | |
577 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | |
578 EXPECT_EQ(2U, all_sent_events().size()); | |
579 EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); | |
580 EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1)); | |
581 EXPECT_EQ(0U, sent_gesture_event(1)->data.scrollUpdate.deltaX); | |
582 EXPECT_EQ(1U, sent_gesture_event(1)->data.scrollUpdate.deltaY); | |
583 EXPECT_EQ(2U, GetAndResetSentEventCount()); | |
584 | |
585 RunTasksAndWait(base::TimeDelta::FromMilliseconds(1)); | |
586 if (!GetParam()) { | |
587 // Scroll end time out happens. | |
588 EXPECT_GESTURE_SCROLL_END(sent_gesture_event(0)); | |
589 EXPECT_EQ(1U, GetAndResetSentEventCount()); | |
590 } else { | |
591 EXPECT_EQ(0U, GetAndResetSentEventCount()); | |
592 } | |
593 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, | |
594 kWheelScrollGlobalY, 1, 1, 0, false, | |
595 WebInputEvent::RailsModeVertical); | |
596 EXPECT_EQ(0U, queued_event_count()); | |
597 EXPECT_TRUE(event_in_flight()); | |
598 EXPECT_EQ(1U, GetAndResetSentEventCount()); | |
599 | |
600 // Receive an ACK for the mouse wheel event. | |
601 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
602 EXPECT_EQ(0U, queued_event_count()); | |
603 EXPECT_FALSE(event_in_flight()); | |
604 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); | |
605 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | |
606 | |
607 int updateEventIndex = -1; | |
608 if (!GetParam()) { | |
609 EXPECT_EQ(2U, all_sent_events().size()); | |
610 EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); | |
611 updateEventIndex = 1; | |
612 } else { | |
613 // Scroll latching: no new scroll begin expected. | |
614 EXPECT_EQ(1U, all_sent_events().size()); | |
615 updateEventIndex = 0; | |
616 } | |
617 EXPECT_GE(updateEventIndex, 0); | |
618 EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(updateEventIndex)); | |
619 EXPECT_EQ(0U, sent_gesture_event(updateEventIndex)->data.scrollUpdate.deltaX); | |
620 EXPECT_EQ(1U, sent_gesture_event(updateEventIndex)->data.scrollUpdate.deltaY); | |
621 EXPECT_EQ(static_cast<size_t>(updateEventIndex + 1), | |
622 GetAndResetSentEventCount()); | |
623 } | |
624 | |
625 INSTANTIATE_TEST_CASE_P(MouseWheelEventQueueTests, | |
626 MouseWheelEventQueueTest, | |
627 testing::Bool()); | |
628 | |
561 } // namespace content | 629 } // namespace content |
OLD | NEW |