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

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

Issue 48973005: Move TouchEvent timeout code to the TouchEventQueue (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Cleanup Created 7 years 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"
9 #include "content/browser/renderer_host/input/timeout_monitor.h"
8 #include "content/browser/renderer_host/input/touch_event_queue.h" 10 #include "content/browser/renderer_host/input/touch_event_queue.h"
9 #include "content/common/input/synthetic_web_input_event_builders.h" 11 #include "content/common/input/synthetic_web_input_event_builders.h"
10 #include "testing/gtest/include/gtest/gtest.h" 12 #include "testing/gtest/include/gtest/gtest.h"
11 #include "third_party/WebKit/public/web/WebInputEvent.h" 13 #include "third_party/WebKit/public/web/WebInputEvent.h"
12 14
13 using blink::WebGestureEvent; 15 using blink::WebGestureEvent;
14 using blink::WebInputEvent; 16 using blink::WebInputEvent;
15 using blink::WebTouchEvent; 17 using blink::WebTouchEvent;
16 using blink::WebTouchPoint; 18 using blink::WebTouchPoint;
17 19
18 namespace content { 20 namespace content {
21 namespace {
22 const size_t kDefaultTouchTimeoutDelayMs = 10;
23 }
19 24
20 class TouchEventQueueTest : public testing::Test, 25 class TouchEventQueueTest : public testing::Test,
21 public TouchEventQueueClient { 26 public TouchEventQueueClient {
22 public: 27 public:
23 TouchEventQueueTest() 28 TouchEventQueueTest()
24 : sent_event_count_(0), 29 : sent_event_count_(0),
25 acked_event_count_(0), 30 acked_event_count_(0),
26 last_acked_event_state_(INPUT_EVENT_ACK_STATE_UNKNOWN) {} 31 last_acked_event_state_(INPUT_EVENT_ACK_STATE_UNKNOWN) {}
27 32
28 virtual ~TouchEventQueueTest() {} 33 virtual ~TouchEventQueueTest() {}
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
60 scoped_ptr<WebGestureEvent> followup_gesture_event = 65 scoped_ptr<WebGestureEvent> followup_gesture_event =
61 followup_gesture_event_.Pass(); 66 followup_gesture_event_.Pass();
62 queue_->OnGestureScrollEvent( 67 queue_->OnGestureScrollEvent(
63 GestureEventWithLatencyInfo(*followup_gesture_event, 68 GestureEventWithLatencyInfo(*followup_gesture_event,
64 ui::LatencyInfo())); 69 ui::LatencyInfo()));
65 } 70 }
66 } 71 }
67 72
68 protected: 73 protected:
69 74
75 void SetUpForTimeoutTesting(size_t timeout_delay_ms) {
76 queue_->SetAckTimeoutEnabled(true, timeout_delay_ms);
77 }
78
70 void SendTouchEvent(const WebTouchEvent& event) { 79 void SendTouchEvent(const WebTouchEvent& event) {
71 queue_->QueueEvent(TouchEventWithLatencyInfo(event, ui::LatencyInfo())); 80 queue_->QueueEvent(TouchEventWithLatencyInfo(event, ui::LatencyInfo()));
72 } 81 }
73 82
74 void SendTouchEvent() { 83 void SendTouchEvent() {
75 SendTouchEvent(touch_event_); 84 SendTouchEvent(touch_event_);
76 touch_event_.ResetPoints(); 85 touch_event_.ResetPoints();
77 } 86 }
78 87
79 void SendGestureEvent(WebInputEvent::Type type) { 88 void SendGestureEvent(WebInputEvent::Type type) {
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 size_t GetAndResetSentEventCount() { 133 size_t GetAndResetSentEventCount() {
125 size_t count = sent_event_count_; 134 size_t count = sent_event_count_;
126 sent_event_count_ = 0; 135 sent_event_count_ = 0;
127 return count; 136 return count;
128 } 137 }
129 138
130 void Flush() { 139 void Flush() {
131 queue_->FlushQueue(); 140 queue_->FlushQueue();
132 } 141 }
133 142
143 void SetEnableTouchForwarding(bool enabled) {
144 queue_->no_touch_to_renderer_ = !enabled;
145 }
146
147 bool WillForwardTouchEvents() {
148 return !queue_->no_touch_to_renderer_ && !queue_->HasTimeoutEvent();
149 }
150
151 bool IsTimeoutRunning() {
152 return queue_->IsTimeoutRunningForTesting();
153 }
154
134 size_t queued_event_count() const { 155 size_t queued_event_count() const {
135 return queue_->GetQueueSize(); 156 return queue_->size();
136 } 157 }
137 158
138 const WebTouchEvent& latest_event() const { 159 const WebTouchEvent& latest_event() const {
139 return queue_->GetLatestEvent().event; 160 return queue_->GetLatestEventForTesting().event;
140 } 161 }
141 162
142 const WebTouchEvent& acked_event() const { 163 const WebTouchEvent& acked_event() const {
143 return last_acked_event_; 164 return last_acked_event_;
144 } 165 }
145 166
146 const WebTouchEvent& sent_event() const { 167 const WebTouchEvent& sent_event() const {
147 return last_sent_event_; 168 return last_sent_event_;
148 } 169 }
149 170
(...skipping 13 matching lines...) Expand all
163 scoped_ptr<TouchEventQueue> queue_; 184 scoped_ptr<TouchEventQueue> queue_;
164 size_t sent_event_count_; 185 size_t sent_event_count_;
165 size_t acked_event_count_; 186 size_t acked_event_count_;
166 WebTouchEvent last_sent_event_; 187 WebTouchEvent last_sent_event_;
167 WebTouchEvent last_acked_event_; 188 WebTouchEvent last_acked_event_;
168 InputEventAckState last_acked_event_state_; 189 InputEventAckState last_acked_event_state_;
169 SyntheticWebTouchEvent touch_event_; 190 SyntheticWebTouchEvent touch_event_;
170 scoped_ptr<WebTouchEvent> followup_touch_event_; 191 scoped_ptr<WebTouchEvent> followup_touch_event_;
171 scoped_ptr<WebGestureEvent> followup_gesture_event_; 192 scoped_ptr<WebGestureEvent> followup_gesture_event_;
172 scoped_ptr<InputEventAckState> sync_ack_result_; 193 scoped_ptr<InputEventAckState> sync_ack_result_;
194 base::MessageLoopForUI message_loop_;
173 }; 195 };
174 196
175 197
176 // Tests that touch-events are queued properly. 198 // Tests that touch-events are queued properly.
177 TEST_F(TouchEventQueueTest, Basic) { 199 TEST_F(TouchEventQueueTest, Basic) {
178 PressTouchPoint(1, 1); 200 PressTouchPoint(1, 1);
179 SendTouchEvent(); 201 SendTouchEvent();
180 EXPECT_EQ(1U, queued_event_count()); 202 EXPECT_EQ(1U, queued_event_count());
181 EXPECT_EQ(1U, GetAndResetSentEventCount()); 203 EXPECT_EQ(1U, GetAndResetSentEventCount());
182 204
(...skipping 517 matching lines...) Expand 10 before | Expand all | Expand 10 after
700 EXPECT_EQ(1U, queued_event_count()); 722 EXPECT_EQ(1U, queued_event_count());
701 EXPECT_EQ(1U, GetAndResetSentEventCount()); 723 EXPECT_EQ(1U, GetAndResetSentEventCount());
702 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 724 EXPECT_EQ(1U, GetAndResetAckedEventCount());
703 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state()); 725 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state());
704 EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type); 726 EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type);
705 } 727 }
706 728
707 // Tests basic TouchEvent forwarding suppression. 729 // Tests basic TouchEvent forwarding suppression.
708 TEST_F(TouchEventQueueTest, NoTouchBasic) { 730 TEST_F(TouchEventQueueTest, NoTouchBasic) {
709 // Disable TouchEvent forwarding. 731 // Disable TouchEvent forwarding.
710 set_no_touch_to_renderer(true); 732 SetEnableTouchForwarding(false);
711 MoveTouchPoint(0, 30, 5); 733 MoveTouchPoint(0, 30, 5);
712 SendTouchEvent(); 734 SendTouchEvent();
713 EXPECT_EQ(0U, GetAndResetSentEventCount()); 735 EXPECT_EQ(0U, GetAndResetSentEventCount());
714 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 736 EXPECT_EQ(1U, GetAndResetAckedEventCount());
715 737
716 // TouchMove should not be sent to renderer. 738 // TouchMove should not be sent to renderer.
717 MoveTouchPoint(0, 65, 10); 739 MoveTouchPoint(0, 65, 10);
718 SendTouchEvent(); 740 SendTouchEvent();
719 EXPECT_EQ(0U, GetAndResetSentEventCount()); 741 EXPECT_EQ(0U, GetAndResetSentEventCount());
720 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 742 EXPECT_EQ(1U, GetAndResetAckedEventCount());
721 743
722 // TouchEnd should not be sent to renderer. 744 // TouchEnd should not be sent to renderer.
723 ReleaseTouchPoint(0); 745 ReleaseTouchPoint(0);
724 SendTouchEvent(); 746 SendTouchEvent();
725 EXPECT_EQ(0U, GetAndResetSentEventCount()); 747 EXPECT_EQ(0U, GetAndResetSentEventCount());
726 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 748 EXPECT_EQ(1U, GetAndResetAckedEventCount());
727 749
728 // TouchStart should not be sent to renderer. 750 // TouchStart should not be sent to renderer.
729 PressTouchPoint(5, 5); 751 PressTouchPoint(5, 5);
730 SendTouchEvent(); 752 SendTouchEvent();
731 EXPECT_EQ(0U, GetAndResetSentEventCount()); 753 EXPECT_EQ(0U, GetAndResetSentEventCount());
732 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 754 EXPECT_EQ(1U, GetAndResetAckedEventCount());
733 755
734 // Enable TouchEvent forwarding. 756 // Enable TouchEvent forwarding.
735 set_no_touch_to_renderer(false); 757 SetEnableTouchForwarding(true);
736 758
737 PressTouchPoint(80, 10); 759 PressTouchPoint(80, 10);
738 SendTouchEvent(); 760 SendTouchEvent();
739 EXPECT_EQ(1U, GetAndResetSentEventCount()); 761 EXPECT_EQ(1U, GetAndResetSentEventCount());
740 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 762 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
741 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 763 EXPECT_EQ(1U, GetAndResetAckedEventCount());
742 764
743 MoveTouchPoint(0, 80, 20); 765 MoveTouchPoint(0, 80, 20);
744 SendTouchEvent(); 766 SendTouchEvent();
745 EXPECT_EQ(1U, GetAndResetSentEventCount()); 767 EXPECT_EQ(1U, GetAndResetSentEventCount());
(...skipping 25 matching lines...) Expand all
771 PressTouchPoint(20, 20); 793 PressTouchPoint(20, 20);
772 SendTouchEvent(); 794 SendTouchEvent();
773 EXPECT_EQ(2U, queued_event_count()); 795 EXPECT_EQ(2U, queued_event_count());
774 EXPECT_EQ(0U, GetAndResetSentEventCount()); 796 EXPECT_EQ(0U, GetAndResetSentEventCount());
775 EXPECT_EQ(WebInputEvent::TouchStart, latest_event().type); 797 EXPECT_EQ(WebInputEvent::TouchStart, latest_event().type);
776 798
777 // GestureScrollBegin inserts a synthetic TouchCancel before the TouchStart. 799 // GestureScrollBegin inserts a synthetic TouchCancel before the TouchStart.
778 WebGestureEvent followup_scroll; 800 WebGestureEvent followup_scroll;
779 followup_scroll.type = WebInputEvent::GestureScrollBegin; 801 followup_scroll.type = WebInputEvent::GestureScrollBegin;
780 SetFollowupEvent(followup_scroll); 802 SetFollowupEvent(followup_scroll);
781 ASSERT_FALSE(no_touch_to_renderer()); 803 ASSERT_TRUE(WillForwardTouchEvents());
782 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 804 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
783 EXPECT_TRUE(no_touch_to_renderer()); 805 EXPECT_FALSE(WillForwardTouchEvents());
784 EXPECT_EQ(1U, GetAndResetSentEventCount()); 806 EXPECT_EQ(1U, GetAndResetSentEventCount());
785 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 807 EXPECT_EQ(1U, GetAndResetAckedEventCount());
786 EXPECT_EQ(2U, queued_event_count()); 808 EXPECT_EQ(2U, queued_event_count());
787 EXPECT_EQ(WebInputEvent::TouchCancel, sent_event().type); 809 EXPECT_EQ(WebInputEvent::TouchCancel, sent_event().type);
788 EXPECT_EQ(WebInputEvent::TouchStart, latest_event().type); 810 EXPECT_EQ(WebInputEvent::TouchStart, latest_event().type);
789 811
790 // Acking the TouchCancel will result in dispatch of the next TouchStart. 812 // Acking the TouchCancel will result in dispatch of the next TouchStart.
791 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 813 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
792 // The synthetic TouchCancel should not reach client, only the TouchStart. 814 // The synthetic TouchCancel should not reach client, only the TouchStart.
793 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 815 EXPECT_EQ(1U, GetAndResetAckedEventCount());
794 EXPECT_EQ(0U, GetAndResetSentEventCount()); 816 EXPECT_EQ(0U, GetAndResetSentEventCount());
795 EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type); 817 EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type);
796 818
797 // TouchMove should not be sent to renderer. 819 // TouchMove should not be sent to the renderer.
798 MoveTouchPoint(0, 30, 5); 820 MoveTouchPoint(0, 30, 5);
799 SendTouchEvent(); 821 SendTouchEvent();
800 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 822 EXPECT_EQ(1U, GetAndResetAckedEventCount());
801 EXPECT_EQ(0U, GetAndResetSentEventCount()); 823 EXPECT_EQ(0U, GetAndResetSentEventCount());
802 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state()); 824 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state());
803 825
804 // GestureScrollUpdates should not change affect touch forwarding. 826 // GestureScrollUpdates should not change affect touch forwarding.
805 SendGestureEvent(WebInputEvent::GestureScrollUpdate); 827 SendGestureEvent(WebInputEvent::GestureScrollUpdate);
806 EXPECT_TRUE(no_touch_to_renderer()); 828 EXPECT_FALSE(WillForwardTouchEvents());
807 829
808 // TouchEnd should not be sent to renderer. 830 // TouchEnd should not be sent to the renderer.
809 ReleaseTouchPoint(0); 831 ReleaseTouchPoint(0);
810 SendTouchEvent(); 832 SendTouchEvent();
811 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 833 EXPECT_EQ(1U, GetAndResetAckedEventCount());
812 EXPECT_EQ(0U, GetAndResetSentEventCount()); 834 EXPECT_EQ(0U, GetAndResetSentEventCount());
813 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state()); 835 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state());
814 836
815 // GestureScrollEnd will resume the sending of TouchEvents to renderer. 837 // GestureScrollEnd will resume the sending of TouchEvents to renderer.
816 SendGestureEvent(blink::WebInputEvent::GestureScrollEnd); 838 SendGestureEvent(blink::WebInputEvent::GestureScrollEnd);
817 EXPECT_FALSE(no_touch_to_renderer()); 839 EXPECT_TRUE(WillForwardTouchEvents());
818 840
819 // Now TouchEvents should be forwarded normally. 841 // Now TouchEvents should be forwarded normally.
820 PressTouchPoint(80, 10); 842 PressTouchPoint(80, 10);
821 SendTouchEvent(); 843 SendTouchEvent();
822 EXPECT_EQ(1U, GetAndResetSentEventCount()); 844 EXPECT_EQ(1U, GetAndResetSentEventCount());
823 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 845 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
824 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 846 EXPECT_EQ(1U, GetAndResetAckedEventCount());
825 847
826 MoveTouchPoint(0, 80, 20); 848 MoveTouchPoint(0, 80, 20);
827 SendTouchEvent(); 849 SendTouchEvent();
828 EXPECT_EQ(1U, GetAndResetSentEventCount()); 850 EXPECT_EQ(1U, GetAndResetSentEventCount());
829 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 851 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
830 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 852 EXPECT_EQ(1U, GetAndResetAckedEventCount());
831 853
832 ReleaseTouchPoint(0); 854 ReleaseTouchPoint(0);
833 SendTouchEvent(); 855 SendTouchEvent();
834 EXPECT_EQ(1U, GetAndResetSentEventCount()); 856 EXPECT_EQ(1U, GetAndResetSentEventCount());
835 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 857 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
836 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 858 EXPECT_EQ(1U, GetAndResetAckedEventCount());
837 } 859 }
838 860
861 // Tests that the touch timeout is started when sending certain touch types.
862 TEST_F(TouchEventQueueTest, TouchTimeoutTypes) {
863 SetUpForTimeoutTesting(kDefaultTouchTimeoutDelayMs);
864
865 // Sending a TouchStart will start the timeout.
866 PressTouchPoint(0, 1);
867 SendTouchEvent();
868 EXPECT_TRUE(IsTimeoutRunning());
869 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
870 EXPECT_FALSE(IsTimeoutRunning());
871
872 // A TouchMove should start the timeout.
873 MoveTouchPoint(0, 5, 5);
874 SendTouchEvent();
875 EXPECT_TRUE(IsTimeoutRunning());
876 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
877 EXPECT_FALSE(IsTimeoutRunning());
878
879 // A TouchEnd should not start the timeout.
880 ReleaseTouchPoint(0);
881 SendTouchEvent();
882 EXPECT_FALSE(IsTimeoutRunning());
883 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
884 EXPECT_FALSE(IsTimeoutRunning());
885
886 // A TouchCancel should not start the timeout.
887 PressTouchPoint(0, 1);
888 SendTouchEvent();
889 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
890 ASSERT_FALSE(IsTimeoutRunning());
891 CancelTouchPoint(0);
892 SendTouchEvent();
893 EXPECT_FALSE(IsTimeoutRunning());
894 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
895 EXPECT_FALSE(IsTimeoutRunning());
896 }
897
898 // Tests that a delayed TouchEvent ack will trigger a TouchCancel timeout,
899 // disabling touch forwarding until the next TouchStart is received after
900 // the timeout events are ack'ed.
901 TEST_F(TouchEventQueueTest, TouchTimeoutBasic) {
902 SetUpForTimeoutTesting(kDefaultTouchTimeoutDelayMs);
903
904 // Queue a TouchStart.
905 GetAndResetSentEventCount();
906 GetAndResetAckedEventCount();
907 PressTouchPoint(0, 1);
908 SendTouchEvent();
909 ASSERT_EQ(1U, GetAndResetSentEventCount());
910 ASSERT_EQ(0U, GetAndResetAckedEventCount());
911 EXPECT_TRUE(IsTimeoutRunning());
912 EXPECT_TRUE(WillForwardTouchEvents());
913
914 // Delay the ack.
915 base::MessageLoop::current()->PostDelayedTask(
916 FROM_HERE,
917 base::MessageLoop::QuitClosure(),
918 base::TimeDelta::FromMilliseconds(kDefaultTouchTimeoutDelayMs * 2));
919 base::MessageLoop::current()->Run();
920
921 // The timeout should have fired, sending a TouchCancel and ack'ing the
922 // TouchStart immediately. TouchEvent forwarding is disabled until both
923 // acks are received.
924 EXPECT_FALSE(IsTimeoutRunning());
925 EXPECT_FALSE(WillForwardTouchEvents());
926 EXPECT_EQ(1U, GetAndResetSentEventCount());
927 EXPECT_EQ(1U, GetAndResetAckedEventCount());
928
929 // Ack'ing the original event should have no effect; we're still waiting
930 // on the cancel ack.
931 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
932 EXPECT_FALSE(IsTimeoutRunning());
933 EXPECT_FALSE(WillForwardTouchEvents());
934 EXPECT_EQ(0U, GetAndResetAckedEventCount());
935 EXPECT_EQ(0U, GetAndResetSentEventCount());
936
937 // Touch events should not be forwarded until we receive the original acks.
938 PressTouchPoint(0, 1);
939 SendTouchEvent();
940 ASSERT_EQ(0U, GetAndResetSentEventCount());
941 ASSERT_EQ(1U, GetAndResetAckedEventCount());
942
943 // The synthetic TouchCancel ack should not reach the client, but should
944 // resume touch forwarding.
945 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
946 EXPECT_EQ(0U, GetAndResetSentEventCount());
947 EXPECT_EQ(0U, GetAndResetAckedEventCount());
948 EXPECT_TRUE(WillForwardTouchEvents());
949
950 // Subsequent events should be handled normally.
951 PressTouchPoint(0, 1);
952 SendTouchEvent();
953 EXPECT_EQ(1U, GetAndResetSentEventCount());
954 EXPECT_EQ(0U, GetAndResetAckedEventCount());
955 }
956
957 // Tests that the timeout is never started if the renderer consumes
958 // a TouchEvent from the current touch sequence.
959 TEST_F(TouchEventQueueTest, NoTouchTimeoutIfRendererIsConsumingGesture) {
960 SetUpForTimeoutTesting(kDefaultTouchTimeoutDelayMs);
961
962 // Queue a TouchStart.
963 PressTouchPoint(0, 1);
964 SendTouchEvent();
965 ASSERT_TRUE(IsTimeoutRunning());
966
967 // Mark the event as consumed. This should prevent the timeout from
968 // being activated on subsequent TouchEvents in this gesture.
969 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
970 EXPECT_FALSE(IsTimeoutRunning());
971
972 // A TouchMove should not start the timeout.
973 MoveTouchPoint(0, 5, 5);
974 SendTouchEvent();
975 EXPECT_FALSE(IsTimeoutRunning());
976 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
977
978 // A TouchCancel should not start the timeout.
979 CancelTouchPoint(0);
980 SendTouchEvent();
981 EXPECT_FALSE(IsTimeoutRunning());
982 }
983
984 // Tests that the timeout is never started if the ack is synchronous.
985 TEST_F(TouchEventQueueTest, NoTouchTimeoutIfAckIsSynchronous) {
986 SetUpForTimeoutTesting(kDefaultTouchTimeoutDelayMs);
987
988 // Queue a TouchStart.
989 SetSyncAckResult(INPUT_EVENT_ACK_STATE_CONSUMED);
990 ASSERT_FALSE(IsTimeoutRunning());
991 PressTouchPoint(0, 1);
992 SendTouchEvent();
993 EXPECT_FALSE(IsTimeoutRunning());
994 }
995
996 // Tests that a TouchCancel timeout plays nice when the timed out touch stream
997 // turns into a scroll gesture sequence.
998 TEST_F(TouchEventQueueTest, TouchTimeoutWithFollowupGesture) {
999 SetUpForTimeoutTesting(kDefaultTouchTimeoutDelayMs);
1000
1001 // Queue a TouchStart.
1002 PressTouchPoint(0, 1);
1003 SendTouchEvent();
1004 EXPECT_TRUE(IsTimeoutRunning());
1005 EXPECT_TRUE(WillForwardTouchEvents());
1006 EXPECT_EQ(1U, GetAndResetSentEventCount());
1007
1008 // The cancelled sequence may turn into a scroll gesture.
1009 WebGestureEvent followup_scroll;
1010 followup_scroll.type = WebInputEvent::GestureScrollBegin;
1011 SetFollowupEvent(followup_scroll);
1012
1013 // Delay the ack.
1014 base::MessageLoop::current()->PostDelayedTask(
1015 FROM_HERE,
1016 base::MessageLoop::QuitClosure(),
1017 base::TimeDelta::FromMilliseconds(kDefaultTouchTimeoutDelayMs * 2));
1018 base::MessageLoop::current()->Run();
1019
1020 // The timeout should have fired, disabling touch forwarding until both acks
1021 // are received, acking the timed out event, and forwarding a TouchCancel.
1022 EXPECT_FALSE(IsTimeoutRunning());
1023 EXPECT_FALSE(WillForwardTouchEvents());
1024 EXPECT_EQ(1U, GetAndResetSentEventCount());
1025 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1026
1027 // Ack the original event.
1028 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
1029 EXPECT_FALSE(IsTimeoutRunning());
1030 EXPECT_FALSE(WillForwardTouchEvents());
1031
1032 // Ack the cancel event. Normally, this would resume touch forwarding,
1033 // but we're still within a scroll gesture so it remains disabled.
1034 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
1035 EXPECT_FALSE(IsTimeoutRunning());
1036 EXPECT_FALSE(WillForwardTouchEvents());
1037
1038 // Try to forward a touch event.
1039 GetAndResetSentEventCount();
1040 GetAndResetAckedEventCount();
1041 PressTouchPoint(0, 1);
1042 SendTouchEvent();
1043 EXPECT_FALSE(IsTimeoutRunning());
1044 EXPECT_EQ(0U, GetAndResetSentEventCount());
1045 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1046
1047 // Now end the scroll sequence, resuming touch handling.
1048 SendGestureEvent(blink::WebInputEvent::GestureScrollEnd);
1049 EXPECT_TRUE(WillForwardTouchEvents());
1050 PressTouchPoint(0, 1);
1051 SendTouchEvent();
1052 EXPECT_TRUE(IsTimeoutRunning());
1053 EXPECT_EQ(1U, GetAndResetSentEventCount());
1054 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1055 }
1056
1057 // Tests that a TouchCancel timeout plays nice when the timed out touch stream
1058 // turns into a scroll gesture sequence, but the original event acks are
1059 // significantly delayed.
1060 TEST_F(TouchEventQueueTest, TouchTimeoutWithFollowupGestureAndDelayedAck) {
1061 SetUpForTimeoutTesting(kDefaultTouchTimeoutDelayMs);
1062
1063 // Queue a TouchStart.
1064 PressTouchPoint(0, 1);
1065 SendTouchEvent();
1066 EXPECT_TRUE(IsTimeoutRunning());
1067 EXPECT_TRUE(WillForwardTouchEvents());
1068 EXPECT_EQ(1U, GetAndResetSentEventCount());
1069
1070 // The cancelled sequence may turn into a scroll gesture.
1071 WebGestureEvent followup_scroll;
1072 followup_scroll.type = WebInputEvent::GestureScrollBegin;
1073 SetFollowupEvent(followup_scroll);
1074
1075 // Delay the ack.
1076 base::MessageLoop::current()->PostDelayedTask(
1077 FROM_HERE,
1078 base::MessageLoop::QuitClosure(),
1079 base::TimeDelta::FromMilliseconds(kDefaultTouchTimeoutDelayMs * 2));
1080 base::MessageLoop::current()->Run();
1081
1082 // The timeout should have fired, disabling touch forwarding until both acks
1083 // are received, acking the timed out event, and forwarding a TouchCancel.
1084 EXPECT_FALSE(IsTimeoutRunning());
1085 EXPECT_FALSE(WillForwardTouchEvents());
1086 EXPECT_EQ(1U, GetAndResetSentEventCount());
1087 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1088
1089 // Try to forward a touch event.
1090 GetAndResetSentEventCount();
1091 GetAndResetAckedEventCount();
1092 PressTouchPoint(0, 1);
1093 SendTouchEvent();
1094 EXPECT_FALSE(IsTimeoutRunning());
1095 EXPECT_EQ(0U, GetAndResetSentEventCount());
1096 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1097
1098 // Now end the scroll sequence. Events will not be forwarded until the two
1099 // outstanding touch acks are received.
1100 SendGestureEvent(blink::WebInputEvent::GestureScrollEnd);
1101 PressTouchPoint(0, 1);
1102 SendTouchEvent();
1103 EXPECT_FALSE(IsTimeoutRunning());
1104 EXPECT_EQ(0U, GetAndResetSentEventCount());
1105 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1106
1107 // Ack the original and cancel events. Events will now be forwarded.
1108 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
1109 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
1110 EXPECT_EQ(0U, GetAndResetSentEventCount());
1111 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1112
1113 PressTouchPoint(0, 1);
1114 SendTouchEvent();
1115 EXPECT_TRUE(IsTimeoutRunning());
1116 EXPECT_EQ(1U, GetAndResetSentEventCount());
1117 }
1118
839 } // namespace content 1119 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698