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 |