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

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

Issue 997283002: Coalesce async touch move events until the ack back from render (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 months 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 <math.h> 5 #include <math.h>
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/strings/utf_string_conversions.h" 10 #include "base/strings/utf_string_conversions.h"
(...skipping 943 matching lines...) Expand 10 before | Expand all | Expand 10 after
954 InputMsg_HandleInputEvent::ID)); 954 InputMsg_HandleInputEvent::ID));
955 EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 955 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
956 956
957 // Check that the correct unhandled wheel event was received. 957 // Check that the correct unhandled wheel event was received.
958 EXPECT_EQ(ack_handler_->acked_wheel_event().deltaY, -5); 958 EXPECT_EQ(ack_handler_->acked_wheel_event().deltaY, -5);
959 } 959 }
960 960
961 TEST_F(InputRouterImplTest, TouchTypesIgnoringAck) { 961 TEST_F(InputRouterImplTest, TouchTypesIgnoringAck) {
962 OnHasTouchEventHandlers(true); 962 OnHasTouchEventHandlers(true);
963 // Only acks for TouchCancel should always be ignored. 963 // Only acks for TouchCancel should always be ignored.
964 ASSERT_FALSE(WebInputEventTraits::IgnoresAckDisposition( 964 ASSERT_TRUE(WebInputEventTraits::WillReceiveAckFromRenderer(
965 GetEventWithType(WebInputEvent::TouchStart))); 965 GetEventWithType(WebInputEvent::TouchStart)));
966 ASSERT_FALSE(WebInputEventTraits::IgnoresAckDisposition( 966 ASSERT_TRUE(WebInputEventTraits::WillReceiveAckFromRenderer(
967 GetEventWithType(WebInputEvent::TouchMove))); 967 GetEventWithType(WebInputEvent::TouchMove)));
968 ASSERT_FALSE(WebInputEventTraits::IgnoresAckDisposition( 968 ASSERT_TRUE(WebInputEventTraits::WillReceiveAckFromRenderer(
969 GetEventWithType(WebInputEvent::TouchEnd))); 969 GetEventWithType(WebInputEvent::TouchEnd)));
970 970
971 // Precede the TouchCancel with an appropriate TouchStart; 971 // Precede the TouchCancel with an appropriate TouchStart;
972 PressTouchPoint(1, 1); 972 PressTouchPoint(1, 1);
973 SendTouchEvent(); 973 SendTouchEvent();
974 SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED); 974 SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
975 ASSERT_EQ(1U, GetSentMessageCountAndResetSink()); 975 ASSERT_EQ(1U, GetSentMessageCountAndResetSink());
976 ASSERT_EQ(1U, ack_handler_->GetAndResetAckCount()); 976 ASSERT_EQ(1U, ack_handler_->GetAndResetAckCount());
977 ASSERT_EQ(0, client_->in_flight_event_count()); 977 ASSERT_EQ(0, client_->in_flight_event_count());
978 978
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1017 WebInputEvent::GestureTapCancel, 1017 WebInputEvent::GestureTapCancel,
1018 WebInputEvent::GestureScrollBegin, 1018 WebInputEvent::GestureScrollBegin,
1019 WebInputEvent::GestureScrollUpdate, 1019 WebInputEvent::GestureScrollUpdate,
1020 WebInputEvent::GesturePinchBegin, 1020 WebInputEvent::GesturePinchBegin,
1021 WebInputEvent::GesturePinchUpdate, 1021 WebInputEvent::GesturePinchUpdate,
1022 WebInputEvent::GesturePinchEnd, 1022 WebInputEvent::GesturePinchEnd,
1023 WebInputEvent::GestureScrollEnd}; 1023 WebInputEvent::GestureScrollEnd};
1024 for (size_t i = 0; i < arraysize(eventTypes); ++i) { 1024 for (size_t i = 0; i < arraysize(eventTypes); ++i) {
1025 WebInputEvent::Type type = eventTypes[i]; 1025 WebInputEvent::Type type = eventTypes[i];
1026 SCOPED_TRACE(WebInputEventTraits::GetName(type)); 1026 SCOPED_TRACE(WebInputEventTraits::GetName(type));
1027 if (!WebInputEventTraits::IgnoresAckDisposition(GetEventWithType(type))) { 1027 if (WebInputEventTraits::WillReceiveAckFromRenderer(
1028 GetEventWithType(type))) {
1028 SimulateGestureEvent(type, blink::WebGestureDeviceTouchscreen); 1029 SimulateGestureEvent(type, blink::WebGestureDeviceTouchscreen);
1029 EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1030 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1030 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 1031 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1031 EXPECT_EQ(1, client_->in_flight_event_count()); 1032 EXPECT_EQ(1, client_->in_flight_event_count());
1032 EXPECT_TRUE(HasPendingEvents()); 1033 EXPECT_TRUE(HasPendingEvents());
1033 1034
1034 SendInputEventACK(type, INPUT_EVENT_ACK_STATE_CONSUMED); 1035 SendInputEventACK(type, INPUT_EVENT_ACK_STATE_CONSUMED);
1035 EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1036 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1036 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); 1037 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount());
1037 EXPECT_EQ(0, client_->in_flight_event_count()); 1038 EXPECT_EQ(0, client_->in_flight_event_count());
(...skipping 18 matching lines...) Expand all
1056 } 1057 }
1057 } 1058 }
1058 1059
1059 TEST_F(InputRouterImplTest, MouseTypesIgnoringAck) { 1060 TEST_F(InputRouterImplTest, MouseTypesIgnoringAck) {
1060 int start_type = static_cast<int>(WebInputEvent::MouseDown); 1061 int start_type = static_cast<int>(WebInputEvent::MouseDown);
1061 int end_type = static_cast<int>(WebInputEvent::ContextMenu); 1062 int end_type = static_cast<int>(WebInputEvent::ContextMenu);
1062 ASSERT_LT(start_type, end_type); 1063 ASSERT_LT(start_type, end_type);
1063 for (int i = start_type; i <= end_type; ++i) { 1064 for (int i = start_type; i <= end_type; ++i) {
1064 WebInputEvent::Type type = static_cast<WebInputEvent::Type>(i); 1065 WebInputEvent::Type type = static_cast<WebInputEvent::Type>(i);
1065 int expected_in_flight_event_count = 1066 int expected_in_flight_event_count =
1066 WebInputEventTraits::IgnoresAckDisposition(GetEventWithType(type)) ? 0 1067 !WebInputEventTraits::WillReceiveAckFromRenderer(GetEventWithType(type))
1067 : 1; 1068 ? 0
1069 : 1;
1068 1070
1069 // Note: Mouse event acks are never forwarded to the ack handler, so the key 1071 // Note: Mouse event acks are never forwarded to the ack handler, so the key
1070 // result here is that ignored ack types don't affect the in-flight count. 1072 // result here is that ignored ack types don't affect the in-flight count.
1071 SimulateMouseEvent(type, 0, 0); 1073 SimulateMouseEvent(type, 0, 0);
1072 EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1074 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1073 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 1075 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1074 EXPECT_EQ(expected_in_flight_event_count, client_->in_flight_event_count()); 1076 EXPECT_EQ(expected_in_flight_event_count, client_->in_flight_event_count());
1075 if (expected_in_flight_event_count) { 1077 if (expected_in_flight_event_count) {
1076 SendInputEventACK(type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1078 SendInputEventACK(type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1077 EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1079 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1078 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); 1080 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount());
1079 EXPECT_EQ(0, client_->in_flight_event_count()); 1081 EXPECT_EQ(0, client_->in_flight_event_count());
1080 } 1082 }
1081 } 1083 }
1082 } 1084 }
1083 1085
1084 // Guard against breaking changes to the list of ignored event ack types in 1086 // Guard against breaking changes to the list of ignored event ack types in
1085 // |WebInputEventTraits::IgnoresAckDisposition|. 1087 // |WebInputEventTraits::WillReceiveAckFromRenderer|.
1086 TEST_F(InputRouterImplTest, RequiredEventAckTypes) { 1088 TEST_F(InputRouterImplTest, RequiredEventAckTypes) {
1087 const WebInputEvent::Type kRequiredEventAckTypes[] = { 1089 const WebInputEvent::Type kRequiredEventAckTypes[] = {
1088 WebInputEvent::MouseMove, 1090 WebInputEvent::MouseMove,
1089 WebInputEvent::MouseWheel, 1091 WebInputEvent::MouseWheel,
1090 WebInputEvent::RawKeyDown, 1092 WebInputEvent::RawKeyDown,
1091 WebInputEvent::KeyDown, 1093 WebInputEvent::KeyDown,
1092 WebInputEvent::KeyUp, 1094 WebInputEvent::KeyUp,
1093 WebInputEvent::Char, 1095 WebInputEvent::Char,
1094 WebInputEvent::GestureScrollUpdate, 1096 WebInputEvent::GestureScrollUpdate,
1095 WebInputEvent::GestureFlingStart, 1097 WebInputEvent::GestureFlingStart,
1096 WebInputEvent::GestureFlingCancel, 1098 WebInputEvent::GestureFlingCancel,
1097 WebInputEvent::GesturePinchUpdate, 1099 WebInputEvent::GesturePinchUpdate,
1098 WebInputEvent::TouchStart, 1100 WebInputEvent::TouchStart,
1099 WebInputEvent::TouchMove 1101 WebInputEvent::TouchMove
1100 }; 1102 };
1101 for (size_t i = 0; i < arraysize(kRequiredEventAckTypes); ++i) { 1103 for (size_t i = 0; i < arraysize(kRequiredEventAckTypes); ++i) {
1102 const WebInputEvent::Type required_ack_type = kRequiredEventAckTypes[i]; 1104 const WebInputEvent::Type required_ack_type = kRequiredEventAckTypes[i];
1103 EXPECT_FALSE(WebInputEventTraits::IgnoresAckDisposition( 1105 ASSERT_TRUE(WebInputEventTraits::WillReceiveAckFromRenderer(
1104 GetEventWithType(required_ack_type))); 1106 GetEventWithType(required_ack_type)));
1105 } 1107 }
1106 } 1108 }
1107 1109
1108 // Test that GestureShowPress, GestureTapDown and GestureTapCancel events don't 1110 // Test that GestureShowPress, GestureTapDown and GestureTapCancel events don't
1109 // wait for ACKs. 1111 // wait for ACKs.
1110 TEST_F(InputRouterImplTest, GestureTypesIgnoringAckInterleaved) { 1112 TEST_F(InputRouterImplTest, GestureTypesIgnoringAckInterleaved) {
1111 // Interleave a few events that do and do not ignore acks, ensuring that 1113 // Interleave a few events that do and do not ignore acks, ensuring that
1112 // ack-ignoring events aren't dispatched until all prior events which observe 1114 // ack-ignoring events aren't dispatched until all prior events which observe
1113 // their ack disposition have been dispatched. 1115 // their ack disposition have been dispatched.
(...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after
1511 SimulateGestureEvent(WebInputEvent::GestureTapDown, 1513 SimulateGestureEvent(WebInputEvent::GestureTapDown,
1512 blink::WebGestureDeviceTouchscreen); 1514 blink::WebGestureDeviceTouchscreen);
1513 EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1515 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1514 1516
1515 // The GestureTapUnconfirmed is converted into a tap, as the touch action is 1517 // The GestureTapUnconfirmed is converted into a tap, as the touch action is
1516 // none. 1518 // none.
1517 SimulateGestureEvent(WebInputEvent::GestureTapUnconfirmed, 1519 SimulateGestureEvent(WebInputEvent::GestureTapUnconfirmed,
1518 blink::WebGestureDeviceTouchscreen); 1520 blink::WebGestureDeviceTouchscreen);
1519 EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1521 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1520 // This test will become invalid if GestureTap stops requiring an ack. 1522 // This test will become invalid if GestureTap stops requiring an ack.
1521 ASSERT_FALSE(WebInputEventTraits::IgnoresAckDisposition( 1523 ASSERT_TRUE(WebInputEventTraits::WillReceiveAckFromRenderer(
1522 GetEventWithType(WebInputEvent::GestureTap))); 1524 GetEventWithType(WebInputEvent::GestureTap)));
1523 EXPECT_EQ(2, client_->in_flight_event_count()); 1525 EXPECT_EQ(2, client_->in_flight_event_count());
1524 SendInputEventACK(WebInputEvent::GestureTap, 1526 SendInputEventACK(WebInputEvent::GestureTap,
1525 INPUT_EVENT_ACK_STATE_CONSUMED); 1527 INPUT_EVENT_ACK_STATE_CONSUMED);
1526 EXPECT_EQ(1, client_->in_flight_event_count()); 1528 EXPECT_EQ(1, client_->in_flight_event_count());
1527 1529
1528 // This tap gesture is dropped, since the GestureTapUnconfirmed was turned 1530 // This tap gesture is dropped, since the GestureTapUnconfirmed was turned
1529 // into a tap. 1531 // into a tap.
1530 SimulateGestureEvent(WebInputEvent::GestureTap, 1532 SimulateGestureEvent(WebInputEvent::GestureTap,
1531 blink::WebGestureDeviceTouchscreen); 1533 blink::WebGestureDeviceTouchscreen);
1532 EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1534 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1533 1535
1534 SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED); 1536 SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED);
1535 SendInputEventACK(WebInputEvent::TouchStart, 1537 SendInputEventACK(WebInputEvent::TouchStart,
1536 INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); 1538 INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
1537 1539
1538 // Second Tap. 1540 // Second Tap.
1539 EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1541 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1540 SimulateGestureEvent(WebInputEvent::GestureTapDown, 1542 SimulateGestureEvent(WebInputEvent::GestureTapDown,
1541 blink::WebGestureDeviceTouchscreen); 1543 blink::WebGestureDeviceTouchscreen);
1542 EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 1544 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
1543 1545
1544 // Although the touch-action is now auto, the double tap still won't be 1546 // Although the touch-action is now auto, the double tap still won't be
1545 // dispatched, because the first tap occured when the touch-action was none. 1547 // dispatched, because the first tap occured when the touch-action was none.
1546 SimulateGestureEvent(WebInputEvent::GestureDoubleTap, 1548 SimulateGestureEvent(WebInputEvent::GestureDoubleTap,
1547 blink::WebGestureDeviceTouchscreen); 1549 blink::WebGestureDeviceTouchscreen);
1548 // This test will become invalid if GestureDoubleTap stops requiring an ack. 1550 // This test will become invalid if GestureDoubleTap stops requiring an ack.
1549 ASSERT_FALSE(WebInputEventTraits::IgnoresAckDisposition( 1551 ASSERT_TRUE(WebInputEventTraits::WillReceiveAckFromRenderer(
1550 GetEventWithType(WebInputEvent::GestureDoubleTap))); 1552 GetEventWithType(WebInputEvent::GestureDoubleTap)));
1551 EXPECT_EQ(1, client_->in_flight_event_count()); 1553 EXPECT_EQ(1, client_->in_flight_event_count());
1552 SendInputEventACK(WebInputEvent::GestureTap, INPUT_EVENT_ACK_STATE_CONSUMED); 1554 SendInputEventACK(WebInputEvent::GestureTap, INPUT_EVENT_ACK_STATE_CONSUMED);
1553 EXPECT_EQ(0, client_->in_flight_event_count()); 1555 EXPECT_EQ(0, client_->in_flight_event_count());
1554 } 1556 }
1555 1557
1556 // Test that the router will call the client's |DidFlush| after all events have 1558 // Test that the router will call the client's |DidFlush| after all events have
1557 // been dispatched following a call to |Flush|. 1559 // been dispatched following a call to |Flush|.
1558 TEST_F(InputRouterImplTest, InputFlush) { 1560 TEST_F(InputRouterImplTest, InputFlush) {
1559 EXPECT_FALSE(HasPendingEvents()); 1561 EXPECT_FALSE(HasPendingEvents());
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
1794 client_overscroll = client_->GetAndResetOverscroll(); 1796 client_overscroll = client_->GetAndResetOverscroll();
1795 EXPECT_EQ(wheel_overscroll.accumulated_overscroll, 1797 EXPECT_EQ(wheel_overscroll.accumulated_overscroll,
1796 client_overscroll.accumulated_overscroll); 1798 client_overscroll.accumulated_overscroll);
1797 EXPECT_EQ(wheel_overscroll.latest_overscroll_delta, 1799 EXPECT_EQ(wheel_overscroll.latest_overscroll_delta,
1798 client_overscroll.latest_overscroll_delta); 1800 client_overscroll.latest_overscroll_delta);
1799 EXPECT_EQ(wheel_overscroll.current_fling_velocity, 1801 EXPECT_EQ(wheel_overscroll.current_fling_velocity,
1800 client_overscroll.current_fling_velocity); 1802 client_overscroll.current_fling_velocity);
1801 } 1803 }
1802 1804
1803 } // namespace content 1805 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698