| 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 558 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 569 EXPECT_EQ(4U, GetAndResetAckedEventCount()); | 569 EXPECT_EQ(4U, GetAndResetAckedEventCount()); |
| 570 EXPECT_EQ(1U, queued_event_count()); | 570 EXPECT_EQ(1U, queued_event_count()); |
| 571 | 571 |
| 572 // ACK the second press event as NO_CONSUMER too. | 572 // ACK the second press event as NO_CONSUMER too. |
| 573 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); | 573 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); |
| 574 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 574 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 575 EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type); | 575 EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type); |
| 576 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 576 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 577 EXPECT_EQ(0U, queued_event_count()); | 577 EXPECT_EQ(0U, queued_event_count()); |
| 578 | 578 |
| 579 // Send a second press event. As the first touch press had NO_CONSUMER, this | 579 // Send a second press event. Even though the first touch press had |
| 580 // press event should not reach the renderer. | 580 // NO_CONSUMER, this press event should reach the renderer. |
| 581 PressTouchPoint(1, 1); | 581 PressTouchPoint(1, 1); |
| 582 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 582 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 583 EXPECT_EQ(1U, queued_event_count()); |
| 584 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); |
| 583 EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type); | 585 EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type); |
| 584 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 586 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 585 EXPECT_EQ(0U, queued_event_count()); | |
| 586 } | 587 } |
| 587 | 588 |
| 588 TEST_F(TouchEventQueueTest, ConsumerIgnoreMultiFinger) { | 589 TEST_F(TouchEventQueueTest, ConsumerIgnoreMultiFinger) { |
| 589 // Press two touch points and move them around a bit. The renderer consumes | 590 // Press two touch points and move them around a bit. The renderer consumes |
| 590 // the events for the first touch point, but returns NO_CONSUMER_EXISTS for | 591 // the events for the first touch point, but returns NO_CONSUMER_EXISTS for |
| 591 // the second touch point. | 592 // the second touch point. |
| 592 | 593 |
| 593 PressTouchPoint(1, 1); | 594 PressTouchPoint(1, 1); |
| 594 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 595 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 595 | 596 |
| (...skipping 919 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1515 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 1516 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1516 | 1517 |
| 1517 // TouchMove's should not should be suppressed, even with the original | 1518 // TouchMove's should not should be suppressed, even with the original |
| 1518 // unmoved pointer. | 1519 // unmoved pointer. |
| 1519 MoveTouchPoint(0, 0, 0); | 1520 MoveTouchPoint(0, 0, 0); |
| 1520 EXPECT_EQ(1U, queued_event_count()); | 1521 EXPECT_EQ(1U, queued_event_count()); |
| 1521 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 1522 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 1522 EXPECT_EQ(0U, GetAndResetAckedEventCount()); | 1523 EXPECT_EQ(0U, GetAndResetAckedEventCount()); |
| 1523 } | 1524 } |
| 1524 | 1525 |
| 1526 // Tests that secondary touch points can be forwarded even if the primary touch |
| 1527 // point had no consumer. |
| 1528 TEST_F(TouchEventQueueTest, SecondaryTouchForwardedAfterPrimaryHadNoConsumer) { |
| 1529 // Queue a TouchStart. |
| 1530 PressTouchPoint(0, 0); |
| 1531 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); |
| 1532 ASSERT_EQ(1U, GetAndResetSentEventCount()); |
| 1533 ASSERT_EQ(1U, GetAndResetAckedEventCount()); |
| 1534 |
| 1535 // Events should not be forwarded, as the point had no consumer. |
| 1536 MoveTouchPoint(0, 0, 15); |
| 1537 EXPECT_EQ(0U, queued_event_count()); |
| 1538 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 1539 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1540 |
| 1541 // Simulate a secondary pointer press. |
| 1542 PressTouchPoint(20, 0); |
| 1543 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1544 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 1545 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1546 |
| 1547 // TouchMove with a secondary pointer should not be suppressed. |
| 1548 MoveTouchPoint(1, 25, 0); |
| 1549 EXPECT_EQ(1U, queued_event_count()); |
| 1550 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 1551 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1552 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1553 } |
| 1554 |
| 1555 // Tests that no touch points will be forwarded after scrolling begins while no |
| 1556 // touch points have a consumer. |
| 1557 TEST_F(TouchEventQueueTest, NoForwardingAfterScrollWithNoTouchConsumers) { |
| 1558 // Queue a TouchStart. |
| 1559 PressTouchPoint(0, 0); |
| 1560 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); |
| 1561 ASSERT_EQ(1U, GetAndResetSentEventCount()); |
| 1562 ASSERT_EQ(1U, GetAndResetAckedEventCount()); |
| 1563 |
| 1564 WebGestureEvent followup_scroll; |
| 1565 followup_scroll.type = WebInputEvent::GestureScrollBegin; |
| 1566 SetFollowupEvent(followup_scroll); |
| 1567 MoveTouchPoint(0, 20, 5); |
| 1568 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 1569 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1570 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state()); |
| 1571 |
| 1572 // The secondary pointer press should not be forwarded. |
| 1573 PressTouchPoint(20, 0); |
| 1574 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 1575 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1576 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state()); |
| 1577 |
| 1578 // Neither should any further touchmoves be forwarded. |
| 1579 MoveTouchPoint(1, 25, 0); |
| 1580 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 1581 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1582 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state()); |
| 1583 } |
| 1584 |
| 1525 TEST_F(TouchEventQueueTest, SyncTouchMoveDoesntCancelTouchOnScroll) { | 1585 TEST_F(TouchEventQueueTest, SyncTouchMoveDoesntCancelTouchOnScroll) { |
| 1526 SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_SYNC_TOUCHMOVE); | 1586 SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_SYNC_TOUCHMOVE); |
| 1527 // Queue a TouchStart. | 1587 // Queue a TouchStart. |
| 1528 PressTouchPoint(0, 1); | 1588 PressTouchPoint(0, 1); |
| 1529 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 1589 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 1530 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1590 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1531 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 1591 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1532 | 1592 |
| 1533 MoveTouchPoint(0, 20, 5); | 1593 MoveTouchPoint(0, 20, 5); |
| 1534 EXPECT_EQ(1U, queued_event_count()); | 1594 EXPECT_EQ(1U, queued_event_count()); |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1763 // appropriately. | 1823 // appropriately. |
| 1764 TEST_F(TouchEventQueueTest, AsyncTouchWithAckTimeout) { | 1824 TEST_F(TouchEventQueueTest, AsyncTouchWithAckTimeout) { |
| 1765 SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_ASYNC_TOUCHMOVE); | 1825 SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_ASYNC_TOUCHMOVE); |
| 1766 SetUpForTimeoutTesting(DefaultTouchTimeoutDelay()); | 1826 SetUpForTimeoutTesting(DefaultTouchTimeoutDelay()); |
| 1767 | 1827 |
| 1768 // The touchstart should start the timeout. | 1828 // The touchstart should start the timeout. |
| 1769 PressTouchPoint(0, 0); | 1829 PressTouchPoint(0, 0); |
| 1770 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 1830 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 1771 EXPECT_TRUE(IsTimeoutRunning()); | 1831 EXPECT_TRUE(IsTimeoutRunning()); |
| 1772 | 1832 |
| 1773 // The start of a scroll gesture should triger async touch event dispatch. | 1833 // The start of a scroll gesture should trigger async touch event dispatch. |
| 1774 WebGestureEvent followup_scroll; | 1834 WebGestureEvent followup_scroll; |
| 1775 followup_scroll.type = WebInputEvent::GestureScrollBegin; | 1835 followup_scroll.type = WebInputEvent::GestureScrollBegin; |
| 1776 SetFollowupEvent(followup_scroll); | 1836 SetFollowupEvent(followup_scroll); |
| 1777 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1837 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1778 EXPECT_FALSE(IsTimeoutRunning()); | 1838 EXPECT_FALSE(IsTimeoutRunning()); |
| 1779 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 1839 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1780 | 1840 |
| 1781 SendGestureEventAck(WebInputEvent::GestureScrollUpdate, | 1841 SendGestureEventAck(WebInputEvent::GestureScrollUpdate, |
| 1782 INPUT_EVENT_ACK_STATE_CONSUMED); | 1842 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 1783 | 1843 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1829 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 1889 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 1830 | 1890 |
| 1831 SendGestureEventAck(WebInputEvent::GestureScrollUpdate, | 1891 SendGestureEventAck(WebInputEvent::GestureScrollUpdate, |
| 1832 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1892 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1833 MoveTouchPoint(0, 25, 5); | 1893 MoveTouchPoint(0, 25, 5); |
| 1834 EXPECT_FALSE(HasPendingAsyncTouchMove()); | 1894 EXPECT_FALSE(HasPendingAsyncTouchMove()); |
| 1835 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 1895 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1836 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 1896 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 1837 } | 1897 } |
| 1838 | 1898 |
| 1899 // Ensure that if the touch ack for an async touchmove triggers a follow-up |
| 1900 // touch event, that follow-up touch will be forwarded appropriately. |
| 1901 TEST_F(TouchEventQueueTest, AsyncTouchWithTouchCancelAfterAck) { |
| 1902 SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_ASYNC_TOUCHMOVE); |
| 1903 |
| 1904 PressTouchPoint(0, 0); |
| 1905 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 1906 |
| 1907 // The start of a scroll gesture should trigger async touch event dispatch. |
| 1908 WebGestureEvent followup_scroll; |
| 1909 followup_scroll.type = WebInputEvent::GestureScrollBegin; |
| 1910 SetFollowupEvent(followup_scroll); |
| 1911 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1912 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1913 EXPECT_EQ(0U, queued_event_count()); |
| 1914 |
| 1915 // The async touchmove should be ack'ed immediately, but not forwarded. |
| 1916 // However, because the ack triggers a touchcancel, both the pending touch and |
| 1917 // the queued touchcancel should be flushed. |
| 1918 WebTouchEvent followup_cancel; |
| 1919 followup_cancel.type = WebInputEvent::TouchCancel; |
| 1920 followup_cancel.touchesLength = 1; |
| 1921 followup_cancel.touches[0].state = WebTouchPoint::StateCancelled; |
| 1922 SetFollowupEvent(followup_cancel); |
| 1923 MoveTouchPoint(0, 5, 5); |
| 1924 EXPECT_EQ(2U, queued_event_count()); |
| 1925 EXPECT_FALSE(sent_event().cancelable); |
| 1926 EXPECT_FALSE(HasPendingAsyncTouchMove()); |
| 1927 EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type); |
| 1928 EXPECT_EQ(WebInputEvent::TouchMove, sent_event().type); |
| 1929 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1930 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 1931 |
| 1932 // The ack for the asnc touchmove should not reach the client, as it has |
| 1933 // already been ack'ed. |
| 1934 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1935 EXPECT_FALSE(sent_event().cancelable); |
| 1936 EXPECT_EQ(1U, queued_event_count()); |
| 1937 EXPECT_EQ(WebInputEvent::TouchCancel, sent_event().type); |
| 1938 EXPECT_EQ(0U, GetAndResetAckedEventCount()); |
| 1939 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 1940 |
| 1941 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1942 EXPECT_EQ(0U, queued_event_count()); |
| 1943 EXPECT_EQ(WebInputEvent::TouchCancel, acked_event().type); |
| 1944 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1945 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 1946 } |
| 1947 |
| 1839 } // namespace content | 1948 } // namespace content |
| OLD | NEW |