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 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
236 float y, | 236 float y, |
237 float global_x, | 237 float global_x, |
238 float global_y, | 238 float global_y, |
239 float dX, | 239 float dX, |
240 float dY, | 240 float dY, |
241 int modifiers, | 241 int modifiers, |
242 bool high_precision) { | 242 bool high_precision) { |
243 SendMouseWheel(x, y, global_x, global_y, dX, dY, modifiers, high_precision, | 243 SendMouseWheel(x, y, global_x, global_y, dX, dY, modifiers, high_precision, |
244 WebInputEvent::kRailsModeFree); | 244 WebInputEvent::kRailsModeFree); |
245 } | 245 } |
| 246 void SendMouseWheelWithPhase(float x, |
| 247 float y, |
| 248 float global_x, |
| 249 float global_y, |
| 250 float dX, |
| 251 float dY, |
| 252 int modifiers, |
| 253 bool high_precision, |
| 254 blink::WebMouseWheelEvent::Phase phase, |
| 255 blink::WebMouseWheelEvent::Phase momentum_phase, |
| 256 WebInputEvent::RailsMode rails_mode) { |
| 257 WebMouseWheelEvent event = SyntheticWebMouseWheelEventBuilder::Build( |
| 258 x, y, global_x, global_y, dX, dY, modifiers, high_precision); |
| 259 event.phase = phase; |
| 260 event.momentum_phase = momentum_phase; |
| 261 event.rails_mode = rails_mode; |
| 262 queue_->QueueEvent(MouseWheelEventWithLatencyInfo(event)); |
| 263 } |
246 void SendMouseWheelWithPhase( | 264 void SendMouseWheelWithPhase( |
247 float x, | 265 float x, |
248 float y, | 266 float y, |
249 float global_x, | 267 float global_x, |
250 float global_y, | 268 float global_y, |
251 float dX, | 269 float dX, |
252 float dY, | 270 float dY, |
253 int modifiers, | 271 int modifiers, |
254 bool high_precision, | 272 bool high_precision, |
255 blink::WebMouseWheelEvent::Phase phase, | 273 blink::WebMouseWheelEvent::Phase phase, |
256 blink::WebMouseWheelEvent::Phase momentum_phase) { | 274 blink::WebMouseWheelEvent::Phase momentum_phase) { |
257 WebMouseWheelEvent event = SyntheticWebMouseWheelEventBuilder::Build( | 275 SendMouseWheelWithPhase(x, y, global_x, global_y, dX, dY, modifiers, |
258 x, y, global_x, global_y, dX, dY, modifiers, high_precision); | 276 high_precision, phase, momentum_phase, |
259 event.phase = phase; | 277 WebInputEvent::kRailsModeFree); |
260 event.momentum_phase = momentum_phase; | 278 } |
261 queue_->QueueEvent(MouseWheelEventWithLatencyInfo(event)); | 279 |
| 280 void SendMouseWheelPossiblyIncludingPhase( |
| 281 bool ignore_phase, |
| 282 float x, |
| 283 float y, |
| 284 float global_x, |
| 285 float global_y, |
| 286 float dX, |
| 287 float dY, |
| 288 int modifiers, |
| 289 bool high_precision, |
| 290 blink::WebMouseWheelEvent::Phase phase, |
| 291 blink::WebMouseWheelEvent::Phase momentum_phase, |
| 292 WebInputEvent::RailsMode rails_mode) { |
| 293 if (ignore_phase) { |
| 294 SendMouseWheel(x, y, global_x, global_y, dX, dY, modifiers, |
| 295 high_precision, rails_mode); |
| 296 } else { |
| 297 SendMouseWheelWithPhase(x, y, global_x, global_y, dX, dY, modifiers, |
| 298 high_precision, phase, momentum_phase, |
| 299 rails_mode); |
| 300 } |
| 301 } |
| 302 |
| 303 void SendMouseWheelPossiblyIncludingPhase( |
| 304 bool ignore_phase, |
| 305 float x, |
| 306 float y, |
| 307 float global_x, |
| 308 float global_y, |
| 309 float dX, |
| 310 float dY, |
| 311 int modifiers, |
| 312 bool high_precision, |
| 313 blink::WebMouseWheelEvent::Phase phase, |
| 314 blink::WebMouseWheelEvent::Phase momentum_phase) { |
| 315 SendMouseWheelPossiblyIncludingPhase( |
| 316 ignore_phase, x, y, global_x, global_y, dX, dY, modifiers, |
| 317 high_precision, phase, momentum_phase, WebInputEvent::kRailsModeFree); |
262 } | 318 } |
263 | 319 |
264 void SendGestureEvent(WebInputEvent::Type type) { | 320 void SendGestureEvent(WebInputEvent::Type type) { |
265 WebGestureEvent event(type, WebInputEvent::kNoModifiers, | 321 WebGestureEvent event(type, WebInputEvent::kNoModifiers, |
266 ui::EventTimeStampToSeconds(ui::EventTimeForNow())); | 322 ui::EventTimeStampToSeconds(ui::EventTimeForNow())); |
267 event.source_device = blink::kWebGestureDeviceTouchscreen; | 323 event.source_device = blink::kWebGestureDeviceTouchscreen; |
268 queue_->OnGestureScrollEvent( | 324 queue_->OnGestureScrollEvent( |
269 GestureEventWithLatencyInfo(event, ui::LatencyInfo())); | 325 GestureEventWithLatencyInfo(event, ui::LatencyInfo())); |
270 } | 326 } |
271 | 327 |
272 static void RunTasksAndWait(base::TimeDelta delay) { | 328 static void RunTasksAndWait(base::TimeDelta delay) { |
273 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | 329 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
274 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(), delay); | 330 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(), delay); |
275 base::RunLoop().Run(); | 331 base::RunLoop().Run(); |
276 } | 332 } |
277 | 333 |
278 void GestureSendingTest(bool high_precision) { | 334 void GestureSendingTest(bool high_precision) { |
279 const WebGestureEvent::ScrollUnits scroll_units = | 335 const WebGestureEvent::ScrollUnits scroll_units = |
280 high_precision ? WebGestureEvent::kPrecisePixels | 336 high_precision ? WebGestureEvent::kPrecisePixels |
281 : WebGestureEvent::kPixels; | 337 : WebGestureEvent::kPixels; |
282 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, | 338 SendMouseWheelPossiblyIncludingPhase( |
283 kWheelScrollGlobalY, 1, 1, 0, high_precision); | 339 !scroll_latching_enabled_, kWheelScrollX, kWheelScrollY, |
| 340 kWheelScrollGlobalX, kWheelScrollGlobalY, 1, 1, 0, high_precision, |
| 341 WebMouseWheelEvent::kPhaseBegan, WebMouseWheelEvent::kPhaseNone); |
284 EXPECT_EQ(0U, queued_event_count()); | 342 EXPECT_EQ(0U, queued_event_count()); |
285 EXPECT_TRUE(event_in_flight()); | 343 EXPECT_TRUE(event_in_flight()); |
286 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 344 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
287 | 345 |
288 // The second mouse wheel should not be sent since one is already in | 346 // The second mouse wheel should not be sent since one is already in |
289 // queue. | 347 // queue. |
290 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, | 348 SendMouseWheelPossiblyIncludingPhase( |
291 kWheelScrollGlobalY, 5, 5, 0, high_precision); | 349 !scroll_latching_enabled_, kWheelScrollX, kWheelScrollY, |
| 350 kWheelScrollGlobalX, kWheelScrollGlobalY, 5, 5, 0, high_precision, |
| 351 WebMouseWheelEvent::kPhaseChanged, WebMouseWheelEvent::kPhaseNone); |
292 EXPECT_EQ(1U, queued_event_count()); | 352 EXPECT_EQ(1U, queued_event_count()); |
293 EXPECT_TRUE(event_in_flight()); | 353 EXPECT_TRUE(event_in_flight()); |
294 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 354 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
295 | 355 |
296 // Receive an ACK for the mouse wheel event and release the next | 356 // Receive an ACK for the mouse wheel event and release the next |
297 // mouse wheel event. | 357 // mouse wheel event. |
298 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 358 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
299 EXPECT_EQ(0U, queued_event_count()); | 359 EXPECT_EQ(0U, queued_event_count()); |
300 EXPECT_TRUE(event_in_flight()); | 360 EXPECT_TRUE(event_in_flight()); |
301 EXPECT_EQ(WebInputEvent::kMouseWheel, acked_event().GetType()); | 361 EXPECT_EQ(WebInputEvent::kMouseWheel, acked_event().GetType()); |
302 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 362 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
303 if (scroll_latching_enabled_) { | 363 if (scroll_latching_enabled_) { |
304 EXPECT_EQ(3U, all_sent_events().size()); | 364 EXPECT_EQ(3U, all_sent_events().size()); |
305 EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); | 365 EXPECT_GESTURE_SCROLL_BEGIN_WITH_PHASE(sent_gesture_event(0)); |
306 EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1)); | 366 EXPECT_GESTURE_SCROLL_UPDATE_WITH_PHASE(sent_gesture_event(1)); |
307 EXPECT_MOUSE_WHEEL(sent_input_event(2)); | 367 EXPECT_MOUSE_WHEEL(sent_input_event(2)); |
308 EXPECT_EQ(3U, GetAndResetSentEventCount()); | 368 EXPECT_EQ(3U, GetAndResetSentEventCount()); |
309 | |
310 RunTasksAndWait(DefaultScrollEndTimeoutDelay() * 2); | |
311 EXPECT_EQ(1U, all_sent_events().size()); | |
312 EXPECT_GESTURE_SCROLL_END(sent_gesture_event(0)); | |
313 } else { | 369 } else { |
314 EXPECT_EQ(4U, all_sent_events().size()); | 370 EXPECT_EQ(4U, all_sent_events().size()); |
315 EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); | 371 EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); |
316 EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1)); | 372 EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1)); |
317 EXPECT_GESTURE_SCROLL_END(sent_gesture_event(2)); | 373 EXPECT_GESTURE_SCROLL_END(sent_gesture_event(2)); |
318 EXPECT_MOUSE_WHEEL(sent_input_event(3)); | 374 EXPECT_MOUSE_WHEEL(sent_input_event(3)); |
319 EXPECT_EQ(4U, GetAndResetSentEventCount()); | 375 EXPECT_EQ(4U, GetAndResetSentEventCount()); |
320 } | 376 } |
321 } | 377 } |
322 | 378 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
355 EXPECT_GESTURE_SCROLL_UPDATE_WITH_PHASE(sent_gesture_event(0)); | 411 EXPECT_GESTURE_SCROLL_UPDATE_WITH_PHASE(sent_gesture_event(0)); |
356 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 412 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
357 } else { | 413 } else { |
358 EXPECT_EQ(3U, all_sent_events().size()); | 414 EXPECT_EQ(3U, all_sent_events().size()); |
359 EXPECT_SYNTHETIC_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); | 415 EXPECT_SYNTHETIC_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); |
360 EXPECT_GESTURE_SCROLL_UPDATE_WITH_PHASE(sent_gesture_event(1)); | 416 EXPECT_GESTURE_SCROLL_UPDATE_WITH_PHASE(sent_gesture_event(1)); |
361 EXPECT_SYNTHETIC_GESTURE_SCROLL_END(sent_gesture_event(2)); | 417 EXPECT_SYNTHETIC_GESTURE_SCROLL_END(sent_gesture_event(2)); |
362 EXPECT_EQ(3U, GetAndResetSentEventCount()); | 418 EXPECT_EQ(3U, GetAndResetSentEventCount()); |
363 } | 419 } |
364 | 420 |
365 SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, | 421 // When wheel scroll latching is enabled no wheel event with phase = |
366 kWheelScrollGlobalY, 0, 0, 0, high_precision, | 422 // |kPhaseEnded| will be sent before a wheel event with momentum_phase = |
367 WebMouseWheelEvent::kPhaseEnded, | 423 // |kPhaseBegan|. |
368 WebMouseWheelEvent::kPhaseNone); | 424 if (!scroll_latching_enabled_) { |
369 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 425 SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, |
370 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 426 kWheelScrollGlobalY, 0, 0, 0, high_precision, |
371 if (scroll_latching_enabled_) { | 427 WebMouseWheelEvent::kPhaseEnded, |
372 // ScrollEnd is not sent right away, a timer starts instead, | 428 WebMouseWheelEvent::kPhaseNone); |
373 // to see if a wheel event with momentumPhase arrives or not. | 429 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
374 EXPECT_EQ(0U, all_sent_events().size()); | 430 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
375 EXPECT_EQ(0U, GetAndResetSentEventCount()); | |
376 } else { | |
377 EXPECT_EQ(2U, all_sent_events().size()); | 431 EXPECT_EQ(2U, all_sent_events().size()); |
378 EXPECT_SYNTHETIC_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); | 432 EXPECT_SYNTHETIC_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); |
379 EXPECT_GESTURE_SCROLL_END_WITH_PHASE(sent_gesture_event(1)); | 433 EXPECT_GESTURE_SCROLL_END_WITH_PHASE(sent_gesture_event(1)); |
380 EXPECT_EQ(2U, GetAndResetSentEventCount()); | 434 EXPECT_EQ(2U, GetAndResetSentEventCount()); |
| 435 |
| 436 // Send a double phase end; OSX does it consistently. |
| 437 SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, |
| 438 kWheelScrollGlobalY, 0, 0, 0, high_precision, |
| 439 WebMouseWheelEvent::kPhaseEnded, |
| 440 WebMouseWheelEvent::kPhaseNone); |
| 441 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 442 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 443 EXPECT_EQ(0U, all_sent_events().size()); |
| 444 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
381 } | 445 } |
382 | 446 |
383 // Send a double phase end; OSX does it consistently. | |
384 SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, | |
385 kWheelScrollGlobalY, 0, 0, 0, high_precision, | |
386 WebMouseWheelEvent::kPhaseEnded, | |
387 WebMouseWheelEvent::kPhaseNone); | |
388 EXPECT_EQ(1U, GetAndResetSentEventCount()); | |
389 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
390 EXPECT_EQ(0U, all_sent_events().size()); | |
391 EXPECT_EQ(0U, GetAndResetSentEventCount()); | |
392 | |
393 SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, | 447 SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, |
394 kWheelScrollGlobalY, 5, 5, 0, high_precision, | 448 kWheelScrollGlobalY, 5, 5, 0, high_precision, |
395 WebMouseWheelEvent::kPhaseNone, | 449 WebMouseWheelEvent::kPhaseNone, |
396 WebMouseWheelEvent::kPhaseBegan); | 450 WebMouseWheelEvent::kPhaseBegan); |
397 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 451 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
398 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 452 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
399 if (scroll_latching_enabled_) { | 453 if (scroll_latching_enabled_) { |
400 // A fling has started, no ScrollEnd/ScrollBegin is sent. | 454 // A fling has started, no ScrollEnd/ScrollBegin is sent. |
401 EXPECT_EQ(1U, all_sent_events().size()); | 455 EXPECT_EQ(1U, all_sent_events().size()); |
402 EXPECT_INERTIAL_GESTURE_SCROLL_UPDATE(sent_gesture_event(0)); | 456 EXPECT_INERTIAL_GESTURE_SCROLL_UPDATE(sent_gesture_event(0)); |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
501 PhaseGestureSendingTest(false); | 555 PhaseGestureSendingTest(false); |
502 } | 556 } |
503 | 557 |
504 TEST_P(MouseWheelEventQueueTest, | 558 TEST_P(MouseWheelEventQueueTest, |
505 GestureSendingWithPhaseInformationPrecisePixels) { | 559 GestureSendingWithPhaseInformationPrecisePixels) { |
506 PhaseGestureSendingTest(true); | 560 PhaseGestureSendingTest(true); |
507 } | 561 } |
508 | 562 |
509 TEST_P(MouseWheelEventQueueTest, GestureSendingInterrupted) { | 563 TEST_P(MouseWheelEventQueueTest, GestureSendingInterrupted) { |
510 const WebGestureEvent::ScrollUnits scroll_units = WebGestureEvent::kPixels; | 564 const WebGestureEvent::ScrollUnits scroll_units = WebGestureEvent::kPixels; |
511 | 565 SendMouseWheelPossiblyIncludingPhase( |
512 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, | 566 !scroll_latching_enabled_, kWheelScrollX, kWheelScrollY, |
513 kWheelScrollGlobalY, 1, 1, 0, false); | 567 kWheelScrollGlobalX, kWheelScrollGlobalY, 1, 1, 0, false, |
| 568 WebMouseWheelEvent::kPhaseBegan, WebMouseWheelEvent::kPhaseNone); |
514 EXPECT_EQ(0U, queued_event_count()); | 569 EXPECT_EQ(0U, queued_event_count()); |
515 EXPECT_TRUE(event_in_flight()); | 570 EXPECT_TRUE(event_in_flight()); |
516 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 571 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
517 | 572 |
518 // Receive an ACK for the mouse wheel event. | 573 // Receive an ACK for the mouse wheel event. |
519 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 574 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
520 EXPECT_EQ(0U, queued_event_count()); | 575 EXPECT_EQ(0U, queued_event_count()); |
521 EXPECT_FALSE(event_in_flight()); | 576 EXPECT_FALSE(event_in_flight()); |
522 EXPECT_EQ(WebInputEvent::kMouseWheel, acked_event().GetType()); | 577 EXPECT_EQ(WebInputEvent::kMouseWheel, acked_event().GetType()); |
523 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 578 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
524 if (scroll_latching_enabled_) { | 579 if (scroll_latching_enabled_) { |
525 EXPECT_EQ(2U, all_sent_events().size()); | 580 EXPECT_EQ(2U, all_sent_events().size()); |
526 EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); | 581 EXPECT_GESTURE_SCROLL_BEGIN_WITH_PHASE(sent_gesture_event(0)); |
527 EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1)); | 582 EXPECT_GESTURE_SCROLL_UPDATE_WITH_PHASE(sent_gesture_event(1)); |
528 EXPECT_EQ(2U, GetAndResetSentEventCount()); | 583 EXPECT_EQ(2U, GetAndResetSentEventCount()); |
529 } else { | 584 } else { |
530 EXPECT_EQ(3U, all_sent_events().size()); | 585 EXPECT_EQ(3U, all_sent_events().size()); |
531 EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); | 586 EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); |
532 EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1)); | 587 EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1)); |
533 EXPECT_GESTURE_SCROLL_END(sent_gesture_event(2)); | 588 EXPECT_GESTURE_SCROLL_END(sent_gesture_event(2)); |
534 EXPECT_EQ(3U, GetAndResetSentEventCount()); | 589 EXPECT_EQ(3U, GetAndResetSentEventCount()); |
535 } | 590 } |
536 | 591 |
| 592 // When wheel scroll latching is enabled and a touch based GSB arrives in the |
| 593 // middle of wheel scrolling sequence, a synthetic wheel event with zero |
| 594 // deltas and phase = |kPhaseEnded| will be sent. |
| 595 if (scroll_latching_enabled_) { |
| 596 SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, |
| 597 kWheelScrollGlobalY, 0, 0, 0, false, |
| 598 WebMouseWheelEvent::kPhaseEnded, |
| 599 WebMouseWheelEvent::kPhaseNone); |
| 600 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 601 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 602 } |
537 // Ensure that a gesture scroll begin terminates the current scroll event. | 603 // Ensure that a gesture scroll begin terminates the current scroll event. |
538 SendGestureEvent(WebInputEvent::kGestureScrollBegin); | 604 SendGestureEvent(WebInputEvent::kGestureScrollBegin); |
| 605 |
539 if (scroll_latching_enabled_) { | 606 if (scroll_latching_enabled_) { |
540 EXPECT_EQ(1U, all_sent_events().size()); | 607 EXPECT_EQ(2U, all_sent_events().size()); |
541 EXPECT_GESTURE_SCROLL_END(sent_gesture_event(0)); | 608 EXPECT_GESTURE_SCROLL_END_WITH_PHASE(sent_gesture_event(1)); |
542 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 609 EXPECT_EQ(2U, GetAndResetSentEventCount()); |
543 } else { | 610 } else { |
544 // ScrollEnd has already been sent. | 611 // ScrollEnd has already been sent. |
545 EXPECT_EQ(0U, all_sent_events().size()); | 612 EXPECT_EQ(0U, all_sent_events().size()); |
546 } | 613 } |
547 | 614 |
548 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, | 615 SendMouseWheelPossiblyIncludingPhase( |
549 kWheelScrollGlobalY, 1, 1, 0, false); | 616 !scroll_latching_enabled_, kWheelScrollX, kWheelScrollY, |
| 617 kWheelScrollGlobalX, kWheelScrollGlobalY, 1, 1, 0, false, |
| 618 WebMouseWheelEvent::kPhaseBegan, WebMouseWheelEvent::kPhaseNone); |
| 619 |
550 EXPECT_EQ(0U, queued_event_count()); | 620 EXPECT_EQ(0U, queued_event_count()); |
551 EXPECT_TRUE(event_in_flight()); | 621 EXPECT_TRUE(event_in_flight()); |
552 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 622 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
553 | 623 |
554 // New mouse wheel events won't cause gestures because a scroll | 624 // New mouse wheel events won't cause gestures because a scroll |
555 // is already in progress by another device. | 625 // is already in progress by another device. |
556 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 626 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
557 EXPECT_EQ(0U, queued_event_count()); | 627 EXPECT_EQ(0U, queued_event_count()); |
558 EXPECT_FALSE(event_in_flight()); | 628 EXPECT_FALSE(event_in_flight()); |
559 EXPECT_EQ(WebInputEvent::kMouseWheel, acked_event().GetType()); | 629 EXPECT_EQ(WebInputEvent::kMouseWheel, acked_event().GetType()); |
560 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 630 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
561 EXPECT_EQ(0U, all_sent_events().size()); | 631 EXPECT_EQ(0U, all_sent_events().size()); |
562 | 632 |
563 SendGestureEvent(WebInputEvent::kGestureScrollEnd); | 633 SendGestureEvent(WebInputEvent::kGestureScrollEnd); |
564 EXPECT_EQ(0U, all_sent_events().size()); | 634 EXPECT_EQ(0U, all_sent_events().size()); |
565 | 635 |
566 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, | 636 SendMouseWheelPossiblyIncludingPhase( |
567 kWheelScrollGlobalY, 1, 1, 0, false); | 637 !scroll_latching_enabled_, kWheelScrollX, kWheelScrollY, |
| 638 kWheelScrollGlobalX, kWheelScrollGlobalY, 1, 1, 0, false, |
| 639 WebMouseWheelEvent::kPhaseBegan, WebMouseWheelEvent::kPhaseNone); |
| 640 |
568 EXPECT_EQ(0U, queued_event_count()); | 641 EXPECT_EQ(0U, queued_event_count()); |
569 EXPECT_TRUE(event_in_flight()); | 642 EXPECT_TRUE(event_in_flight()); |
570 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 643 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
571 | 644 |
572 // Receive an ACK for the mouse wheel event. | 645 // Receive an ACK for the mouse wheel event. |
573 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 646 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
574 EXPECT_EQ(0U, queued_event_count()); | 647 EXPECT_EQ(0U, queued_event_count()); |
575 EXPECT_FALSE(event_in_flight()); | 648 EXPECT_FALSE(event_in_flight()); |
576 EXPECT_EQ(WebInputEvent::kMouseWheel, acked_event().GetType()); | 649 EXPECT_EQ(WebInputEvent::kMouseWheel, acked_event().GetType()); |
577 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 650 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
578 if (scroll_latching_enabled_) { | 651 if (scroll_latching_enabled_) { |
579 EXPECT_EQ(2U, all_sent_events().size()); | 652 EXPECT_EQ(2U, all_sent_events().size()); |
580 EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); | 653 EXPECT_GESTURE_SCROLL_BEGIN_WITH_PHASE(sent_gesture_event(0)); |
581 EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1)); | 654 EXPECT_GESTURE_SCROLL_UPDATE_WITH_PHASE(sent_gesture_event(1)); |
582 EXPECT_EQ(2U, GetAndResetSentEventCount()); | 655 EXPECT_EQ(2U, GetAndResetSentEventCount()); |
583 } else { | 656 } else { |
584 EXPECT_EQ(3U, all_sent_events().size()); | 657 EXPECT_EQ(3U, all_sent_events().size()); |
585 EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); | 658 EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); |
586 EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1)); | 659 EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1)); |
587 EXPECT_GESTURE_SCROLL_END(sent_gesture_event(2)); | 660 EXPECT_GESTURE_SCROLL_END(sent_gesture_event(2)); |
588 EXPECT_EQ(3U, GetAndResetSentEventCount()); | 661 EXPECT_EQ(3U, GetAndResetSentEventCount()); |
589 } | 662 } |
590 } | 663 } |
591 | 664 |
592 TEST_P(MouseWheelEventQueueTest, GestureRailScrolling) { | 665 TEST_P(MouseWheelEventQueueTest, GestureRailScrolling) { |
593 const WebGestureEvent::ScrollUnits scroll_units = WebGestureEvent::kPixels; | 666 const WebGestureEvent::ScrollUnits scroll_units = WebGestureEvent::kPixels; |
594 | 667 |
595 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, | 668 SendMouseWheelPossiblyIncludingPhase( |
596 kWheelScrollGlobalY, 1, 1, 0, false, | 669 !scroll_latching_enabled_, kWheelScrollX, kWheelScrollY, |
597 WebInputEvent::kRailsModeHorizontal); | 670 kWheelScrollGlobalX, kWheelScrollGlobalY, 1, 1, 0, false, |
| 671 WebMouseWheelEvent::kPhaseBegan, WebMouseWheelEvent::kPhaseNone, |
| 672 WebInputEvent::kRailsModeHorizontal); |
598 EXPECT_EQ(0U, queued_event_count()); | 673 EXPECT_EQ(0U, queued_event_count()); |
599 EXPECT_TRUE(event_in_flight()); | 674 EXPECT_TRUE(event_in_flight()); |
600 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 675 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
601 | 676 |
602 // Receive an ACK for the mouse wheel event. | 677 // Receive an ACK for the mouse wheel event. |
603 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 678 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
604 EXPECT_EQ(0U, queued_event_count()); | 679 EXPECT_EQ(0U, queued_event_count()); |
605 EXPECT_FALSE(event_in_flight()); | 680 EXPECT_FALSE(event_in_flight()); |
606 EXPECT_EQ(WebInputEvent::kMouseWheel, acked_event().GetType()); | 681 EXPECT_EQ(WebInputEvent::kMouseWheel, acked_event().GetType()); |
607 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 682 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
608 if (scroll_latching_enabled_) { | 683 if (scroll_latching_enabled_) { |
609 EXPECT_EQ(2U, all_sent_events().size()); | 684 EXPECT_EQ(2U, all_sent_events().size()); |
610 EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); | 685 EXPECT_GESTURE_SCROLL_BEGIN_WITH_PHASE(sent_gesture_event(0)); |
611 EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1)); | 686 EXPECT_GESTURE_SCROLL_UPDATE_WITH_PHASE(sent_gesture_event(1)); |
612 EXPECT_EQ(1U, sent_gesture_event(1)->data.scroll_update.delta_x); | 687 EXPECT_EQ(1U, sent_gesture_event(1)->data.scroll_update.delta_x); |
613 EXPECT_EQ(0U, sent_gesture_event(1)->data.scroll_update.delta_y); | 688 EXPECT_EQ(0U, sent_gesture_event(1)->data.scroll_update.delta_y); |
614 EXPECT_EQ(2U, GetAndResetSentEventCount()); | 689 EXPECT_EQ(2U, GetAndResetSentEventCount()); |
615 RunTasksAndWait(DefaultScrollEndTimeoutDelay() * 2); | |
616 EXPECT_EQ(1U, all_sent_events().size()); | |
617 EXPECT_GESTURE_SCROLL_END(sent_gesture_event(0)); | |
618 EXPECT_EQ(1U, GetAndResetSentEventCount()); | |
619 } else { | 690 } else { |
620 EXPECT_EQ(3U, all_sent_events().size()); | 691 EXPECT_EQ(3U, all_sent_events().size()); |
621 EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); | 692 EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); |
622 EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1)); | 693 EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1)); |
623 EXPECT_GESTURE_SCROLL_END(sent_gesture_event(2)); | 694 EXPECT_GESTURE_SCROLL_END(sent_gesture_event(2)); |
624 EXPECT_EQ(1U, sent_gesture_event(1)->data.scroll_update.delta_x); | 695 EXPECT_EQ(1U, sent_gesture_event(1)->data.scroll_update.delta_x); |
625 EXPECT_EQ(0U, sent_gesture_event(1)->data.scroll_update.delta_y); | 696 EXPECT_EQ(0U, sent_gesture_event(1)->data.scroll_update.delta_y); |
626 EXPECT_EQ(3U, GetAndResetSentEventCount()); | 697 EXPECT_EQ(3U, GetAndResetSentEventCount()); |
627 } | 698 } |
| 699 SendMouseWheelPossiblyIncludingPhase( |
| 700 !scroll_latching_enabled_, kWheelScrollX, kWheelScrollY, |
| 701 kWheelScrollGlobalX, kWheelScrollGlobalY, 1, 1, 0, false, |
| 702 WebMouseWheelEvent::kPhaseChanged, WebMouseWheelEvent::kPhaseNone, |
| 703 WebInputEvent::kRailsModeVertical); |
628 | 704 |
629 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, | |
630 kWheelScrollGlobalY, 1, 1, 0, false, | |
631 WebInputEvent::kRailsModeVertical); | |
632 EXPECT_EQ(0U, queued_event_count()); | 705 EXPECT_EQ(0U, queued_event_count()); |
633 EXPECT_TRUE(event_in_flight()); | 706 EXPECT_TRUE(event_in_flight()); |
634 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 707 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
635 | 708 |
636 // Receive an ACK for the mouse wheel event. | 709 // Receive an ACK for the mouse wheel event. |
637 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 710 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
638 EXPECT_EQ(0U, queued_event_count()); | 711 EXPECT_EQ(0U, queued_event_count()); |
639 EXPECT_FALSE(event_in_flight()); | 712 EXPECT_FALSE(event_in_flight()); |
640 EXPECT_EQ(WebInputEvent::kMouseWheel, acked_event().GetType()); | 713 EXPECT_EQ(WebInputEvent::kMouseWheel, acked_event().GetType()); |
641 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 714 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 715 size_t scroll_update_index = 0; |
642 if (scroll_latching_enabled_) { | 716 if (scroll_latching_enabled_) { |
643 EXPECT_EQ(2U, all_sent_events().size()); | 717 EXPECT_EQ(1U, all_sent_events().size()); |
644 EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); | 718 EXPECT_GESTURE_SCROLL_UPDATE_WITH_PHASE(sent_gesture_event(0)); |
645 EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1)); | |
646 } else { | 719 } else { |
647 EXPECT_EQ(3U, all_sent_events().size()); | 720 EXPECT_EQ(3U, all_sent_events().size()); |
648 EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); | 721 EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); |
649 EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1)); | 722 EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1)); |
650 EXPECT_GESTURE_SCROLL_END(sent_gesture_event(2)); | 723 EXPECT_GESTURE_SCROLL_END(sent_gesture_event(2)); |
| 724 scroll_update_index = 1; |
651 } | 725 } |
652 EXPECT_EQ(0U, sent_gesture_event(1)->data.scroll_update.delta_x); | 726 EXPECT_EQ( |
653 EXPECT_EQ(1U, sent_gesture_event(1)->data.scroll_update.delta_y); | 727 0U, sent_gesture_event(scroll_update_index)->data.scroll_update.delta_x); |
| 728 EXPECT_EQ( |
| 729 1U, sent_gesture_event(scroll_update_index)->data.scroll_update.delta_y); |
654 if (scroll_latching_enabled_) | 730 if (scroll_latching_enabled_) |
655 EXPECT_EQ(2U, GetAndResetSentEventCount()); | 731 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
656 else | 732 else |
657 EXPECT_EQ(3U, GetAndResetSentEventCount()); | 733 EXPECT_EQ(3U, GetAndResetSentEventCount()); |
658 } | 734 } |
659 | 735 |
660 TEST_P(MouseWheelEventQueueTest, WheelScrollLatching) { | 736 TEST_P(MouseWheelEventQueueTest, WheelScrollLatching) { |
661 if (!scroll_latching_enabled_) | 737 if (!scroll_latching_enabled_) |
662 return; | 738 return; |
663 | 739 |
664 const WebGestureEvent::ScrollUnits scroll_units = WebGestureEvent::kPixels; | 740 const WebGestureEvent::ScrollUnits scroll_units = WebGestureEvent::kPixels; |
665 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, | 741 SendMouseWheelWithPhase( |
666 kWheelScrollGlobalY, 1, 1, 0, false, | 742 kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, kWheelScrollGlobalY, 1, |
667 WebInputEvent::kRailsModeVertical); | 743 1, 0, false, WebMouseWheelEvent::kPhaseBegan, |
| 744 WebMouseWheelEvent::kPhaseNone, WebInputEvent::kRailsModeVertical); |
668 EXPECT_EQ(0U, queued_event_count()); | 745 EXPECT_EQ(0U, queued_event_count()); |
669 EXPECT_TRUE(event_in_flight()); | 746 EXPECT_TRUE(event_in_flight()); |
670 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 747 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
671 | 748 |
672 // Receive an ACK for the mouse wheel event. | 749 // Receive an ACK for the mouse wheel event. |
673 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 750 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
674 EXPECT_EQ(0U, queued_event_count()); | 751 EXPECT_EQ(0U, queued_event_count()); |
675 EXPECT_FALSE(event_in_flight()); | 752 EXPECT_FALSE(event_in_flight()); |
676 EXPECT_EQ(WebInputEvent::kMouseWheel, acked_event().GetType()); | 753 EXPECT_EQ(WebInputEvent::kMouseWheel, acked_event().GetType()); |
677 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 754 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
678 EXPECT_EQ(2U, all_sent_events().size()); | 755 EXPECT_EQ(2U, all_sent_events().size()); |
679 EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0)); | 756 EXPECT_GESTURE_SCROLL_BEGIN_WITH_PHASE(sent_gesture_event(0)); |
680 EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1)); | 757 EXPECT_GESTURE_SCROLL_UPDATE_WITH_PHASE(sent_gesture_event(1)); |
681 EXPECT_EQ(0U, sent_gesture_event(1)->data.scroll_update.delta_x); | 758 EXPECT_EQ(0U, sent_gesture_event(1)->data.scroll_update.delta_x); |
682 EXPECT_EQ(1U, sent_gesture_event(1)->data.scroll_update.delta_y); | 759 EXPECT_EQ(1U, sent_gesture_event(1)->data.scroll_update.delta_y); |
683 EXPECT_EQ(2U, GetAndResetSentEventCount()); | 760 EXPECT_EQ(2U, GetAndResetSentEventCount()); |
684 | 761 |
685 RunTasksAndWait(DefaultScrollEndTimeoutDelay() / 2); | 762 SendMouseWheelWithPhase( |
686 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 763 kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, kWheelScrollGlobalY, 1, |
687 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, | 764 1, 0, false, WebMouseWheelEvent::kPhaseChanged, |
688 kWheelScrollGlobalY, 1, 1, 0, false, | 765 WebMouseWheelEvent::kPhaseNone, WebInputEvent::kRailsModeVertical); |
689 WebInputEvent::kRailsModeVertical); | |
690 EXPECT_EQ(0U, queued_event_count()); | 766 EXPECT_EQ(0U, queued_event_count()); |
691 EXPECT_TRUE(event_in_flight()); | 767 EXPECT_TRUE(event_in_flight()); |
692 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 768 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
693 | 769 |
694 // Receive an ACK for the mouse wheel event. | 770 // Receive an ACK for the mouse wheel event. |
695 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 771 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
696 EXPECT_EQ(0U, queued_event_count()); | 772 EXPECT_EQ(0U, queued_event_count()); |
697 EXPECT_FALSE(event_in_flight()); | 773 EXPECT_FALSE(event_in_flight()); |
698 EXPECT_EQ(WebInputEvent::kMouseWheel, acked_event().GetType()); | 774 EXPECT_EQ(WebInputEvent::kMouseWheel, acked_event().GetType()); |
699 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 775 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
700 | 776 |
701 // Scroll latching: no new scroll begin expected. | 777 // Scroll latching: no new scroll begin expected. |
702 EXPECT_EQ(1U, all_sent_events().size()); | 778 EXPECT_EQ(1U, all_sent_events().size()); |
703 EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(0)); | 779 EXPECT_GESTURE_SCROLL_UPDATE_WITH_PHASE(sent_gesture_event(0)); |
704 EXPECT_EQ(0U, sent_gesture_event(0)->data.scroll_update.delta_x); | 780 EXPECT_EQ(0U, sent_gesture_event(0)->data.scroll_update.delta_x); |
705 EXPECT_EQ(1U, sent_gesture_event(0)->data.scroll_update.delta_y); | 781 EXPECT_EQ(1U, sent_gesture_event(0)->data.scroll_update.delta_y); |
706 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 782 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
707 } | 783 } |
708 | 784 |
709 INSTANTIATE_TEST_CASE_P(MouseWheelEventQueueTests, | 785 INSTANTIATE_TEST_CASE_P(MouseWheelEventQueueTests, |
710 MouseWheelEventQueueTest, | 786 MouseWheelEventQueueTest, |
711 testing::Bool()); | 787 testing::Bool()); |
712 | 788 |
713 } // namespace content | 789 } // namespace content |
OLD | NEW |