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" |
| 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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |