| 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 |