Chromium Code Reviews| 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" |
| 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 MinSecondsBetweenThrottledTouchmoves = 0.2; | |
| 24 | |
| 22 base::TimeDelta DefaultTouchTimeoutDelay() { | 25 base::TimeDelta DefaultTouchTimeoutDelay() { |
| 23 return base::TimeDelta::FromMilliseconds(1); | 26 return base::TimeDelta::FromMilliseconds(1); |
| 24 } | 27 } |
| 25 } // namespace | 28 } // namespace |
| 26 | 29 |
| 27 class TouchEventQueueTest : public testing::Test, | 30 class TouchEventQueueTest : public testing::Test, |
| 28 public TouchEventQueueClient { | 31 public TouchEventQueueClient { |
| 29 public: | 32 public: |
| 30 TouchEventQueueTest() | 33 TouchEventQueueTest() |
| 31 : sent_event_count_(0), | 34 : sent_event_count_(0), |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 149 void ReleaseTouchPoint(int index) { | 152 void ReleaseTouchPoint(int index) { |
| 150 touch_event_.ReleasePoint(index); | 153 touch_event_.ReleasePoint(index); |
| 151 SendTouchEvent(); | 154 SendTouchEvent(); |
| 152 } | 155 } |
| 153 | 156 |
| 154 void CancelTouchPoint(int index) { | 157 void CancelTouchPoint(int index) { |
| 155 touch_event_.CancelPoint(index); | 158 touch_event_.CancelPoint(index); |
| 156 SendTouchEvent(); | 159 SendTouchEvent(); |
| 157 } | 160 } |
| 158 | 161 |
| 162 void AdvanceTouchTime(double seconds) { | |
| 163 touch_event_.timeStampSeconds += seconds; | |
| 164 } | |
| 165 | |
| 159 size_t GetAndResetAckedEventCount() { | 166 size_t GetAndResetAckedEventCount() { |
| 160 size_t count = acked_event_count_; | 167 size_t count = acked_event_count_; |
| 161 acked_event_count_ = 0; | 168 acked_event_count_ = 0; |
| 162 return count; | 169 return count; |
| 163 } | 170 } |
| 164 | 171 |
| 165 size_t GetAndResetSentEventCount() { | 172 size_t GetAndResetSentEventCount() { |
| 166 size_t count = sent_event_count_; | 173 size_t count = sent_event_count_; |
| 167 sent_event_count_ = 0; | 174 sent_event_count_ = 0; |
| 168 return count; | 175 return count; |
| 169 } | 176 } |
| 170 | 177 |
| 171 bool IsPendingAckTouchStart() const { | 178 bool IsPendingAckTouchStart() const { |
| 172 return queue_->IsPendingAckTouchStart(); | 179 return queue_->IsPendingAckTouchStart(); |
| 173 } | 180 } |
| 174 | 181 |
| 175 void OnHasTouchEventHandlers(bool has_handlers) { | 182 void OnHasTouchEventHandlers(bool has_handlers) { |
| 176 queue_->OnHasTouchEventHandlers(has_handlers); | 183 queue_->OnHasTouchEventHandlers(has_handlers); |
| 177 } | 184 } |
| 178 | 185 |
| 179 void SetAckTimeoutDisabled() { | 186 void SetAckTimeoutDisabled() { |
| 180 queue_->SetAckTimeoutEnabled(false, base::TimeDelta()); | 187 queue_->SetAckTimeoutEnabled(false, base::TimeDelta()); |
| 181 } | 188 } |
| 182 | 189 |
| 183 bool IsTimeoutEnabled() { | 190 bool IsTimeoutEnabled() const { |
| 184 return queue_->ack_timeout_enabled(); | 191 return queue_->ack_timeout_enabled(); |
| 185 } | 192 } |
| 186 | 193 |
| 187 bool IsTimeoutRunning() { | 194 bool IsTimeoutRunning() const { |
| 188 return queue_->IsTimeoutRunningForTesting(); | 195 return queue_->IsTimeoutRunningForTesting(); |
| 189 } | 196 } |
| 190 | 197 |
| 198 bool HasPendingAsyncTouchMove() const { | |
| 199 return queue_->HasPendingAsyncTouchMoveForTesting(); | |
| 200 } | |
| 201 | |
| 191 size_t queued_event_count() const { | 202 size_t queued_event_count() const { |
| 192 return queue_->size(); | 203 return queue_->size(); |
| 193 } | 204 } |
| 194 | 205 |
| 195 const WebTouchEvent& latest_event() const { | 206 const WebTouchEvent& latest_event() const { |
| 196 return queue_->GetLatestEventForTesting().event; | 207 return queue_->GetLatestEventForTesting().event; |
| 197 } | 208 } |
| 198 | 209 |
| 199 const WebTouchEvent& acked_event() const { | 210 const WebTouchEvent& acked_event() const { |
| 200 return last_acked_event_; | 211 return last_acked_event_; |
| (...skipping 1322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1523 // GestureScrollBegin doesn't insert a synthetic TouchCancel. | 1534 // GestureScrollBegin doesn't insert a synthetic TouchCancel. |
| 1524 WebGestureEvent followup_scroll; | 1535 WebGestureEvent followup_scroll; |
| 1525 followup_scroll.type = WebInputEvent::GestureScrollBegin; | 1536 followup_scroll.type = WebInputEvent::GestureScrollBegin; |
| 1526 SetFollowupEvent(followup_scroll); | 1537 SetFollowupEvent(followup_scroll); |
| 1527 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1538 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1528 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 1539 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 1529 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 1540 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1530 EXPECT_EQ(0U, queued_event_count()); | 1541 EXPECT_EQ(0U, queued_event_count()); |
| 1531 } | 1542 } |
| 1532 | 1543 |
| 1533 TEST_F(TouchEventQueueTest, TouchAbsorption) { | 1544 TEST_F(TouchEventQueueTest, AsyncTouch) { |
| 1534 SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_ABSORB_TOUCHMOVE); | 1545 SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_ASYNC_TOUCHMOVE); |
| 1535 | 1546 |
| 1536 // Queue a TouchStart. | 1547 // Queue a TouchStart. |
| 1537 PressTouchPoint(0, 1); | 1548 PressTouchPoint(0, 1); |
| 1538 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 1549 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 1539 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1550 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1540 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 1551 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1541 | 1552 |
| 1542 for (int i = 0; i < 3; ++i) { | 1553 for (int i = 0; i < 3; ++i) { |
| 1543 SendGestureEventAck(WebInputEvent::GestureScrollUpdate, | 1554 SendGestureEventAck(WebInputEvent::GestureScrollUpdate, |
| 1544 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1555 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1545 | 1556 |
| 1546 MoveTouchPoint(0, 20, 5); | 1557 MoveTouchPoint(0, 20, 5); |
| 1547 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1558 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1559 EXPECT_FALSE(HasPendingAsyncTouchMove()); | |
| 1560 EXPECT_TRUE(sent_event().cancelable); | |
| 1548 EXPECT_EQ(0U, queued_event_count()); | 1561 EXPECT_EQ(0U, queued_event_count()); |
| 1549 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 1562 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 1550 | 1563 |
| 1551 // Consuming a scroll event prevents the next touch moves from being | 1564 // Consuming a scroll event prevents the next touch moves from being |
|
Rick Byers
2014/04/23 21:56:17
this comment isn't quite true anymore, maybe "enab
jdduke (slow)
2014/04/23 22:56:48
Done.
| |
| 1552 // dispatched. | 1565 // dispatched. |
| 1553 SendGestureEventAck(WebInputEvent::GestureScrollUpdate, | 1566 SendGestureEventAck(WebInputEvent::GestureScrollUpdate, |
| 1554 INPUT_EVENT_ACK_STATE_CONSUMED); | 1567 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 1555 MoveTouchPoint(0, 20, 5); | 1568 MoveTouchPoint(0, 20, 5); |
| 1556 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1569 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1570 EXPECT_TRUE(HasPendingAsyncTouchMove()); | |
| 1557 EXPECT_EQ(0U, queued_event_count()); | 1571 EXPECT_EQ(0U, queued_event_count()); |
| 1558 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 1572 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 1559 } | 1573 } |
| 1560 } | 1574 } |
| 1561 | 1575 |
| 1562 TEST_F(TouchEventQueueTest, TouchAbsorptionNoTouchAfterScroll) { | 1576 TEST_F(TouchEventQueueTest, AsyncTouchThrottledAfterScroll) { |
| 1563 SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_ABSORB_TOUCHMOVE); | 1577 SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_ASYNC_TOUCHMOVE); |
| 1564 | 1578 |
| 1565 // Process a TouchStart | 1579 // Process a TouchStart |
| 1566 PressTouchPoint(0, 1); | 1580 PressTouchPoint(0, 1); |
| 1567 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 1581 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 1568 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1582 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1569 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 1583 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1570 | 1584 |
| 1571 // Now send the first touch move and associated GestureScrollBegin, | 1585 // Now send the first touch move and associated GestureScrollBegin, |
| 1572 // but don't ACK the gesture event yet. | 1586 // but don't ACK the gesture event yet. |
| 1573 MoveTouchPoint(0, 0, 5); | 1587 MoveTouchPoint(0, 0, 5); |
| 1574 WebGestureEvent followup_scroll; | 1588 WebGestureEvent followup_scroll; |
| 1575 followup_scroll.type = WebInputEvent::GestureScrollBegin; | 1589 followup_scroll.type = WebInputEvent::GestureScrollBegin; |
| 1576 SetFollowupEvent(followup_scroll); | 1590 SetFollowupEvent(followup_scroll); |
| 1577 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1591 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1578 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 1592 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 1579 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 1593 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1580 | 1594 |
| 1581 // Now queue a second touchmove and verify it's not dispatched. | 1595 // Now queue a second touchmove and verify it's not (yet) dispatched. |
| 1582 MoveTouchPoint(0, 0, 10); | 1596 MoveTouchPoint(0, 0, 10); |
| 1583 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1597 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1598 EXPECT_TRUE(HasPendingAsyncTouchMove()); | |
| 1599 EXPECT_EQ(0U, queued_event_count()); | |
| 1600 EXPECT_EQ(0U, GetAndResetSentEventCount()); | |
| 1601 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | |
| 1602 | |
| 1603 // Queuing the final touchend should flush the pending, async touchmove. | |
| 1604 ReleaseTouchPoint(0); | |
| 1605 EXPECT_EQ(WebInputEvent::TouchMove, sent_event().type); | |
| 1606 EXPECT_FALSE(HasPendingAsyncTouchMove()); | |
| 1607 EXPECT_FALSE(sent_event().cancelable); | |
| 1608 EXPECT_EQ(1U, GetAndResetSentEventCount()); | |
| 1609 EXPECT_EQ(2U, queued_event_count()); | |
| 1610 | |
| 1611 // Ack the flushed, async touchmove. The ack should not reach the client, but | |
| 1612 // it should trigger sending of the (now non-cancelable) touchend. | |
| 1613 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
| 1614 EXPECT_EQ(WebInputEvent::TouchEnd, sent_event().type); | |
| 1615 EXPECT_FALSE(sent_event().cancelable); | |
| 1616 EXPECT_EQ(1U, GetAndResetSentEventCount()); | |
| 1617 EXPECT_EQ(0U, GetAndResetAckedEventCount()); | |
| 1618 EXPECT_EQ(1U, queued_event_count()); | |
| 1619 | |
| 1620 // Ack the touchend. | |
| 1621 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
| 1584 EXPECT_EQ(0U, queued_event_count()); | 1622 EXPECT_EQ(0U, queued_event_count()); |
| 1585 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 1623 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 1586 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 1624 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1587 | 1625 |
| 1588 // But a final touchend is sent (even before any gesture events | |
| 1589 // have been ACKed). | |
| 1590 ReleaseTouchPoint(0); | |
| 1591 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
| 1592 EXPECT_EQ(0U, queued_event_count()); | |
| 1593 EXPECT_EQ(1U, GetAndResetSentEventCount()); | |
| 1594 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | |
| 1595 EXPECT_EQ(WebInputEvent::TouchEnd, sent_event().type); | |
| 1596 | |
| 1597 // Now mark the scroll as not consumed (which would cause future | 1626 // Now mark the scroll as not consumed (which would cause future |
| 1598 // touchmoves in the active sequence to be sent if there was one). | 1627 // touchmoves in the active sequence to be sent if there was one). |
| 1599 SendGestureEventAck(WebInputEvent::GestureScrollBegin, | 1628 SendGestureEventAck(WebInputEvent::GestureScrollBegin, |
| 1600 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1629 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1601 | 1630 |
| 1602 // Start a new touch sequence and verify that absorption has been | 1631 // Start a new touch sequence and verify that absorption has been |
|
Rick Byers
2014/04/23 21:56:17
replace reference to "absorption" I guess...
| |
| 1603 // reset so that moves after the start of scrolling are not sent. | 1632 // reset so that moves after the start of scrolling are throttled. |
| 1604 PressTouchPoint(0, 1); | 1633 PressTouchPoint(0, 0); |
| 1605 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 1634 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 1606 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1635 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1607 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 1636 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1608 MoveTouchPoint(0, 0, 5); | 1637 MoveTouchPoint(0, 0, 5); |
| 1609 SetFollowupEvent(followup_scroll); | 1638 SetFollowupEvent(followup_scroll); |
| 1610 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1639 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1611 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 1640 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 1612 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 1641 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1613 MoveTouchPoint(0, 0, 10); | 1642 MoveTouchPoint(0, 0, 10); |
| 1614 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1643 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1644 EXPECT_TRUE(HasPendingAsyncTouchMove()); | |
| 1615 EXPECT_EQ(0U, queued_event_count()); | 1645 EXPECT_EQ(0U, queued_event_count()); |
| 1616 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 1646 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 1647 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | |
| 1648 | |
|
Rick Byers
2014/04/23 21:56:17
All the additional tests below look great - cover
jdduke (slow)
2014/04/23 22:56:48
:) Yeah, I actually had a few subtle bugs caught b
| |
| 1649 // As soon as a touchmove exceeds the outer slop region it will be forwarded | |
| 1650 // immediately. | |
| 1651 MoveTouchPoint(0, 0, 20); | |
| 1652 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
| 1653 EXPECT_FALSE(HasPendingAsyncTouchMove()); | |
| 1654 EXPECT_FALSE(sent_event().cancelable); | |
| 1655 EXPECT_EQ(0U, queued_event_count()); | |
| 1656 EXPECT_EQ(1U, GetAndResetSentEventCount()); | |
| 1657 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | |
| 1658 | |
| 1659 // Subsequent touchmove's should be deferred. | |
| 1660 MoveTouchPoint(0, 0, 25); | |
| 1661 EXPECT_TRUE(HasPendingAsyncTouchMove()); | |
| 1662 EXPECT_EQ(0U, queued_event_count()); | |
| 1663 EXPECT_EQ(0U, GetAndResetSentEventCount()); | |
| 1664 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | |
| 1665 | |
| 1666 // The pending touchmove should be flushed with the the new touchmove if | |
| 1667 // sufficient time has passed. | |
| 1668 AdvanceTouchTime(MinSecondsBetweenThrottledTouchmoves + 0.1); | |
| 1669 MoveTouchPoint(0, 0, 15); | |
| 1670 EXPECT_FALSE(HasPendingAsyncTouchMove()); | |
| 1671 EXPECT_FALSE(sent_event().cancelable); | |
| 1672 EXPECT_EQ(1U, queued_event_count()); | |
| 1673 EXPECT_EQ(1U, GetAndResetSentEventCount()); | |
| 1674 EXPECT_EQ(0U, GetAndResetAckedEventCount()); | |
| 1675 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
| 1676 EXPECT_EQ(0U, queued_event_count()); | |
| 1677 EXPECT_EQ(0U, GetAndResetSentEventCount()); | |
| 1678 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | |
| 1679 | |
| 1680 // Non-touchmove events should always flush any pending touchmove events. | |
| 1681 MoveTouchPoint(0, 0, 25); | |
| 1682 EXPECT_TRUE(HasPendingAsyncTouchMove()); | |
| 1683 EXPECT_EQ(0U, queued_event_count()); | |
| 1684 EXPECT_EQ(0U, GetAndResetSentEventCount()); | |
| 1685 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | |
| 1686 PressTouchPoint(30, 30); | |
| 1687 EXPECT_FALSE(HasPendingAsyncTouchMove()); | |
| 1688 EXPECT_FALSE(sent_event().cancelable); | |
| 1689 EXPECT_EQ(WebInputEvent::TouchMove, sent_event().type); | |
| 1690 EXPECT_EQ(1U, GetAndResetSentEventCount()); | |
| 1691 EXPECT_EQ(2U, queued_event_count()); | |
| 1692 | |
| 1693 // Ack'ing the flushed, async touchmove will dispatch the touchstart. Note | |
| 1694 // that the flushed touchmove's ack will not reach the client (its | |
| 1695 // constituent events have already been ack'ed). | |
| 1696 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
| 1697 EXPECT_FALSE(sent_event().cancelable); | |
| 1698 EXPECT_EQ(WebInputEvent::TouchStart, sent_event().type); | |
| 1699 EXPECT_EQ(1U, queued_event_count()); | |
| 1700 EXPECT_EQ(1U, GetAndResetSentEventCount()); | |
| 1701 EXPECT_EQ(0U, GetAndResetAckedEventCount()); | |
| 1702 | |
| 1703 // Ack the touchstart. | |
| 1704 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
| 1705 EXPECT_EQ(0U, queued_event_count()); | |
| 1706 EXPECT_EQ(0U, GetAndResetSentEventCount()); | |
| 1707 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | |
| 1708 | |
| 1709 // Send a secondary touchmove. | |
| 1710 MoveTouchPoint(1, 0, 25); | |
| 1711 EXPECT_TRUE(HasPendingAsyncTouchMove()); | |
| 1712 EXPECT_EQ(0U, queued_event_count()); | |
| 1713 EXPECT_EQ(0U, GetAndResetSentEventCount()); | |
| 1714 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | |
| 1715 | |
| 1716 // An unconsumed scroll should resume synchronous touch handling. | |
| 1717 SendGestureEventAck(WebInputEvent::GestureScrollUpdate, | |
| 1718 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
| 1719 | |
| 1720 // The pending touchmove should be coalesced with the next (now synchronous) | |
| 1721 // touchmove. | |
| 1722 MoveTouchPoint(0, 0, 25); | |
| 1723 EXPECT_TRUE(sent_event().cancelable); | |
| 1724 EXPECT_FALSE(HasPendingAsyncTouchMove()); | |
| 1725 EXPECT_EQ(WebInputEvent::TouchMove, sent_event().type); | |
| 1726 EXPECT_EQ(WebTouchPoint::StateMoved, sent_event().touches[0].state); | |
| 1727 EXPECT_EQ(WebTouchPoint::StateMoved, sent_event().touches[1].state); | |
| 1728 EXPECT_EQ(1U, queued_event_count()); | |
| 1729 EXPECT_EQ(1U, GetAndResetSentEventCount()); | |
| 1730 EXPECT_EQ(0U, GetAndResetAckedEventCount()); | |
| 1731 | |
| 1732 // Subsequent touches will queue until the preceding, synchronous touches are | |
| 1733 // ack'ed. | |
| 1734 ReleaseTouchPoint(1); | |
| 1735 EXPECT_EQ(2U, queued_event_count()); | |
| 1736 ReleaseTouchPoint(0); | |
| 1737 EXPECT_EQ(3U, queued_event_count()); | |
| 1738 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
| 1739 EXPECT_TRUE(sent_event().cancelable); | |
| 1740 EXPECT_EQ(WebInputEvent::TouchEnd, sent_event().type); | |
| 1741 EXPECT_EQ(2U, queued_event_count()); | |
| 1742 EXPECT_EQ(1U, GetAndResetSentEventCount()); | |
| 1743 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | |
| 1744 | |
| 1745 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
| 1746 EXPECT_TRUE(sent_event().cancelable); | |
| 1747 EXPECT_EQ(WebInputEvent::TouchEnd, sent_event().type); | |
| 1748 EXPECT_EQ(1U, queued_event_count()); | |
| 1749 EXPECT_EQ(1U, GetAndResetSentEventCount()); | |
| 1750 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | |
| 1751 | |
| 1752 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
| 1753 EXPECT_EQ(0U, queued_event_count()); | |
| 1754 EXPECT_EQ(0U, GetAndResetSentEventCount()); | |
| 1755 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | |
| 1617 } | 1756 } |
| 1618 | 1757 |
| 1619 } // namespace content | 1758 } // namespace content |
| OLD | NEW |