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> |
11 | 11 |
12 #include "base/location.h" | 12 #include "base/location.h" |
13 #include "base/message_loop/message_loop.h" | 13 #include "base/message_loop/message_loop.h" |
14 #include "base/run_loop.h" | 14 #include "base/run_loop.h" |
15 #include "base/single_thread_task_runner.h" | 15 #include "base/single_thread_task_runner.h" |
| 16 #include "base/test/scoped_feature_list.h" |
16 #include "base/test/scoped_task_environment.h" | 17 #include "base/test/scoped_task_environment.h" |
17 #include "base/threading/thread_task_runner_handle.h" | 18 #include "base/threading/thread_task_runner_handle.h" |
18 #include "content/browser/renderer_host/input/timeout_monitor.h" | 19 #include "content/browser/renderer_host/input/timeout_monitor.h" |
19 #include "content/common/input/synthetic_web_input_event_builders.h" | 20 #include "content/common/input/synthetic_web_input_event_builders.h" |
| 21 #include "content/public/common/content_features.h" |
20 #include "testing/gtest/include/gtest/gtest.h" | 22 #include "testing/gtest/include/gtest/gtest.h" |
21 #include "third_party/WebKit/public/platform/WebInputEvent.h" | 23 #include "third_party/WebKit/public/platform/WebInputEvent.h" |
22 #include "ui/events/base_event_utils.h" | 24 #include "ui/events/base_event_utils.h" |
23 | 25 |
24 using blink::WebGestureEvent; | 26 using blink::WebGestureEvent; |
25 using blink::WebInputEvent; | 27 using blink::WebInputEvent; |
26 using blink::WebMouseWheelEvent; | 28 using blink::WebMouseWheelEvent; |
27 | 29 |
28 namespace content { | 30 namespace content { |
29 namespace { | 31 namespace { |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 | 130 |
129 #define EXPECT_SYNTHETIC_INERTIAL_GESTURE_SCROLL_END(event) \ | 131 #define EXPECT_SYNTHETIC_INERTIAL_GESTURE_SCROLL_END(event) \ |
130 EXPECT_GESTURE_SCROLL_END_IMPL(event); \ | 132 EXPECT_GESTURE_SCROLL_END_IMPL(event); \ |
131 EXPECT_TRUE(event->data.scroll_end.synthetic); \ | 133 EXPECT_TRUE(event->data.scroll_end.synthetic); \ |
132 EXPECT_EQ(WebGestureEvent::kMomentumPhase, \ | 134 EXPECT_EQ(WebGestureEvent::kMomentumPhase, \ |
133 event->data.scroll_end.inertial_phase); | 135 event->data.scroll_end.inertial_phase); |
134 | 136 |
135 #define EXPECT_MOUSE_WHEEL(event) \ | 137 #define EXPECT_MOUSE_WHEEL(event) \ |
136 EXPECT_EQ(WebInputEvent::kMouseWheel, event->GetType()); | 138 EXPECT_EQ(WebInputEvent::kMouseWheel, event->GetType()); |
137 | 139 |
| 140 enum WheelScrollingMode { |
| 141 kWheelScrollingModeNone, |
| 142 kWheelScrollLatching, |
| 143 kAsyncWheelEvents, |
| 144 }; |
| 145 |
138 } // namespace | 146 } // namespace |
139 | 147 |
140 class MouseWheelEventQueueTest : public testing::TestWithParam<bool>, | 148 class MouseWheelEventQueueTest |
141 public MouseWheelEventQueueClient { | 149 : public testing::TestWithParam<WheelScrollingMode>, |
| 150 public MouseWheelEventQueueClient { |
142 public: | 151 public: |
143 MouseWheelEventQueueTest() | 152 MouseWheelEventQueueTest() |
144 : scoped_task_environment_( | 153 : scoped_task_environment_( |
145 base::test::ScopedTaskEnvironment::MainThreadType::UI), | 154 base::test::ScopedTaskEnvironment::MainThreadType::UI), |
146 acked_event_count_(0), | 155 acked_event_count_(0), |
147 last_acked_event_state_(INPUT_EVENT_ACK_STATE_UNKNOWN) { | 156 last_acked_event_state_(INPUT_EVENT_ACK_STATE_UNKNOWN) { |
148 scroll_latching_enabled_ = GetParam(); | 157 scroll_latching_enabled_ = GetParam() != kWheelScrollingModeNone; |
| 158 switch (GetParam()) { |
| 159 case kWheelScrollingModeNone: |
| 160 feature_list_.InitWithFeatures( |
| 161 {}, {features::kTouchpadAndWheelScrollLatching, |
| 162 features::kAsyncWheelEvents}); |
| 163 break; |
| 164 case kWheelScrollLatching: |
| 165 feature_list_.InitWithFeatures( |
| 166 {features::kTouchpadAndWheelScrollLatching}, |
| 167 {features::kAsyncWheelEvents}); |
| 168 break; |
| 169 case kAsyncWheelEvents: |
| 170 feature_list_.InitWithFeatures( |
| 171 {features::kTouchpadAndWheelScrollLatching, |
| 172 features::kAsyncWheelEvents}, |
| 173 {}); |
| 174 } |
| 175 |
149 queue_.reset(new MouseWheelEventQueue(this, scroll_latching_enabled_)); | 176 queue_.reset(new MouseWheelEventQueue(this, scroll_latching_enabled_)); |
150 scroll_end_timeout_ms_ = scroll_latching_enabled_ ? 100 : 0; | |
151 } | 177 } |
152 | 178 |
153 ~MouseWheelEventQueueTest() override {} | 179 ~MouseWheelEventQueueTest() override {} |
154 | 180 |
155 // MouseWheelEventQueueClient | 181 // MouseWheelEventQueueClient |
156 void SendMouseWheelEventImmediately( | 182 void SendMouseWheelEventImmediately( |
157 const MouseWheelEventWithLatencyInfo& event) override { | 183 const MouseWheelEventWithLatencyInfo& event) override { |
158 WebMouseWheelEvent* cloned_event = new WebMouseWheelEvent(); | 184 WebMouseWheelEvent* cloned_event = new WebMouseWheelEvent(); |
159 std::unique_ptr<WebInputEvent> cloned_event_holder(cloned_event); | 185 std::unique_ptr<WebInputEvent> cloned_event_holder(cloned_event); |
160 *cloned_event = event.event; | 186 *cloned_event = event.event; |
161 sent_events_.push_back(std::move(cloned_event_holder)); | 187 sent_events_.push_back(std::move(cloned_event_holder)); |
162 } | 188 } |
163 | 189 |
164 void ForwardGestureEventWithLatencyInfo( | 190 void ForwardGestureEventWithLatencyInfo( |
165 const blink::WebGestureEvent& event, | 191 const blink::WebGestureEvent& event, |
166 const ui::LatencyInfo& latency_info) override { | 192 const ui::LatencyInfo& latency_info) override { |
167 WebGestureEvent* cloned_event = new WebGestureEvent(); | 193 WebGestureEvent* cloned_event = new WebGestureEvent(); |
168 std::unique_ptr<WebInputEvent> cloned_event_holder(cloned_event); | 194 std::unique_ptr<WebInputEvent> cloned_event_holder(cloned_event); |
169 *cloned_event = event; | 195 *cloned_event = event; |
170 sent_events_.push_back(std::move(cloned_event_holder)); | 196 sent_events_.push_back(std::move(cloned_event_holder)); |
171 } | 197 } |
172 | 198 |
173 void OnMouseWheelEventAck(const MouseWheelEventWithLatencyInfo& event, | 199 void OnMouseWheelEventAck(const MouseWheelEventWithLatencyInfo& event, |
174 InputEventAckState ack_result) override { | 200 InputEventAckState ack_result) override { |
175 ++acked_event_count_; | 201 ++acked_event_count_; |
176 last_acked_event_ = event.event; | 202 last_acked_event_ = event.event; |
177 last_acked_event_state_ = ack_result; | 203 last_acked_event_state_ = ack_result; |
178 } | 204 } |
179 | 205 |
180 base::TimeDelta DefaultScrollEndTimeoutDelay() { | |
181 return base::TimeDelta::FromMilliseconds(scroll_end_timeout_ms_); | |
182 } | |
183 | |
184 bool scroll_latching_enabled() { return scroll_latching_enabled_; } | 206 bool scroll_latching_enabled() { return scroll_latching_enabled_; } |
185 | 207 |
186 protected: | 208 protected: |
187 size_t queued_event_count() const { return queue_->queued_size(); } | 209 size_t queued_event_count() const { return queue_->queued_size(); } |
188 | 210 |
189 bool event_in_flight() const { return queue_->event_in_flight(); } | 211 bool event_in_flight() const { return queue_->event_in_flight(); } |
190 | 212 |
191 std::vector<std::unique_ptr<WebInputEvent>>& all_sent_events() { | 213 std::vector<std::unique_ptr<WebInputEvent>>& all_sent_events() { |
192 return sent_events_; | 214 return sent_events_; |
193 } | 215 } |
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
500 EXPECT_EQ(2U, GetAndResetSentEventCount()); | 522 EXPECT_EQ(2U, GetAndResetSentEventCount()); |
501 } | 523 } |
502 } | 524 } |
503 | 525 |
504 base::test::ScopedTaskEnvironment scoped_task_environment_; | 526 base::test::ScopedTaskEnvironment scoped_task_environment_; |
505 std::unique_ptr<MouseWheelEventQueue> queue_; | 527 std::unique_ptr<MouseWheelEventQueue> queue_; |
506 std::vector<std::unique_ptr<WebInputEvent>> sent_events_; | 528 std::vector<std::unique_ptr<WebInputEvent>> sent_events_; |
507 size_t acked_event_count_; | 529 size_t acked_event_count_; |
508 InputEventAckState last_acked_event_state_; | 530 InputEventAckState last_acked_event_state_; |
509 WebMouseWheelEvent last_acked_event_; | 531 WebMouseWheelEvent last_acked_event_; |
510 int64_t scroll_end_timeout_ms_; | |
511 bool scroll_latching_enabled_; | 532 bool scroll_latching_enabled_; |
| 533 |
| 534 private: |
| 535 base::test::ScopedFeatureList feature_list_; |
512 }; | 536 }; |
513 | 537 |
514 // Tests that mouse wheel events are queued properly. | 538 // Tests that mouse wheel events are queued properly. |
515 TEST_P(MouseWheelEventQueueTest, Basic) { | 539 TEST_P(MouseWheelEventQueueTest, Basic) { |
516 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, | 540 SendMouseWheelPossiblyIncludingPhase( |
517 kWheelScrollGlobalY, 1, 1, 0, false); | 541 !scroll_latching_enabled_, kWheelScrollX, kWheelScrollY, |
| 542 kWheelScrollGlobalX, kWheelScrollGlobalY, 1, 1, 0, false, |
| 543 WebMouseWheelEvent::kPhaseBegan, WebMouseWheelEvent::kPhaseNone); |
518 EXPECT_EQ(0U, queued_event_count()); | 544 EXPECT_EQ(0U, queued_event_count()); |
519 EXPECT_TRUE(event_in_flight()); | 545 EXPECT_TRUE(event_in_flight()); |
520 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 546 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
521 | 547 |
522 // The second mouse wheel should not be sent since one is already in queue. | 548 // The second mouse wheel should not be sent since one is already in queue. |
523 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, | 549 SendMouseWheelPossiblyIncludingPhase( |
524 kWheelScrollGlobalY, 5, 5, 0, false); | 550 !scroll_latching_enabled_, kWheelScrollX, kWheelScrollY, |
| 551 kWheelScrollGlobalX, kWheelScrollGlobalY, 5, 5, 0, false, |
| 552 WebMouseWheelEvent::kPhaseChanged, WebMouseWheelEvent::kPhaseNone); |
525 EXPECT_EQ(1U, queued_event_count()); | 553 EXPECT_EQ(1U, queued_event_count()); |
526 EXPECT_TRUE(event_in_flight()); | 554 EXPECT_TRUE(event_in_flight()); |
527 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 555 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
528 | 556 |
529 // Receive an ACK for the first mouse wheel event. | 557 // Receive an ACK for the first mouse wheel event. |
530 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); | 558 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); |
531 EXPECT_EQ(0U, queued_event_count()); | 559 EXPECT_EQ(0U, queued_event_count()); |
532 EXPECT_TRUE(event_in_flight()); | 560 EXPECT_TRUE(event_in_flight()); |
533 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 561 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
534 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 562 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
777 // Scroll latching: no new scroll begin expected. | 805 // Scroll latching: no new scroll begin expected. |
778 EXPECT_EQ(1U, all_sent_events().size()); | 806 EXPECT_EQ(1U, all_sent_events().size()); |
779 EXPECT_GESTURE_SCROLL_UPDATE_WITH_PHASE(sent_gesture_event(0)); | 807 EXPECT_GESTURE_SCROLL_UPDATE_WITH_PHASE(sent_gesture_event(0)); |
780 EXPECT_EQ(0U, sent_gesture_event(0)->data.scroll_update.delta_x); | 808 EXPECT_EQ(0U, sent_gesture_event(0)->data.scroll_update.delta_x); |
781 EXPECT_EQ(1U, sent_gesture_event(0)->data.scroll_update.delta_y); | 809 EXPECT_EQ(1U, sent_gesture_event(0)->data.scroll_update.delta_y); |
782 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 810 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
783 } | 811 } |
784 | 812 |
785 INSTANTIATE_TEST_CASE_P(MouseWheelEventQueueTests, | 813 INSTANTIATE_TEST_CASE_P(MouseWheelEventQueueTests, |
786 MouseWheelEventQueueTest, | 814 MouseWheelEventQueueTest, |
787 testing::Bool()); | 815 testing::Values(kWheelScrollingModeNone, |
| 816 kWheelScrollLatching, |
| 817 kAsyncWheelEvents)); |
788 | 818 |
789 } // namespace content | 819 } // namespace content |
OLD | NEW |