| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/basictypes.h" | 5 #include "base/basictypes.h" |
| 6 #include "base/logging.h" | 6 #include "base/logging.h" |
| 7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
| 9 #include "content/browser/renderer_host/input/timeout_monitor.h" | 9 #include "content/browser/renderer_host/input/timeout_monitor.h" |
| 10 #include "content/browser/renderer_host/input/touch_event_queue.h" | 10 #include "content/browser/renderer_host/input/touch_event_queue.h" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 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()); |
| 46 sent_events_ids_.clear(); |
| 47 } | 47 } |
| 48 | 48 |
| 49 void TearDown() override { queue_.reset(); } | 49 void TearDown() override { queue_.reset(); } |
| 50 | 50 |
| 51 // TouchEventQueueClient | 51 // TouchEventQueueClient |
| 52 void SendTouchEventImmediately( | 52 void SendTouchEventImmediately( |
| 53 const TouchEventWithLatencyInfo& event) override { | 53 const TouchEventWithLatencyInfo& event) override { |
| 54 ++sent_event_count_; | 54 sent_events_.push_back(event.event); |
| 55 last_sent_event_ = event.event; | 55 sent_events_ids_.push_back(event.event.uniqueTouchEventId); |
| 56 if (sync_ack_result_) { | 56 if (sync_ack_result_) { |
| 57 auto sync_ack_result = sync_ack_result_.Pass(); | 57 auto sync_ack_result = sync_ack_result_.Pass(); |
| 58 SendTouchEventAck(*sync_ack_result); | 58 SendTouchEventAck(*sync_ack_result); |
| 59 } | 59 } |
| 60 } | 60 } |
| 61 | 61 |
| 62 void OnTouchEventAck(const TouchEventWithLatencyInfo& event, | 62 void OnTouchEventAck(const TouchEventWithLatencyInfo& event, |
| 63 InputEventAckState ack_result) override { | 63 InputEventAckState ack_result) override { |
| 64 ++acked_event_count_; | 64 ++acked_event_count_; |
| 65 last_acked_event_ = event.event; | 65 last_acked_event_ = event.event; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 108 } | 108 } |
| 109 | 109 |
| 110 void SendGestureEvent(WebInputEvent::Type type) { | 110 void SendGestureEvent(WebInputEvent::Type type) { |
| 111 WebGestureEvent event; | 111 WebGestureEvent event; |
| 112 event.type = type; | 112 event.type = type; |
| 113 queue_->OnGestureScrollEvent( | 113 queue_->OnGestureScrollEvent( |
| 114 GestureEventWithLatencyInfo(event, ui::LatencyInfo())); | 114 GestureEventWithLatencyInfo(event, ui::LatencyInfo())); |
| 115 } | 115 } |
| 116 | 116 |
| 117 void SendTouchEventAck(InputEventAckState ack_result) { | 117 void SendTouchEventAck(InputEventAckState ack_result) { |
| 118 queue_->ProcessTouchAck(ack_result, ui::LatencyInfo()); | 118 DCHECK(!sent_events_ids_.empty()); |
| 119 queue_->ProcessTouchAck(ack_result, ui::LatencyInfo(), |
| 120 sent_events_ids_.front()); |
| 121 sent_events_ids_.pop_front(); |
| 122 } |
| 123 |
| 124 void SendTouchEventAckWithID(InputEventAckState ack_result, |
| 125 int unique_event_id) { |
| 126 queue_->ProcessTouchAck(ack_result, ui::LatencyInfo(), unique_event_id); |
| 127 sent_events_ids_.erase(std::remove(sent_events_ids_.begin(), |
| 128 sent_events_ids_.end(), unique_event_id), |
| 129 sent_events_ids_.end()); |
| 119 } | 130 } |
| 120 | 131 |
| 121 void SendGestureEventAck(WebInputEvent::Type type, | 132 void SendGestureEventAck(WebInputEvent::Type type, |
| 122 InputEventAckState ack_result) { | 133 InputEventAckState ack_result) { |
| 123 blink::WebGestureEvent gesture_event; | 134 blink::WebGestureEvent gesture_event; |
| 124 gesture_event.type = type; | 135 gesture_event.type = type; |
| 125 GestureEventWithLatencyInfo event(gesture_event, ui::LatencyInfo()); | 136 GestureEventWithLatencyInfo event(gesture_event, ui::LatencyInfo()); |
| 126 queue_->OnGestureEventAck(event, ack_result); | 137 queue_->OnGestureEventAck(event, ack_result); |
| 127 } | 138 } |
| 128 | 139 |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 217 touch_event_ = SyntheticWebTouchEvent(); | 228 touch_event_ = SyntheticWebTouchEvent(); |
| 218 } | 229 } |
| 219 | 230 |
| 220 size_t GetAndResetAckedEventCount() { | 231 size_t GetAndResetAckedEventCount() { |
| 221 size_t count = acked_event_count_; | 232 size_t count = acked_event_count_; |
| 222 acked_event_count_ = 0; | 233 acked_event_count_ = 0; |
| 223 return count; | 234 return count; |
| 224 } | 235 } |
| 225 | 236 |
| 226 size_t GetAndResetSentEventCount() { | 237 size_t GetAndResetSentEventCount() { |
| 227 size_t count = sent_event_count_; | 238 size_t count = sent_events_.size(); |
| 228 sent_event_count_ = 0; | 239 sent_events_.clear(); |
| 229 return count; | 240 return count; |
| 230 } | 241 } |
| 231 | 242 |
| 232 bool IsPendingAckTouchStart() const { | 243 bool IsPendingAckTouchStart() const { |
| 233 return queue_->IsPendingAckTouchStart(); | 244 return queue_->IsPendingAckTouchStart(); |
| 234 } | 245 } |
| 235 | 246 |
| 236 void OnHasTouchEventHandlers(bool has_handlers) { | 247 void OnHasTouchEventHandlers(bool has_handlers) { |
| 237 queue_->OnHasTouchEventHandlers(has_handlers); | 248 queue_->OnHasTouchEventHandlers(has_handlers); |
| 238 } | 249 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 251 | 262 |
| 252 const WebTouchEvent& latest_event() const { | 263 const WebTouchEvent& latest_event() const { |
| 253 return queue_->GetLatestEventForTesting().event; | 264 return queue_->GetLatestEventForTesting().event; |
| 254 } | 265 } |
| 255 | 266 |
| 256 const WebTouchEvent& acked_event() const { | 267 const WebTouchEvent& acked_event() const { |
| 257 return last_acked_event_; | 268 return last_acked_event_; |
| 258 } | 269 } |
| 259 | 270 |
| 260 const WebTouchEvent& sent_event() const { | 271 const WebTouchEvent& sent_event() const { |
| 261 return last_sent_event_; | 272 DCHECK(!sent_events_.empty()); |
| 273 return sent_events_.back(); |
| 274 } |
| 275 |
| 276 const std::vector<WebTouchEvent>& all_sent_events() const { |
| 277 return sent_events_; |
| 262 } | 278 } |
| 263 | 279 |
| 264 InputEventAckState acked_event_state() const { | 280 InputEventAckState acked_event_state() const { |
| 265 return last_acked_event_state_; | 281 return last_acked_event_state_; |
| 266 } | 282 } |
| 267 | 283 |
| 268 static void RunTasksAndWait(base::TimeDelta delay) { | 284 static void RunTasksAndWait(base::TimeDelta delay) { |
| 269 base::MessageLoop::current()->PostDelayedTask( | 285 base::MessageLoop::current()->PostDelayedTask( |
| 270 FROM_HERE, base::MessageLoop::QuitClosure(), delay); | 286 FROM_HERE, base::MessageLoop::QuitClosure(), delay); |
| 271 base::MessageLoop::current()->Run(); | 287 base::MessageLoop::current()->Run(); |
| 272 } | 288 } |
| 273 | 289 |
| 290 size_t uncancelable_touch_moves_pending_ack_count() const { |
| 291 return queue_->uncancelable_touch_moves_pending_ack_count(); |
| 292 } |
| 293 |
| 294 int GetUniqueTouchEventID() { return sent_events_ids_.back(); } |
| 295 |
| 274 private: | 296 private: |
| 275 void SendTouchEvent() { | 297 void SendTouchEvent() { |
| 276 SendTouchEvent(touch_event_); | 298 SendTouchEvent(touch_event_); |
| 277 touch_event_.ResetPoints(); | 299 touch_event_.ResetPoints(); |
| 278 } | 300 } |
| 279 | 301 |
| 280 void ResetQueueWithConfig(const TouchEventQueue::Config& config) { | 302 void ResetQueueWithConfig(const TouchEventQueue::Config& config) { |
| 281 queue_.reset(new TouchEventQueue(this, config)); | 303 queue_.reset(new TouchEventQueue(this, config)); |
| 282 queue_->OnHasTouchEventHandlers(true); | 304 queue_->OnHasTouchEventHandlers(true); |
| 283 } | 305 } |
| 284 | 306 |
| 285 scoped_ptr<TouchEventQueue> queue_; | 307 scoped_ptr<TouchEventQueue> queue_; |
| 286 size_t sent_event_count_; | |
| 287 size_t acked_event_count_; | 308 size_t acked_event_count_; |
| 288 WebTouchEvent last_sent_event_; | |
| 289 WebTouchEvent last_acked_event_; | 309 WebTouchEvent last_acked_event_; |
| 310 std::vector<WebTouchEvent> sent_events_; |
| 290 InputEventAckState last_acked_event_state_; | 311 InputEventAckState last_acked_event_state_; |
| 291 SyntheticWebTouchEvent touch_event_; | 312 SyntheticWebTouchEvent touch_event_; |
| 292 scoped_ptr<WebTouchEvent> followup_touch_event_; | 313 scoped_ptr<WebTouchEvent> followup_touch_event_; |
| 293 scoped_ptr<WebGestureEvent> followup_gesture_event_; | 314 scoped_ptr<WebGestureEvent> followup_gesture_event_; |
| 294 scoped_ptr<InputEventAckState> sync_ack_result_; | 315 scoped_ptr<InputEventAckState> sync_ack_result_; |
| 295 double slop_length_dips_; | 316 double slop_length_dips_; |
| 296 gfx::PointF anchor_; | 317 gfx::PointF anchor_; |
| 297 base::MessageLoopForUI message_loop_; | 318 base::MessageLoopForUI message_loop_; |
| 319 std::deque<int> sent_events_ids_; |
| 298 }; | 320 }; |
| 299 | 321 |
| 300 | 322 |
| 301 // Tests that touch-events are queued properly. | 323 // Tests that touch-events are queued properly. |
| 302 TEST_F(TouchEventQueueTest, Basic) { | 324 TEST_F(TouchEventQueueTest, Basic) { |
| 303 PressTouchPoint(1, 1); | 325 PressTouchPoint(1, 1); |
| 304 EXPECT_EQ(1U, queued_event_count()); | 326 EXPECT_EQ(1U, queued_event_count()); |
| 305 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 327 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 306 | 328 |
| 307 // The second touch should not be sent since one is already in queue. | 329 // The second touch should not be sent since one is already in queue. |
| (...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 640 // Make sure both fingers are marked as having been moved in the coalesced | 662 // Make sure both fingers are marked as having been moved in the coalesced |
| 641 // event. | 663 // event. |
| 642 const WebTouchEvent& event = latest_event(); | 664 const WebTouchEvent& event = latest_event(); |
| 643 EXPECT_EQ(WebTouchPoint::StateMoved, event.touches[0].state); | 665 EXPECT_EQ(WebTouchPoint::StateMoved, event.touches[0].state); |
| 644 EXPECT_EQ(WebTouchPoint::StateMoved, event.touches[1].state); | 666 EXPECT_EQ(WebTouchPoint::StateMoved, event.touches[1].state); |
| 645 } | 667 } |
| 646 | 668 |
| 647 // Tests that the touch-event queue is robust to redundant acks. | 669 // Tests that the touch-event queue is robust to redundant acks. |
| 648 TEST_F(TouchEventQueueTest, SpuriousAcksIgnored) { | 670 TEST_F(TouchEventQueueTest, SpuriousAcksIgnored) { |
| 649 // Trigger a spurious ack. | 671 // Trigger a spurious ack. |
| 650 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); | 672 SendTouchEventAckWithID(INPUT_EVENT_ACK_STATE_CONSUMED, 0); |
| 651 EXPECT_EQ(0U, GetAndResetAckedEventCount()); | 673 EXPECT_EQ(0U, GetAndResetAckedEventCount()); |
| 652 | 674 |
| 653 // Send and ack a touch press. | 675 // Send and ack a touch press. |
| 654 PressTouchPoint(1, 1); | 676 PressTouchPoint(1, 1); |
| 655 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 677 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 656 EXPECT_EQ(1U, queued_event_count()); | 678 EXPECT_EQ(1U, queued_event_count()); |
| 657 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); | 679 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); |
| 658 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 680 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 659 EXPECT_EQ(0U, queued_event_count()); | 681 EXPECT_EQ(0U, queued_event_count()); |
| 660 | 682 |
| 661 // Trigger a spurious ack. | 683 // Trigger a spurious ack. |
| 662 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); | 684 SendTouchEventAckWithID(INPUT_EVENT_ACK_STATE_CONSUMED, 3); |
| 663 EXPECT_EQ(0U, GetAndResetAckedEventCount()); | 685 EXPECT_EQ(0U, GetAndResetAckedEventCount()); |
| 664 } | 686 } |
| 665 | 687 |
| 666 // Tests that touch-move events are not sent to the renderer if the preceding | 688 // Tests that touch-move events are not sent to the renderer if the preceding |
| 667 // touch-press event did not have a consumer (and consequently, did not hit the | 689 // touch-press event did not have a consumer (and consequently, did not hit the |
| 668 // main thread in the renderer). Also tests that all queued/coalesced touch | 690 // main thread in the renderer). Also tests that all queued/coalesced touch |
| 669 // events are flushed immediately when the ACK for the touch-press comes back | 691 // events are flushed immediately when the ACK for the touch-press comes back |
| 670 // with NO_CONSUMER status. | 692 // with NO_CONSUMER status. |
| 671 TEST_F(TouchEventQueueTest, NoConsumer) { | 693 TEST_F(TouchEventQueueTest, NoConsumer) { |
| 672 // The first touch-press should reach the renderer. | 694 // The first touch-press should reach the renderer. |
| (...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1023 // The timeout should have fired, synthetically ack'ing the timed-out event. | 1045 // The timeout should have fired, synthetically ack'ing the timed-out event. |
| 1024 // TouchEvent forwarding is disabled until the ack is received for the | 1046 // TouchEvent forwarding is disabled until the ack is received for the |
| 1025 // timed-out event and the future cancel event. | 1047 // timed-out event and the future cancel event. |
| 1026 EXPECT_FALSE(IsTimeoutRunning()); | 1048 EXPECT_FALSE(IsTimeoutRunning()); |
| 1027 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 1049 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 1028 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 1050 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1029 | 1051 |
| 1030 // Ack'ing the original event should trigger a cancel event. | 1052 // Ack'ing the original event should trigger a cancel event. |
| 1031 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1053 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1032 EXPECT_FALSE(IsTimeoutRunning()); | 1054 EXPECT_FALSE(IsTimeoutRunning()); |
| 1055 EXPECT_EQ(WebInputEvent::TouchCancel, sent_event().type); |
| 1056 EXPECT_FALSE(sent_event().cancelable); |
| 1033 EXPECT_EQ(0U, GetAndResetAckedEventCount()); | 1057 EXPECT_EQ(0U, GetAndResetAckedEventCount()); |
| 1034 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 1058 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 1035 EXPECT_EQ(WebInputEvent::TouchCancel, sent_event().type); | |
| 1036 EXPECT_FALSE(sent_event().cancelable); | |
| 1037 | 1059 |
| 1038 // Touch events should not be forwarded until we receive the cancel acks. | 1060 // Touch events should not be forwarded until we receive the cancel acks. |
| 1039 MoveTouchPoint(0, 1, 1); | 1061 MoveTouchPoint(0, 1, 1); |
| 1040 ASSERT_EQ(0U, GetAndResetSentEventCount()); | 1062 ASSERT_EQ(0U, GetAndResetSentEventCount()); |
| 1041 ASSERT_EQ(1U, GetAndResetAckedEventCount()); | 1063 ASSERT_EQ(1U, GetAndResetAckedEventCount()); |
| 1042 | 1064 |
| 1043 ReleaseTouchPoint(0); | 1065 ReleaseTouchPoint(0); |
| 1044 ASSERT_EQ(0U, GetAndResetSentEventCount()); | 1066 ASSERT_EQ(0U, GetAndResetSentEventCount()); |
| 1045 ASSERT_EQ(1U, GetAndResetAckedEventCount()); | 1067 ASSERT_EQ(1U, GetAndResetAckedEventCount()); |
| 1046 | 1068 |
| 1047 // The synthetic TouchCancel ack should not reach the client, but should | 1069 // The synthetic TouchCancel ack should not reach the client, but should |
| 1048 // resume touch forwarding. | 1070 // resume touch forwarding. |
| 1049 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1071 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1050 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 1072 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 1051 EXPECT_EQ(0U, GetAndResetAckedEventCount()); | 1073 EXPECT_EQ(0U, GetAndResetAckedEventCount()); |
| 1052 | 1074 |
| 1053 // Subsequent events should be handled normally. | 1075 // Subsequent events should be handled normally. |
| 1054 PressTouchPoint(0, 1); | 1076 PressTouchPoint(0, 1); |
| 1077 EXPECT_EQ(WebInputEvent::TouchStart, sent_event().type); |
| 1078 EXPECT_TRUE(sent_event().cancelable); |
| 1055 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 1079 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 1056 EXPECT_EQ(0U, GetAndResetAckedEventCount()); | 1080 EXPECT_EQ(0U, GetAndResetAckedEventCount()); |
| 1057 EXPECT_EQ(WebInputEvent::TouchStart, sent_event().type); | |
| 1058 EXPECT_TRUE(sent_event().cancelable); | |
| 1059 } | 1081 } |
| 1060 | 1082 |
| 1061 // Tests that the timeout is never started if the renderer consumes | 1083 // Tests that the timeout is never started if the renderer consumes |
| 1062 // a TouchEvent from the current touch sequence. | 1084 // a TouchEvent from the current touch sequence. |
| 1063 TEST_F(TouchEventQueueTest, NoTouchTimeoutIfRendererIsConsumingGesture) { | 1085 TEST_F(TouchEventQueueTest, NoTouchTimeoutIfRendererIsConsumingGesture) { |
| 1064 SetUpForTimeoutTesting(DefaultTouchTimeoutDelay()); | 1086 SetUpForTimeoutTesting(DefaultTouchTimeoutDelay()); |
| 1065 | 1087 |
| 1066 // Queue a TouchStart. | 1088 // Queue a TouchStart. |
| 1067 PressTouchPoint(0, 1); | 1089 PressTouchPoint(0, 1); |
| 1068 ASSERT_TRUE(IsTimeoutRunning()); | 1090 ASSERT_TRUE(IsTimeoutRunning()); |
| (...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1533 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1555 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1534 EXPECT_FALSE(HasPendingAsyncTouchMove()); | 1556 EXPECT_FALSE(HasPendingAsyncTouchMove()); |
| 1535 EXPECT_TRUE(sent_event().cancelable); | 1557 EXPECT_TRUE(sent_event().cancelable); |
| 1536 EXPECT_EQ(0U, queued_event_count()); | 1558 EXPECT_EQ(0U, queued_event_count()); |
| 1537 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 1559 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 1538 | 1560 |
| 1539 // Consuming a scroll event will throttle subsequent touchmoves. | 1561 // Consuming a scroll event will throttle subsequent touchmoves. |
| 1540 SendGestureEventAck(WebInputEvent::GestureScrollUpdate, | 1562 SendGestureEventAck(WebInputEvent::GestureScrollUpdate, |
| 1541 INPUT_EVENT_ACK_STATE_CONSUMED); | 1563 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 1542 MoveTouchPoint(0, 10, 7+i); | 1564 MoveTouchPoint(0, 10, 7+i); |
| 1543 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
| 1544 EXPECT_TRUE(HasPendingAsyncTouchMove()); | 1565 EXPECT_TRUE(HasPendingAsyncTouchMove()); |
| 1545 EXPECT_EQ(0U, queued_event_count()); | 1566 EXPECT_EQ(0U, queued_event_count()); |
| 1546 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 1567 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 1547 } | 1568 } |
| 1548 } | 1569 } |
| 1549 | 1570 |
| 1550 // Ensure that touchmove's are appropriately throttled during a typical | 1571 // Ensure that touchmove's are appropriately throttled during a typical |
| 1551 // scroll sequences that transitions between scrolls consumed and unconsumed. | 1572 // scroll sequences that transitions between scrolls consumed and unconsumed. |
| 1552 TEST_F(TouchEventQueueTest, AsyncTouchThrottledAfterScroll) { | 1573 TEST_F(TouchEventQueueTest, AsyncTouchThrottledAfterScroll) { |
| 1553 // Process a TouchStart | 1574 // Process a TouchStart |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1572 MoveTouchPoint(0, 0, 50); | 1593 MoveTouchPoint(0, 0, 50); |
| 1573 followup_scroll.type = WebInputEvent::GestureScrollUpdate; | 1594 followup_scroll.type = WebInputEvent::GestureScrollUpdate; |
| 1574 SetFollowupEvent(followup_scroll); | 1595 SetFollowupEvent(followup_scroll); |
| 1575 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1596 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1576 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 1597 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 1577 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 1598 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1578 | 1599 |
| 1579 // Now queue a second touchmove and verify it's not (yet) dispatched. | 1600 // Now queue a second touchmove and verify it's not (yet) dispatched. |
| 1580 MoveTouchPoint(0, 0, 100); | 1601 MoveTouchPoint(0, 0, 100); |
| 1581 SetFollowupEvent(followup_scroll); | 1602 SetFollowupEvent(followup_scroll); |
| 1582 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
| 1583 EXPECT_TRUE(HasPendingAsyncTouchMove()); | 1603 EXPECT_TRUE(HasPendingAsyncTouchMove()); |
| 1584 EXPECT_EQ(0U, queued_event_count()); | 1604 EXPECT_EQ(0U, queued_event_count()); |
| 1585 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 1605 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 1586 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 1606 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1587 | 1607 |
| 1588 // Queuing the final touchend should flush the pending, async touchmove. | 1608 // Queuing the final touchend should flush the pending async touchmove. In |
| 1609 // this case, we will first dispatch an async touchmove and then a touchend. |
| 1610 // For the async touchmove, we will not send ack again. |
| 1589 ReleaseTouchPoint(0); | 1611 ReleaseTouchPoint(0); |
| 1590 followup_scroll.type = WebInputEvent::GestureScrollEnd; | 1612 followup_scroll.type = WebInputEvent::GestureScrollEnd; |
| 1591 SetFollowupEvent(followup_scroll); | 1613 SetFollowupEvent(followup_scroll); |
| 1592 EXPECT_EQ(WebInputEvent::TouchMove, sent_event().type); | |
| 1593 EXPECT_FALSE(HasPendingAsyncTouchMove()); | 1614 EXPECT_FALSE(HasPendingAsyncTouchMove()); |
| 1594 EXPECT_FALSE(sent_event().cancelable); | 1615 EXPECT_EQ(2U, all_sent_events().size()); |
| 1595 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 1616 EXPECT_EQ(WebInputEvent::TouchMove, all_sent_events()[0].type); |
| 1596 EXPECT_EQ(2U, queued_event_count()); | 1617 EXPECT_FALSE(all_sent_events()[0].cancelable); |
| 1597 | 1618 EXPECT_EQ(WebInputEvent::TouchEnd, all_sent_events()[1].type); |
| 1598 // Ack the flushed, async touchmove. The ack should not reach the client, but | 1619 EXPECT_FALSE(all_sent_events()[1].cancelable); |
| 1599 // it should trigger sending of the (now non-cancelable) touchend. | 1620 EXPECT_EQ(2U, GetAndResetSentEventCount()); |
| 1600 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
| 1601 EXPECT_EQ(WebInputEvent::TouchEnd, sent_event().type); | |
| 1602 EXPECT_FALSE(sent_event().cancelable); | |
| 1603 EXPECT_EQ(1U, GetAndResetSentEventCount()); | |
| 1604 EXPECT_EQ(0U, GetAndResetAckedEventCount()); | 1621 EXPECT_EQ(0U, GetAndResetAckedEventCount()); |
| 1605 EXPECT_EQ(1U, queued_event_count()); | 1622 EXPECT_EQ(1U, queued_event_count()); |
| 1606 | 1623 |
| 1607 // Ack the touchend. | 1624 // Ack the touchend. |
| 1608 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1625 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1626 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1609 EXPECT_EQ(0U, queued_event_count()); | 1627 EXPECT_EQ(0U, queued_event_count()); |
| 1610 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 1628 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 1611 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 1629 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1612 | 1630 |
| 1613 // Now mark the scrolls as not consumed (which would cause future touchmoves | 1631 // Now mark the scrolls as not consumed (which would cause future touchmoves |
| 1614 // in the active sequence to be sent if there was one). | 1632 // in the active sequence to be sent if there was one). |
| 1615 SendGestureEventAck(WebInputEvent::GestureScrollUpdate, | 1633 SendGestureEventAck(WebInputEvent::GestureScrollUpdate, |
| 1616 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1634 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1617 SendGestureEventAck(WebInputEvent::GestureScrollUpdate, | 1635 SendGestureEventAck(WebInputEvent::GestureScrollUpdate, |
| 1618 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1636 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1632 | 1650 |
| 1633 MoveTouchPoint(0, 0, 6); | 1651 MoveTouchPoint(0, 0, 6); |
| 1634 followup_scroll.type = WebInputEvent::GestureScrollUpdate; | 1652 followup_scroll.type = WebInputEvent::GestureScrollUpdate; |
| 1635 SetFollowupEvent(followup_scroll); | 1653 SetFollowupEvent(followup_scroll); |
| 1636 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1654 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1637 EXPECT_FALSE(HasPendingAsyncTouchMove()); | 1655 EXPECT_FALSE(HasPendingAsyncTouchMove()); |
| 1638 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 1656 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 1639 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 1657 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1640 | 1658 |
| 1641 MoveTouchPoint(0, 0, 10); | 1659 MoveTouchPoint(0, 0, 10); |
| 1642 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
| 1643 EXPECT_TRUE(HasPendingAsyncTouchMove()); | 1660 EXPECT_TRUE(HasPendingAsyncTouchMove()); |
| 1644 EXPECT_EQ(0U, queued_event_count()); | 1661 EXPECT_EQ(0U, queued_event_count()); |
| 1645 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 1662 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 1646 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 1663 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1647 | 1664 |
| 1648 // Subsequent touchmove's should be deferred. | 1665 // Subsequent touchmove's should be deferred. |
| 1649 MoveTouchPoint(0, 0, 25); | 1666 MoveTouchPoint(0, 0, 25); |
| 1650 EXPECT_TRUE(HasPendingAsyncTouchMove()); | 1667 EXPECT_TRUE(HasPendingAsyncTouchMove()); |
| 1651 EXPECT_EQ(0U, queued_event_count()); | 1668 EXPECT_EQ(0U, queued_event_count()); |
| 1652 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 1669 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 1653 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 1670 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1671 EXPECT_EQ(0U, uncancelable_touch_moves_pending_ack_count()); |
| 1654 | 1672 |
| 1655 // The pending touchmove should be flushed with the the new touchmove if | 1673 // The pending touchmove should be flushed with the the new touchmove if |
| 1656 // sufficient time has passed. | 1674 // sufficient time has passed and ack to the client. |
| 1657 AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1); | 1675 AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1); |
| 1658 MoveTouchPoint(0, 0, 15); | 1676 MoveTouchPoint(0, 0, 15); |
| 1677 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1659 EXPECT_FALSE(HasPendingAsyncTouchMove()); | 1678 EXPECT_FALSE(HasPendingAsyncTouchMove()); |
| 1660 EXPECT_FALSE(sent_event().cancelable); | 1679 EXPECT_FALSE(sent_event().cancelable); |
| 1661 EXPECT_EQ(1U, queued_event_count()); | 1680 EXPECT_EQ(0U, queued_event_count()); |
| 1662 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 1681 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()); | 1682 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1668 | 1683 |
| 1669 // Non-touchmove events should always flush any pending touchmove events. | 1684 // Non-touchmove events should always flush any pending touchmove events. In |
| 1685 // this case, we will first dispatch an async touchmove and then a |
| 1686 // touchstart. For the async touchmove, we will not send ack again. |
| 1670 MoveTouchPoint(0, 0, 25); | 1687 MoveTouchPoint(0, 0, 25); |
| 1671 EXPECT_TRUE(HasPendingAsyncTouchMove()); | 1688 EXPECT_TRUE(HasPendingAsyncTouchMove()); |
| 1672 EXPECT_EQ(0U, queued_event_count()); | 1689 EXPECT_EQ(0U, queued_event_count()); |
| 1673 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 1690 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 1674 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 1691 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1675 PressTouchPoint(30, 30); | 1692 PressTouchPoint(30, 30); |
| 1676 EXPECT_FALSE(HasPendingAsyncTouchMove()); | 1693 EXPECT_FALSE(HasPendingAsyncTouchMove()); |
| 1677 EXPECT_FALSE(sent_event().cancelable); | 1694 EXPECT_EQ(2U, all_sent_events().size()); |
| 1678 EXPECT_EQ(WebInputEvent::TouchMove, sent_event().type); | 1695 EXPECT_EQ(WebInputEvent::TouchMove, all_sent_events()[0].type); |
| 1679 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 1696 EXPECT_FALSE(all_sent_events()[0].cancelable); |
| 1680 EXPECT_EQ(2U, queued_event_count()); | 1697 EXPECT_EQ(WebInputEvent::TouchStart, all_sent_events()[1].type); |
| 1681 | 1698 EXPECT_TRUE(all_sent_events()[1].cancelable); |
| 1682 // Ack'ing the flushed, async touchmove will dispatch the touchstart. Note | 1699 EXPECT_EQ(2U, GetAndResetSentEventCount()); |
| 1683 // that the flushed touchmove's ack will not reach the client (its | 1700 EXPECT_EQ(0U, 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()); | 1701 EXPECT_EQ(1U, queued_event_count()); |
| 1689 EXPECT_EQ(1U, GetAndResetSentEventCount()); | |
| 1690 EXPECT_EQ(0U, GetAndResetAckedEventCount()); | |
| 1691 | 1702 |
| 1692 // Ack the touchstart. | 1703 // Ack the touchstart. |
| 1693 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1704 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1705 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1694 EXPECT_EQ(0U, queued_event_count()); | 1706 EXPECT_EQ(0U, queued_event_count()); |
| 1695 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 1707 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 1696 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 1708 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1697 | 1709 |
| 1698 // Send a secondary touchmove. | 1710 // Send a secondary touchmove. |
| 1699 MoveTouchPoint(1, 0, 25); | 1711 MoveTouchPoint(1, 0, 25); |
| 1700 EXPECT_TRUE(HasPendingAsyncTouchMove()); | 1712 EXPECT_TRUE(HasPendingAsyncTouchMove()); |
| 1701 EXPECT_EQ(0U, queued_event_count()); | 1713 EXPECT_EQ(0U, queued_event_count()); |
| 1702 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 1714 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 1703 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 1715 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1774 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 1786 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1775 | 1787 |
| 1776 // Return the touch sequence to the original touchstart position. Note that | 1788 // Return the touch sequence to the original touchstart position. Note that |
| 1777 // this (0, 0) touchmove will coalesce with the previous (0, 100) touchmove. | 1789 // this (0, 0) touchmove will coalesce with the previous (0, 100) touchmove. |
| 1778 MoveTouchPoint(0, 0, 0); | 1790 MoveTouchPoint(0, 0, 0); |
| 1779 EXPECT_TRUE(HasPendingAsyncTouchMove()); | 1791 EXPECT_TRUE(HasPendingAsyncTouchMove()); |
| 1780 EXPECT_EQ(0U, queued_event_count()); | 1792 EXPECT_EQ(0U, queued_event_count()); |
| 1781 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 1793 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 1782 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 1794 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1783 | 1795 |
| 1784 // Queuing the final touchend should flush the pending, async touchmove. | 1796 // Queuing the final touchend should flush the pending, async touchmove. In |
| 1797 // this case, we will first dispatch an async touchmove and then a touchend. |
| 1798 // For the async touchmove, we will not send ack again. |
| 1785 ReleaseTouchPoint(0); | 1799 ReleaseTouchPoint(0); |
| 1786 EXPECT_FALSE(HasPendingAsyncTouchMove()); | 1800 EXPECT_FALSE(HasPendingAsyncTouchMove()); |
| 1787 EXPECT_EQ(WebInputEvent::TouchMove, sent_event().type); | 1801 EXPECT_EQ(2U, all_sent_events().size()); |
| 1788 EXPECT_FALSE(sent_event().cancelable); | 1802 EXPECT_EQ(WebInputEvent::TouchMove, all_sent_events()[0].type); |
| 1789 EXPECT_EQ(0, sent_event().touches[0].position.x); | 1803 EXPECT_FALSE(all_sent_events()[0].cancelable); |
| 1790 EXPECT_EQ(0, sent_event().touches[0].position.y); | 1804 EXPECT_EQ(0, all_sent_events()[0].touches[0].position.x); |
| 1791 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 1805 EXPECT_EQ(0, all_sent_events()[0].touches[0].position.y); |
| 1792 | 1806 EXPECT_EQ(WebInputEvent::TouchEnd, all_sent_events()[1].type); |
| 1793 // Touchend is not cancelable during async touch dispatch. | 1807 EXPECT_FALSE(all_sent_events()[1].cancelable); |
| 1794 SendTouchEventAck(INPUT_EVENT_ACK_STATE_IGNORED); | 1808 EXPECT_EQ(2U, GetAndResetSentEventCount()); |
| 1795 EXPECT_EQ(WebInputEvent::TouchEnd, sent_event().type); | 1809 EXPECT_EQ(0U, GetAndResetAckedEventCount()); |
| 1796 EXPECT_FALSE(sent_event().cancelable); | |
| 1797 EXPECT_EQ(1U, GetAndResetSentEventCount()); | |
| 1798 } | 1810 } |
| 1799 | 1811 |
| 1800 // Ensure that async touch dispatch and touch ack timeout interactions work | 1812 // Ensure that async touch dispatch and touch ack timeout interactions work |
| 1801 // appropriately. | 1813 // appropriately. |
| 1802 TEST_F(TouchEventQueueTest, AsyncTouchWithAckTimeout) { | 1814 TEST_F(TouchEventQueueTest, AsyncTouchWithAckTimeout) { |
| 1803 SetUpForTimeoutTesting(DefaultTouchTimeoutDelay()); | 1815 SetUpForTimeoutTesting(DefaultTouchTimeoutDelay()); |
| 1804 | 1816 |
| 1805 // The touchstart should start the timeout. | 1817 // The touchstart should start the timeout. |
| 1806 PressTouchPoint(0, 0); | 1818 PressTouchPoint(0, 0); |
| 1807 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 1819 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1828 // it should not start the touch ack timeout. | 1840 // it should not start the touch ack timeout. |
| 1829 MoveTouchPoint(0, 5, 5); | 1841 MoveTouchPoint(0, 5, 5); |
| 1830 EXPECT_TRUE(HasPendingAsyncTouchMove()); | 1842 EXPECT_TRUE(HasPendingAsyncTouchMove()); |
| 1831 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 1843 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1832 | 1844 |
| 1833 AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1); | 1845 AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1); |
| 1834 MoveTouchPoint(0, 5, 5); | 1846 MoveTouchPoint(0, 5, 5); |
| 1835 EXPECT_FALSE(IsTimeoutRunning()); | 1847 EXPECT_FALSE(IsTimeoutRunning()); |
| 1836 EXPECT_FALSE(HasPendingAsyncTouchMove()); | 1848 EXPECT_FALSE(HasPendingAsyncTouchMove()); |
| 1837 EXPECT_FALSE(sent_event().cancelable); | 1849 EXPECT_FALSE(sent_event().cancelable); |
| 1838 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
| 1839 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 1850 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1840 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 1851 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 1841 | 1852 |
| 1842 // An unconsumed scroll event will resume synchronous touchmoves, which are | 1853 // An unconsumed scroll event will resume synchronous touchmoves, which are |
| 1843 // subject to the ack timeout. | 1854 // subject to the ack timeout. |
| 1844 SendGestureEventAck(WebInputEvent::GestureScrollUpdate, | 1855 SendGestureEventAck(WebInputEvent::GestureScrollUpdate, |
| 1845 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1856 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1846 MoveTouchPoint(0, 20, 5); | 1857 MoveTouchPoint(0, 20, 5); |
| 1847 EXPECT_TRUE(IsTimeoutRunning()); | 1858 EXPECT_TRUE(IsTimeoutRunning()); |
| 1848 EXPECT_TRUE(sent_event().cancelable); | 1859 EXPECT_TRUE(sent_event().cancelable); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1901 | 1912 |
| 1902 // The async touchmove should be ack'ed immediately, but not forwarded. | 1913 // The async touchmove should be ack'ed immediately, but not forwarded. |
| 1903 // However, because the ack triggers a touchcancel, both the pending touch and | 1914 // However, because the ack triggers a touchcancel, both the pending touch and |
| 1904 // the queued touchcancel should be flushed. | 1915 // the queued touchcancel should be flushed. |
| 1905 WebTouchEvent followup_cancel; | 1916 WebTouchEvent followup_cancel; |
| 1906 followup_cancel.type = WebInputEvent::TouchCancel; | 1917 followup_cancel.type = WebInputEvent::TouchCancel; |
| 1907 followup_cancel.touchesLength = 1; | 1918 followup_cancel.touchesLength = 1; |
| 1908 followup_cancel.touches[0].state = WebTouchPoint::StateCancelled; | 1919 followup_cancel.touches[0].state = WebTouchPoint::StateCancelled; |
| 1909 SetFollowupEvent(followup_cancel); | 1920 SetFollowupEvent(followup_cancel); |
| 1910 MoveTouchPoint(0, 5, 5); | 1921 MoveTouchPoint(0, 5, 5); |
| 1911 EXPECT_EQ(2U, queued_event_count()); | 1922 EXPECT_EQ(1U, queued_event_count()); |
| 1912 EXPECT_FALSE(sent_event().cancelable); | 1923 EXPECT_EQ(2U, all_sent_events().size()); |
| 1913 EXPECT_FALSE(HasPendingAsyncTouchMove()); | 1924 EXPECT_EQ(WebInputEvent::TouchMove, all_sent_events()[0].type); |
| 1925 EXPECT_FALSE(all_sent_events()[0].cancelable); |
| 1926 EXPECT_EQ(WebInputEvent::TouchCancel, all_sent_events()[1].type); |
| 1927 EXPECT_FALSE(all_sent_events()[1].cancelable); |
| 1928 EXPECT_EQ(2U, GetAndResetSentEventCount()); |
| 1929 // Sending the ack is because the async touchmove is not ready for |
| 1930 // dispatching send the ack immediately. |
| 1931 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1914 EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type); | 1932 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 | 1933 |
| 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); | 1934 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 | |
| 1928 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1935 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1929 EXPECT_EQ(0U, queued_event_count()); | 1936 EXPECT_EQ(0U, queued_event_count()); |
| 1930 EXPECT_EQ(WebInputEvent::TouchCancel, acked_event().type); | 1937 EXPECT_EQ(WebInputEvent::TouchCancel, acked_event().type); |
| 1931 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 1938 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1932 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 1939 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 1933 } | 1940 } |
| 1934 | 1941 |
| 1935 // Ensure that the async touch is fully reset if the touch sequence restarts | 1942 // Ensure that the async touch is fully reset if the touch sequence restarts |
| 1936 // without properly terminating. | 1943 // without properly terminating. |
| 1937 TEST_F(TouchEventQueueTest, AsyncTouchWithHardTouchStartReset) { | 1944 TEST_F(TouchEventQueueTest, AsyncTouchWithHardTouchStartReset) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1958 EXPECT_EQ(0U, queued_event_count()); | 1965 EXPECT_EQ(0U, queued_event_count()); |
| 1959 EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type); | 1966 EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type); |
| 1960 | 1967 |
| 1961 // The queue should be robust to hard touch restarts with a new touch | 1968 // 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 | 1969 // sequence. In this case, the deferred async touch should not be flushed |
| 1963 // by the new touch sequence. | 1970 // by the new touch sequence. |
| 1964 SendGestureEvent(WebInputEvent::GestureScrollEnd); | 1971 SendGestureEvent(WebInputEvent::GestureScrollEnd); |
| 1965 ResetTouchEvent(); | 1972 ResetTouchEvent(); |
| 1966 | 1973 |
| 1967 PressTouchPoint(0, 0); | 1974 PressTouchPoint(0, 0); |
| 1968 EXPECT_EQ(1U, GetAndResetSentEventCount()); | |
| 1969 EXPECT_EQ(WebInputEvent::TouchStart, sent_event().type); | 1975 EXPECT_EQ(WebInputEvent::TouchStart, sent_event().type); |
| 1970 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1976 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 1971 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 1977 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1978 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1979 } |
| 1980 |
| 1981 // Ensure that even when the interval expires, we still need to wait for the |
| 1982 // ack sent back from render to send the next async touchmove once the scroll |
| 1983 // starts. |
| 1984 TEST_F(TouchEventQueueTest, SendNextThrottledAsyncTouchMoveAfterAck) { |
| 1985 // Process a TouchStart |
| 1986 PressTouchPoint(0, 1); |
| 1987 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 1988 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1989 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1990 |
| 1991 // Initiate async touchmove dispatch after the start of a scroll sequence. |
| 1992 MoveTouchPoint(0, 0, 5); |
| 1993 WebGestureEvent followup_scroll; |
| 1994 followup_scroll.type = WebInputEvent::GestureScrollBegin; |
| 1995 SetFollowupEvent(followup_scroll); |
| 1996 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1997 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 1998 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1999 |
| 2000 MoveTouchPoint(0, 0, 10); |
| 2001 followup_scroll.type = WebInputEvent::GestureScrollUpdate; |
| 2002 SetFollowupEvent(followup_scroll); |
| 2003 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 2004 EXPECT_FALSE(HasPendingAsyncTouchMove()); |
| 2005 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 2006 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 2007 |
| 2008 // We set the next touch event time to be after the throttled interval. |
| 2009 AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1); |
| 2010 // Dispatch the touch move event when sufficient time has passed. |
| 2011 MoveTouchPoint(0, 0, 40); |
| 2012 EXPECT_FALSE(HasPendingAsyncTouchMove()); |
| 2013 EXPECT_FALSE(sent_event().cancelable); |
| 2014 // When we dispatch an async touchmove, we do not put it back to the queue |
| 2015 // any more and we will ack to client right away. |
| 2016 EXPECT_EQ(0U, queued_event_count()); |
| 2017 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 2018 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 2019 EXPECT_EQ(1U, uncancelable_touch_moves_pending_ack_count()); |
| 2020 |
| 2021 // Do not dispatch the event until throttledTouchmoves intervals expires and |
| 2022 // receive an ack from render. |
| 2023 AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1); |
| 2024 MoveTouchPoint(0, 0, 50); |
| 2025 EXPECT_TRUE(HasPendingAsyncTouchMove()); |
| 2026 EXPECT_EQ(0U, queued_event_count()); |
| 2027 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 2028 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 2029 EXPECT_EQ(1U, uncancelable_touch_moves_pending_ack_count()); |
| 2030 |
| 2031 // Send pending_async_touch_move_ when we receive an ack back from render, |
| 2032 // but we will not send an ack for pending_async_touch_move_ becasue it is |
| 2033 // been acked before. |
| 2034 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 2035 EXPECT_FALSE(HasPendingAsyncTouchMove()); |
| 2036 EXPECT_EQ(0U, queued_event_count()); |
| 2037 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 2038 EXPECT_EQ(0U, GetAndResetAckedEventCount()); |
| 2039 EXPECT_EQ(1U, uncancelable_touch_moves_pending_ack_count()); |
| 2040 } |
| 2041 |
| 2042 // Ensure that even when we receive the ack from render, we still need to wait |
| 2043 // for the interval expires to send the next async touchmove once the scroll |
| 2044 // starts. |
| 2045 TEST_F(TouchEventQueueTest, SendNextAsyncTouchMoveAfterAckAndTimeExpire) { |
| 2046 // Process a TouchStart |
| 2047 PressTouchPoint(0, 1); |
| 2048 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 2049 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 2050 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 2051 |
| 2052 // Initiate async touchmove dispatch after the start of a scroll sequence. |
| 2053 MoveTouchPoint(0, 0, 5); |
| 2054 WebGestureEvent followup_scroll; |
| 2055 followup_scroll.type = WebInputEvent::GestureScrollBegin; |
| 2056 SetFollowupEvent(followup_scroll); |
| 2057 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 2058 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 2059 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 2060 |
| 2061 MoveTouchPoint(0, 0, 10); |
| 2062 followup_scroll.type = WebInputEvent::GestureScrollUpdate; |
| 2063 SetFollowupEvent(followup_scroll); |
| 2064 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 2065 EXPECT_FALSE(HasPendingAsyncTouchMove()); |
| 2066 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 2067 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 2068 |
| 2069 // Dispatch the touch move event when sufficient time has passed. |
| 2070 AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1); |
| 2071 MoveTouchPoint(0, 0, 40); |
| 2072 EXPECT_FALSE(HasPendingAsyncTouchMove()); |
| 2073 EXPECT_FALSE(sent_event().cancelable); |
| 2074 // When we dispatch an async touchmove, we do not put it back to the queue |
| 2075 // any more and we will ack to client right away. |
| 2076 EXPECT_EQ(0U, queued_event_count()); |
| 2077 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 2078 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 2079 EXPECT_EQ(1U, uncancelable_touch_moves_pending_ack_count()); |
| 2080 |
| 2081 // We receive an ack back from render but the time interval is not expired, |
| 2082 // so we do not dispatch the touch move event. |
| 2083 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 2084 EXPECT_EQ(0U, uncancelable_touch_moves_pending_ack_count()); |
| 2085 MoveTouchPoint(0, 0, 50); |
| 2086 EXPECT_TRUE(HasPendingAsyncTouchMove()); |
| 2087 EXPECT_EQ(0U, queued_event_count()); |
| 2088 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 2089 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 2090 |
| 2091 // Dispatch the touch move when sufficient time has passed. |
| 2092 AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1); |
| 2093 MoveTouchPoint(0, 0, 50); |
| 2094 EXPECT_FALSE(HasPendingAsyncTouchMove()); |
| 2095 EXPECT_EQ(WebInputEvent::TouchMove, sent_event().type); |
| 2096 EXPECT_FALSE(sent_event().cancelable); |
| 2097 EXPECT_EQ(0U, queued_event_count()); |
| 2098 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 2099 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 2100 EXPECT_EQ(1U, uncancelable_touch_moves_pending_ack_count()); |
| 2101 } |
| 2102 |
| 2103 TEST_F(TouchEventQueueTest, AsyncTouchFlushedByNonTouchMove) { |
| 2104 // Process a TouchStart |
| 2105 PressTouchPoint(0, 1); |
| 2106 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 2107 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 2108 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 2109 |
| 2110 // Initiate async touchmove dispatch after the start of a scroll sequence. |
| 2111 MoveTouchPoint(0, 0, 5); |
| 2112 WebGestureEvent followup_scroll; |
| 2113 followup_scroll.type = WebInputEvent::GestureScrollBegin; |
| 2114 SetFollowupEvent(followup_scroll); |
| 2115 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 2116 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 2117 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 2118 |
| 2119 MoveTouchPoint(0, 0, 10); |
| 2120 followup_scroll.type = WebInputEvent::GestureScrollUpdate; |
| 2121 SetFollowupEvent(followup_scroll); |
| 2122 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 2123 EXPECT_FALSE(HasPendingAsyncTouchMove()); |
| 2124 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 2125 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 2126 |
| 2127 // Dispatch the touch move when sufficient time has passed. |
| 2128 AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1); |
| 2129 MoveTouchPoint(0, 0, 40); |
| 2130 EXPECT_FALSE(HasPendingAsyncTouchMove()); |
| 2131 EXPECT_FALSE(sent_event().cancelable); |
| 2132 // When we dispatch an async touchmove, we do not put it back to the queue |
| 2133 // any more and we will ack to client right away. |
| 2134 EXPECT_EQ(0U, queued_event_count()); |
| 2135 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 2136 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 2137 EXPECT_EQ(1U, uncancelable_touch_moves_pending_ack_count()); |
| 2138 |
| 2139 for (int i = 0; i < 3; ++i) { |
| 2140 // We throttle the touchmoves, put it in the pending_async_touch_move_, |
| 2141 // do not dispatch it. |
| 2142 MoveTouchPoint(0, 10 + 10 * i, 10 + 10 * i); |
| 2143 EXPECT_TRUE(HasPendingAsyncTouchMove()); |
| 2144 EXPECT_EQ(0U, queued_event_count()); |
| 2145 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 2146 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 2147 EXPECT_EQ(static_cast<size_t>(i + 1), |
| 2148 uncancelable_touch_moves_pending_ack_count()); |
| 2149 |
| 2150 // Send touchstart will flush pending_async_touch_move_, and increase the |
| 2151 // count. In this case, we will first dispatch an async touchmove and |
| 2152 // then a touchstart. For the async touchmove, we will not send ack again. |
| 2153 PressTouchPoint(30, 30); |
| 2154 EXPECT_FALSE(HasPendingAsyncTouchMove()); |
| 2155 EXPECT_EQ(2U, all_sent_events().size()); |
| 2156 EXPECT_EQ(WebInputEvent::TouchMove, all_sent_events()[0].type); |
| 2157 EXPECT_FALSE(all_sent_events()[0].cancelable); |
| 2158 EXPECT_EQ(10 + 10 * i, all_sent_events()[0].touches[0].position.x); |
| 2159 EXPECT_EQ(10 + 10 * i, all_sent_events()[0].touches[0].position.y); |
| 2160 EXPECT_EQ(static_cast<size_t>(i + 2), |
| 2161 uncancelable_touch_moves_pending_ack_count()); |
| 2162 EXPECT_EQ(WebInputEvent::TouchStart, all_sent_events()[1].type); |
| 2163 EXPECT_TRUE(all_sent_events()[1].cancelable); |
| 2164 EXPECT_EQ(2U, GetAndResetSentEventCount()); |
| 2165 EXPECT_EQ(0U, GetAndResetAckedEventCount()); |
| 2166 |
| 2167 SendTouchEventAckWithID(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, |
| 2168 GetUniqueTouchEventID()); |
| 2169 EXPECT_EQ(0U, queued_event_count()); |
| 2170 EXPECT_FALSE(HasPendingAsyncTouchMove()); |
| 2171 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 2172 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 2173 } |
| 2174 |
| 2175 EXPECT_EQ(4U, uncancelable_touch_moves_pending_ack_count()); |
| 2176 |
| 2177 // When we receive an ack from render we decrease the count. |
| 2178 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 2179 EXPECT_EQ(3U, uncancelable_touch_moves_pending_ack_count()); |
| 2180 EXPECT_EQ(0U, queued_event_count()); |
| 2181 EXPECT_FALSE(HasPendingAsyncTouchMove()); |
| 2182 |
| 2183 // Do not dispatch the next uncancelable touchmove when we have not received |
| 2184 // all the acks back from render. |
| 2185 AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1); |
| 2186 MoveTouchPoint(0, 20, 30); |
| 2187 EXPECT_TRUE(HasPendingAsyncTouchMove()); |
| 2188 EXPECT_EQ(0U, queued_event_count()); |
| 2189 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 2190 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 2191 EXPECT_EQ(3U, uncancelable_touch_moves_pending_ack_count()); |
| 2192 |
| 2193 // Once we receive the ack from render, we do not dispatch the |
| 2194 // pending_async_touchmove_ until the count is 0. |
| 2195 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 2196 EXPECT_EQ(2U, uncancelable_touch_moves_pending_ack_count()); |
| 2197 EXPECT_EQ(0U, queued_event_count()); |
| 2198 EXPECT_TRUE(HasPendingAsyncTouchMove()); |
| 2199 |
| 2200 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 2201 |
| 2202 // When we receive this ack from render, and the count is 0, so we can |
| 2203 // dispatch the pending_async_touchmove_. |
| 2204 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 2205 EXPECT_EQ(1U, uncancelable_touch_moves_pending_ack_count()); |
| 2206 EXPECT_FALSE(HasPendingAsyncTouchMove()); |
| 2207 EXPECT_EQ(0U, queued_event_count()); |
| 2208 EXPECT_EQ(WebInputEvent::TouchMove, sent_event().type); |
| 2209 EXPECT_FALSE(sent_event().cancelable); |
| 2210 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 2211 EXPECT_EQ(0U, GetAndResetAckedEventCount()); |
| 2212 } |
| 2213 |
| 2214 // Ensure that even when we receive the ack from render, we still need to wait |
| 2215 // for the interval expires to send the next async touchmove once the scroll |
| 2216 // starts. |
| 2217 TEST_F(TouchEventQueueTest, DoNotIncreaseIfClientConsumeAsyncTouchMove) { |
| 2218 // Process a TouchStart |
| 2219 PressTouchPoint(0, 1); |
| 2220 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 2221 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 2222 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 2223 |
| 2224 // Initiate async touchmove dispatch after the start of a scroll sequence. |
| 2225 MoveTouchPoint(0, 0, 5); |
| 2226 WebGestureEvent followup_scroll; |
| 2227 followup_scroll.type = WebInputEvent::GestureScrollBegin; |
| 2228 SetFollowupEvent(followup_scroll); |
| 2229 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 2230 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 2231 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 2232 |
| 2233 MoveTouchPoint(0, 0, 10); |
| 2234 followup_scroll.type = WebInputEvent::GestureScrollUpdate; |
| 2235 SetFollowupEvent(followup_scroll); |
| 2236 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 2237 EXPECT_FALSE(HasPendingAsyncTouchMove()); |
| 2238 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 2239 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 2240 |
| 2241 // Dispatch the touch move event when sufficient time has passed. |
| 2242 AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1); |
| 2243 MoveTouchPoint(0, 0, 40); |
| 2244 EXPECT_FALSE(HasPendingAsyncTouchMove()); |
| 2245 EXPECT_FALSE(sent_event().cancelable); |
| 2246 // When we dispatch an async touchmove, we do not put it back to the queue |
| 2247 // any more and we will ack to client right away. |
| 2248 EXPECT_EQ(0U, queued_event_count()); |
| 2249 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 2250 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 2251 EXPECT_EQ(1U, uncancelable_touch_moves_pending_ack_count()); |
| 2252 |
| 2253 // We receive an ack back from render but the time interval is not expired, |
| 2254 // so we do not dispatch the touch move event. |
| 2255 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 2256 EXPECT_EQ(0U, uncancelable_touch_moves_pending_ack_count()); |
| 2257 MoveTouchPoint(0, 0, 50); |
| 2258 EXPECT_TRUE(HasPendingAsyncTouchMove()); |
| 2259 EXPECT_EQ(0U, queued_event_count()); |
| 2260 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 2261 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 2262 |
| 2263 // Dispatch the touch move when sufficient time has passed. Becasue the event |
| 2264 // is consumed by client already, we would not increase the count and ack to |
| 2265 // client again. |
| 2266 AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1); |
| 2267 SetSyncAckResult(INPUT_EVENT_ACK_STATE_CONSUMED); |
| 2268 MoveTouchPoint(0, 0, 50); |
| 2269 EXPECT_FALSE(HasPendingAsyncTouchMove()); |
| 2270 EXPECT_EQ(WebInputEvent::TouchMove, sent_event().type); |
| 2271 EXPECT_FALSE(sent_event().cancelable); |
| 2272 EXPECT_EQ(0U, queued_event_count()); |
| 2273 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 2274 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 2275 EXPECT_EQ(0U, uncancelable_touch_moves_pending_ack_count()); |
| 1972 } | 2276 } |
| 1973 | 2277 |
| 1974 TEST_F(TouchEventQueueTest, TouchAbsorptionWithConsumedFirstMove) { | 2278 TEST_F(TouchEventQueueTest, TouchAbsorptionWithConsumedFirstMove) { |
| 1975 // Queue a TouchStart. | 2279 // Queue a TouchStart. |
| 1976 PressTouchPoint(0, 1); | 2280 PressTouchPoint(0, 1); |
| 1977 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 2281 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1978 EXPECT_EQ(0U, queued_event_count()); | 2282 EXPECT_EQ(0U, queued_event_count()); |
| 1979 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 2283 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 1980 | 2284 |
| 1981 MoveTouchPoint(0, 20, 5); | 2285 MoveTouchPoint(0, 20, 5); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1998 SetFollowupEvent(followup_scroll); | 2302 SetFollowupEvent(followup_scroll); |
| 1999 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 2303 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 2000 SendGestureEventAck(WebInputEvent::GestureScrollUpdate, | 2304 SendGestureEventAck(WebInputEvent::GestureScrollUpdate, |
| 2001 INPUT_EVENT_ACK_STATE_CONSUMED); | 2305 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 2002 EXPECT_EQ(0U, queued_event_count()); | 2306 EXPECT_EQ(0U, queued_event_count()); |
| 2003 EXPECT_TRUE(sent_event().cancelable); | 2307 EXPECT_TRUE(sent_event().cancelable); |
| 2004 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 2308 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 2005 | 2309 |
| 2006 // Touch move event is throttled. | 2310 // Touch move event is throttled. |
| 2007 MoveTouchPoint(0, 60, 5); | 2311 MoveTouchPoint(0, 60, 5); |
| 2008 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); | |
| 2009 EXPECT_EQ(0U, queued_event_count()); | 2312 EXPECT_EQ(0U, queued_event_count()); |
| 2010 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 2313 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 2011 } | 2314 } |
| 2012 | 2315 |
| 2013 TEST_F(TouchEventQueueTest, TouchStartCancelableDuringScroll) { | 2316 TEST_F(TouchEventQueueTest, TouchStartCancelableDuringScroll) { |
| 2014 // Queue a touchstart and touchmove that go unconsumed, transitioning to an | 2317 // Queue a touchstart and touchmove that go unconsumed, transitioning to an |
| 2015 // active scroll sequence. | 2318 // active scroll sequence. |
| 2016 PressTouchPoint(0, 1); | 2319 PressTouchPoint(0, 1); |
| 2017 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 2320 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 2321 EXPECT_TRUE(sent_event().cancelable); |
| 2018 ASSERT_EQ(1U, GetAndResetSentEventCount()); | 2322 ASSERT_EQ(1U, GetAndResetSentEventCount()); |
| 2019 EXPECT_TRUE(sent_event().cancelable); | |
| 2020 | 2323 |
| 2021 MoveTouchPoint(0, 20, 5); | 2324 MoveTouchPoint(0, 20, 5); |
| 2022 EXPECT_TRUE(sent_event().cancelable); | 2325 EXPECT_TRUE(sent_event().cancelable); |
| 2023 SendGestureEvent(blink::WebInputEvent::GestureScrollBegin); | 2326 SendGestureEvent(blink::WebInputEvent::GestureScrollBegin); |
| 2024 SendGestureEvent(blink::WebInputEvent::GestureScrollUpdate); | 2327 SendGestureEvent(blink::WebInputEvent::GestureScrollUpdate); |
| 2025 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 2328 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 2329 EXPECT_TRUE(sent_event().cancelable); |
| 2026 ASSERT_EQ(1U, GetAndResetSentEventCount()); | 2330 ASSERT_EQ(1U, GetAndResetSentEventCount()); |
| 2027 EXPECT_TRUE(sent_event().cancelable); | |
| 2028 | 2331 |
| 2029 // Even though scrolling has begun, touchstart events should be cancelable, | 2332 // Even though scrolling has begun, touchstart events should be cancelable, |
| 2030 // allowing, for example, customized pinch processing. | 2333 // allowing, for example, customized pinch processing. |
| 2031 PressTouchPoint(10, 11); | 2334 PressTouchPoint(10, 11); |
| 2032 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); | 2335 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); |
| 2336 EXPECT_TRUE(sent_event().cancelable); |
| 2033 ASSERT_EQ(1U, GetAndResetSentEventCount()); | 2337 ASSERT_EQ(1U, GetAndResetSentEventCount()); |
| 2034 EXPECT_TRUE(sent_event().cancelable); | |
| 2035 | 2338 |
| 2036 // As the touch start was consumed, touchmoves should no longer be throttled. | 2339 // As the touch start was consumed, touchmoves should no longer be throttled. |
| 2037 MoveTouchPoint(1, 11, 11); | 2340 MoveTouchPoint(1, 11, 11); |
| 2038 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); | 2341 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); |
| 2342 EXPECT_TRUE(sent_event().cancelable); |
| 2039 ASSERT_EQ(1U, GetAndResetSentEventCount()); | 2343 ASSERT_EQ(1U, GetAndResetSentEventCount()); |
| 2040 EXPECT_TRUE(sent_event().cancelable); | |
| 2041 | 2344 |
| 2042 // With throttling disabled, touchend and touchmove events should also be | 2345 // With throttling disabled, touchend and touchmove events should also be |
| 2043 // cancelable. | 2346 // cancelable. |
| 2044 MoveTouchPoint(1, 12, 12); | 2347 MoveTouchPoint(1, 12, 12); |
| 2045 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); | 2348 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); |
| 2349 EXPECT_TRUE(sent_event().cancelable); |
| 2046 ASSERT_EQ(1U, GetAndResetSentEventCount()); | 2350 ASSERT_EQ(1U, GetAndResetSentEventCount()); |
| 2047 EXPECT_TRUE(sent_event().cancelable); | |
| 2048 ReleaseTouchPoint(1); | 2351 ReleaseTouchPoint(1); |
| 2049 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); | 2352 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); |
| 2353 EXPECT_TRUE(sent_event().cancelable); |
| 2050 ASSERT_EQ(1U, GetAndResetSentEventCount()); | 2354 ASSERT_EQ(1U, GetAndResetSentEventCount()); |
| 2051 EXPECT_TRUE(sent_event().cancelable); | |
| 2052 | 2355 |
| 2053 // If subsequent touchmoves aren't consumed, the generated scroll events | 2356 // If subsequent touchmoves aren't consumed, the generated scroll events |
| 2054 // will restore async touch dispatch. | 2357 // will restore async touch dispatch. |
| 2055 MoveTouchPoint(0, 25, 5); | 2358 MoveTouchPoint(0, 25, 5); |
| 2056 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 2359 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 2057 SendGestureEvent(blink::WebInputEvent::GestureScrollUpdate); | 2360 SendGestureEvent(blink::WebInputEvent::GestureScrollUpdate); |
| 2361 EXPECT_TRUE(sent_event().cancelable); |
| 2058 ASSERT_EQ(1U, GetAndResetSentEventCount()); | 2362 ASSERT_EQ(1U, GetAndResetSentEventCount()); |
| 2059 EXPECT_TRUE(sent_event().cancelable); | |
| 2060 AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1); | 2363 AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1); |
| 2061 MoveTouchPoint(0, 30, 5); | 2364 MoveTouchPoint(0, 30, 5); |
| 2365 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 2366 EXPECT_FALSE(sent_event().cancelable); |
| 2062 ASSERT_EQ(1U, GetAndResetSentEventCount()); | 2367 ASSERT_EQ(1U, GetAndResetSentEventCount()); |
| 2063 SendTouchEventAck(INPUT_EVENT_ACK_STATE_IGNORED); | |
| 2064 EXPECT_FALSE(sent_event().cancelable); | |
| 2065 | 2368 |
| 2066 // The touchend will be uncancelable during an active scroll sequence. | 2369 // The touchend will be uncancelable during an active scroll sequence. |
| 2067 ReleaseTouchPoint(0); | 2370 ReleaseTouchPoint(0); |
| 2371 EXPECT_FALSE(sent_event().cancelable); |
| 2068 ASSERT_EQ(1U, GetAndResetSentEventCount()); | 2372 ASSERT_EQ(1U, GetAndResetSentEventCount()); |
| 2069 EXPECT_FALSE(sent_event().cancelable); | |
| 2070 } | 2373 } |
| 2071 | 2374 |
| 2072 TEST_F(TouchEventQueueTest, UnseenTouchPointerIdsNotForwarded) { | 2375 TEST_F(TouchEventQueueTest, UnseenTouchPointerIdsNotForwarded) { |
| 2073 SyntheticWebTouchEvent event; | 2376 SyntheticWebTouchEvent event; |
| 2074 event.PressPoint(0, 0); | 2377 event.PressPoint(0, 0); |
| 2075 SendTouchEvent(event); | 2378 SendTouchEvent(event); |
| 2076 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 2379 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 2077 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); | 2380 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); |
| 2078 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 2381 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 2079 | 2382 |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2211 PressTouchPoint(2, 2); | 2514 PressTouchPoint(2, 2); |
| 2212 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); | 2515 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); |
| 2213 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); | 2516 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); |
| 2214 EXPECT_EQ(0U, queued_event_count()); | 2517 EXPECT_EQ(0U, queued_event_count()); |
| 2215 EXPECT_EQ(2U, GetAndResetSentEventCount()); | 2518 EXPECT_EQ(2U, GetAndResetSentEventCount()); |
| 2216 EXPECT_EQ(2U, GetAndResetAckedEventCount()); | 2519 EXPECT_EQ(2U, GetAndResetAckedEventCount()); |
| 2217 | 2520 |
| 2218 // Move 1st touch point. | 2521 // Move 1st touch point. |
| 2219 MoveTouchPoint(0, 10, 10); | 2522 MoveTouchPoint(0, 10, 10); |
| 2220 EXPECT_EQ(1U, queued_event_count()); | 2523 EXPECT_EQ(1U, queued_event_count()); |
| 2221 EXPECT_EQ(1U, GetAndResetSentEventCount()); | |
| 2222 EXPECT_EQ(0U, GetAndResetAckedEventCount()); | |
| 2223 | 2524 |
| 2224 // TouchMove should be allowed and test for touches state. | 2525 // TouchMove should be allowed and test for touches state. |
| 2225 const WebTouchEvent& event1 = sent_event(); | 2526 const WebTouchEvent& event1 = sent_event(); |
| 2226 EXPECT_EQ(WebInputEvent::TouchMove, event1.type); | 2527 EXPECT_EQ(WebInputEvent::TouchMove, event1.type); |
| 2227 EXPECT_EQ(WebTouchPoint::StateMoved, event1.touches[0].state); | 2528 EXPECT_EQ(WebTouchPoint::StateMoved, event1.touches[0].state); |
| 2228 EXPECT_EQ(WebTouchPoint::StateStationary, event1.touches[1].state); | 2529 EXPECT_EQ(WebTouchPoint::StateStationary, event1.touches[1].state); |
| 2530 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 2531 EXPECT_EQ(0U, GetAndResetAckedEventCount()); |
| 2229 | 2532 |
| 2230 // Do not really move any touch points, but use previous values. | 2533 // Do not really move any touch points, but use previous values. |
| 2231 MoveTouchPoint(0, 10, 10); | 2534 MoveTouchPoint(0, 10, 10); |
| 2232 ChangeTouchPointRadius(1, 1, 1); | 2535 ChangeTouchPointRadius(1, 1, 1); |
| 2233 MoveTouchPoint(1, 2, 2); | 2536 MoveTouchPoint(1, 2, 2); |
| 2234 EXPECT_EQ(2U, queued_event_count()); | 2537 EXPECT_EQ(2U, queued_event_count()); |
| 2235 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 2538 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 2236 | 2539 |
| 2237 // Receive an ACK for 1st TouchMove. | 2540 // Receive an ACK for 1st TouchMove. |
| 2238 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); | 2541 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); |
| 2239 | 2542 |
| 2240 // Tries to forward TouchMove but should be filtered | 2543 // Tries to forward TouchMove but should be filtered |
| 2241 // when none of the touch points have changed. | 2544 // when none of the touch points have changed. |
| 2242 EXPECT_EQ(0U, queued_event_count()); | 2545 EXPECT_EQ(0U, queued_event_count()); |
| 2243 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 2546 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 2244 EXPECT_EQ(4U, GetAndResetAckedEventCount()); | 2547 EXPECT_EQ(4U, GetAndResetAckedEventCount()); |
| 2245 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state()); | 2548 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state()); |
| 2246 | 2549 |
| 2247 // Move 2nd touch point. | 2550 // Move 2nd touch point. |
| 2248 MoveTouchPoint(1, 3, 3); | 2551 MoveTouchPoint(1, 3, 3); |
| 2249 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); | 2552 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); |
| 2250 EXPECT_EQ(0U, queued_event_count()); | 2553 EXPECT_EQ(0U, queued_event_count()); |
| 2251 EXPECT_EQ(1U, GetAndResetSentEventCount()); | |
| 2252 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | |
| 2253 | 2554 |
| 2254 // TouchMove should be allowed and test for touches state. | 2555 // TouchMove should be allowed and test for touches state. |
| 2255 const WebTouchEvent& event2 = sent_event(); | 2556 const WebTouchEvent& event2 = sent_event(); |
| 2256 EXPECT_EQ(WebInputEvent::TouchMove, event2.type); | 2557 EXPECT_EQ(WebInputEvent::TouchMove, event2.type); |
| 2257 EXPECT_EQ(WebTouchPoint::StateStationary, event2.touches[0].state); | 2558 EXPECT_EQ(WebTouchPoint::StateStationary, event2.touches[0].state); |
| 2258 EXPECT_EQ(WebTouchPoint::StateMoved, event2.touches[1].state); | 2559 EXPECT_EQ(WebTouchPoint::StateMoved, event2.touches[1].state); |
| 2560 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 2561 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 2259 } | 2562 } |
| 2260 | 2563 |
| 2261 } // namespace content | 2564 } // namespace content |
| OLD | NEW |