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

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

Issue 997283002: Coalesce async touch move events until the ack back from render (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 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
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"
(...skipping 16 matching lines...) Expand all
27 27
28 base::TimeDelta DefaultTouchTimeoutDelay() { 28 base::TimeDelta DefaultTouchTimeoutDelay() {
29 return base::TimeDelta::FromMilliseconds(1); 29 return base::TimeDelta::FromMilliseconds(1);
30 } 30 }
31 } // namespace 31 } // namespace
32 32
33 class TouchEventQueueTest : public testing::Test, 33 class TouchEventQueueTest : public testing::Test,
34 public TouchEventQueueClient { 34 public TouchEventQueueClient {
35 public: 35 public:
36 TouchEventQueueTest() 36 TouchEventQueueTest()
37 : sent_event_count_(0), 37 : acked_event_count_(0),
38 acked_event_count_(0),
39 last_acked_event_state_(INPUT_EVENT_ACK_STATE_UNKNOWN), 38 last_acked_event_state_(INPUT_EVENT_ACK_STATE_UNKNOWN),
40 slop_length_dips_(0) {} 39 slop_length_dips_(0) {}
41 40
42 ~TouchEventQueueTest() override {} 41 ~TouchEventQueueTest() override {}
43 42
44 // testing::Test 43 // testing::Test
45 void SetUp() override { 44 void SetUp() override {
46 ResetQueueWithConfig(TouchEventQueue::Config()); 45 ResetQueueWithConfig(TouchEventQueue::Config());
47 } 46 }
48 47
49 void TearDown() override { queue_.reset(); } 48 void TearDown() override { queue_.reset(); }
50 49
51 // TouchEventQueueClient 50 // TouchEventQueueClient
52 void SendTouchEventImmediately( 51 void SendTouchEventImmediately(
53 const TouchEventWithLatencyInfo& event) override { 52 const TouchEventWithLatencyInfo& event) override {
54 ++sent_event_count_; 53 sent_events_.push_back(event.event);
55 last_sent_event_ = event.event;
56 if (sync_ack_result_) { 54 if (sync_ack_result_) {
57 auto sync_ack_result = sync_ack_result_.Pass(); 55 auto sync_ack_result = sync_ack_result_.Pass();
58 SendTouchEventAck(*sync_ack_result); 56 SendTouchEventAck(*sync_ack_result);
59 } 57 }
60 } 58 }
61 59
62 void OnTouchEventAck(const TouchEventWithLatencyInfo& event, 60 void OnTouchEventAck(const TouchEventWithLatencyInfo& event,
63 InputEventAckState ack_result) override { 61 InputEventAckState ack_result) override {
64 ++acked_event_count_; 62 ++acked_event_count_;
65 last_acked_event_ = event.event; 63 last_acked_event_ = event.event;
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 WebGestureEvent event; 109 WebGestureEvent event;
112 event.type = type; 110 event.type = type;
113 queue_->OnGestureScrollEvent( 111 queue_->OnGestureScrollEvent(
114 GestureEventWithLatencyInfo(event, ui::LatencyInfo())); 112 GestureEventWithLatencyInfo(event, ui::LatencyInfo()));
115 } 113 }
116 114
117 void SendTouchEventAck(InputEventAckState ack_result) { 115 void SendTouchEventAck(InputEventAckState ack_result) {
118 queue_->ProcessTouchAck(ack_result, ui::LatencyInfo()); 116 queue_->ProcessTouchAck(ack_result, ui::LatencyInfo());
119 } 117 }
120 118
119 void SendUncancelableTouchMoveEventAck() {
120 queue_->ProcessUncancelableTouchMoveAck();
121 }
122
121 void SendGestureEventAck(WebInputEvent::Type type, 123 void SendGestureEventAck(WebInputEvent::Type type,
122 InputEventAckState ack_result) { 124 InputEventAckState ack_result) {
123 blink::WebGestureEvent gesture_event; 125 blink::WebGestureEvent gesture_event;
124 gesture_event.type = type; 126 gesture_event.type = type;
125 GestureEventWithLatencyInfo event(gesture_event, ui::LatencyInfo()); 127 GestureEventWithLatencyInfo event(gesture_event, ui::LatencyInfo());
126 queue_->OnGestureEventAck(event, ack_result); 128 queue_->OnGestureEventAck(event, ack_result);
127 } 129 }
128 130
129 void SetFollowupEvent(const WebTouchEvent& event) { 131 void SetFollowupEvent(const WebTouchEvent& event) {
130 followup_touch_event_.reset(new WebTouchEvent(event)); 132 followup_touch_event_.reset(new WebTouchEvent(event));
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 touch_event_ = SyntheticWebTouchEvent(); 219 touch_event_ = SyntheticWebTouchEvent();
218 } 220 }
219 221
220 size_t GetAndResetAckedEventCount() { 222 size_t GetAndResetAckedEventCount() {
221 size_t count = acked_event_count_; 223 size_t count = acked_event_count_;
222 acked_event_count_ = 0; 224 acked_event_count_ = 0;
223 return count; 225 return count;
224 } 226 }
225 227
226 size_t GetAndResetSentEventCount() { 228 size_t GetAndResetSentEventCount() {
227 size_t count = sent_event_count_; 229 size_t count = sent_events_.size();
228 sent_event_count_ = 0; 230 sent_events_.clear();
229 return count; 231 return count;
230 } 232 }
231 233
232 bool IsPendingAckTouchStart() const { 234 bool IsPendingAckTouchStart() const {
233 return queue_->IsPendingAckTouchStart(); 235 return queue_->IsPendingAckTouchStart();
234 } 236 }
235 237
236 void OnHasTouchEventHandlers(bool has_handlers) { 238 void OnHasTouchEventHandlers(bool has_handlers) {
237 queue_->OnHasTouchEventHandlers(has_handlers); 239 queue_->OnHasTouchEventHandlers(has_handlers);
238 } 240 }
(...skipping 12 matching lines...) Expand all
251 253
252 const WebTouchEvent& latest_event() const { 254 const WebTouchEvent& latest_event() const {
253 return queue_->GetLatestEventForTesting().event; 255 return queue_->GetLatestEventForTesting().event;
254 } 256 }
255 257
256 const WebTouchEvent& acked_event() const { 258 const WebTouchEvent& acked_event() const {
257 return last_acked_event_; 259 return last_acked_event_;
258 } 260 }
259 261
260 const WebTouchEvent& sent_event() const { 262 const WebTouchEvent& sent_event() const {
261 return last_sent_event_; 263 DCHECK(!sent_events_.empty());
264 return sent_events_.back();
265 }
266
267 const std::vector<WebTouchEvent> sent_all_events() const {
jdduke (slow) 2015/04/15 17:14:53 maybe |all_sent_events|, and you can return by con
lanwei 2015/04/17 20:49:00 Done.
268 return sent_events_;
262 } 269 }
263 270
264 InputEventAckState acked_event_state() const { 271 InputEventAckState acked_event_state() const {
265 return last_acked_event_state_; 272 return last_acked_event_state_;
266 } 273 }
267 274
268 static void RunTasksAndWait(base::TimeDelta delay) { 275 static void RunTasksAndWait(base::TimeDelta delay) {
269 base::MessageLoop::current()->PostDelayedTask( 276 base::MessageLoop::current()->PostDelayedTask(
270 FROM_HERE, base::MessageLoop::QuitClosure(), delay); 277 FROM_HERE, base::MessageLoop::QuitClosure(), delay);
271 base::MessageLoop::current()->Run(); 278 base::MessageLoop::current()->Run();
272 } 279 }
273 280
281 size_t uncancelable_touch_moves_pending_ack_count() const {
282 return queue_->uncancelable_touch_moves_pending_ack_count();
283 }
284
274 private: 285 private:
275 void SendTouchEvent() { 286 void SendTouchEvent() {
276 SendTouchEvent(touch_event_); 287 SendTouchEvent(touch_event_);
277 touch_event_.ResetPoints(); 288 touch_event_.ResetPoints();
278 } 289 }
279 290
280 void ResetQueueWithConfig(const TouchEventQueue::Config& config) { 291 void ResetQueueWithConfig(const TouchEventQueue::Config& config) {
281 queue_.reset(new TouchEventQueue(this, config)); 292 queue_.reset(new TouchEventQueue(this, config));
282 queue_->OnHasTouchEventHandlers(true); 293 queue_->OnHasTouchEventHandlers(true);
283 } 294 }
284 295
285 scoped_ptr<TouchEventQueue> queue_; 296 scoped_ptr<TouchEventQueue> queue_;
286 size_t sent_event_count_;
287 size_t acked_event_count_; 297 size_t acked_event_count_;
288 WebTouchEvent last_sent_event_;
289 WebTouchEvent last_acked_event_; 298 WebTouchEvent last_acked_event_;
299 std::vector<WebTouchEvent> sent_events_;
290 InputEventAckState last_acked_event_state_; 300 InputEventAckState last_acked_event_state_;
291 SyntheticWebTouchEvent touch_event_; 301 SyntheticWebTouchEvent touch_event_;
292 scoped_ptr<WebTouchEvent> followup_touch_event_; 302 scoped_ptr<WebTouchEvent> followup_touch_event_;
293 scoped_ptr<WebGestureEvent> followup_gesture_event_; 303 scoped_ptr<WebGestureEvent> followup_gesture_event_;
294 scoped_ptr<InputEventAckState> sync_ack_result_; 304 scoped_ptr<InputEventAckState> sync_ack_result_;
295 double slop_length_dips_; 305 double slop_length_dips_;
296 gfx::PointF anchor_; 306 gfx::PointF anchor_;
297 base::MessageLoopForUI message_loop_; 307 base::MessageLoopForUI message_loop_;
298 }; 308 };
299 309
(...skipping 723 matching lines...) Expand 10 before | Expand all | Expand 10 after
1023 // The timeout should have fired, synthetically ack'ing the timed-out event. 1033 // The timeout should have fired, synthetically ack'ing the timed-out event.
1024 // TouchEvent forwarding is disabled until the ack is received for the 1034 // TouchEvent forwarding is disabled until the ack is received for the
1025 // timed-out event and the future cancel event. 1035 // timed-out event and the future cancel event.
1026 EXPECT_FALSE(IsTimeoutRunning()); 1036 EXPECT_FALSE(IsTimeoutRunning());
1027 EXPECT_EQ(0U, GetAndResetSentEventCount()); 1037 EXPECT_EQ(0U, GetAndResetSentEventCount());
1028 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 1038 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1029 1039
1030 // Ack'ing the original event should trigger a cancel event. 1040 // Ack'ing the original event should trigger a cancel event.
1031 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1041 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1032 EXPECT_FALSE(IsTimeoutRunning()); 1042 EXPECT_FALSE(IsTimeoutRunning());
1043 EXPECT_EQ(WebInputEvent::TouchCancel, sent_event().type);
1044 EXPECT_FALSE(sent_event().cancelable);
1033 EXPECT_EQ(0U, GetAndResetAckedEventCount()); 1045 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1034 EXPECT_EQ(1U, GetAndResetSentEventCount()); 1046 EXPECT_EQ(1U, GetAndResetSentEventCount());
1035 EXPECT_EQ(WebInputEvent::TouchCancel, sent_event().type);
1036 EXPECT_FALSE(sent_event().cancelable);
1037 1047
1038 // Touch events should not be forwarded until we receive the cancel acks. 1048 // Touch events should not be forwarded until we receive the cancel acks.
1039 MoveTouchPoint(0, 1, 1); 1049 MoveTouchPoint(0, 1, 1);
1040 ASSERT_EQ(0U, GetAndResetSentEventCount()); 1050 ASSERT_EQ(0U, GetAndResetSentEventCount());
1041 ASSERT_EQ(1U, GetAndResetAckedEventCount()); 1051 ASSERT_EQ(1U, GetAndResetAckedEventCount());
1042 1052
1043 ReleaseTouchPoint(0); 1053 ReleaseTouchPoint(0);
1044 ASSERT_EQ(0U, GetAndResetSentEventCount()); 1054 ASSERT_EQ(0U, GetAndResetSentEventCount());
1045 ASSERT_EQ(1U, GetAndResetAckedEventCount()); 1055 ASSERT_EQ(1U, GetAndResetAckedEventCount());
1046 1056
1047 // The synthetic TouchCancel ack should not reach the client, but should 1057 // The synthetic TouchCancel ack should not reach the client, but should
1048 // resume touch forwarding. 1058 // resume touch forwarding.
1049 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1059 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1050 EXPECT_EQ(0U, GetAndResetSentEventCount()); 1060 EXPECT_EQ(0U, GetAndResetSentEventCount());
1051 EXPECT_EQ(0U, GetAndResetAckedEventCount()); 1061 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1052 1062
1053 // Subsequent events should be handled normally. 1063 // Subsequent events should be handled normally.
1054 PressTouchPoint(0, 1); 1064 PressTouchPoint(0, 1);
1065 EXPECT_EQ(WebInputEvent::TouchStart, sent_event().type);
1066 EXPECT_TRUE(sent_event().cancelable);
1055 EXPECT_EQ(1U, GetAndResetSentEventCount()); 1067 EXPECT_EQ(1U, GetAndResetSentEventCount());
1056 EXPECT_EQ(0U, GetAndResetAckedEventCount()); 1068 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1057 EXPECT_EQ(WebInputEvent::TouchStart, sent_event().type);
1058 EXPECT_TRUE(sent_event().cancelable);
1059 } 1069 }
1060 1070
1061 // Tests that the timeout is never started if the renderer consumes 1071 // Tests that the timeout is never started if the renderer consumes
1062 // a TouchEvent from the current touch sequence. 1072 // a TouchEvent from the current touch sequence.
1063 TEST_F(TouchEventQueueTest, NoTouchTimeoutIfRendererIsConsumingGesture) { 1073 TEST_F(TouchEventQueueTest, NoTouchTimeoutIfRendererIsConsumingGesture) {
1064 SetUpForTimeoutTesting(DefaultTouchTimeoutDelay()); 1074 SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
1065 1075
1066 // Queue a TouchStart. 1076 // Queue a TouchStart.
1067 PressTouchPoint(0, 1); 1077 PressTouchPoint(0, 1);
1068 ASSERT_TRUE(IsTimeoutRunning()); 1078 ASSERT_TRUE(IsTimeoutRunning());
(...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after
1578 1588
1579 // Now queue a second touchmove and verify it's not (yet) dispatched. 1589 // Now queue a second touchmove and verify it's not (yet) dispatched.
1580 MoveTouchPoint(0, 0, 100); 1590 MoveTouchPoint(0, 0, 100);
1581 SetFollowupEvent(followup_scroll); 1591 SetFollowupEvent(followup_scroll);
1582 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1592 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1583 EXPECT_TRUE(HasPendingAsyncTouchMove()); 1593 EXPECT_TRUE(HasPendingAsyncTouchMove());
1584 EXPECT_EQ(0U, queued_event_count()); 1594 EXPECT_EQ(0U, queued_event_count());
1585 EXPECT_EQ(0U, GetAndResetSentEventCount()); 1595 EXPECT_EQ(0U, GetAndResetSentEventCount());
1586 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 1596 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1587 1597
1588 // Queuing the final touchend should flush the pending, async touchmove. 1598 // Queuing the final touchend should flush the pending async touchmove. In
1599 // this case, we will first dispatch an async touchmove and then a touchend.
1600 // For the async touchmove, we will only ack the client.
1589 ReleaseTouchPoint(0); 1601 ReleaseTouchPoint(0);
1590 followup_scroll.type = WebInputEvent::GestureScrollEnd; 1602 followup_scroll.type = WebInputEvent::GestureScrollEnd;
1591 SetFollowupEvent(followup_scroll); 1603 SetFollowupEvent(followup_scroll);
1592 EXPECT_EQ(WebInputEvent::TouchMove, sent_event().type);
1593 EXPECT_FALSE(HasPendingAsyncTouchMove()); 1604 EXPECT_FALSE(HasPendingAsyncTouchMove());
1594 EXPECT_FALSE(sent_event().cancelable); 1605 EXPECT_EQ(2U, sent_all_events().size());
1595 EXPECT_EQ(1U, GetAndResetSentEventCount()); 1606 EXPECT_EQ(WebInputEvent::TouchMove, sent_all_events()[0].type);
1596 EXPECT_EQ(2U, queued_event_count()); 1607 EXPECT_FALSE(sent_all_events()[0].cancelable);
1597 1608 EXPECT_EQ(WebInputEvent::TouchEnd, sent_all_events()[1].type);
1598 // Ack the flushed, async touchmove. The ack should not reach the client, but 1609 EXPECT_FALSE(sent_all_events()[1].cancelable);
1599 // it should trigger sending of the (now non-cancelable) touchend. 1610 EXPECT_EQ(2U, GetAndResetSentEventCount());
1600 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1611 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1601 EXPECT_EQ(WebInputEvent::TouchEnd, sent_event().type);
1602 EXPECT_FALSE(sent_event().cancelable);
1603 EXPECT_EQ(1U, GetAndResetSentEventCount());
1604 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1605 EXPECT_EQ(1U, queued_event_count()); 1612 EXPECT_EQ(1U, queued_event_count());
1606 1613
1607 // Ack the touchend. 1614 // Ack the touchend.
1608 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1615 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1609 EXPECT_EQ(0U, queued_event_count()); 1616 EXPECT_EQ(0U, queued_event_count());
1610 EXPECT_EQ(0U, GetAndResetSentEventCount()); 1617 EXPECT_EQ(0U, GetAndResetSentEventCount());
1611 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 1618 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1612 1619
1613 // Now mark the scrolls as not consumed (which would cause future touchmoves 1620 // Now mark the scrolls as not consumed (which would cause future touchmoves
1614 // in the active sequence to be sent if there was one). 1621 // in the active sequence to be sent if there was one).
(...skipping 12 matching lines...) Expand all
1627 followup_scroll.type = WebInputEvent::GestureScrollBegin; 1634 followup_scroll.type = WebInputEvent::GestureScrollBegin;
1628 SetFollowupEvent(followup_scroll); 1635 SetFollowupEvent(followup_scroll);
1629 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1636 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1630 EXPECT_EQ(1U, GetAndResetSentEventCount()); 1637 EXPECT_EQ(1U, GetAndResetSentEventCount());
1631 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 1638 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1632 1639
1633 MoveTouchPoint(0, 0, 6); 1640 MoveTouchPoint(0, 0, 6);
1634 followup_scroll.type = WebInputEvent::GestureScrollUpdate; 1641 followup_scroll.type = WebInputEvent::GestureScrollUpdate;
1635 SetFollowupEvent(followup_scroll); 1642 SetFollowupEvent(followup_scroll);
1636 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1643 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1644 SendUncancelableTouchMoveEventAck();
1637 EXPECT_FALSE(HasPendingAsyncTouchMove()); 1645 EXPECT_FALSE(HasPendingAsyncTouchMove());
1638 EXPECT_EQ(1U, GetAndResetSentEventCount()); 1646 EXPECT_EQ(1U, GetAndResetSentEventCount());
1639 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 1647 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1640 1648
1641 MoveTouchPoint(0, 0, 10); 1649 MoveTouchPoint(0, 0, 10);
1642 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1650 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1643 EXPECT_TRUE(HasPendingAsyncTouchMove()); 1651 EXPECT_TRUE(HasPendingAsyncTouchMove());
1644 EXPECT_EQ(0U, queued_event_count()); 1652 EXPECT_EQ(0U, queued_event_count());
1645 EXPECT_EQ(0U, GetAndResetSentEventCount()); 1653 EXPECT_EQ(0U, GetAndResetSentEventCount());
1646 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 1654 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1647 1655
1648 // Subsequent touchmove's should be deferred. 1656 // Subsequent touchmove's should be deferred.
1649 MoveTouchPoint(0, 0, 25); 1657 MoveTouchPoint(0, 0, 25);
1650 EXPECT_TRUE(HasPendingAsyncTouchMove()); 1658 EXPECT_TRUE(HasPendingAsyncTouchMove());
1651 EXPECT_EQ(0U, queued_event_count()); 1659 EXPECT_EQ(0U, queued_event_count());
1652 EXPECT_EQ(0U, GetAndResetSentEventCount()); 1660 EXPECT_EQ(0U, GetAndResetSentEventCount());
1653 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 1661 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1654 1662
1655 // The pending touchmove should be flushed with the the new touchmove if 1663 // The pending touchmove should be flushed with the the new touchmove if
1656 // sufficient time has passed. 1664 // sufficient time has passed and ack to the client.
1657 AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1); 1665 AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1);
1658 MoveTouchPoint(0, 0, 15); 1666 MoveTouchPoint(0, 0, 15);
1659 EXPECT_FALSE(HasPendingAsyncTouchMove()); 1667 EXPECT_FALSE(HasPendingAsyncTouchMove());
1660 EXPECT_FALSE(sent_event().cancelable); 1668 EXPECT_FALSE(sent_event().cancelable);
1661 EXPECT_EQ(1U, queued_event_count()); 1669 EXPECT_EQ(0U, queued_event_count());
1662 EXPECT_EQ(1U, GetAndResetSentEventCount()); 1670 EXPECT_EQ(1U, GetAndResetSentEventCount());
1663 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1664 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1665 EXPECT_EQ(0U, queued_event_count());
1666 EXPECT_EQ(0U, GetAndResetSentEventCount());
1667 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 1671 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1668 1672
1669 // Non-touchmove events should always flush any pending touchmove events. 1673 // Non-touchmove events should always flush any pending touchmove events. In
1674 // this case, we will first dispatch an async touchmove and then a
1675 // touchstart. For the async touchmove, we will only ack the client.
1670 MoveTouchPoint(0, 0, 25); 1676 MoveTouchPoint(0, 0, 25);
1671 EXPECT_TRUE(HasPendingAsyncTouchMove()); 1677 EXPECT_TRUE(HasPendingAsyncTouchMove());
1672 EXPECT_EQ(0U, queued_event_count()); 1678 EXPECT_EQ(0U, queued_event_count());
1673 EXPECT_EQ(0U, GetAndResetSentEventCount()); 1679 EXPECT_EQ(0U, GetAndResetSentEventCount());
1674 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 1680 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1675 PressTouchPoint(30, 30); 1681 PressTouchPoint(30, 30);
1676 EXPECT_FALSE(HasPendingAsyncTouchMove()); 1682 EXPECT_FALSE(HasPendingAsyncTouchMove());
1677 EXPECT_FALSE(sent_event().cancelable); 1683 EXPECT_EQ(2U, sent_all_events().size());
1678 EXPECT_EQ(WebInputEvent::TouchMove, sent_event().type); 1684 EXPECT_EQ(WebInputEvent::TouchMove, sent_all_events()[0].type);
1679 EXPECT_EQ(1U, GetAndResetSentEventCount()); 1685 EXPECT_FALSE(sent_all_events()[0].cancelable);
1680 EXPECT_EQ(2U, queued_event_count()); 1686 EXPECT_EQ(WebInputEvent::TouchStart, sent_all_events()[1].type);
1681 1687 EXPECT_TRUE(sent_all_events()[1].cancelable);
1682 // Ack'ing the flushed, async touchmove will dispatch the touchstart. Note 1688 EXPECT_EQ(2U, GetAndResetSentEventCount());
1683 // that the flushed touchmove's ack will not reach the client (its 1689 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1684 // constituent events have already been ack'ed).
1685 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1686 EXPECT_TRUE(sent_event().cancelable);
1687 EXPECT_EQ(WebInputEvent::TouchStart, sent_event().type);
1688 EXPECT_EQ(1U, queued_event_count()); 1690 EXPECT_EQ(1U, queued_event_count());
1689 EXPECT_EQ(1U, GetAndResetSentEventCount());
1690 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1691 1691
1692 // Ack the touchstart. 1692 // Ack the touchstart.
1693 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1693 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1694 EXPECT_EQ(0U, queued_event_count()); 1694 EXPECT_EQ(0U, queued_event_count());
1695 EXPECT_EQ(0U, GetAndResetSentEventCount()); 1695 EXPECT_EQ(0U, GetAndResetSentEventCount());
1696 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 1696 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1697 1697
1698 // Send a secondary touchmove. 1698 // Send a secondary touchmove.
1699 MoveTouchPoint(1, 0, 25); 1699 MoveTouchPoint(1, 0, 25);
1700 EXPECT_TRUE(HasPendingAsyncTouchMove()); 1700 EXPECT_TRUE(HasPendingAsyncTouchMove());
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
1774 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 1774 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1775 1775
1776 // Return the touch sequence to the original touchstart position. Note that 1776 // Return the touch sequence to the original touchstart position. Note that
1777 // this (0, 0) touchmove will coalesce with the previous (0, 100) touchmove. 1777 // this (0, 0) touchmove will coalesce with the previous (0, 100) touchmove.
1778 MoveTouchPoint(0, 0, 0); 1778 MoveTouchPoint(0, 0, 0);
1779 EXPECT_TRUE(HasPendingAsyncTouchMove()); 1779 EXPECT_TRUE(HasPendingAsyncTouchMove());
1780 EXPECT_EQ(0U, queued_event_count()); 1780 EXPECT_EQ(0U, queued_event_count());
1781 EXPECT_EQ(0U, GetAndResetSentEventCount()); 1781 EXPECT_EQ(0U, GetAndResetSentEventCount());
1782 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 1782 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1783 1783
1784 // Queuing the final touchend should flush the pending, async touchmove. 1784 // Queuing the final touchend should flush the pending, async touchmove. In
1785 // this case, we will first dispatch an async touchmove and then a touchend.
1786 // For the async touchmove, we will only ack the client.
1785 ReleaseTouchPoint(0); 1787 ReleaseTouchPoint(0);
1786 EXPECT_FALSE(HasPendingAsyncTouchMove()); 1788 EXPECT_FALSE(HasPendingAsyncTouchMove());
1787 EXPECT_EQ(WebInputEvent::TouchMove, sent_event().type); 1789 EXPECT_EQ(2U, sent_all_events().size());
1788 EXPECT_FALSE(sent_event().cancelable); 1790 EXPECT_EQ(WebInputEvent::TouchMove, sent_all_events()[0].type);
1789 EXPECT_EQ(0, sent_event().touches[0].position.x); 1791 EXPECT_FALSE(sent_all_events()[0].cancelable);
1790 EXPECT_EQ(0, sent_event().touches[0].position.y); 1792 EXPECT_EQ(0, sent_all_events()[0].touches[0].position.x);
1791 EXPECT_EQ(1U, GetAndResetSentEventCount()); 1793 EXPECT_EQ(0, sent_all_events()[0].touches[0].position.y);
1792 1794 EXPECT_EQ(WebInputEvent::TouchEnd, sent_all_events()[1].type);
1793 // Touchend is not cancelable during async touch dispatch. 1795 EXPECT_FALSE(sent_all_events()[1].cancelable);
1794 SendTouchEventAck(INPUT_EVENT_ACK_STATE_IGNORED); 1796 EXPECT_EQ(2U, GetAndResetSentEventCount());
1795 EXPECT_EQ(WebInputEvent::TouchEnd, sent_event().type); 1797 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1796 EXPECT_FALSE(sent_event().cancelable);
1797 EXPECT_EQ(1U, GetAndResetSentEventCount());
1798 } 1798 }
1799 1799
1800 // Ensure that async touch dispatch and touch ack timeout interactions work 1800 // Ensure that async touch dispatch and touch ack timeout interactions work
1801 // appropriately. 1801 // appropriately.
1802 TEST_F(TouchEventQueueTest, AsyncTouchWithAckTimeout) { 1802 TEST_F(TouchEventQueueTest, AsyncTouchWithAckTimeout) {
1803 SetUpForTimeoutTesting(DefaultTouchTimeoutDelay()); 1803 SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
1804 1804
1805 // The touchstart should start the timeout. 1805 // The touchstart should start the timeout.
1806 PressTouchPoint(0, 0); 1806 PressTouchPoint(0, 0);
1807 EXPECT_EQ(1U, GetAndResetSentEventCount()); 1807 EXPECT_EQ(1U, GetAndResetSentEventCount());
(...skipping 20 matching lines...) Expand all
1828 // it should not start the touch ack timeout. 1828 // it should not start the touch ack timeout.
1829 MoveTouchPoint(0, 5, 5); 1829 MoveTouchPoint(0, 5, 5);
1830 EXPECT_TRUE(HasPendingAsyncTouchMove()); 1830 EXPECT_TRUE(HasPendingAsyncTouchMove());
1831 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 1831 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1832 1832
1833 AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1); 1833 AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1);
1834 MoveTouchPoint(0, 5, 5); 1834 MoveTouchPoint(0, 5, 5);
1835 EXPECT_FALSE(IsTimeoutRunning()); 1835 EXPECT_FALSE(IsTimeoutRunning());
1836 EXPECT_FALSE(HasPendingAsyncTouchMove()); 1836 EXPECT_FALSE(HasPendingAsyncTouchMove());
1837 EXPECT_FALSE(sent_event().cancelable); 1837 EXPECT_FALSE(sent_event().cancelable);
1838 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1839 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 1838 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1840 EXPECT_EQ(1U, GetAndResetSentEventCount()); 1839 EXPECT_EQ(1U, GetAndResetSentEventCount());
1841 1840
1842 // An unconsumed scroll event will resume synchronous touchmoves, which are 1841 // An unconsumed scroll event will resume synchronous touchmoves, which are
1843 // subject to the ack timeout. 1842 // subject to the ack timeout.
1844 SendGestureEventAck(WebInputEvent::GestureScrollUpdate, 1843 SendGestureEventAck(WebInputEvent::GestureScrollUpdate,
1845 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1844 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1846 MoveTouchPoint(0, 20, 5); 1845 MoveTouchPoint(0, 20, 5);
1847 EXPECT_TRUE(IsTimeoutRunning()); 1846 EXPECT_TRUE(IsTimeoutRunning());
1848 EXPECT_TRUE(sent_event().cancelable); 1847 EXPECT_TRUE(sent_event().cancelable);
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1901 1900
1902 // The async touchmove should be ack'ed immediately, but not forwarded. 1901 // The async touchmove should be ack'ed immediately, but not forwarded.
1903 // However, because the ack triggers a touchcancel, both the pending touch and 1902 // However, because the ack triggers a touchcancel, both the pending touch and
1904 // the queued touchcancel should be flushed. 1903 // the queued touchcancel should be flushed.
1905 WebTouchEvent followup_cancel; 1904 WebTouchEvent followup_cancel;
1906 followup_cancel.type = WebInputEvent::TouchCancel; 1905 followup_cancel.type = WebInputEvent::TouchCancel;
1907 followup_cancel.touchesLength = 1; 1906 followup_cancel.touchesLength = 1;
1908 followup_cancel.touches[0].state = WebTouchPoint::StateCancelled; 1907 followup_cancel.touches[0].state = WebTouchPoint::StateCancelled;
1909 SetFollowupEvent(followup_cancel); 1908 SetFollowupEvent(followup_cancel);
1910 MoveTouchPoint(0, 5, 5); 1909 MoveTouchPoint(0, 5, 5);
1911 EXPECT_EQ(2U, queued_event_count()); 1910 EXPECT_EQ(1U, queued_event_count());
1912 EXPECT_FALSE(sent_event().cancelable); 1911 EXPECT_EQ(2U, sent_all_events().size());
1913 EXPECT_FALSE(HasPendingAsyncTouchMove()); 1912 EXPECT_EQ(WebInputEvent::TouchMove, sent_all_events()[0].type);
1913 EXPECT_FALSE(sent_all_events()[0].cancelable);
1914 EXPECT_EQ(WebInputEvent::TouchCancel, sent_all_events()[1].type);
1915 EXPECT_FALSE(sent_all_events()[1].cancelable);
1916 EXPECT_EQ(2U, GetAndResetSentEventCount());
1917 // The first ack is because the async touchmove is not ready for dispatching
1918 // send the ack immediately, the second ack is when flushing the async
1919 // touchmove, ack to client right away.
1920 EXPECT_EQ(2U, GetAndResetAckedEventCount());
1914 EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type); 1921 EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type);
1915 EXPECT_EQ(WebInputEvent::TouchMove, sent_event().type);
1916 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1917 EXPECT_EQ(1U, GetAndResetSentEventCount());
1918
1919 // The ack for the async touchmove should not reach the client, as it has
1920 // already been ack'ed.
1921 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1922 EXPECT_FALSE(sent_event().cancelable);
1923 EXPECT_EQ(1U, queued_event_count());
1924 EXPECT_EQ(WebInputEvent::TouchCancel, sent_event().type);
1925 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1926 EXPECT_EQ(1U, GetAndResetSentEventCount());
1927 1922
1928 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1923 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1929 EXPECT_EQ(0U, queued_event_count()); 1924 EXPECT_EQ(0U, queued_event_count());
1930 EXPECT_EQ(WebInputEvent::TouchCancel, acked_event().type); 1925 EXPECT_EQ(WebInputEvent::TouchCancel, acked_event().type);
1931 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 1926 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1932 EXPECT_EQ(0U, GetAndResetSentEventCount()); 1927 EXPECT_EQ(0U, GetAndResetSentEventCount());
1933 } 1928 }
1934 1929
1935 // Ensure that the async touch is fully reset if the touch sequence restarts 1930 // Ensure that the async touch is fully reset if the touch sequence restarts
1936 // without properly terminating. 1931 // without properly terminating.
(...skipping 21 matching lines...) Expand all
1958 EXPECT_EQ(0U, queued_event_count()); 1953 EXPECT_EQ(0U, queued_event_count());
1959 EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type); 1954 EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type);
1960 1955
1961 // The queue should be robust to hard touch restarts with a new touch 1956 // The queue should be robust to hard touch restarts with a new touch
1962 // sequence. In this case, the deferred async touch should not be flushed 1957 // sequence. In this case, the deferred async touch should not be flushed
1963 // by the new touch sequence. 1958 // by the new touch sequence.
1964 SendGestureEvent(WebInputEvent::GestureScrollEnd); 1959 SendGestureEvent(WebInputEvent::GestureScrollEnd);
1965 ResetTouchEvent(); 1960 ResetTouchEvent();
1966 1961
1967 PressTouchPoint(0, 0); 1962 PressTouchPoint(0, 0);
1968 EXPECT_EQ(1U, GetAndResetSentEventCount());
1969 EXPECT_EQ(WebInputEvent::TouchStart, sent_event().type); 1963 EXPECT_EQ(WebInputEvent::TouchStart, sent_event().type);
1970 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1964 EXPECT_EQ(1U, GetAndResetSentEventCount());
1965 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1966 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1967 }
1968
1969 // Ensure that even when the interval expires, we still need to wait for the
1970 // ack sent back from render to send the next async touchmove once the scroll
1971 // starts.
1972 TEST_F(TouchEventQueueTest, SendNextThrottledAsyncTouchMoveAfterAck) {
1973 // Process a TouchStart
1974 PressTouchPoint(0, 1);
1975 EXPECT_EQ(1U, GetAndResetSentEventCount());
1976 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1977 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1978
1979 // Initiate async touchmove dispatch after the start of a scroll sequence.
1980 MoveTouchPoint(0, 0, 5);
1981 WebGestureEvent followup_scroll;
1982 followup_scroll.type = WebInputEvent::GestureScrollBegin;
1983 SetFollowupEvent(followup_scroll);
1984 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1985 EXPECT_EQ(1U, GetAndResetSentEventCount());
1986 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1987
1988 MoveTouchPoint(0, 0, 10);
1989 followup_scroll.type = WebInputEvent::GestureScrollUpdate;
1990 SetFollowupEvent(followup_scroll);
1991 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1992 EXPECT_FALSE(HasPendingAsyncTouchMove());
1993 EXPECT_EQ(1U, GetAndResetSentEventCount());
1994 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1995
1996 // We set the next touch event time to be after the throttled interval.
1997 AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1);
1998 // Dispatch the touch move event when sufficient time has passed.
1999 MoveTouchPoint(0, 0, 40);
2000 EXPECT_FALSE(HasPendingAsyncTouchMove());
2001 EXPECT_FALSE(sent_event().cancelable);
2002 // When we dispatch an async touchmove, we do not put it back to the queue
2003 // any more and we will ack to client right away.
2004 EXPECT_EQ(0U, queued_event_count());
2005 EXPECT_EQ(1U, GetAndResetSentEventCount());
2006 EXPECT_EQ(1U, GetAndResetAckedEventCount());
2007 EXPECT_EQ(1U, uncancelable_touch_moves_pending_ack_count());
2008
2009 // Do not dispatch the event until throttledTouchmoves intervals expires and
2010 // receive an ack from render.
2011 AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1);
2012 MoveTouchPoint(0, 0, 50);
2013 EXPECT_TRUE(HasPendingAsyncTouchMove());
2014 EXPECT_EQ(0U, queued_event_count());
2015 EXPECT_EQ(0U, GetAndResetSentEventCount());
2016 EXPECT_EQ(1U, GetAndResetAckedEventCount());
2017 EXPECT_EQ(1U, uncancelable_touch_moves_pending_ack_count());
2018
2019 // Send pending_async_touch_move_ when we receive an ack back from render.
2020 SendUncancelableTouchMoveEventAck();
2021 EXPECT_FALSE(HasPendingAsyncTouchMove());
2022 EXPECT_EQ(0U, queued_event_count());
2023 EXPECT_EQ(1U, GetAndResetSentEventCount());
2024 EXPECT_EQ(1U, GetAndResetAckedEventCount());
2025 EXPECT_EQ(1U, uncancelable_touch_moves_pending_ack_count());
2026 }
2027
2028 // Ensure that even when we receive the ack from render, we still need to wait
2029 // for the interval expires to send the next async touchmove once the scroll
2030 // starts.
2031 TEST_F(TouchEventQueueTest, SendNextAsyncTouchMoveAfterAckAndTimeExpire) {
2032 // Process a TouchStart
2033 PressTouchPoint(0, 1);
2034 EXPECT_EQ(1U, GetAndResetSentEventCount());
2035 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2036 EXPECT_EQ(1U, GetAndResetAckedEventCount());
2037
2038 // Initiate async touchmove dispatch after the start of a scroll sequence.
2039 MoveTouchPoint(0, 0, 5);
2040 WebGestureEvent followup_scroll;
2041 followup_scroll.type = WebInputEvent::GestureScrollBegin;
2042 SetFollowupEvent(followup_scroll);
2043 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2044 EXPECT_EQ(1U, GetAndResetSentEventCount());
2045 EXPECT_EQ(1U, GetAndResetAckedEventCount());
2046
2047 MoveTouchPoint(0, 0, 10);
2048 followup_scroll.type = WebInputEvent::GestureScrollUpdate;
2049 SetFollowupEvent(followup_scroll);
2050 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2051 EXPECT_FALSE(HasPendingAsyncTouchMove());
2052 EXPECT_EQ(1U, GetAndResetSentEventCount());
2053 EXPECT_EQ(1U, GetAndResetAckedEventCount());
2054
2055 // Dispatch the touch move event when sufficient time has passed.
2056 AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1);
2057 MoveTouchPoint(0, 0, 40);
2058 EXPECT_FALSE(HasPendingAsyncTouchMove());
2059 EXPECT_FALSE(sent_event().cancelable);
2060 // When we dispatch an async touchmove, we do not put it back to the queue
2061 // any more and we will ack to client right away.
2062 EXPECT_EQ(0U, queued_event_count());
2063 EXPECT_EQ(1U, GetAndResetSentEventCount());
2064 EXPECT_EQ(1U, GetAndResetAckedEventCount());
2065 EXPECT_EQ(1U, uncancelable_touch_moves_pending_ack_count());
2066
2067 // We receive an ack back from render but the time interval is not expired,
2068 // so we do not dispatch the touch move event.
2069 SendUncancelableTouchMoveEventAck();
2070 EXPECT_EQ(0U, uncancelable_touch_moves_pending_ack_count());
2071 MoveTouchPoint(0, 0, 50);
2072 EXPECT_TRUE(HasPendingAsyncTouchMove());
2073 EXPECT_EQ(0U, queued_event_count());
2074 EXPECT_EQ(0U, GetAndResetSentEventCount());
2075 EXPECT_EQ(1U, GetAndResetAckedEventCount());
2076
2077 // Dispatch the touch move when sufficient time has passed.
2078 AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1);
2079 MoveTouchPoint(0, 0, 50);
2080 EXPECT_FALSE(HasPendingAsyncTouchMove());
2081 EXPECT_EQ(WebInputEvent::TouchMove, sent_event().type);
2082 EXPECT_FALSE(sent_event().cancelable);
2083 EXPECT_EQ(0U, queued_event_count());
2084 EXPECT_EQ(1U, GetAndResetSentEventCount());
2085 EXPECT_EQ(1U, GetAndResetAckedEventCount());
2086 EXPECT_EQ(1U, uncancelable_touch_moves_pending_ack_count());
2087 }
2088
2089 TEST_F(TouchEventQueueTest, AsyncTouchFlushedByNonTouchMove) {
2090 // Process a TouchStart
2091 PressTouchPoint(0, 1);
2092 EXPECT_EQ(1U, GetAndResetSentEventCount());
2093 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2094 EXPECT_EQ(1U, GetAndResetAckedEventCount());
2095
2096 // Initiate async touchmove dispatch after the start of a scroll sequence.
2097 MoveTouchPoint(0, 0, 5);
2098 WebGestureEvent followup_scroll;
2099 followup_scroll.type = WebInputEvent::GestureScrollBegin;
2100 SetFollowupEvent(followup_scroll);
2101 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2102 EXPECT_EQ(1U, GetAndResetSentEventCount());
2103 EXPECT_EQ(1U, GetAndResetAckedEventCount());
2104
2105 MoveTouchPoint(0, 0, 10);
2106 followup_scroll.type = WebInputEvent::GestureScrollUpdate;
2107 SetFollowupEvent(followup_scroll);
2108 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2109 EXPECT_FALSE(HasPendingAsyncTouchMove());
2110 EXPECT_EQ(1U, GetAndResetSentEventCount());
2111 EXPECT_EQ(1U, GetAndResetAckedEventCount());
2112
2113 // Dispatch the touch move when sufficient time has passed.
2114 AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1);
2115 MoveTouchPoint(0, 0, 40);
2116 EXPECT_FALSE(HasPendingAsyncTouchMove());
2117 EXPECT_FALSE(sent_event().cancelable);
2118 // When we dispatch an async touchmove, we do not put it back to the queue
2119 // any more and we will ack to client right away.
2120 EXPECT_EQ(0U, queued_event_count());
2121 EXPECT_EQ(1U, GetAndResetSentEventCount());
2122 EXPECT_EQ(1U, GetAndResetAckedEventCount());
2123 EXPECT_EQ(1U, uncancelable_touch_moves_pending_ack_count());
2124
2125 for (int i = 0; i < 3; ++i) {
2126 // We throttle the touchmoves, put it in the pending_async_touch_move_,
2127 // do not dispatch it.
2128 MoveTouchPoint(0, 10 + 10 * i, 10 + 10 * i);
2129 EXPECT_TRUE(HasPendingAsyncTouchMove());
2130 EXPECT_EQ(0U, queued_event_count());
2131 EXPECT_EQ(0U, GetAndResetSentEventCount());
2132 EXPECT_EQ(1U, GetAndResetAckedEventCount());
2133 EXPECT_EQ(static_cast<size_t>(i + 1),
2134 uncancelable_touch_moves_pending_ack_count());
2135
2136 // Send touchstart will flush pending_async_touch_move_, and increase the
2137 // count. In this case, we will first dispatch an async touchmove and
2138 // then a touchstart. For the async touchmove, we will only ack the client.
2139 PressTouchPoint(30, 30);
2140 EXPECT_FALSE(HasPendingAsyncTouchMove());
2141 EXPECT_EQ(2U, sent_all_events().size());
2142 EXPECT_EQ(WebInputEvent::TouchMove, sent_all_events()[0].type);
2143 EXPECT_FALSE(sent_all_events()[0].cancelable);
2144 EXPECT_EQ(10 + 10 * i, sent_all_events()[0].touches[0].position.x);
2145 EXPECT_EQ(10 + 10 * i, sent_all_events()[0].touches[0].position.y);
2146 EXPECT_EQ(static_cast<size_t>(i + 2),
2147 uncancelable_touch_moves_pending_ack_count());
2148 EXPECT_EQ(WebInputEvent::TouchStart, sent_all_events()[1].type);
2149 EXPECT_TRUE(sent_all_events()[1].cancelable);
2150 EXPECT_EQ(2U, GetAndResetSentEventCount());
2151 EXPECT_EQ(1U, GetAndResetAckedEventCount());
2152
2153 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2154 EXPECT_EQ(0U, queued_event_count());
2155 EXPECT_FALSE(HasPendingAsyncTouchMove());
2156 EXPECT_EQ(0U, GetAndResetSentEventCount());
2157 EXPECT_EQ(1U, GetAndResetAckedEventCount());
2158 }
2159
2160 EXPECT_EQ(4U, uncancelable_touch_moves_pending_ack_count());
2161 // When we receive an ack from render we decrease the count.
2162 SendUncancelableTouchMoveEventAck();
2163 EXPECT_EQ(3U, uncancelable_touch_moves_pending_ack_count());
2164 EXPECT_EQ(0U, queued_event_count());
2165 EXPECT_FALSE(HasPendingAsyncTouchMove());
2166
2167 // Do not dispatch the next uncancelable touchmove when we have not received
2168 // all the acks back from render.
2169 AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1);
2170 MoveTouchPoint(0, 20, 30);
2171 EXPECT_TRUE(HasPendingAsyncTouchMove());
2172 EXPECT_EQ(0U, queued_event_count());
2173 EXPECT_EQ(0U, GetAndResetSentEventCount());
2174 EXPECT_EQ(1U, GetAndResetAckedEventCount());
2175 EXPECT_EQ(3U, uncancelable_touch_moves_pending_ack_count());
2176
2177 // Once we receive the ack from render, we do not dispatch the
2178 // pending_async_touchmove_ until the count is 0.
2179 SendUncancelableTouchMoveEventAck();
2180 EXPECT_EQ(2U, uncancelable_touch_moves_pending_ack_count());
2181 EXPECT_EQ(0U, queued_event_count());
2182 EXPECT_TRUE(HasPendingAsyncTouchMove());
2183
2184 SendUncancelableTouchMoveEventAck();
2185
2186 // When we receive this ack from render, and the count is 0, so we can
2187 // dispatch the pending_async_touchmove_.
2188 SendUncancelableTouchMoveEventAck();
2189 EXPECT_EQ(1U, uncancelable_touch_moves_pending_ack_count());
2190 EXPECT_FALSE(HasPendingAsyncTouchMove());
2191 EXPECT_EQ(0U, queued_event_count());
2192 EXPECT_EQ(WebInputEvent::TouchMove, sent_event().type);
2193 EXPECT_FALSE(sent_event().cancelable);
2194 EXPECT_EQ(1U, GetAndResetSentEventCount());
1971 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 2195 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1972 } 2196 }
1973 2197
1974 TEST_F(TouchEventQueueTest, TouchAbsorptionWithConsumedFirstMove) { 2198 TEST_F(TouchEventQueueTest, TouchAbsorptionWithConsumedFirstMove) {
1975 // Queue a TouchStart. 2199 // Queue a TouchStart.
1976 PressTouchPoint(0, 1); 2200 PressTouchPoint(0, 1);
1977 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 2201 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1978 EXPECT_EQ(0U, queued_event_count()); 2202 EXPECT_EQ(0U, queued_event_count());
1979 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 2203 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1980 2204
(...skipping 27 matching lines...) Expand all
2008 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); 2232 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
2009 EXPECT_EQ(0U, queued_event_count()); 2233 EXPECT_EQ(0U, queued_event_count());
2010 EXPECT_EQ(0U, GetAndResetSentEventCount()); 2234 EXPECT_EQ(0U, GetAndResetSentEventCount());
2011 } 2235 }
2012 2236
2013 TEST_F(TouchEventQueueTest, TouchStartCancelableDuringScroll) { 2237 TEST_F(TouchEventQueueTest, TouchStartCancelableDuringScroll) {
2014 // Queue a touchstart and touchmove that go unconsumed, transitioning to an 2238 // Queue a touchstart and touchmove that go unconsumed, transitioning to an
2015 // active scroll sequence. 2239 // active scroll sequence.
2016 PressTouchPoint(0, 1); 2240 PressTouchPoint(0, 1);
2017 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 2241 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2242 EXPECT_TRUE(sent_event().cancelable);
2018 ASSERT_EQ(1U, GetAndResetSentEventCount()); 2243 ASSERT_EQ(1U, GetAndResetSentEventCount());
2019 EXPECT_TRUE(sent_event().cancelable);
2020 2244
2021 MoveTouchPoint(0, 20, 5); 2245 MoveTouchPoint(0, 20, 5);
2022 EXPECT_TRUE(sent_event().cancelable); 2246 EXPECT_TRUE(sent_event().cancelable);
2023 SendGestureEvent(blink::WebInputEvent::GestureScrollBegin); 2247 SendGestureEvent(blink::WebInputEvent::GestureScrollBegin);
2024 SendGestureEvent(blink::WebInputEvent::GestureScrollUpdate); 2248 SendGestureEvent(blink::WebInputEvent::GestureScrollUpdate);
2025 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 2249 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2250 EXPECT_TRUE(sent_event().cancelable);
2026 ASSERT_EQ(1U, GetAndResetSentEventCount()); 2251 ASSERT_EQ(1U, GetAndResetSentEventCount());
2027 EXPECT_TRUE(sent_event().cancelable);
2028 2252
2029 // Even though scrolling has begun, touchstart events should be cancelable, 2253 // Even though scrolling has begun, touchstart events should be cancelable,
2030 // allowing, for example, customized pinch processing. 2254 // allowing, for example, customized pinch processing.
2031 PressTouchPoint(10, 11); 2255 PressTouchPoint(10, 11);
2032 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); 2256 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
2257 EXPECT_TRUE(sent_event().cancelable);
2033 ASSERT_EQ(1U, GetAndResetSentEventCount()); 2258 ASSERT_EQ(1U, GetAndResetSentEventCount());
2034 EXPECT_TRUE(sent_event().cancelable);
2035 2259
2036 // As the touch start was consumed, touchmoves should no longer be throttled. 2260 // As the touch start was consumed, touchmoves should no longer be throttled.
2037 MoveTouchPoint(1, 11, 11); 2261 MoveTouchPoint(1, 11, 11);
2038 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); 2262 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
2263 EXPECT_TRUE(sent_event().cancelable);
2039 ASSERT_EQ(1U, GetAndResetSentEventCount()); 2264 ASSERT_EQ(1U, GetAndResetSentEventCount());
2040 EXPECT_TRUE(sent_event().cancelable);
2041 2265
2042 // With throttling disabled, touchend and touchmove events should also be 2266 // With throttling disabled, touchend and touchmove events should also be
2043 // cancelable. 2267 // cancelable.
2044 MoveTouchPoint(1, 12, 12); 2268 MoveTouchPoint(1, 12, 12);
2045 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); 2269 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
2270 EXPECT_TRUE(sent_event().cancelable);
2046 ASSERT_EQ(1U, GetAndResetSentEventCount()); 2271 ASSERT_EQ(1U, GetAndResetSentEventCount());
2047 EXPECT_TRUE(sent_event().cancelable);
2048 ReleaseTouchPoint(1); 2272 ReleaseTouchPoint(1);
2049 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); 2273 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
2274 EXPECT_TRUE(sent_event().cancelable);
2050 ASSERT_EQ(1U, GetAndResetSentEventCount()); 2275 ASSERT_EQ(1U, GetAndResetSentEventCount());
2051 EXPECT_TRUE(sent_event().cancelable);
2052 2276
2053 // If subsequent touchmoves aren't consumed, the generated scroll events 2277 // If subsequent touchmoves aren't consumed, the generated scroll events
2054 // will restore async touch dispatch. 2278 // will restore async touch dispatch.
2055 MoveTouchPoint(0, 25, 5); 2279 MoveTouchPoint(0, 25, 5);
2056 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 2280 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2057 SendGestureEvent(blink::WebInputEvent::GestureScrollUpdate); 2281 SendGestureEvent(blink::WebInputEvent::GestureScrollUpdate);
2282 EXPECT_TRUE(sent_event().cancelable);
2058 ASSERT_EQ(1U, GetAndResetSentEventCount()); 2283 ASSERT_EQ(1U, GetAndResetSentEventCount());
2059 EXPECT_TRUE(sent_event().cancelable);
2060 AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1); 2284 AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1);
2061 MoveTouchPoint(0, 30, 5); 2285 MoveTouchPoint(0, 30, 5);
2286 SendUncancelableTouchMoveEventAck();
2287 EXPECT_FALSE(sent_event().cancelable);
2062 ASSERT_EQ(1U, GetAndResetSentEventCount()); 2288 ASSERT_EQ(1U, GetAndResetSentEventCount());
2063 SendTouchEventAck(INPUT_EVENT_ACK_STATE_IGNORED);
2064 EXPECT_FALSE(sent_event().cancelable);
2065 2289
2066 // The touchend will be uncancelable during an active scroll sequence. 2290 // The touchend will be uncancelable during an active scroll sequence.
2067 ReleaseTouchPoint(0); 2291 ReleaseTouchPoint(0);
2292 EXPECT_FALSE(sent_event().cancelable);
2068 ASSERT_EQ(1U, GetAndResetSentEventCount()); 2293 ASSERT_EQ(1U, GetAndResetSentEventCount());
2069 EXPECT_FALSE(sent_event().cancelable);
2070 } 2294 }
2071 2295
2072 TEST_F(TouchEventQueueTest, UnseenTouchPointerIdsNotForwarded) { 2296 TEST_F(TouchEventQueueTest, UnseenTouchPointerIdsNotForwarded) {
2073 SyntheticWebTouchEvent event; 2297 SyntheticWebTouchEvent event;
2074 event.PressPoint(0, 0); 2298 event.PressPoint(0, 0);
2075 SendTouchEvent(event); 2299 SendTouchEvent(event);
2076 EXPECT_EQ(1U, GetAndResetSentEventCount()); 2300 EXPECT_EQ(1U, GetAndResetSentEventCount());
2077 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); 2301 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
2078 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 2302 EXPECT_EQ(1U, GetAndResetAckedEventCount());
2079 2303
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
2211 PressTouchPoint(2, 2); 2435 PressTouchPoint(2, 2);
2212 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); 2436 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
2213 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); 2437 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
2214 EXPECT_EQ(0U, queued_event_count()); 2438 EXPECT_EQ(0U, queued_event_count());
2215 EXPECT_EQ(2U, GetAndResetSentEventCount()); 2439 EXPECT_EQ(2U, GetAndResetSentEventCount());
2216 EXPECT_EQ(2U, GetAndResetAckedEventCount()); 2440 EXPECT_EQ(2U, GetAndResetAckedEventCount());
2217 2441
2218 // Move 1st touch point. 2442 // Move 1st touch point.
2219 MoveTouchPoint(0, 10, 10); 2443 MoveTouchPoint(0, 10, 10);
2220 EXPECT_EQ(1U, queued_event_count()); 2444 EXPECT_EQ(1U, queued_event_count());
2221 EXPECT_EQ(1U, GetAndResetSentEventCount());
2222 EXPECT_EQ(0U, GetAndResetAckedEventCount());
2223 2445
2224 // TouchMove should be allowed and test for touches state. 2446 // TouchMove should be allowed and test for touches state.
2225 const WebTouchEvent& event1 = sent_event(); 2447 const WebTouchEvent& event1 = sent_event();
2226 EXPECT_EQ(WebInputEvent::TouchMove, event1.type); 2448 EXPECT_EQ(WebInputEvent::TouchMove, event1.type);
2227 EXPECT_EQ(WebTouchPoint::StateMoved, event1.touches[0].state); 2449 EXPECT_EQ(WebTouchPoint::StateMoved, event1.touches[0].state);
2228 EXPECT_EQ(WebTouchPoint::StateStationary, event1.touches[1].state); 2450 EXPECT_EQ(WebTouchPoint::StateStationary, event1.touches[1].state);
2451 EXPECT_EQ(1U, GetAndResetSentEventCount());
2452 EXPECT_EQ(0U, GetAndResetAckedEventCount());
2229 2453
2230 // Do not really move any touch points, but use previous values. 2454 // Do not really move any touch points, but use previous values.
2231 MoveTouchPoint(0, 10, 10); 2455 MoveTouchPoint(0, 10, 10);
2232 ChangeTouchPointRadius(1, 1, 1); 2456 ChangeTouchPointRadius(1, 1, 1);
2233 MoveTouchPoint(1, 2, 2); 2457 MoveTouchPoint(1, 2, 2);
2234 EXPECT_EQ(2U, queued_event_count()); 2458 EXPECT_EQ(2U, queued_event_count());
2235 EXPECT_EQ(0U, GetAndResetSentEventCount()); 2459 EXPECT_EQ(0U, GetAndResetSentEventCount());
2236 2460
2237 // Receive an ACK for 1st TouchMove. 2461 // Receive an ACK for 1st TouchMove.
2238 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); 2462 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
2239 2463
2240 // Tries to forward TouchMove but should be filtered 2464 // Tries to forward TouchMove but should be filtered
2241 // when none of the touch points have changed. 2465 // when none of the touch points have changed.
2242 EXPECT_EQ(0U, queued_event_count()); 2466 EXPECT_EQ(0U, queued_event_count());
2243 EXPECT_EQ(0U, GetAndResetSentEventCount()); 2467 EXPECT_EQ(0U, GetAndResetSentEventCount());
2244 EXPECT_EQ(4U, GetAndResetAckedEventCount()); 2468 EXPECT_EQ(4U, GetAndResetAckedEventCount());
2245 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state()); 2469 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state());
2246 2470
2247 // Move 2nd touch point. 2471 // Move 2nd touch point.
2248 MoveTouchPoint(1, 3, 3); 2472 MoveTouchPoint(1, 3, 3);
2249 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); 2473 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
2250 EXPECT_EQ(0U, queued_event_count()); 2474 EXPECT_EQ(0U, queued_event_count());
2251 EXPECT_EQ(1U, GetAndResetSentEventCount());
2252 EXPECT_EQ(1U, GetAndResetAckedEventCount());
2253 2475
2254 // TouchMove should be allowed and test for touches state. 2476 // TouchMove should be allowed and test for touches state.
2255 const WebTouchEvent& event2 = sent_event(); 2477 const WebTouchEvent& event2 = sent_event();
2256 EXPECT_EQ(WebInputEvent::TouchMove, event2.type); 2478 EXPECT_EQ(WebInputEvent::TouchMove, event2.type);
2257 EXPECT_EQ(WebTouchPoint::StateStationary, event2.touches[0].state); 2479 EXPECT_EQ(WebTouchPoint::StateStationary, event2.touches[0].state);
2258 EXPECT_EQ(WebTouchPoint::StateMoved, event2.touches[1].state); 2480 EXPECT_EQ(WebTouchPoint::StateMoved, event2.touches[1].state);
2481 EXPECT_EQ(1U, GetAndResetSentEventCount());
2482 EXPECT_EQ(1U, GetAndResetAckedEventCount());
2259 } 2483 }
2260 2484
2261 } // namespace content 2485 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698