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 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/location.h" | 10 #include "base/location.h" |
11 #include "base/memory/scoped_ptr.h" | 11 #include "base/memory/scoped_ptr.h" |
12 #include "base/message_loop/message_loop.h" | 12 #include "base/message_loop/message_loop.h" |
13 #include "base/single_thread_task_runner.h" | 13 #include "base/single_thread_task_runner.h" |
14 #include "base/thread_task_runner_handle.h" | 14 #include "base/thread_task_runner_handle.h" |
15 #include "content/browser/renderer_host/input/timeout_monitor.h" | 15 #include "content/browser/renderer_host/input/timeout_monitor.h" |
16 #include "content/common/input/synthetic_web_input_event_builders.h" | 16 #include "content/common/input/synthetic_web_input_event_builders.h" |
17 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
18 #include "third_party/WebKit/public/web/WebInputEvent.h" | 18 #include "third_party/WebKit/public/web/WebInputEvent.h" |
19 | 19 |
20 using blink::WebGestureEvent; | 20 using blink::WebGestureEvent; |
21 using blink::WebInputEvent; | 21 using blink::WebInputEvent; |
22 using blink::WebMouseWheelEvent; | 22 using blink::WebMouseWheelEvent; |
23 | 23 |
24 namespace content { | 24 namespace content { |
25 namespace { | 25 namespace { |
26 | 26 |
| 27 const float kWheelScrollX = 10; |
| 28 const float kWheelScrollY = 12; |
| 29 const float kWheelScrollGlobalX = 50; |
| 30 const float kWheelScrollGlobalY = 72; |
27 const int64_t kScrollEndTimeoutMs = 100; | 31 const int64_t kScrollEndTimeoutMs = 100; |
28 | 32 |
29 base::TimeDelta DefaultScrollEndTimeoutDelay() { | 33 base::TimeDelta DefaultScrollEndTimeoutDelay() { |
30 return base::TimeDelta::FromMilliseconds(kScrollEndTimeoutMs); | 34 return base::TimeDelta::FromMilliseconds(kScrollEndTimeoutMs); |
31 } | 35 } |
32 | 36 |
33 } // namespace | 37 } // namespace |
34 | 38 |
35 class MouseWheelEventQueueTest : public testing::Test, | 39 class MouseWheelEventQueueTest : public testing::Test, |
36 public MouseWheelEventQueueClient { | 40 public MouseWheelEventQueueClient { |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 acked_event_count_ = 0; | 95 acked_event_count_ = 0; |
92 return count; | 96 return count; |
93 } | 97 } |
94 | 98 |
95 void SendMouseWheelEventAck(InputEventAckState ack_result) { | 99 void SendMouseWheelEventAck(InputEventAckState ack_result) { |
96 queue_->ProcessMouseWheelAck(ack_result, ui::LatencyInfo()); | 100 queue_->ProcessMouseWheelAck(ack_result, ui::LatencyInfo()); |
97 } | 101 } |
98 | 102 |
99 void SendMouseWheel(float x, | 103 void SendMouseWheel(float x, |
100 float y, | 104 float y, |
| 105 float global_x, |
| 106 float global_y, |
101 float dX, | 107 float dX, |
102 float dY, | 108 float dY, |
103 int modifiers, | 109 int modifiers, |
104 bool high_precision) { | 110 bool high_precision) { |
105 queue_->QueueEvent(MouseWheelEventWithLatencyInfo( | 111 queue_->QueueEvent(MouseWheelEventWithLatencyInfo( |
106 SyntheticWebMouseWheelEventBuilder::Build(x, y, dX, dY, modifiers, | 112 SyntheticWebMouseWheelEventBuilder::Build( |
107 high_precision))); | 113 x, y, global_x, global_y, dX, dY, modifiers, high_precision))); |
108 } | 114 } |
109 | 115 |
110 void SendGestureEvent(WebInputEvent::Type type) { | 116 void SendGestureEvent(WebInputEvent::Type type) { |
111 WebGestureEvent event; | 117 WebGestureEvent event; |
112 event.type = type; | 118 event.type = type; |
113 event.sourceDevice = blink::WebGestureDeviceTouchscreen; | 119 event.sourceDevice = blink::WebGestureDeviceTouchscreen; |
114 queue_->OnGestureScrollEvent( | 120 queue_->OnGestureScrollEvent( |
115 GestureEventWithLatencyInfo(event, ui::LatencyInfo())); | 121 GestureEventWithLatencyInfo(event, ui::LatencyInfo())); |
116 } | 122 } |
117 | 123 |
118 static void RunTasksAndWait(base::TimeDelta delay) { | 124 static void RunTasksAndWait(base::TimeDelta delay) { |
119 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | 125 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
120 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(), delay); | 126 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(), delay); |
121 base::MessageLoop::current()->Run(); | 127 base::MessageLoop::current()->Run(); |
122 } | 128 } |
123 | 129 |
124 void GestureSendingTest(bool high_precision) { | 130 void GestureSendingTest(bool high_precision) { |
125 const WebGestureEvent::ScrollUnits scroll_units = | 131 const WebGestureEvent::ScrollUnits scroll_units = |
126 high_precision ? WebGestureEvent::PrecisePixels | 132 high_precision ? WebGestureEvent::PrecisePixels |
127 : WebGestureEvent::Pixels; | 133 : WebGestureEvent::Pixels; |
128 SendMouseWheel(10, 10, 1, 1, 0, high_precision); | 134 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, |
| 135 kWheelScrollGlobalY, 1, 1, 0, high_precision); |
129 EXPECT_EQ(0U, queued_event_count()); | 136 EXPECT_EQ(0U, queued_event_count()); |
130 EXPECT_TRUE(event_in_flight()); | 137 EXPECT_TRUE(event_in_flight()); |
131 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 138 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
132 | 139 |
133 // The second mouse wheel should not be sent since one is already in queue. | 140 // The second mouse wheel should not be sent since one is already in queue. |
134 SendMouseWheel(10, 10, 5, 5, 0, high_precision); | 141 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, |
| 142 kWheelScrollGlobalY, 5, 5, 0, high_precision); |
135 EXPECT_EQ(1U, queued_event_count()); | 143 EXPECT_EQ(1U, queued_event_count()); |
136 EXPECT_TRUE(event_in_flight()); | 144 EXPECT_TRUE(event_in_flight()); |
137 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 145 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
138 | 146 |
139 // Receive an ACK for the mouse wheel event and release the next | 147 // Receive an ACK for the mouse wheel event and release the next |
140 // mouse wheel event. | 148 // mouse wheel event. |
141 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 149 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
142 EXPECT_EQ(0U, queued_event_count()); | 150 EXPECT_EQ(0U, queued_event_count()); |
143 EXPECT_TRUE(event_in_flight()); | 151 EXPECT_TRUE(event_in_flight()); |
144 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); | 152 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); |
145 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 153 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
146 EXPECT_EQ(3U, all_sent_events().size()); | 154 EXPECT_EQ(3U, all_sent_events().size()); |
147 EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type); | 155 EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type); |
148 EXPECT_EQ(scroll_units, | 156 EXPECT_EQ(scroll_units, |
149 sent_gesture_events()[0].data.scrollBegin.deltaHintUnits); | 157 sent_gesture_events()[0].data.scrollBegin.deltaHintUnits); |
| 158 EXPECT_EQ(kWheelScrollX, sent_gesture_events()[0].x); |
| 159 EXPECT_EQ(kWheelScrollY, sent_gesture_events()[0].y); |
| 160 EXPECT_EQ(kWheelScrollGlobalX, sent_gesture_events()[0].globalX); |
| 161 EXPECT_EQ(kWheelScrollGlobalY, sent_gesture_events()[0].globalY); |
150 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type); | 162 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type); |
151 EXPECT_EQ(scroll_units, | 163 EXPECT_EQ(scroll_units, |
152 sent_gesture_events()[1].data.scrollUpdate.deltaUnits); | 164 sent_gesture_events()[1].data.scrollUpdate.deltaUnits); |
| 165 EXPECT_EQ(kWheelScrollX, sent_gesture_events()[1].x); |
| 166 EXPECT_EQ(kWheelScrollY, sent_gesture_events()[1].y); |
| 167 EXPECT_EQ(kWheelScrollGlobalX, sent_gesture_events()[1].globalX); |
| 168 EXPECT_EQ(kWheelScrollGlobalY, sent_gesture_events()[1].globalY); |
153 EXPECT_EQ(WebInputEvent::MouseWheel, all_sent_events()[2].type); | 169 EXPECT_EQ(WebInputEvent::MouseWheel, all_sent_events()[2].type); |
154 EXPECT_EQ(3U, GetAndResetSentEventCount()); | 170 EXPECT_EQ(3U, GetAndResetSentEventCount()); |
155 | 171 |
156 RunTasksAndWait(DefaultScrollEndTimeoutDelay() * 2); | 172 RunTasksAndWait(DefaultScrollEndTimeoutDelay() * 2); |
157 EXPECT_EQ(1U, all_sent_events().size()); | 173 EXPECT_EQ(1U, all_sent_events().size()); |
158 EXPECT_EQ(WebInputEvent::GestureScrollEnd, all_sent_events()[0].type); | 174 EXPECT_EQ(WebInputEvent::GestureScrollEnd, all_sent_events()[0].type); |
159 EXPECT_EQ(scroll_units, sent_gesture_events()[0].data.scrollEnd.deltaUnits); | 175 EXPECT_EQ(scroll_units, sent_gesture_events()[0].data.scrollEnd.deltaUnits); |
| 176 EXPECT_EQ(kWheelScrollX, sent_gesture_events()[0].x); |
| 177 EXPECT_EQ(kWheelScrollY, sent_gesture_events()[0].y); |
| 178 EXPECT_EQ(kWheelScrollGlobalX, sent_gesture_events()[0].globalX); |
| 179 EXPECT_EQ(kWheelScrollGlobalY, sent_gesture_events()[0].globalY); |
160 } | 180 } |
161 | 181 |
162 scoped_ptr<MouseWheelEventQueue> queue_; | 182 scoped_ptr<MouseWheelEventQueue> queue_; |
163 std::vector<WebInputEvent> sent_events_; | 183 std::vector<WebInputEvent> sent_events_; |
164 std::vector<WebGestureEvent> sent_gesture_events_; | 184 std::vector<WebGestureEvent> sent_gesture_events_; |
165 size_t acked_event_count_; | 185 size_t acked_event_count_; |
166 InputEventAckState last_acked_event_state_; | 186 InputEventAckState last_acked_event_state_; |
167 base::MessageLoopForUI message_loop_; | 187 base::MessageLoopForUI message_loop_; |
168 WebMouseWheelEvent last_acked_event_; | 188 WebMouseWheelEvent last_acked_event_; |
169 }; | 189 }; |
170 | 190 |
171 // Tests that mouse wheel events are queued properly. | 191 // Tests that mouse wheel events are queued properly. |
172 TEST_F(MouseWheelEventQueueTest, Basic) { | 192 TEST_F(MouseWheelEventQueueTest, Basic) { |
173 SendMouseWheel(10, 10, 1, 1, 0, false); | 193 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, |
| 194 kWheelScrollGlobalY, 1, 1, 0, false); |
174 EXPECT_EQ(0U, queued_event_count()); | 195 EXPECT_EQ(0U, queued_event_count()); |
175 EXPECT_TRUE(event_in_flight()); | 196 EXPECT_TRUE(event_in_flight()); |
176 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 197 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
177 | 198 |
178 // The second mouse wheel should not be sent since one is already in queue. | 199 // The second mouse wheel should not be sent since one is already in queue. |
179 SendMouseWheel(10, 10, 5, 5, 0, false); | 200 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, |
| 201 kWheelScrollGlobalY, 5, 5, 0, false); |
180 EXPECT_EQ(1U, queued_event_count()); | 202 EXPECT_EQ(1U, queued_event_count()); |
181 EXPECT_TRUE(event_in_flight()); | 203 EXPECT_TRUE(event_in_flight()); |
182 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 204 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
183 | 205 |
184 // Receive an ACK for the first mouse wheel event. | 206 // Receive an ACK for the first mouse wheel event. |
185 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); | 207 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); |
186 EXPECT_EQ(0U, queued_event_count()); | 208 EXPECT_EQ(0U, queued_event_count()); |
187 EXPECT_TRUE(event_in_flight()); | 209 EXPECT_TRUE(event_in_flight()); |
188 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 210 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
189 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 211 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
(...skipping 13 matching lines...) Expand all Loading... |
203 GestureSendingTest(false); | 225 GestureSendingTest(false); |
204 } | 226 } |
205 | 227 |
206 TEST_F(MouseWheelEventQueueTest, GestureSendingPrecisePixels) { | 228 TEST_F(MouseWheelEventQueueTest, GestureSendingPrecisePixels) { |
207 SetUpForGestureTesting(true); | 229 SetUpForGestureTesting(true); |
208 GestureSendingTest(false); | 230 GestureSendingTest(false); |
209 } | 231 } |
210 | 232 |
211 TEST_F(MouseWheelEventQueueTest, GestureSendingInterrupted) { | 233 TEST_F(MouseWheelEventQueueTest, GestureSendingInterrupted) { |
212 SetUpForGestureTesting(true); | 234 SetUpForGestureTesting(true); |
213 SendMouseWheel(10, 10, 1, 1, 0, false); | 235 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, |
| 236 kWheelScrollGlobalY, 1, 1, 0, false); |
214 EXPECT_EQ(0U, queued_event_count()); | 237 EXPECT_EQ(0U, queued_event_count()); |
215 EXPECT_TRUE(event_in_flight()); | 238 EXPECT_TRUE(event_in_flight()); |
216 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 239 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
217 | 240 |
218 // Receive an ACK for the mouse wheel event. | 241 // Receive an ACK for the mouse wheel event. |
219 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 242 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
220 EXPECT_EQ(0U, queued_event_count()); | 243 EXPECT_EQ(0U, queued_event_count()); |
221 EXPECT_FALSE(event_in_flight()); | 244 EXPECT_FALSE(event_in_flight()); |
222 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); | 245 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); |
223 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 246 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
224 EXPECT_EQ(2U, all_sent_events().size()); | 247 EXPECT_EQ(2U, all_sent_events().size()); |
225 EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type); | 248 EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type); |
226 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type); | 249 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type); |
227 EXPECT_EQ(2U, GetAndResetSentEventCount()); | 250 EXPECT_EQ(2U, GetAndResetSentEventCount()); |
228 | 251 |
229 // Ensure that a gesture scroll begin terminates the current scroll event. | 252 // Ensure that a gesture scroll begin terminates the current scroll event. |
230 SendGestureEvent(WebInputEvent::GestureScrollBegin); | 253 SendGestureEvent(WebInputEvent::GestureScrollBegin); |
231 EXPECT_EQ(1U, all_sent_events().size()); | 254 EXPECT_EQ(1U, all_sent_events().size()); |
232 EXPECT_EQ(WebInputEvent::GestureScrollEnd, all_sent_events()[0].type); | 255 EXPECT_EQ(WebInputEvent::GestureScrollEnd, all_sent_events()[0].type); |
233 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 256 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
234 | 257 |
235 SendMouseWheel(10, 10, 1, 1, 0, false); | 258 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, |
| 259 kWheelScrollGlobalY, 1, 1, 0, false); |
236 EXPECT_EQ(0U, queued_event_count()); | 260 EXPECT_EQ(0U, queued_event_count()); |
237 EXPECT_TRUE(event_in_flight()); | 261 EXPECT_TRUE(event_in_flight()); |
238 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 262 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
239 | 263 |
240 // New mouse wheel events won't cause gestures because a scroll | 264 // New mouse wheel events won't cause gestures because a scroll |
241 // is already in progress by another device. | 265 // is already in progress by another device. |
242 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 266 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
243 EXPECT_EQ(0U, queued_event_count()); | 267 EXPECT_EQ(0U, queued_event_count()); |
244 EXPECT_FALSE(event_in_flight()); | 268 EXPECT_FALSE(event_in_flight()); |
245 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); | 269 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); |
246 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 270 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
247 EXPECT_EQ(0U, all_sent_events().size()); | 271 EXPECT_EQ(0U, all_sent_events().size()); |
248 | 272 |
249 SendGestureEvent(WebInputEvent::GestureScrollEnd); | 273 SendGestureEvent(WebInputEvent::GestureScrollEnd); |
250 EXPECT_EQ(0U, all_sent_events().size()); | 274 EXPECT_EQ(0U, all_sent_events().size()); |
251 | 275 |
252 SendMouseWheel(10, 10, 1, 1, 0, false); | 276 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, |
| 277 kWheelScrollGlobalY, 1, 1, 0, false); |
253 EXPECT_EQ(0U, queued_event_count()); | 278 EXPECT_EQ(0U, queued_event_count()); |
254 EXPECT_TRUE(event_in_flight()); | 279 EXPECT_TRUE(event_in_flight()); |
255 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 280 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
256 | 281 |
257 // Receive an ACK for the mouse wheel event. | 282 // Receive an ACK for the mouse wheel event. |
258 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 283 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
259 EXPECT_EQ(0U, queued_event_count()); | 284 EXPECT_EQ(0U, queued_event_count()); |
260 EXPECT_FALSE(event_in_flight()); | 285 EXPECT_FALSE(event_in_flight()); |
261 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); | 286 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); |
262 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 287 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
263 EXPECT_EQ(2U, all_sent_events().size()); | 288 EXPECT_EQ(2U, all_sent_events().size()); |
264 EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type); | 289 EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type); |
265 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type); | 290 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type); |
266 EXPECT_EQ(2U, GetAndResetSentEventCount()); | 291 EXPECT_EQ(2U, GetAndResetSentEventCount()); |
267 } | 292 } |
268 | 293 |
269 } // namespace content | 294 } // namespace content |
OLD | NEW |