| 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/memory/scoped_ptr.h" | 6 #include "base/memory/scoped_ptr.h" |
| 7 #include "base/strings/utf_string_conversions.h" | 7 #include "base/strings/utf_string_conversions.h" |
| 8 #include "content/browser/renderer_host/input/gesture_event_filter.h" | 8 #include "content/browser/renderer_host/input/gesture_event_filter.h" |
| 9 #include "content/browser/renderer_host/input/immediate_input_router.h" | 9 #include "content/browser/renderer_host/input/immediate_input_router.h" |
| 10 #include "content/browser/renderer_host/input/input_router_client.h" | 10 #include "content/browser/renderer_host/input/input_router_client.h" |
| (...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 358 } | 358 } |
| 359 | 359 |
| 360 TEST_F(ImmediateInputRouterTest, IgnoreKeyEventsWeDidntSend) { | 360 TEST_F(ImmediateInputRouterTest, IgnoreKeyEventsWeDidntSend) { |
| 361 // Send a simulated, unrequested key response. We should ignore this. | 361 // Send a simulated, unrequested key response. We should ignore this. |
| 362 SendInputEventACK(WebInputEvent::RawKeyDown, | 362 SendInputEventACK(WebInputEvent::RawKeyDown, |
| 363 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 363 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 364 | 364 |
| 365 ack_handler_->ExpectAckCalled(0); | 365 ack_handler_->ExpectAckCalled(0); |
| 366 } | 366 } |
| 367 | 367 |
| 368 // GestureEventFilter tests should be factored out of |
| 369 // ImmediateInputRouterTest. See crbug.com/301807. |
| 368 TEST_F(ImmediateInputRouterTest, CoalescesWheelEvents) { | 370 TEST_F(ImmediateInputRouterTest, CoalescesWheelEvents) { |
| 369 // Simulate wheel events. | 371 // Simulate wheel events. |
| 370 SimulateWheelEvent(0, -5, 0, false); // sent directly | 372 SimulateWheelEvent(0, -5, 0, false); // sent directly |
| 371 SimulateWheelEvent(0, -10, 0, false); // enqueued | 373 SimulateWheelEvent(0, -10, 0, false); // enqueued |
| 372 SimulateWheelEvent(8, -6, 0, false); // coalesced into previous event | 374 SimulateWheelEvent(8, -6, 0, false); // coalesced into previous event |
| 373 SimulateWheelEvent(9, -7, 1, false); // enqueued, different modifiers | 375 SimulateWheelEvent(9, -7, 1, false); // enqueued, different modifiers |
| 374 | 376 |
| 375 // Check that only the first event was sent. | 377 // Check that only the first event was sent. |
| 376 EXPECT_EQ(1U, process_->sink().message_count()); | 378 EXPECT_EQ(1U, process_->sink().message_count()); |
| 377 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( | 379 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( |
| (...skipping 504 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 882 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); | 884 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); |
| 883 | 885 |
| 884 // Wait long enough for first timeout and see if it fired. | 886 // Wait long enough for first timeout and see if it fired. |
| 885 base::MessageLoop::current()->PostDelayedTask( | 887 base::MessageLoop::current()->PostDelayedTask( |
| 886 FROM_HERE, | 888 FROM_HERE, |
| 887 base::MessageLoop::QuitClosure(), | 889 base::MessageLoop::QuitClosure(), |
| 888 TimeDelta::FromMilliseconds(10)); | 890 TimeDelta::FromMilliseconds(10)); |
| 889 base::MessageLoop::current()->Run(); | 891 base::MessageLoop::current()->Run(); |
| 890 | 892 |
| 891 EXPECT_EQ(1U, process_->sink().message_count()); | 893 EXPECT_EQ(1U, process_->sink().message_count()); |
| 892 EXPECT_EQ(1U, GestureEventLastQueueEventSize()); | 894 // The tap down event will have escaped the queue, since they're async. |
| 893 EXPECT_EQ(WebInputEvent::GestureTapDown, | 895 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); |
| 894 GestureEventLastQueueEvent().type); | |
| 895 } | 896 } |
| 896 | 897 |
| 897 // Test that GestureTapDown events are sent immediately on GestureTap. | 898 // Test that GestureTapDown events are sent immediately on GestureTap. |
| 898 TEST_F(ImmediateInputRouterTest, DeferredGestureTapDownSentOnTap) { | 899 TEST_F(ImmediateInputRouterTest, DeferredGestureTapDownSentOnTap) { |
| 899 // Set some sort of short deferral timeout | 900 // Set some sort of short deferral timeout |
| 900 set_maximum_tap_gap_time_ms(5); | 901 set_maximum_tap_gap_time_ms(5); |
| 901 | 902 |
| 902 SimulateGestureEvent(WebInputEvent::GestureTapDown, | 903 SimulateGestureEvent(WebInputEvent::GestureTapDown, |
| 903 WebGestureEvent::Touchscreen); | 904 WebGestureEvent::Touchscreen); |
| 904 EXPECT_EQ(0U, process_->sink().message_count()); | 905 EXPECT_EQ(0U, process_->sink().message_count()); |
| 905 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); | 906 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); |
| 906 | 907 |
| 907 SimulateGestureEvent(WebInputEvent::GestureTap, | 908 SimulateGestureEvent(WebInputEvent::GestureTap, |
| 908 WebGestureEvent::Touchscreen); | 909 WebGestureEvent::Touchscreen); |
| 909 EXPECT_EQ(1U, process_->sink().message_count()); | 910 |
| 910 EXPECT_EQ(2U, GestureEventLastQueueEventSize()); | 911 EXPECT_EQ(2U, process_->sink().message_count()); |
| 912 EXPECT_EQ(1U, GestureEventLastQueueEventSize()); |
| 911 EXPECT_EQ(WebInputEvent::GestureTap, | 913 EXPECT_EQ(WebInputEvent::GestureTap, |
| 912 GestureEventLastQueueEvent().type); | 914 GestureEventLastQueueEvent().type); |
| 913 | 915 |
| 914 base::MessageLoop::current()->PostDelayedTask( | 916 base::MessageLoop::current()->PostDelayedTask( |
| 915 FROM_HERE, | 917 FROM_HERE, |
| 916 base::MessageLoop::QuitClosure(), | 918 base::MessageLoop::QuitClosure(), |
| 917 TimeDelta::FromMilliseconds(10)); | 919 TimeDelta::FromMilliseconds(10)); |
| 918 base::MessageLoop::current()->Run(); | 920 base::MessageLoop::current()->Run(); |
| 919 | 921 |
| 920 EXPECT_EQ(WebInputEvent::GestureTapDown, | 922 EXPECT_EQ(WebInputEvent::GestureTapDown, |
| 921 client_->immediately_sent_gesture_event().event.type); | 923 client_->immediately_sent_gesture_event().event.type); |
| 922 | 924 |
| 923 // If the deferral timer incorrectly fired, it sent an extra message. | 925 // If the deferral timer incorrectly fired, it sent an extra message. |
| 924 EXPECT_EQ(1U, process_->sink().message_count()); | 926 EXPECT_EQ(2U, process_->sink().message_count()); |
| 925 } | 927 } |
| 926 | 928 |
| 927 // Test that only a single GestureTapDown event is sent when tap occurs after | 929 // Test that only a single GestureTapDown event is sent when tap occurs after |
| 928 // the timeout. | 930 // the timeout. |
| 929 TEST_F(ImmediateInputRouterTest, DeferredGestureTapDownOnlyOnce) { | 931 TEST_F(ImmediateInputRouterTest, DeferredGestureTapDownOnlyOnce) { |
| 930 // Set some sort of short deferral timeout | 932 // Set some sort of short deferral timeout |
| 931 set_maximum_tap_gap_time_ms(5); | 933 set_maximum_tap_gap_time_ms(5); |
| 932 | 934 |
| 933 SimulateGestureEvent(WebInputEvent::GestureTapDown, | 935 SimulateGestureEvent(WebInputEvent::GestureTapDown, |
| 934 WebGestureEvent::Touchscreen); | 936 WebGestureEvent::Touchscreen); |
| 935 EXPECT_EQ(0U, process_->sink().message_count()); | 937 EXPECT_EQ(0U, process_->sink().message_count()); |
| 936 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); | 938 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); |
| 937 | 939 |
| 938 // Wait long enough for the timeout and verify it fired. | 940 // Wait long enough for the timeout and verify it fired. |
| 939 base::MessageLoop::current()->PostDelayedTask( | 941 base::MessageLoop::current()->PostDelayedTask( |
| 940 FROM_HERE, | 942 FROM_HERE, |
| 941 base::MessageLoop::QuitClosure(), | 943 base::MessageLoop::QuitClosure(), |
| 942 TimeDelta::FromMilliseconds(10)); | 944 TimeDelta::FromMilliseconds(10)); |
| 943 base::MessageLoop::current()->Run(); | 945 base::MessageLoop::current()->Run(); |
| 944 | 946 |
| 945 EXPECT_EQ(1U, process_->sink().message_count()); | 947 EXPECT_EQ(1U, process_->sink().message_count()); |
| 946 EXPECT_EQ(1U, GestureEventLastQueueEventSize()); | 948 // The tap down events will have escaped the queue, since they're async. |
| 947 EXPECT_EQ(WebInputEvent::GestureTapDown, | 949 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); |
| 948 GestureEventLastQueueEvent().type); | |
| 949 | 950 |
| 950 // Now send the tap gesture and verify we didn't get an extra TapDown. | 951 // Now send the tap gesture and verify we didn't get an extra TapDown. |
| 951 SimulateGestureEvent(WebInputEvent::GestureTap, | 952 SimulateGestureEvent(WebInputEvent::GestureTap, |
| 952 WebGestureEvent::Touchscreen); | 953 WebGestureEvent::Touchscreen); |
| 953 EXPECT_EQ(1U, process_->sink().message_count()); | 954 EXPECT_EQ(2U, process_->sink().message_count()); |
| 954 EXPECT_EQ(2U, GestureEventLastQueueEventSize()); | 955 EXPECT_EQ(1U, GestureEventLastQueueEventSize()); |
| 955 EXPECT_EQ(WebInputEvent::GestureTap, | 956 EXPECT_EQ(WebInputEvent::GestureTap, |
| 956 GestureEventLastQueueEvent().type); | 957 GestureEventLastQueueEvent().type); |
| 957 } | 958 } |
| 958 | 959 |
| 960 // Test that GestureTapDown events don't wait for ACKs. |
| 961 TEST_F(ImmediateInputRouterTest, GestureTapDownIsAsync) { |
| 962 // Set some sort of short deferral timeout |
| 963 set_maximum_tap_gap_time_ms(5); |
| 964 |
| 965 SimulateGestureEvent(WebInputEvent::GestureTapDown, |
| 966 WebGestureEvent::Touchscreen); |
| 967 EXPECT_EQ(0U, process_->sink().message_count()); |
| 968 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); |
| 969 |
| 970 // Wait for tap deferral to end. |
| 971 base::MessageLoop::current()->PostDelayedTask( |
| 972 FROM_HERE, |
| 973 base::MessageLoop::QuitClosure(), |
| 974 TimeDelta::FromMilliseconds(10)); |
| 975 base::MessageLoop::current()->Run(); |
| 976 |
| 977 EXPECT_EQ(1U, process_->sink().message_count()); |
| 978 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); |
| 979 |
| 980 SimulateGestureEvent(WebInputEvent::GestureTapDown, |
| 981 WebGestureEvent::Touchscreen); |
| 982 |
| 983 EXPECT_EQ(1U, process_->sink().message_count()); |
| 984 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); |
| 985 |
| 986 // Wait for tap deferral to end. |
| 987 base::MessageLoop::current()->PostDelayedTask( |
| 988 FROM_HERE, |
| 989 base::MessageLoop::QuitClosure(), |
| 990 TimeDelta::FromMilliseconds(10)); |
| 991 base::MessageLoop::current()->Run(); |
| 992 |
| 993 SimulateGestureEvent(WebInputEvent::GestureTapDown, |
| 994 WebGestureEvent::Touchscreen); |
| 995 |
| 996 EXPECT_EQ(2U, process_->sink().message_count()); |
| 997 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); |
| 998 |
| 999 // Wait for tap deferral to end. |
| 1000 base::MessageLoop::current()->PostDelayedTask( |
| 1001 FROM_HERE, |
| 1002 base::MessageLoop::QuitClosure(), |
| 1003 TimeDelta::FromMilliseconds(10)); |
| 1004 base::MessageLoop::current()->Run(); |
| 1005 |
| 1006 EXPECT_EQ(3U, process_->sink().message_count()); |
| 1007 // The tap down events will have escaped the queue, since they're async. |
| 1008 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); |
| 1009 } |
| 1010 |
| 1011 // Test that GestureTapDown events don't get out of order due to asynchronicity. |
| 1012 TEST_F(ImmediateInputRouterTest, GestureTapDownIsInOrder) { |
| 1013 // Set some sort of short deferral timeout |
| 1014 set_maximum_tap_gap_time_ms(5); |
| 1015 |
| 1016 SimulateGestureEvent(WebInputEvent::GestureTap, |
| 1017 WebGestureEvent::Touchscreen); |
| 1018 |
| 1019 SimulateGestureEvent(WebInputEvent::GestureTapDown, |
| 1020 WebGestureEvent::Touchscreen); |
| 1021 EXPECT_EQ(1U, process_->sink().message_count()); |
| 1022 // TapDown is deferred, hasn't entered the queue yet. |
| 1023 EXPECT_EQ(1U, GestureEventLastQueueEventSize()); |
| 1024 |
| 1025 // Wait long enough for the first timeout and verify it fired. |
| 1026 base::MessageLoop::current()->PostDelayedTask( |
| 1027 FROM_HERE, |
| 1028 base::MessageLoop::QuitClosure(), |
| 1029 TimeDelta::FromMilliseconds(10)); |
| 1030 base::MessageLoop::current()->Run(); |
| 1031 |
| 1032 EXPECT_EQ(1U, process_->sink().message_count()); |
| 1033 // The TapDown, though asynchronous, is still stuck in the queue |
| 1034 // behind the synchronous Tap. |
| 1035 EXPECT_EQ(2U, GestureEventLastQueueEventSize()); |
| 1036 |
| 1037 SimulateGestureEvent(WebInputEvent::GestureTapDown, |
| 1038 WebGestureEvent::Touchscreen); |
| 1039 EXPECT_EQ(1U, process_->sink().message_count()); |
| 1040 // TapDown is deferred, hasn't entered the queue yet. |
| 1041 EXPECT_EQ(2U, GestureEventLastQueueEventSize()); |
| 1042 |
| 1043 // Wait long enough for the second timeout and verify it fired. |
| 1044 base::MessageLoop::current()->PostDelayedTask( |
| 1045 FROM_HERE, |
| 1046 base::MessageLoop::QuitClosure(), |
| 1047 TimeDelta::FromMilliseconds(10)); |
| 1048 base::MessageLoop::current()->Run(); |
| 1049 |
| 1050 EXPECT_EQ(1U, process_->sink().message_count()); |
| 1051 // TapDown has entered the queue. |
| 1052 EXPECT_EQ(3U, GestureEventLastQueueEventSize()); |
| 1053 |
| 1054 SendInputEventACK(WebInputEvent::GestureTap, |
| 1055 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1056 |
| 1057 // Now that the Tap has been ACKed, the TapDowns should fire immediately. |
| 1058 EXPECT_EQ(3U, process_->sink().message_count()); |
| 1059 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); |
| 1060 } |
| 1061 |
| 959 // Test that scroll events during the deferral interval drop the GestureTapDown. | 1062 // Test that scroll events during the deferral interval drop the GestureTapDown. |
| 960 TEST_F(ImmediateInputRouterTest, DeferredGestureTapDownAnulledOnScroll) { | 1063 TEST_F(ImmediateInputRouterTest, DeferredGestureTapDownAnulledOnScroll) { |
| 961 // Set some sort of short deferral timeout | 1064 // Set some sort of short deferral timeout |
| 962 set_maximum_tap_gap_time_ms(5); | 1065 set_maximum_tap_gap_time_ms(5); |
| 963 | 1066 |
| 964 SimulateGestureEvent(WebInputEvent::GestureTapDown, | 1067 SimulateGestureEvent(WebInputEvent::GestureTapDown, |
| 965 WebGestureEvent::Touchscreen); | 1068 WebGestureEvent::Touchscreen); |
| 966 EXPECT_EQ(0U, process_->sink().message_count()); | 1069 EXPECT_EQ(0U, process_->sink().message_count()); |
| 967 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); | 1070 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); |
| 968 | 1071 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1020 EXPECT_EQ(0U, process_->sink().message_count()); | 1123 EXPECT_EQ(0U, process_->sink().message_count()); |
| 1021 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); | 1124 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); |
| 1022 | 1125 |
| 1023 base::MessageLoop::current()->PostDelayedTask( | 1126 base::MessageLoop::current()->PostDelayedTask( |
| 1024 FROM_HERE, | 1127 FROM_HERE, |
| 1025 base::MessageLoop::QuitClosure(), | 1128 base::MessageLoop::QuitClosure(), |
| 1026 TimeDelta::FromMilliseconds(10)); | 1129 TimeDelta::FromMilliseconds(10)); |
| 1027 base::MessageLoop::current()->Run(); | 1130 base::MessageLoop::current()->Run(); |
| 1028 | 1131 |
| 1029 EXPECT_EQ(1U, process_->sink().message_count()); | 1132 EXPECT_EQ(1U, process_->sink().message_count()); |
| 1030 EXPECT_EQ(1U, GestureEventLastQueueEventSize()); | 1133 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); |
| 1031 | 1134 |
| 1032 SimulateGestureEvent(WebInputEvent::GestureTapCancel, | 1135 SimulateGestureEvent(WebInputEvent::GestureTapCancel, |
| 1033 WebGestureEvent::Touchscreen); | 1136 WebGestureEvent::Touchscreen); |
| 1034 EXPECT_EQ(1U, process_->sink().message_count()); | 1137 EXPECT_EQ(2U, process_->sink().message_count()); |
| 1035 EXPECT_EQ(2U, GestureEventLastQueueEventSize()); | 1138 EXPECT_EQ(1U, GestureEventLastQueueEventSize()); |
| 1036 } | 1139 } |
| 1037 | 1140 |
| 1038 // Test that a GestureScrollEnd | GestureFlingStart are deferred during the | 1141 // Test that a GestureScrollEnd | GestureFlingStart are deferred during the |
| 1039 // debounce interval, that Scrolls are not and that the deferred events are | 1142 // debounce interval, that Scrolls are not and that the deferred events are |
| 1040 // sent after that timer fires. | 1143 // sent after that timer fires. |
| 1041 TEST_F(ImmediateInputRouterTest, DebounceDefersFollowingGestureEvents) { | 1144 TEST_F(ImmediateInputRouterTest, DebounceDefersFollowingGestureEvents) { |
| 1042 set_debounce_interval_time_ms(3); | 1145 set_debounce_interval_time_ms(3); |
| 1043 | 1146 |
| 1044 SimulateGestureEvent(WebInputEvent::GestureScrollUpdate, | 1147 SimulateGestureEvent(WebInputEvent::GestureScrollUpdate, |
| 1045 WebGestureEvent::Touchscreen); | 1148 WebGestureEvent::Touchscreen); |
| (...skipping 888 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1934 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 2037 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1935 | 2038 |
| 1936 ReleaseTouchPoint(0); | 2039 ReleaseTouchPoint(0); |
| 1937 SendTouchEvent(); | 2040 SendTouchEvent(); |
| 1938 EXPECT_EQ(1U, process_->sink().message_count()); | 2041 EXPECT_EQ(1U, process_->sink().message_count()); |
| 1939 process_->sink().ClearMessages(); | 2042 process_->sink().ClearMessages(); |
| 1940 SendInputEventACK(WebInputEvent::TouchEnd, | 2043 SendInputEventACK(WebInputEvent::TouchEnd, |
| 1941 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 2044 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1942 } | 2045 } |
| 1943 } // namespace content | 2046 } // namespace content |
| OLD | NEW |