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

Side by Side Diff: content/browser/renderer_host/input/mouse_wheel_event_queue_unittest.cc

Issue 2158423002: Wheel scroll latching enabled behind flag. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 4 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 unified diff | Download patch
OLDNEW
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
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
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 ScrollLatchingEnabled_ = GetParam();
145 queue_.reset(new MouseWheelEventQueue(this, ScrollLatchingEnabled_));
146 ScrollEndTimeoutMs_ = ScrollLatchingEnabled_ ? 100 : 0;
150 } 147 }
151 148
152 ~MouseWheelEventQueueTest() override {} 149 ~MouseWheelEventQueueTest() override {}
153 150
154 // MouseWheelEventQueueClient 151 // MouseWheelEventQueueClient
155 void SendMouseWheelEventImmediately( 152 void SendMouseWheelEventImmediately(
156 const MouseWheelEventWithLatencyInfo& event) override { 153 const MouseWheelEventWithLatencyInfo& event) override {
157 WebMouseWheelEvent* cloned_event = new WebMouseWheelEvent(); 154 WebMouseWheelEvent* cloned_event = new WebMouseWheelEvent();
158 std::unique_ptr<WebInputEvent> cloned_event_holder(cloned_event); 155 std::unique_ptr<WebInputEvent> cloned_event_holder(cloned_event);
159 *cloned_event = event.event; 156 *cloned_event = event.event;
160 sent_events_.push_back(std::move(cloned_event_holder)); 157 sent_events_.push_back(std::move(cloned_event_holder));
161 } 158 }
162 159
163 void ForwardGestureEventWithLatencyInfo( 160 void ForwardGestureEventWithLatencyInfo(
164 const blink::WebGestureEvent& event, 161 const blink::WebGestureEvent& event,
165 const ui::LatencyInfo& latency_info) override { 162 const ui::LatencyInfo& latency_info) override {
166 WebGestureEvent* cloned_event = new WebGestureEvent(); 163 WebGestureEvent* cloned_event = new WebGestureEvent();
167 std::unique_ptr<WebInputEvent> cloned_event_holder(cloned_event); 164 std::unique_ptr<WebInputEvent> cloned_event_holder(cloned_event);
168 *cloned_event = event; 165 *cloned_event = event;
169 sent_events_.push_back(std::move(cloned_event_holder)); 166 sent_events_.push_back(std::move(cloned_event_holder));
170 } 167 }
171 168
172 void OnMouseWheelEventAck(const MouseWheelEventWithLatencyInfo& event, 169 void OnMouseWheelEventAck(const MouseWheelEventWithLatencyInfo& event,
173 InputEventAckState ack_result) override { 170 InputEventAckState ack_result) override {
174 ++acked_event_count_; 171 ++acked_event_count_;
175 last_acked_event_ = event.event; 172 last_acked_event_ = event.event;
176 last_acked_event_state_ = ack_result; 173 last_acked_event_state_ = ack_result;
177 } 174 }
178 175
176 base::TimeDelta DefaultScrollEndTimeoutDelay() {
177 return base::TimeDelta::FromMilliseconds(ScrollEndTimeoutMs_);
178 }
179
180 bool ScrollLatchingEnabled() { return ScrollLatchingEnabled_; }
tdresser 2016/08/12 13:28:32 scroll_latching_enabled() Thin getters should be
sahel 2016/08/12 15:45:28 Done.
181
179 protected: 182 protected:
180 size_t queued_event_count() const { return queue_->queued_size(); } 183 size_t queued_event_count() const { return queue_->queued_size(); }
181 184
182 bool event_in_flight() const { return queue_->event_in_flight(); } 185 bool event_in_flight() const { return queue_->event_in_flight(); }
183 186
184 std::vector<std::unique_ptr<WebInputEvent>>& all_sent_events() { 187 std::vector<std::unique_ptr<WebInputEvent>>& all_sent_events() {
185 return sent_events_; 188 return sent_events_;
186 } 189 }
187 190
188 const std::unique_ptr<WebInputEvent>& sent_input_event(size_t index) { 191 const std::unique_ptr<WebInputEvent>& sent_input_event(size_t index) {
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 EXPECT_INERTIAL_GESTURE_SCROLL_END(sent_gesture_event(1)); 392 EXPECT_INERTIAL_GESTURE_SCROLL_END(sent_gesture_event(1));
390 EXPECT_EQ(2U, GetAndResetSentEventCount()); 393 EXPECT_EQ(2U, GetAndResetSentEventCount());
391 } 394 }
392 395
393 std::unique_ptr<MouseWheelEventQueue> queue_; 396 std::unique_ptr<MouseWheelEventQueue> queue_;
394 std::vector<std::unique_ptr<WebInputEvent>> sent_events_; 397 std::vector<std::unique_ptr<WebInputEvent>> sent_events_;
395 size_t acked_event_count_; 398 size_t acked_event_count_;
396 InputEventAckState last_acked_event_state_; 399 InputEventAckState last_acked_event_state_;
397 base::MessageLoopForUI message_loop_; 400 base::MessageLoopForUI message_loop_;
398 WebMouseWheelEvent last_acked_event_; 401 WebMouseWheelEvent last_acked_event_;
402 int64_t ScrollEndTimeoutMs_;
tdresser 2016/08/12 13:28:32 scroll_end_timeout_ms_
sahel 2016/08/12 15:45:29 Done.
403 bool ScrollLatchingEnabled_;
tdresser 2016/08/12 13:28:32 scroll_latching_enabled_
sahel 2016/08/12 15:45:29 Done.
399 }; 404 };
400 405
401 // Tests that mouse wheel events are queued properly. 406 // Tests that mouse wheel events are queued properly.
402 TEST_F(MouseWheelEventQueueTest, Basic) { 407 TEST_P(MouseWheelEventQueueTest, Basic) {
403 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, 408 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX,
404 kWheelScrollGlobalY, 1, 1, 0, false); 409 kWheelScrollGlobalY, 1, 1, 0, false);
405 EXPECT_EQ(0U, queued_event_count()); 410 EXPECT_EQ(0U, queued_event_count());
406 EXPECT_TRUE(event_in_flight()); 411 EXPECT_TRUE(event_in_flight());
407 EXPECT_EQ(1U, GetAndResetSentEventCount()); 412 EXPECT_EQ(1U, GetAndResetSentEventCount());
408 413
409 // The second mouse wheel should not be sent since one is already in queue. 414 // The second mouse wheel should not be sent since one is already in queue.
410 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, 415 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX,
411 kWheelScrollGlobalY, 5, 5, 0, false); 416 kWheelScrollGlobalY, 5, 5, 0, false);
412 EXPECT_EQ(1U, queued_event_count()); 417 EXPECT_EQ(1U, queued_event_count());
(...skipping 10 matching lines...) Expand all
423 428
424 // Receive an ACK for the second mouse wheel event. 429 // Receive an ACK for the second mouse wheel event.
425 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); 430 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
426 EXPECT_EQ(0U, queued_event_count()); 431 EXPECT_EQ(0U, queued_event_count());
427 EXPECT_FALSE(event_in_flight()); 432 EXPECT_FALSE(event_in_flight());
428 EXPECT_EQ(0U, GetAndResetSentEventCount()); 433 EXPECT_EQ(0U, GetAndResetSentEventCount());
429 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 434 EXPECT_EQ(1U, GetAndResetAckedEventCount());
430 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); 435 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type);
431 } 436 }
432 437
433 TEST_F(MouseWheelEventQueueTest, GestureSending) { 438 TEST_P(MouseWheelEventQueueTest, GestureSending) {
434 GestureSendingTest(false); 439 GestureSendingTest(false);
435 } 440 }
436 441
437 TEST_F(MouseWheelEventQueueTest, GestureSendingPrecisePixels) { 442 TEST_P(MouseWheelEventQueueTest, GestureSendingPrecisePixels) {
438 GestureSendingTest(false); 443 GestureSendingTest(false);
439 } 444 }
440 445
441 TEST_F(MouseWheelEventQueueTest, GestureSendingWithPhaseInformation) { 446 TEST_P(MouseWheelEventQueueTest, GestureSendingWithPhaseInformation) {
442 PhaseGestureSendingTest(false); 447 PhaseGestureSendingTest(false);
443 } 448 }
444 449
445 TEST_F(MouseWheelEventQueueTest, 450 TEST_P(MouseWheelEventQueueTest,
446 GestureSendingWithPhaseInformationPrecisePixels) { 451 GestureSendingWithPhaseInformationPrecisePixels) {
447 PhaseGestureSendingTest(true); 452 PhaseGestureSendingTest(true);
448 } 453 }
449 454
450 TEST_F(MouseWheelEventQueueTest, GestureSendingInterrupted) { 455 TEST_P(MouseWheelEventQueueTest, GestureSendingInterrupted) {
451 const WebGestureEvent::ScrollUnits scroll_units = WebGestureEvent::Pixels; 456 const WebGestureEvent::ScrollUnits scroll_units = WebGestureEvent::Pixels;
452 457
453 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, 458 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX,
454 kWheelScrollGlobalY, 1, 1, 0, false); 459 kWheelScrollGlobalY, 1, 1, 0, false);
455 EXPECT_EQ(0U, queued_event_count()); 460 EXPECT_EQ(0U, queued_event_count());
456 EXPECT_TRUE(event_in_flight()); 461 EXPECT_TRUE(event_in_flight());
457 EXPECT_EQ(1U, GetAndResetSentEventCount()); 462 EXPECT_EQ(1U, GetAndResetSentEventCount());
458 463
459 // Receive an ACK for the mouse wheel event. 464 // Receive an ACK for the mouse wheel event.
460 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 465 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
502 EXPECT_EQ(0U, queued_event_count()); 507 EXPECT_EQ(0U, queued_event_count());
503 EXPECT_FALSE(event_in_flight()); 508 EXPECT_FALSE(event_in_flight());
504 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); 509 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type);
505 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 510 EXPECT_EQ(1U, GetAndResetAckedEventCount());
506 EXPECT_EQ(2U, all_sent_events().size()); 511 EXPECT_EQ(2U, all_sent_events().size());
507 EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); 512 EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0));
508 EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1)); 513 EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1));
509 EXPECT_EQ(2U, GetAndResetSentEventCount()); 514 EXPECT_EQ(2U, GetAndResetSentEventCount());
510 } 515 }
511 516
512 TEST_F(MouseWheelEventQueueTest, GestureRailScrolling) { 517 TEST_P(MouseWheelEventQueueTest, GestureRailScrolling) {
513 const WebGestureEvent::ScrollUnits scroll_units = WebGestureEvent::Pixels; 518 const WebGestureEvent::ScrollUnits scroll_units = WebGestureEvent::Pixels;
514 519
515 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, 520 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX,
516 kWheelScrollGlobalY, 1, 1, 0, false, 521 kWheelScrollGlobalY, 1, 1, 0, false,
517 WebInputEvent::RailsModeHorizontal); 522 WebInputEvent::RailsModeHorizontal);
518 EXPECT_EQ(0U, queued_event_count()); 523 EXPECT_EQ(0U, queued_event_count());
519 EXPECT_TRUE(event_in_flight()); 524 EXPECT_TRUE(event_in_flight());
520 EXPECT_EQ(1U, GetAndResetSentEventCount()); 525 EXPECT_EQ(1U, GetAndResetSentEventCount());
521 526
522 // Receive an ACK for the mouse wheel event. 527 // Receive an ACK for the mouse wheel event.
(...skipping 28 matching lines...) Expand all
551 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); 556 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type);
552 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 557 EXPECT_EQ(1U, GetAndResetAckedEventCount());
553 EXPECT_EQ(2U, all_sent_events().size()); 558 EXPECT_EQ(2U, all_sent_events().size());
554 EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); 559 EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0));
555 EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1)); 560 EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1));
556 EXPECT_EQ(0U, sent_gesture_event(1)->data.scrollUpdate.deltaX); 561 EXPECT_EQ(0U, sent_gesture_event(1)->data.scrollUpdate.deltaX);
557 EXPECT_EQ(1U, sent_gesture_event(1)->data.scrollUpdate.deltaY); 562 EXPECT_EQ(1U, sent_gesture_event(1)->data.scrollUpdate.deltaY);
558 EXPECT_EQ(2U, GetAndResetSentEventCount()); 563 EXPECT_EQ(2U, GetAndResetSentEventCount());
559 } 564 }
560 565
566 TEST_P(MouseWheelEventQueueTest, WheelScrollLatching) {
567 const WebGestureEvent::ScrollUnits scroll_units = WebGestureEvent::Pixels;
568 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX,
569 kWheelScrollGlobalY, 1, 1, 0, false,
570 WebInputEvent::RailsModeVertical);
571 EXPECT_EQ(0U, queued_event_count());
572 EXPECT_TRUE(event_in_flight());
573 EXPECT_EQ(1U, GetAndResetSentEventCount());
574
575 // Receive an ACK for the mouse wheel event.
576 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
577 EXPECT_EQ(0U, queued_event_count());
578 EXPECT_FALSE(event_in_flight());
579 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type);
580 EXPECT_EQ(1U, GetAndResetAckedEventCount());
581 EXPECT_EQ(2U, all_sent_events().size());
582 EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0));
583 EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1));
584 EXPECT_EQ(0U, sent_gesture_event(1)->data.scrollUpdate.deltaX);
585 EXPECT_EQ(1U, sent_gesture_event(1)->data.scrollUpdate.deltaY);
586 EXPECT_EQ(2U, GetAndResetSentEventCount());
587
588 RunTasksAndWait(base::TimeDelta::FromMilliseconds(1));
589 if (!ScrollLatchingEnabled_) {
590 // Scroll end time out happens.
tdresser 2016/08/12 13:28:32 If scroll latching isn't enabled, there's no timeo
sahel 2016/08/12 15:45:28 Yes, the timeout is zero. I think the comment is m
591 EXPECT_GESTURE_SCROLL_END(sent_gesture_event(0));
592 EXPECT_EQ(1U, GetAndResetSentEventCount());
593 } else {
594 EXPECT_EQ(0U, GetAndResetSentEventCount());
595 }
596 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX,
597 kWheelScrollGlobalY, 1, 1, 0, false,
598 WebInputEvent::RailsModeVertical);
599 EXPECT_EQ(0U, queued_event_count());
600 EXPECT_TRUE(event_in_flight());
601 EXPECT_EQ(1U, GetAndResetSentEventCount());
602
603 // Receive an ACK for the mouse wheel event.
604 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
605 EXPECT_EQ(0U, queued_event_count());
606 EXPECT_FALSE(event_in_flight());
607 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type);
608 EXPECT_EQ(1U, GetAndResetAckedEventCount());
609
610 int updateEventIndex = -1;
611 if (!ScrollLatchingEnabled_) {
612 EXPECT_EQ(2U, all_sent_events().size());
613 EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0));
614 updateEventIndex = 1;
615 } else {
616 // Scroll latching: no new scroll begin expected.
617 EXPECT_EQ(1U, all_sent_events().size());
618 updateEventIndex = 0;
619 }
620 EXPECT_GE(updateEventIndex, 0);
621 EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(updateEventIndex));
622 EXPECT_EQ(0U, sent_gesture_event(updateEventIndex)->data.scrollUpdate.deltaX);
623 EXPECT_EQ(1U, sent_gesture_event(updateEventIndex)->data.scrollUpdate.deltaY);
624 EXPECT_EQ(static_cast<size_t>(updateEventIndex + 1),
625 GetAndResetSentEventCount());
626 }
627
628 INSTANTIATE_TEST_CASE_P(MouseWheelEventQueueTests,
629 MouseWheelEventQueueTest,
630 testing::Bool());
631
561 } // namespace content 632 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698