| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "base/basictypes.h" | 5 #include "base/basictypes.h" |
| 6 #include "base/logging.h" | 6 #include "base/logging.h" |
| 7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
| 9 #include "content/browser/renderer_host/input/timeout_monitor.h" | 9 #include "content/browser/renderer_host/input/timeout_monitor.h" |
| 10 #include "content/browser/renderer_host/input/touch_event_queue.h" | 10 #include "content/browser/renderer_host/input/touch_event_queue.h" |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 } // namespace | 28 } // namespace |
| 29 | 29 |
| 30 class TouchEventQueueTest : public testing::Test, | 30 class TouchEventQueueTest : public testing::Test, |
| 31 public TouchEventQueueClient { | 31 public TouchEventQueueClient { |
| 32 public: | 32 public: |
| 33 TouchEventQueueTest() | 33 TouchEventQueueTest() |
| 34 : sent_event_count_(0), | 34 : sent_event_count_(0), |
| 35 acked_event_count_(0), | 35 acked_event_count_(0), |
| 36 last_acked_event_state_(INPUT_EVENT_ACK_STATE_UNKNOWN), | 36 last_acked_event_state_(INPUT_EVENT_ACK_STATE_UNKNOWN), |
| 37 slop_length_dips_(0), | 37 slop_length_dips_(0), |
| 38 slop_includes_boundary_(true), | |
| 39 touch_scrolling_mode_(TouchEventQueue::TOUCH_SCROLLING_MODE_DEFAULT) {} | 38 touch_scrolling_mode_(TouchEventQueue::TOUCH_SCROLLING_MODE_DEFAULT) {} |
| 40 | 39 |
| 41 virtual ~TouchEventQueueTest() {} | 40 virtual ~TouchEventQueueTest() {} |
| 42 | 41 |
| 43 // testing::Test | 42 // testing::Test |
| 44 virtual void SetUp() OVERRIDE { ResetQueueWithConfig(CreateConfig()); } | 43 virtual void SetUp() OVERRIDE { ResetQueueWithConfig(CreateConfig()); } |
| 45 | 44 |
| 46 virtual void TearDown() OVERRIDE { | 45 virtual void TearDown() OVERRIDE { |
| 47 queue_.reset(); | 46 queue_.reset(); |
| 48 } | 47 } |
| (...skipping 25 matching lines...) Expand all Loading... |
| 74 GestureEventWithLatencyInfo(*followup_gesture_event, | 73 GestureEventWithLatencyInfo(*followup_gesture_event, |
| 75 ui::LatencyInfo())); | 74 ui::LatencyInfo())); |
| 76 } | 75 } |
| 77 } | 76 } |
| 78 | 77 |
| 79 protected: | 78 protected: |
| 80 TouchEventQueue::Config CreateConfig() { | 79 TouchEventQueue::Config CreateConfig() { |
| 81 TouchEventQueue::Config config; | 80 TouchEventQueue::Config config; |
| 82 config.touch_scrolling_mode = touch_scrolling_mode_; | 81 config.touch_scrolling_mode = touch_scrolling_mode_; |
| 83 config.touchmove_slop_suppression_length_dips = slop_length_dips_; | 82 config.touchmove_slop_suppression_length_dips = slop_length_dips_; |
| 84 config.touchmove_slop_suppression_region_includes_boundary = | |
| 85 slop_includes_boundary_; | |
| 86 return config; | 83 return config; |
| 87 } | 84 } |
| 88 | 85 |
| 89 void SetTouchScrollingMode(TouchEventQueue::TouchScrollingMode mode) { | 86 void SetTouchScrollingMode(TouchEventQueue::TouchScrollingMode mode) { |
| 90 touch_scrolling_mode_ = mode; | 87 touch_scrolling_mode_ = mode; |
| 91 ResetQueueWithConfig(CreateConfig()); | 88 ResetQueueWithConfig(CreateConfig()); |
| 92 } | 89 } |
| 93 | 90 |
| 94 void SetUpForTouchMoveSlopTesting(double slop_length_dips, | 91 void SetUpForTouchMoveSlopTesting(double slop_length_dips) { |
| 95 bool slop_includes_boundary) { | |
| 96 slop_length_dips_ = slop_length_dips; | 92 slop_length_dips_ = slop_length_dips; |
| 97 slop_includes_boundary_ = slop_includes_boundary; | |
| 98 ResetQueueWithConfig(CreateConfig()); | 93 ResetQueueWithConfig(CreateConfig()); |
| 99 } | 94 } |
| 100 | 95 |
| 101 void SetUpForTimeoutTesting(base::TimeDelta timeout_delay) { | 96 void SetUpForTimeoutTesting(base::TimeDelta timeout_delay) { |
| 102 TouchEventQueue::Config config = CreateConfig(); | 97 TouchEventQueue::Config config = CreateConfig(); |
| 103 config.touch_ack_timeout_delay = timeout_delay; | 98 config.touch_ack_timeout_delay = timeout_delay; |
| 104 config.touch_ack_timeout_supported = true; | 99 config.touch_ack_timeout_supported = true; |
| 105 ResetQueueWithConfig(config); | 100 ResetQueueWithConfig(config); |
| 106 } | 101 } |
| 107 | 102 |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 250 size_t sent_event_count_; | 245 size_t sent_event_count_; |
| 251 size_t acked_event_count_; | 246 size_t acked_event_count_; |
| 252 WebTouchEvent last_sent_event_; | 247 WebTouchEvent last_sent_event_; |
| 253 WebTouchEvent last_acked_event_; | 248 WebTouchEvent last_acked_event_; |
| 254 InputEventAckState last_acked_event_state_; | 249 InputEventAckState last_acked_event_state_; |
| 255 SyntheticWebTouchEvent touch_event_; | 250 SyntheticWebTouchEvent touch_event_; |
| 256 scoped_ptr<WebTouchEvent> followup_touch_event_; | 251 scoped_ptr<WebTouchEvent> followup_touch_event_; |
| 257 scoped_ptr<WebGestureEvent> followup_gesture_event_; | 252 scoped_ptr<WebGestureEvent> followup_gesture_event_; |
| 258 scoped_ptr<InputEventAckState> sync_ack_result_; | 253 scoped_ptr<InputEventAckState> sync_ack_result_; |
| 259 double slop_length_dips_; | 254 double slop_length_dips_; |
| 260 bool slop_includes_boundary_; | |
| 261 TouchEventQueue::TouchScrollingMode touch_scrolling_mode_; | 255 TouchEventQueue::TouchScrollingMode touch_scrolling_mode_; |
| 262 base::MessageLoopForUI message_loop_; | 256 base::MessageLoopForUI message_loop_; |
| 263 }; | 257 }; |
| 264 | 258 |
| 265 | 259 |
| 266 // Tests that touch-events are queued properly. | 260 // Tests that touch-events are queued properly. |
| 267 TEST_F(TouchEventQueueTest, Basic) { | 261 TEST_F(TouchEventQueueTest, Basic) { |
| 268 PressTouchPoint(1, 1); | 262 PressTouchPoint(1, 1); |
| 269 EXPECT_EQ(1U, queued_event_count()); | 263 EXPECT_EQ(1U, queued_event_count()); |
| 270 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 264 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| (...skipping 1097 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1368 PressTouchPoint(0, 1); | 1362 PressTouchPoint(0, 1); |
| 1369 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 1363 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 1370 EXPECT_EQ(0U, GetAndResetAckedEventCount()); | 1364 EXPECT_EQ(0U, GetAndResetAckedEventCount()); |
| 1371 } | 1365 } |
| 1372 | 1366 |
| 1373 // Tests that TouchMove's are dropped if within the boundary-inclusive slop | 1367 // Tests that TouchMove's are dropped if within the boundary-inclusive slop |
| 1374 // suppression region for an unconsumed TouchStart. | 1368 // suppression region for an unconsumed TouchStart. |
| 1375 TEST_F(TouchEventQueueTest, TouchMoveSuppressionIncludingSlopBoundary) { | 1369 TEST_F(TouchEventQueueTest, TouchMoveSuppressionIncludingSlopBoundary) { |
| 1376 const double kSlopLengthDips = 10.; | 1370 const double kSlopLengthDips = 10.; |
| 1377 const double kHalfSlopLengthDips = kSlopLengthDips / 2; | 1371 const double kHalfSlopLengthDips = kSlopLengthDips / 2; |
| 1378 const bool slop_includes_boundary = true; | 1372 SetUpForTouchMoveSlopTesting(kSlopLengthDips); |
| 1379 SetUpForTouchMoveSlopTesting(kSlopLengthDips, slop_includes_boundary); | |
| 1380 | 1373 |
| 1381 // Queue a TouchStart. | 1374 // Queue a TouchStart. |
| 1382 PressTouchPoint(0, 0); | 1375 PressTouchPoint(0, 0); |
| 1383 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1376 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1384 ASSERT_EQ(1U, GetAndResetSentEventCount()); | 1377 ASSERT_EQ(1U, GetAndResetSentEventCount()); |
| 1385 ASSERT_EQ(1U, GetAndResetAckedEventCount()); | 1378 ASSERT_EQ(1U, GetAndResetAckedEventCount()); |
| 1386 | 1379 |
| 1387 // TouchMove's within the region should be suppressed. | 1380 // TouchMove's within the region should be suppressed. |
| 1388 MoveTouchPoint(0, 0, kHalfSlopLengthDips); | 1381 MoveTouchPoint(0, 0, kHalfSlopLengthDips); |
| 1389 EXPECT_EQ(0U, queued_event_count()); | 1382 EXPECT_EQ(0U, queued_event_count()); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1449 EXPECT_EQ(0U, queued_event_count()); | 1442 EXPECT_EQ(0U, queued_event_count()); |
| 1450 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 1443 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 1451 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 1444 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1452 | 1445 |
| 1453 MoveTouchPoint(0, kSlopLengthDips, 0); | 1446 MoveTouchPoint(0, kSlopLengthDips, 0); |
| 1454 EXPECT_EQ(0U, queued_event_count()); | 1447 EXPECT_EQ(0U, queued_event_count()); |
| 1455 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 1448 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 1456 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 1449 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1457 } | 1450 } |
| 1458 | 1451 |
| 1459 // Tests that TouchMove's are dropped if within the boundary-exclusive slop | |
| 1460 // suppression region for an unconsumed TouchStart. | |
| 1461 TEST_F(TouchEventQueueTest, TouchMoveSuppressionExcludingSlopBoundary) { | |
| 1462 const double kSlopLengthDips = 10.; | |
| 1463 const double kHalfSlopLengthDips = kSlopLengthDips / 2; | |
| 1464 const bool slop_includes_boundary = false; | |
| 1465 SetUpForTouchMoveSlopTesting(kSlopLengthDips, slop_includes_boundary); | |
| 1466 | |
| 1467 // Queue a TouchStart. | |
| 1468 PressTouchPoint(0, 0); | |
| 1469 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
| 1470 ASSERT_EQ(1U, GetAndResetSentEventCount()); | |
| 1471 ASSERT_EQ(1U, GetAndResetAckedEventCount()); | |
| 1472 | |
| 1473 // TouchMove's within the region should be suppressed. | |
| 1474 MoveTouchPoint(0, 0, kHalfSlopLengthDips); | |
| 1475 EXPECT_EQ(0U, queued_event_count()); | |
| 1476 EXPECT_EQ(0U, GetAndResetSentEventCount()); | |
| 1477 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | |
| 1478 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, acked_event_state()); | |
| 1479 | |
| 1480 MoveTouchPoint(0, kSlopLengthDips - 0.2f, 0); | |
| 1481 EXPECT_EQ(0U, queued_event_count()); | |
| 1482 EXPECT_EQ(0U, GetAndResetSentEventCount()); | |
| 1483 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | |
| 1484 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, acked_event_state()); | |
| 1485 | |
| 1486 // As soon as a TouchMove reaches the (Euclidean) slop distance, no more | |
| 1487 // TouchMove's should be suppressed. | |
| 1488 MoveTouchPoint(0, kSlopLengthDips, 0); | |
| 1489 EXPECT_EQ(1U, queued_event_count()); | |
| 1490 EXPECT_EQ(1U, GetAndResetSentEventCount()); | |
| 1491 EXPECT_EQ(0U, GetAndResetAckedEventCount()); | |
| 1492 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
| 1493 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | |
| 1494 | |
| 1495 MoveTouchPoint(0, kHalfSlopLengthDips, 0); | |
| 1496 EXPECT_EQ(1U, queued_event_count()); | |
| 1497 EXPECT_EQ(1U, GetAndResetSentEventCount()); | |
| 1498 EXPECT_EQ(0U, GetAndResetAckedEventCount()); | |
| 1499 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
| 1500 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | |
| 1501 } | |
| 1502 | |
| 1503 // Tests that TouchMove's are not dropped within the slop suppression region if | 1452 // Tests that TouchMove's are not dropped within the slop suppression region if |
| 1504 // the touchstart was consumed. | 1453 // the touchstart was consumed. |
| 1505 TEST_F(TouchEventQueueTest, NoTouchMoveSuppressionAfterTouchConsumed) { | 1454 TEST_F(TouchEventQueueTest, NoTouchMoveSuppressionAfterTouchConsumed) { |
| 1506 const double kSlopLengthDips = 10.; | 1455 const double kSlopLengthDips = 10.; |
| 1507 const double kHalfSlopLengthDips = kSlopLengthDips / 2; | 1456 const double kHalfSlopLengthDips = kSlopLengthDips / 2; |
| 1508 const bool slop_includes_boundary = true; | 1457 SetUpForTouchMoveSlopTesting(kSlopLengthDips); |
| 1509 SetUpForTouchMoveSlopTesting(kSlopLengthDips, slop_includes_boundary); | |
| 1510 | 1458 |
| 1511 // Queue a TouchStart. | 1459 // Queue a TouchStart. |
| 1512 PressTouchPoint(0, 0); | 1460 PressTouchPoint(0, 0); |
| 1513 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); | 1461 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); |
| 1514 ASSERT_EQ(1U, GetAndResetSentEventCount()); | 1462 ASSERT_EQ(1U, GetAndResetSentEventCount()); |
| 1515 ASSERT_EQ(1U, GetAndResetAckedEventCount()); | 1463 ASSERT_EQ(1U, GetAndResetAckedEventCount()); |
| 1516 | 1464 |
| 1517 // TouchMove's within the region should not be suppressed, as a touch was | 1465 // TouchMove's within the region should not be suppressed, as a touch was |
| 1518 // consumed. | 1466 // consumed. |
| 1519 MoveTouchPoint(0, 0, kHalfSlopLengthDips); | 1467 MoveTouchPoint(0, 0, kHalfSlopLengthDips); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1536 EXPECT_EQ(1U, queued_event_count()); | 1484 EXPECT_EQ(1U, queued_event_count()); |
| 1537 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 1485 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 1538 EXPECT_EQ(0U, GetAndResetAckedEventCount()); | 1486 EXPECT_EQ(0U, GetAndResetAckedEventCount()); |
| 1539 } | 1487 } |
| 1540 | 1488 |
| 1541 // Tests that TouchMove's are not dropped due to incorrect handling of DPI | 1489 // Tests that TouchMove's are not dropped due to incorrect handling of DPI |
| 1542 // scaling. | 1490 // scaling. |
| 1543 TEST_F(TouchEventQueueTest, TouchMoveSuppressionWithDIPScaling) { | 1491 TEST_F(TouchEventQueueTest, TouchMoveSuppressionWithDIPScaling) { |
| 1544 const float kSlopLengthPixels = 7.f; | 1492 const float kSlopLengthPixels = 7.f; |
| 1545 const float kDPIScale = 3.f; | 1493 const float kDPIScale = 3.f; |
| 1546 const bool slop_includes_boundary = true; | 1494 SetUpForTouchMoveSlopTesting(kSlopLengthPixels / kDPIScale); |
| 1547 SetUpForTouchMoveSlopTesting(kSlopLengthPixels / kDPIScale, | |
| 1548 slop_includes_boundary); | |
| 1549 | 1495 |
| 1550 // Queue a TouchStart. | 1496 // Queue a TouchStart. |
| 1551 PressTouchPoint(0, 0); | 1497 PressTouchPoint(0, 0); |
| 1552 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1498 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1553 ASSERT_EQ(1U, GetAndResetSentEventCount()); | 1499 ASSERT_EQ(1U, GetAndResetSentEventCount()); |
| 1554 ASSERT_EQ(1U, GetAndResetAckedEventCount()); | 1500 ASSERT_EQ(1U, GetAndResetAckedEventCount()); |
| 1555 | 1501 |
| 1556 // TouchMove's along the slop boundary should be suppresed. | 1502 // TouchMove's along the slop boundary should be suppresed. |
| 1557 MoveTouchPoint(0, 0, kSlopLengthPixels / kDPIScale); | 1503 MoveTouchPoint(0, 0, kSlopLengthPixels / kDPIScale); |
| 1558 EXPECT_EQ(0U, queued_event_count()); | 1504 EXPECT_EQ(0U, queued_event_count()); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1578 EXPECT_EQ(1U, queued_event_count()); | 1524 EXPECT_EQ(1U, queued_event_count()); |
| 1579 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 1525 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 1580 EXPECT_EQ(0U, GetAndResetAckedEventCount()); | 1526 EXPECT_EQ(0U, GetAndResetAckedEventCount()); |
| 1581 } | 1527 } |
| 1582 | 1528 |
| 1583 // Tests that TouchMove's are not dropped if a secondary pointer is present | 1529 // Tests that TouchMove's are not dropped if a secondary pointer is present |
| 1584 // during any movement. | 1530 // during any movement. |
| 1585 TEST_F(TouchEventQueueTest, NoTouchMoveSuppressionAfterMultiTouch) { | 1531 TEST_F(TouchEventQueueTest, NoTouchMoveSuppressionAfterMultiTouch) { |
| 1586 const double kSlopLengthDips = 10.; | 1532 const double kSlopLengthDips = 10.; |
| 1587 const double kHalfSlopLengthDips = kSlopLengthDips / 2; | 1533 const double kHalfSlopLengthDips = kSlopLengthDips / 2; |
| 1588 const bool slop_includes_boundary = true; | 1534 SetUpForTouchMoveSlopTesting(kSlopLengthDips); |
| 1589 SetUpForTouchMoveSlopTesting(kSlopLengthDips, slop_includes_boundary); | |
| 1590 | 1535 |
| 1591 // Queue a TouchStart. | 1536 // Queue a TouchStart. |
| 1592 PressTouchPoint(0, 0); | 1537 PressTouchPoint(0, 0); |
| 1593 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1538 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1594 ASSERT_EQ(1U, GetAndResetSentEventCount()); | 1539 ASSERT_EQ(1U, GetAndResetSentEventCount()); |
| 1595 ASSERT_EQ(1U, GetAndResetAckedEventCount()); | 1540 ASSERT_EQ(1U, GetAndResetAckedEventCount()); |
| 1596 | 1541 |
| 1597 // TouchMove's within the region should be suppressed. | 1542 // TouchMove's within the region should be suppressed. |
| 1598 MoveTouchPoint(0, 0, kHalfSlopLengthDips); | 1543 MoveTouchPoint(0, 0, kHalfSlopLengthDips); |
| 1599 EXPECT_EQ(0U, queued_event_count()); | 1544 EXPECT_EQ(0U, queued_event_count()); |
| (...skipping 562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2162 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 2107 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 2163 | 2108 |
| 2164 // Touch move event is throttled. | 2109 // Touch move event is throttled. |
| 2165 MoveTouchPoint(0, 60, 5); | 2110 MoveTouchPoint(0, 60, 5); |
| 2166 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); | 2111 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); |
| 2167 EXPECT_EQ(0U, queued_event_count()); | 2112 EXPECT_EQ(0U, queued_event_count()); |
| 2168 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 2113 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 2169 } | 2114 } |
| 2170 | 2115 |
| 2171 } // namespace content | 2116 } // namespace content |
| OLD | NEW |