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" |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
106 float global_y, | 106 float global_y, |
107 float dX, | 107 float dX, |
108 float dY, | 108 float dY, |
109 int modifiers, | 109 int modifiers, |
110 bool high_precision) { | 110 bool high_precision) { |
111 queue_->QueueEvent(MouseWheelEventWithLatencyInfo( | 111 queue_->QueueEvent(MouseWheelEventWithLatencyInfo( |
112 SyntheticWebMouseWheelEventBuilder::Build( | 112 SyntheticWebMouseWheelEventBuilder::Build( |
113 x, y, global_x, global_y, dX, dY, modifiers, high_precision))); | 113 x, y, global_x, global_y, dX, dY, modifiers, high_precision))); |
114 } | 114 } |
115 | 115 |
116 void SendMouseWheelWithPhase( | |
117 float x, | |
118 float y, | |
119 float global_x, | |
120 float global_y, | |
121 float dX, | |
122 float dY, | |
123 int modifiers, | |
124 bool high_precision, | |
125 blink::WebMouseWheelEvent::Phase phase, | |
126 blink::WebMouseWheelEvent::Phase momentum_phase) { | |
127 WebMouseWheelEvent event = SyntheticWebMouseWheelEventBuilder::Build( | |
128 x, y, global_x, global_y, dX, dY, modifiers, high_precision); | |
129 event.phase = phase; | |
130 event.momentumPhase = momentum_phase; | |
131 queue_->QueueEvent(MouseWheelEventWithLatencyInfo(event)); | |
132 } | |
133 | |
116 void SendGestureEvent(WebInputEvent::Type type) { | 134 void SendGestureEvent(WebInputEvent::Type type) { |
117 WebGestureEvent event; | 135 WebGestureEvent event; |
118 event.type = type; | 136 event.type = type; |
119 event.sourceDevice = blink::WebGestureDeviceTouchscreen; | 137 event.sourceDevice = blink::WebGestureDeviceTouchscreen; |
120 queue_->OnGestureScrollEvent( | 138 queue_->OnGestureScrollEvent( |
121 GestureEventWithLatencyInfo(event, ui::LatencyInfo())); | 139 GestureEventWithLatencyInfo(event, ui::LatencyInfo())); |
122 } | 140 } |
123 | 141 |
124 static void RunTasksAndWait(base::TimeDelta delay) { | 142 static void RunTasksAndWait(base::TimeDelta delay) { |
125 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | 143 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
172 RunTasksAndWait(DefaultScrollEndTimeoutDelay() * 2); | 190 RunTasksAndWait(DefaultScrollEndTimeoutDelay() * 2); |
173 EXPECT_EQ(1U, all_sent_events().size()); | 191 EXPECT_EQ(1U, all_sent_events().size()); |
174 EXPECT_EQ(WebInputEvent::GestureScrollEnd, all_sent_events()[0].type); | 192 EXPECT_EQ(WebInputEvent::GestureScrollEnd, all_sent_events()[0].type); |
175 EXPECT_EQ(scroll_units, sent_gesture_events()[0].data.scrollEnd.deltaUnits); | 193 EXPECT_EQ(scroll_units, sent_gesture_events()[0].data.scrollEnd.deltaUnits); |
176 EXPECT_EQ(kWheelScrollX, sent_gesture_events()[0].x); | 194 EXPECT_EQ(kWheelScrollX, sent_gesture_events()[0].x); |
177 EXPECT_EQ(kWheelScrollY, sent_gesture_events()[0].y); | 195 EXPECT_EQ(kWheelScrollY, sent_gesture_events()[0].y); |
178 EXPECT_EQ(kWheelScrollGlobalX, sent_gesture_events()[0].globalX); | 196 EXPECT_EQ(kWheelScrollGlobalX, sent_gesture_events()[0].globalX); |
179 EXPECT_EQ(kWheelScrollGlobalY, sent_gesture_events()[0].globalY); | 197 EXPECT_EQ(kWheelScrollGlobalY, sent_gesture_events()[0].globalY); |
180 } | 198 } |
181 | 199 |
200 const uint32_t HAS_SCROLL_UPDATE = 1; | |
201 const uint32_t HAS_MOUSEWHEEL = 1 << 1; | |
202 const uint32_t HAS_SYNTHETIC_BEGIN = 1 << 2; | |
203 const uint32_t HAS_SYNTHETIC_END = 1 << 3; | |
204 const uint32_t HAS_INERTIAL = 1 << 4; | |
205 | |
206 void ValidatePhaseSequence(bool high_precision, | |
207 size_t expect_queue_count, | |
208 uint32_t flags) { | |
209 const WebGestureEvent::ScrollUnits scroll_units = | |
210 high_precision ? WebGestureEvent::PrecisePixels | |
211 : WebGestureEvent::Pixels; | |
212 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
213 EXPECT_EQ(expect_queue_count, queued_event_count()); | |
214 EXPECT_EQ((flags & HAS_MOUSEWHEEL) != 0, event_in_flight()); | |
215 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); | |
216 | |
217 size_t expect_event_count = 2; | |
218 if (flags & HAS_SCROLL_UPDATE) | |
219 ++expect_event_count; | |
220 if (flags & HAS_MOUSEWHEEL) | |
221 ++expect_event_count; | |
222 | |
223 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | |
224 EXPECT_EQ(expect_event_count, all_sent_events().size()); | |
225 EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type); | |
226 EXPECT_EQ(scroll_units, | |
227 sent_gesture_events()[0].data.scrollBegin.deltaHintUnits); | |
228 EXPECT_EQ(kWheelScrollX, sent_gesture_events()[0].x); | |
229 EXPECT_EQ(kWheelScrollY, sent_gesture_events()[0].y); | |
230 EXPECT_EQ(kWheelScrollGlobalX, sent_gesture_events()[0].globalX); | |
231 EXPECT_EQ(kWheelScrollGlobalY, sent_gesture_events()[0].globalY); | |
232 EXPECT_EQ((flags & HAS_INERTIAL) != 0, | |
233 sent_gesture_events()[0].data.scrollBegin.inertial); | |
234 EXPECT_EQ((flags & HAS_SYNTHETIC_BEGIN) != 0, | |
235 sent_gesture_events()[0].data.scrollBegin.synthetic); | |
236 size_t index = 1; | |
237 if (flags & HAS_SCROLL_UPDATE) { | |
238 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type); | |
239 EXPECT_EQ(scroll_units, | |
240 sent_gesture_events()[1].data.scrollUpdate.deltaUnits); | |
241 EXPECT_EQ((flags & HAS_INERTIAL) != 0, | |
242 sent_gesture_events()[1].data.scrollUpdate.inertial); | |
243 EXPECT_EQ(kWheelScrollX, sent_gesture_events()[1].x); | |
244 EXPECT_EQ(kWheelScrollY, sent_gesture_events()[1].y); | |
245 EXPECT_EQ(kWheelScrollGlobalX, sent_gesture_events()[1].globalX); | |
246 EXPECT_EQ(kWheelScrollGlobalY, sent_gesture_events()[1].globalY); | |
247 ++index; | |
248 } | |
249 | |
250 EXPECT_EQ(WebInputEvent::GestureScrollEnd, all_sent_events()[index].type); | |
251 EXPECT_EQ(scroll_units, | |
252 sent_gesture_events()[index].data.scrollEnd.deltaUnits); | |
253 EXPECT_EQ(kWheelScrollX, sent_gesture_events()[index].x); | |
254 EXPECT_EQ(kWheelScrollY, sent_gesture_events()[index].y); | |
255 EXPECT_EQ(kWheelScrollGlobalX, sent_gesture_events()[index].globalX); | |
256 EXPECT_EQ(kWheelScrollGlobalY, sent_gesture_events()[index].globalY); | |
257 EXPECT_EQ((flags & HAS_INERTIAL) != 0, | |
258 sent_gesture_events()[index].data.scrollEnd.inertial); | |
259 EXPECT_EQ((flags & HAS_SYNTHETIC_END) != 0, | |
260 sent_gesture_events()[index].data.scrollEnd.synthetic); | |
261 ++index; | |
262 if (flags & HAS_MOUSEWHEEL) | |
263 EXPECT_EQ(WebInputEvent::MouseWheel, all_sent_events()[index].type); | |
264 EXPECT_EQ(expect_event_count, GetAndResetSentEventCount()); | |
265 } | |
266 | |
267 void PhaseGestureSendingTest(bool high_precision) { | |
268 SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, | |
269 kWheelScrollGlobalY, 1, 1, 0, high_precision, | |
270 WebMouseWheelEvent::PhaseBegan, | |
271 WebMouseWheelEvent::PhaseNone); | |
272 SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, | |
273 kWheelScrollGlobalY, 5, 5, 0, high_precision, | |
274 WebMouseWheelEvent::PhaseChanged, | |
275 WebMouseWheelEvent::PhaseNone); | |
276 SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, | |
277 kWheelScrollGlobalY, 0, 0, 0, high_precision, | |
278 WebMouseWheelEvent::PhaseEnded, | |
279 WebMouseWheelEvent::PhaseNone); | |
280 SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, | |
281 kWheelScrollGlobalY, 5, 5, 0, high_precision, | |
282 WebMouseWheelEvent::PhaseNone, | |
283 WebMouseWheelEvent::PhaseBegan); | |
284 SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, | |
285 kWheelScrollGlobalY, 5, 5, 0, high_precision, | |
286 WebMouseWheelEvent::PhaseNone, | |
287 WebMouseWheelEvent::PhaseChanged); | |
288 SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, | |
289 kWheelScrollGlobalY, 0, 0, 0, high_precision, | |
290 WebMouseWheelEvent::PhaseNone, | |
291 WebMouseWheelEvent::PhaseEnded); | |
292 | |
293 EXPECT_EQ(5U, queued_event_count()); | |
294 EXPECT_TRUE(event_in_flight()); | |
295 EXPECT_EQ(1U, GetAndResetSentEventCount()); | |
296 | |
297 // Receive an ACK for the mouse wheel event and release the next | |
298 // mouse wheel event. | |
299 ValidatePhaseSequence(high_precision, 4U, HAS_SCROLL_UPDATE | | |
300 HAS_MOUSEWHEEL | | |
301 HAS_SYNTHETIC_END); | |
tdresser
2016/03/08 14:28:53
The distance between sending the mousewheel and de
dtapuska
2016/03/08 20:31:49
I've replaced it with macros that I find much easi
| |
302 ValidatePhaseSequence(high_precision, 3U, | |
303 HAS_SCROLL_UPDATE | HAS_MOUSEWHEEL | | |
304 HAS_SYNTHETIC_BEGIN | HAS_SYNTHETIC_END); | |
305 ValidatePhaseSequence(high_precision, 2U, | |
306 HAS_SYNTHETIC_BEGIN | HAS_MOUSEWHEEL); | |
307 ValidatePhaseSequence( | |
308 high_precision, 1U, | |
309 HAS_SCROLL_UPDATE | HAS_MOUSEWHEEL | HAS_SYNTHETIC_END | HAS_INERTIAL); | |
310 ValidatePhaseSequence(high_precision, 0U, | |
311 HAS_SCROLL_UPDATE | HAS_MOUSEWHEEL | | |
312 HAS_SYNTHETIC_BEGIN | HAS_SYNTHETIC_END | | |
313 HAS_INERTIAL); | |
314 ValidatePhaseSequence(high_precision, 0U, | |
315 HAS_SYNTHETIC_BEGIN | HAS_INERTIAL); | |
316 } | |
317 | |
182 scoped_ptr<MouseWheelEventQueue> queue_; | 318 scoped_ptr<MouseWheelEventQueue> queue_; |
183 std::vector<WebInputEvent> sent_events_; | 319 std::vector<WebInputEvent> sent_events_; |
184 std::vector<WebGestureEvent> sent_gesture_events_; | 320 std::vector<WebGestureEvent> sent_gesture_events_; |
185 size_t acked_event_count_; | 321 size_t acked_event_count_; |
186 InputEventAckState last_acked_event_state_; | 322 InputEventAckState last_acked_event_state_; |
187 base::MessageLoopForUI message_loop_; | 323 base::MessageLoopForUI message_loop_; |
188 WebMouseWheelEvent last_acked_event_; | 324 WebMouseWheelEvent last_acked_event_; |
189 }; | 325 }; |
190 | 326 |
191 // Tests that mouse wheel events are queued properly. | 327 // Tests that mouse wheel events are queued properly. |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
223 TEST_F(MouseWheelEventQueueTest, GestureSending) { | 359 TEST_F(MouseWheelEventQueueTest, GestureSending) { |
224 SetUpForGestureTesting(true); | 360 SetUpForGestureTesting(true); |
225 GestureSendingTest(false); | 361 GestureSendingTest(false); |
226 } | 362 } |
227 | 363 |
228 TEST_F(MouseWheelEventQueueTest, GestureSendingPrecisePixels) { | 364 TEST_F(MouseWheelEventQueueTest, GestureSendingPrecisePixels) { |
229 SetUpForGestureTesting(true); | 365 SetUpForGestureTesting(true); |
230 GestureSendingTest(false); | 366 GestureSendingTest(false); |
231 } | 367 } |
232 | 368 |
369 TEST_F(MouseWheelEventQueueTest, GestureSendingWithPhaseInformation) { | |
tdresser
2016/03/08 14:28:53
You could use TEST_P here, but I don't think it ha
dtapuska
2016/03/08 20:31:49
For two parameters; true vs false it is much more
| |
370 SetUpForGestureTesting(true); | |
371 PhaseGestureSendingTest(false); | |
372 } | |
373 | |
374 TEST_F(MouseWheelEventQueueTest, | |
375 GestureSendingWithPhaseInformationPrecisePixels) { | |
376 SetUpForGestureTesting(true); | |
377 PhaseGestureSendingTest(true); | |
378 } | |
379 | |
233 TEST_F(MouseWheelEventQueueTest, GestureSendingInterrupted) { | 380 TEST_F(MouseWheelEventQueueTest, GestureSendingInterrupted) { |
234 SetUpForGestureTesting(true); | 381 SetUpForGestureTesting(true); |
235 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, | 382 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, |
236 kWheelScrollGlobalY, 1, 1, 0, false); | 383 kWheelScrollGlobalY, 1, 1, 0, false); |
237 EXPECT_EQ(0U, queued_event_count()); | 384 EXPECT_EQ(0U, queued_event_count()); |
238 EXPECT_TRUE(event_in_flight()); | 385 EXPECT_TRUE(event_in_flight()); |
239 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 386 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
240 | 387 |
241 // Receive an ACK for the mouse wheel event. | 388 // Receive an ACK for the mouse wheel event. |
242 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 389 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
285 EXPECT_FALSE(event_in_flight()); | 432 EXPECT_FALSE(event_in_flight()); |
286 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); | 433 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); |
287 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 434 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
288 EXPECT_EQ(2U, all_sent_events().size()); | 435 EXPECT_EQ(2U, all_sent_events().size()); |
289 EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type); | 436 EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type); |
290 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type); | 437 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type); |
291 EXPECT_EQ(2U, GetAndResetSentEventCount()); | 438 EXPECT_EQ(2U, GetAndResetSentEventCount()); |
292 } | 439 } |
293 | 440 |
294 } // namespace content | 441 } // namespace content |
OLD | NEW |