Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(75)

Side by Side Diff: trunk/src/content/browser/renderer_host/input/touch_event_queue_unittest.cc

Issue 252023005: Revert 266470 "Implement async touchmove dispatch during scroll" (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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"
11 #include "content/common/input/synthetic_web_input_event_builders.h" 11 #include "content/common/input/synthetic_web_input_event_builders.h"
12 #include "testing/gtest/include/gtest/gtest.h" 12 #include "testing/gtest/include/gtest/gtest.h"
13 #include "third_party/WebKit/public/web/WebInputEvent.h" 13 #include "third_party/WebKit/public/web/WebInputEvent.h"
14 14
15 using blink::WebGestureEvent; 15 using blink::WebGestureEvent;
16 using blink::WebInputEvent; 16 using blink::WebInputEvent;
17 using blink::WebTouchEvent; 17 using blink::WebTouchEvent;
18 using blink::WebTouchPoint; 18 using blink::WebTouchPoint;
19 19
20 namespace content { 20 namespace content {
21 namespace { 21 namespace {
22
23 const double kMinSecondsBetweenThrottledTouchmoves = 0.2;
24
25 base::TimeDelta DefaultTouchTimeoutDelay() { 22 base::TimeDelta DefaultTouchTimeoutDelay() {
26 return base::TimeDelta::FromMilliseconds(1); 23 return base::TimeDelta::FromMilliseconds(1);
27 } 24 }
28 } // namespace 25 } // namespace
29 26
30 class TouchEventQueueTest : public testing::Test, 27 class TouchEventQueueTest : public testing::Test,
31 public TouchEventQueueClient { 28 public TouchEventQueueClient {
32 public: 29 public:
33 TouchEventQueueTest() 30 TouchEventQueueTest()
34 : sent_event_count_(0), 31 : sent_event_count_(0),
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 void ReleaseTouchPoint(int index) { 149 void ReleaseTouchPoint(int index) {
153 touch_event_.ReleasePoint(index); 150 touch_event_.ReleasePoint(index);
154 SendTouchEvent(); 151 SendTouchEvent();
155 } 152 }
156 153
157 void CancelTouchPoint(int index) { 154 void CancelTouchPoint(int index) {
158 touch_event_.CancelPoint(index); 155 touch_event_.CancelPoint(index);
159 SendTouchEvent(); 156 SendTouchEvent();
160 } 157 }
161 158
162 void AdvanceTouchTime(double seconds) {
163 touch_event_.timeStampSeconds += seconds;
164 }
165
166 size_t GetAndResetAckedEventCount() { 159 size_t GetAndResetAckedEventCount() {
167 size_t count = acked_event_count_; 160 size_t count = acked_event_count_;
168 acked_event_count_ = 0; 161 acked_event_count_ = 0;
169 return count; 162 return count;
170 } 163 }
171 164
172 size_t GetAndResetSentEventCount() { 165 size_t GetAndResetSentEventCount() {
173 size_t count = sent_event_count_; 166 size_t count = sent_event_count_;
174 sent_event_count_ = 0; 167 sent_event_count_ = 0;
175 return count; 168 return count;
176 } 169 }
177 170
178 bool IsPendingAckTouchStart() const { 171 bool IsPendingAckTouchStart() const {
179 return queue_->IsPendingAckTouchStart(); 172 return queue_->IsPendingAckTouchStart();
180 } 173 }
181 174
182 void OnHasTouchEventHandlers(bool has_handlers) { 175 void OnHasTouchEventHandlers(bool has_handlers) {
183 queue_->OnHasTouchEventHandlers(has_handlers); 176 queue_->OnHasTouchEventHandlers(has_handlers);
184 } 177 }
185 178
186 void SetAckTimeoutDisabled() { 179 void SetAckTimeoutDisabled() {
187 queue_->SetAckTimeoutEnabled(false, base::TimeDelta()); 180 queue_->SetAckTimeoutEnabled(false, base::TimeDelta());
188 } 181 }
189 182
190 bool IsTimeoutEnabled() const { return queue_->ack_timeout_enabled(); } 183 bool IsTimeoutEnabled() {
184 return queue_->ack_timeout_enabled();
185 }
191 186
192 bool IsTimeoutRunning() const { return queue_->IsTimeoutRunningForTesting(); } 187 bool IsTimeoutRunning() {
193 188 return queue_->IsTimeoutRunningForTesting();
194 bool HasPendingAsyncTouchMove() const {
195 return queue_->HasPendingAsyncTouchMoveForTesting();
196 } 189 }
197 190
198 size_t queued_event_count() const { 191 size_t queued_event_count() const {
199 return queue_->size(); 192 return queue_->size();
200 } 193 }
201 194
202 const WebTouchEvent& latest_event() const { 195 const WebTouchEvent& latest_event() const {
203 return queue_->GetLatestEventForTesting().event; 196 return queue_->GetLatestEventForTesting().event;
204 } 197 }
205 198
(...skipping 1331 matching lines...) Expand 10 before | Expand all | Expand 10 after
1537 // GestureScrollBegin doesn't insert a synthetic TouchCancel. 1530 // GestureScrollBegin doesn't insert a synthetic TouchCancel.
1538 WebGestureEvent followup_scroll; 1531 WebGestureEvent followup_scroll;
1539 followup_scroll.type = WebInputEvent::GestureScrollBegin; 1532 followup_scroll.type = WebInputEvent::GestureScrollBegin;
1540 SetFollowupEvent(followup_scroll); 1533 SetFollowupEvent(followup_scroll);
1541 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1534 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1542 EXPECT_EQ(0U, GetAndResetSentEventCount()); 1535 EXPECT_EQ(0U, GetAndResetSentEventCount());
1543 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 1536 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1544 EXPECT_EQ(0U, queued_event_count()); 1537 EXPECT_EQ(0U, queued_event_count());
1545 } 1538 }
1546 1539
1547 TEST_F(TouchEventQueueTest, AsyncTouch) { 1540 TEST_F(TouchEventQueueTest, TouchAbsorption) {
1548 SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_ASYNC_TOUCHMOVE); 1541 SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_ABSORB_TOUCHMOVE);
1549 1542
1550 // Queue a TouchStart. 1543 // Queue a TouchStart.
1551 PressTouchPoint(0, 1); 1544 PressTouchPoint(0, 1);
1552 EXPECT_EQ(1U, GetAndResetSentEventCount()); 1545 EXPECT_EQ(1U, GetAndResetSentEventCount());
1553 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1546 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1554 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 1547 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1555 1548
1556 for (int i = 0; i < 3; ++i) { 1549 for (int i = 0; i < 3; ++i) {
1557 SendGestureEventAck(WebInputEvent::GestureScrollUpdate, 1550 SendGestureEventAck(WebInputEvent::GestureScrollUpdate,
1558 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1551 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1559 1552
1560 MoveTouchPoint(0, 10, 5); 1553 MoveTouchPoint(0, 20, 5);
1561 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1554 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1562 EXPECT_FALSE(HasPendingAsyncTouchMove());
1563 EXPECT_TRUE(sent_event().cancelable);
1564 EXPECT_EQ(0U, queued_event_count()); 1555 EXPECT_EQ(0U, queued_event_count());
1565 EXPECT_EQ(1U, GetAndResetSentEventCount()); 1556 EXPECT_EQ(1U, GetAndResetSentEventCount());
1566 1557
1567 // Consuming a scroll event will throttle subsequent touchmoves. 1558 // Consuming a scroll event prevents the next touch moves from being
1559 // dispatched.
1568 SendGestureEventAck(WebInputEvent::GestureScrollUpdate, 1560 SendGestureEventAck(WebInputEvent::GestureScrollUpdate,
1569 INPUT_EVENT_ACK_STATE_CONSUMED); 1561 INPUT_EVENT_ACK_STATE_CONSUMED);
1570 MoveTouchPoint(0, 10, 5); 1562 MoveTouchPoint(0, 20, 5);
1571 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1563 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1572 EXPECT_TRUE(HasPendingAsyncTouchMove());
1573 EXPECT_EQ(0U, queued_event_count()); 1564 EXPECT_EQ(0U, queued_event_count());
1574 EXPECT_EQ(0U, GetAndResetSentEventCount()); 1565 EXPECT_EQ(0U, GetAndResetSentEventCount());
1575 } 1566 }
1576 } 1567 }
1577 1568
1578 // Ensure that touchmove's are appropriately throttled during a typical 1569 TEST_F(TouchEventQueueTest, TouchAbsorptionNoTouchAfterScroll) {
1579 // scroll sequences that transitions between scrolls consumed and unconsumed. 1570 SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_ABSORB_TOUCHMOVE);
1580 TEST_F(TouchEventQueueTest, AsyncTouchThrottledAfterScroll) {
1581 SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_ASYNC_TOUCHMOVE);
1582 1571
1583 // Process a TouchStart 1572 // Process a TouchStart
1584 PressTouchPoint(0, 1); 1573 PressTouchPoint(0, 1);
1585 EXPECT_EQ(1U, GetAndResetSentEventCount()); 1574 EXPECT_EQ(1U, GetAndResetSentEventCount());
1586 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1575 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1587 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 1576 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1588 1577
1589 // Now send the first touch move and associated GestureScrollBegin, 1578 // Now send the first touch move and associated GestureScrollBegin,
1590 // but don't ACK the gesture event yet. 1579 // but don't ACK the gesture event yet.
1591 MoveTouchPoint(0, 0, 5); 1580 MoveTouchPoint(0, 0, 5);
1592 WebGestureEvent followup_scroll; 1581 WebGestureEvent followup_scroll;
1593 followup_scroll.type = WebInputEvent::GestureScrollBegin; 1582 followup_scroll.type = WebInputEvent::GestureScrollBegin;
1594 SetFollowupEvent(followup_scroll); 1583 SetFollowupEvent(followup_scroll);
1595 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1584 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1596 EXPECT_EQ(1U, GetAndResetSentEventCount()); 1585 EXPECT_EQ(1U, GetAndResetSentEventCount());
1597 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 1586 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1598 1587
1599 // Now queue a second touchmove and verify it's not (yet) dispatched. 1588 // Now queue a second touchmove and verify it's not dispatched.
1600 MoveTouchPoint(0, 0, 10); 1589 MoveTouchPoint(0, 0, 10);
1601 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1590 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1602 EXPECT_TRUE(HasPendingAsyncTouchMove());
1603 EXPECT_EQ(0U, queued_event_count()); 1591 EXPECT_EQ(0U, queued_event_count());
1604 EXPECT_EQ(0U, GetAndResetSentEventCount()); 1592 EXPECT_EQ(0U, GetAndResetSentEventCount());
1605 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 1593 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1606 1594
1607 // Queuing the final touchend should flush the pending, async touchmove. 1595 // But a final touchend is sent (even before any gesture events
1596 // have been ACKed).
1608 ReleaseTouchPoint(0); 1597 ReleaseTouchPoint(0);
1609 EXPECT_EQ(WebInputEvent::TouchMove, sent_event().type);
1610 EXPECT_FALSE(HasPendingAsyncTouchMove());
1611 EXPECT_FALSE(sent_event().cancelable);
1612 EXPECT_EQ(1U, GetAndResetSentEventCount());
1613 EXPECT_EQ(2U, queued_event_count());
1614
1615 // Ack the flushed, async touchmove. The ack should not reach the client, but
1616 // it should trigger sending of the (now non-cancelable) touchend.
1617 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1618 EXPECT_EQ(WebInputEvent::TouchEnd, sent_event().type);
1619 EXPECT_FALSE(sent_event().cancelable);
1620 EXPECT_EQ(1U, GetAndResetSentEventCount());
1621 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1622 EXPECT_EQ(1U, queued_event_count());
1623
1624 // Ack the touchend.
1625 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1598 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1626 EXPECT_EQ(0U, queued_event_count()); 1599 EXPECT_EQ(0U, queued_event_count());
1627 EXPECT_EQ(0U, GetAndResetSentEventCount()); 1600 EXPECT_EQ(1U, GetAndResetSentEventCount());
1628 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 1601 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1602 EXPECT_EQ(WebInputEvent::TouchEnd, sent_event().type);
1629 1603
1630 // Now mark the scroll as not consumed (which would cause future 1604 // Now mark the scroll as not consumed (which would cause future
1631 // touchmoves in the active sequence to be sent if there was one). 1605 // touchmoves in the active sequence to be sent if there was one).
1632 SendGestureEventAck(WebInputEvent::GestureScrollBegin, 1606 SendGestureEventAck(WebInputEvent::GestureScrollBegin,
1633 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1607 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1634 1608
1635 // Start a new touch sequence and verify that throttling has been reset. 1609 // Start a new touch sequence and verify that absorption has been
1636 // Touch moves after the start of scrolling will again be throttled. 1610 // reset so that moves after the start of scrolling are not sent.
1637 PressTouchPoint(0, 0); 1611 PressTouchPoint(0, 1);
1638 EXPECT_EQ(1U, GetAndResetSentEventCount()); 1612 EXPECT_EQ(1U, GetAndResetSentEventCount());
1639 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1613 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1640 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 1614 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1641 MoveTouchPoint(0, 0, 5); 1615 MoveTouchPoint(0, 0, 5);
1642 SetFollowupEvent(followup_scroll); 1616 SetFollowupEvent(followup_scroll);
1643 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1617 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1644 EXPECT_EQ(1U, GetAndResetSentEventCount()); 1618 EXPECT_EQ(1U, GetAndResetSentEventCount());
1645 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 1619 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1646 MoveTouchPoint(0, 0, 10); 1620 MoveTouchPoint(0, 0, 10);
1647 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1621 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1648 EXPECT_TRUE(HasPendingAsyncTouchMove());
1649 EXPECT_EQ(0U, queued_event_count()); 1622 EXPECT_EQ(0U, queued_event_count());
1650 EXPECT_EQ(0U, GetAndResetSentEventCount()); 1623 EXPECT_EQ(0U, GetAndResetSentEventCount());
1651 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1652
1653 // As soon as a touchmove exceeds the outer slop region it will be forwarded
1654 // immediately.
1655 MoveTouchPoint(0, 0, 20);
1656 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1657 EXPECT_FALSE(HasPendingAsyncTouchMove());
1658 EXPECT_FALSE(sent_event().cancelable);
1659 EXPECT_EQ(0U, queued_event_count());
1660 EXPECT_EQ(1U, GetAndResetSentEventCount());
1661 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1662
1663 // Subsequent touchmove's should be deferred.
1664 MoveTouchPoint(0, 0, 25);
1665 EXPECT_TRUE(HasPendingAsyncTouchMove());
1666 EXPECT_EQ(0U, queued_event_count());
1667 EXPECT_EQ(0U, GetAndResetSentEventCount());
1668 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1669
1670 // The pending touchmove should be flushed with the the new touchmove if
1671 // sufficient time has passed.
1672 AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1);
1673 MoveTouchPoint(0, 0, 15);
1674 EXPECT_FALSE(HasPendingAsyncTouchMove());
1675 EXPECT_FALSE(sent_event().cancelable);
1676 EXPECT_EQ(1U, queued_event_count());
1677 EXPECT_EQ(1U, GetAndResetSentEventCount());
1678 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1679 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1680 EXPECT_EQ(0U, queued_event_count());
1681 EXPECT_EQ(0U, GetAndResetSentEventCount());
1682 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1683
1684 // Non-touchmove events should always flush any pending touchmove events.
1685 MoveTouchPoint(0, 0, 25);
1686 EXPECT_TRUE(HasPendingAsyncTouchMove());
1687 EXPECT_EQ(0U, queued_event_count());
1688 EXPECT_EQ(0U, GetAndResetSentEventCount());
1689 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1690 PressTouchPoint(30, 30);
1691 EXPECT_FALSE(HasPendingAsyncTouchMove());
1692 EXPECT_FALSE(sent_event().cancelable);
1693 EXPECT_EQ(WebInputEvent::TouchMove, sent_event().type);
1694 EXPECT_EQ(1U, GetAndResetSentEventCount());
1695 EXPECT_EQ(2U, queued_event_count());
1696
1697 // Ack'ing the flushed, async touchmove will dispatch the touchstart. Note
1698 // that the flushed touchmove's ack will not reach the client (its
1699 // constituent events have already been ack'ed).
1700 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1701 EXPECT_FALSE(sent_event().cancelable);
1702 EXPECT_EQ(WebInputEvent::TouchStart, sent_event().type);
1703 EXPECT_EQ(1U, queued_event_count());
1704 EXPECT_EQ(1U, GetAndResetSentEventCount());
1705 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1706
1707 // Ack the touchstart.
1708 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1709 EXPECT_EQ(0U, queued_event_count());
1710 EXPECT_EQ(0U, GetAndResetSentEventCount());
1711 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1712
1713 // Send a secondary touchmove.
1714 MoveTouchPoint(1, 0, 25);
1715 EXPECT_TRUE(HasPendingAsyncTouchMove());
1716 EXPECT_EQ(0U, queued_event_count());
1717 EXPECT_EQ(0U, GetAndResetSentEventCount());
1718 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1719
1720 // An unconsumed scroll should resume synchronous touch handling.
1721 SendGestureEventAck(WebInputEvent::GestureScrollUpdate,
1722 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1723
1724 // The pending touchmove should be coalesced with the next (now synchronous)
1725 // touchmove.
1726 MoveTouchPoint(0, 0, 25);
1727 EXPECT_TRUE(sent_event().cancelable);
1728 EXPECT_FALSE(HasPendingAsyncTouchMove());
1729 EXPECT_EQ(WebInputEvent::TouchMove, sent_event().type);
1730 EXPECT_EQ(WebTouchPoint::StateMoved, sent_event().touches[0].state);
1731 EXPECT_EQ(WebTouchPoint::StateMoved, sent_event().touches[1].state);
1732 EXPECT_EQ(1U, queued_event_count());
1733 EXPECT_EQ(1U, GetAndResetSentEventCount());
1734 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1735
1736 // Subsequent touches will queue until the preceding, synchronous touches are
1737 // ack'ed.
1738 ReleaseTouchPoint(1);
1739 EXPECT_EQ(2U, queued_event_count());
1740 ReleaseTouchPoint(0);
1741 EXPECT_EQ(3U, queued_event_count());
1742 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1743 EXPECT_TRUE(sent_event().cancelable);
1744 EXPECT_EQ(WebInputEvent::TouchEnd, sent_event().type);
1745 EXPECT_EQ(2U, queued_event_count());
1746 EXPECT_EQ(1U, GetAndResetSentEventCount());
1747 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1748
1749 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1750 EXPECT_TRUE(sent_event().cancelable);
1751 EXPECT_EQ(WebInputEvent::TouchEnd, sent_event().type);
1752 EXPECT_EQ(1U, queued_event_count());
1753 EXPECT_EQ(1U, GetAndResetSentEventCount());
1754 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1755
1756 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1757 EXPECT_EQ(0U, queued_event_count());
1758 EXPECT_EQ(0U, GetAndResetSentEventCount());
1759 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1760 }
1761
1762 // Ensure that async touch dispatch and touch ack timeout interactions work
1763 // appropriately.
1764 TEST_F(TouchEventQueueTest, AsyncTouchWithAckTimeout) {
1765 SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_ASYNC_TOUCHMOVE);
1766 SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
1767
1768 // The touchstart should start the timeout.
1769 PressTouchPoint(0, 0);
1770 EXPECT_EQ(1U, GetAndResetSentEventCount());
1771 EXPECT_TRUE(IsTimeoutRunning());
1772
1773 // The start of a scroll gesture should triger async touch event dispatch.
1774 WebGestureEvent followup_scroll;
1775 followup_scroll.type = WebInputEvent::GestureScrollBegin;
1776 SetFollowupEvent(followup_scroll);
1777 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1778 EXPECT_FALSE(IsTimeoutRunning());
1779 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1780
1781 SendGestureEventAck(WebInputEvent::GestureScrollUpdate,
1782 INPUT_EVENT_ACK_STATE_CONSUMED);
1783
1784 // An async touch should fire after the throttling interval has expired, but
1785 // it should not start the touch ack timeout.
1786 MoveTouchPoint(0, 5, 5);
1787 EXPECT_TRUE(HasPendingAsyncTouchMove());
1788 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1789
1790 AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1);
1791 MoveTouchPoint(0, 5, 5);
1792 EXPECT_FALSE(IsTimeoutRunning());
1793 EXPECT_FALSE(HasPendingAsyncTouchMove());
1794 EXPECT_FALSE(sent_event().cancelable);
1795 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1796 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1797 EXPECT_EQ(1U, GetAndResetSentEventCount());
1798
1799 // An unconsumed scroll event will resume synchronous touchmoves, which are
1800 // subject to the ack timeout.
1801 SendGestureEventAck(WebInputEvent::GestureScrollUpdate,
1802 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1803 MoveTouchPoint(0, 20, 5);
1804 EXPECT_TRUE(IsTimeoutRunning());
1805 EXPECT_TRUE(sent_event().cancelable);
1806 EXPECT_EQ(1U, GetAndResetSentEventCount());
1807
1808 // The timeout should fire, disabling touch forwarding until both acks are
1809 // received and acking the timed out event.
1810 RunTasksAndWait(DefaultTouchTimeoutDelay() * 2);
1811 EXPECT_FALSE(IsTimeoutRunning());
1812 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1813 EXPECT_EQ(0U, GetAndResetSentEventCount());
1814
1815 // Ack'ing the original event should trigger a cancel event.
1816 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1817 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1818 EXPECT_FALSE(sent_event().cancelable);
1819 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1820 EXPECT_EQ(1U, GetAndResetSentEventCount());
1821
1822 // Subsequent touchmove's should not be forwarded, even as the scroll gesture
1823 // goes from unconsumed to consumed.
1824 SendGestureEventAck(WebInputEvent::GestureScrollUpdate,
1825 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1826 MoveTouchPoint(0, 20, 5);
1827 EXPECT_FALSE(HasPendingAsyncTouchMove());
1828 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1829 EXPECT_EQ(0U, GetAndResetSentEventCount());
1830
1831 SendGestureEventAck(WebInputEvent::GestureScrollUpdate,
1832 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1833 MoveTouchPoint(0, 25, 5);
1834 EXPECT_FALSE(HasPendingAsyncTouchMove());
1835 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1836 EXPECT_EQ(0U, GetAndResetSentEventCount());
1837 } 1624 }
1838 1625
1839 } // namespace content 1626 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698