Index: content/browser/renderer_host/input/input_router_impl_unittest.cc |
diff --git a/content/browser/renderer_host/input/input_router_impl_unittest.cc b/content/browser/renderer_host/input/input_router_impl_unittest.cc |
index ff3baafe84f992f4552cfd972acf0f6e1d0887d6..de80c068b822e8273df871ce6fd53a89a2d2b524 100644 |
--- a/content/browser/renderer_host/input/input_router_impl_unittest.cc |
+++ b/content/browser/renderer_host/input/input_router_impl_unittest.cc |
@@ -14,6 +14,7 @@ |
#include "content/common/content_constants_internal.h" |
#include "content/common/edit_command.h" |
#include "content/common/input/synthetic_web_input_event_builders.h" |
+#include "content/common/input/touch_action.h" |
#include "content/common/input/web_input_event_traits.h" |
#include "content/common/input_messages.h" |
#include "content/common/view_messages.h" |
@@ -274,6 +275,11 @@ class InputRouterImplTest : public testing::Test { |
ViewHostMsg_HasTouchEventHandlers(0, has_handlers)); |
} |
+ void OnSetTouchAction(content::TouchAction touch_action) { |
+ input_router_->OnMessageReceived( |
+ InputHostMsg_SetTouchAction(0, touch_action)); |
+ } |
+ |
size_t GetSentMessageCountAndResetSink() { |
size_t count = process_->sink().message_count(); |
process_->sink().ClearMessages(); |
@@ -955,4 +961,57 @@ TEST_F(InputRouterImplTest, TouchAckTimeoutConfigured) { |
EXPECT_TRUE(TouchEventTimeoutEnabled()); |
} |
+// Test that TouchActionFilter::OnStartNewTouchSequence is called before the |
+// first touch event for a touch sequence reaches the renderer. |
+TEST_F(InputRouterImplTest, OnStartNewTouchSequenceBeforeEventReachesRenderer) { |
+ OnHasTouchEventHandlers(true); |
+ |
+ // Sequence 1. |
+ PressTouchPoint(1, 1); |
+ SendTouchEvent(); |
+ OnSetTouchAction(TouchAction::TOUCH_ACTION_NONE); |
+ MoveTouchPoint(0, 5, 5); |
+ SendTouchEvent(); |
+ ReleaseTouchPoint(0); |
+ SendTouchEvent(); |
+ |
+ // Sequence 2. |
+ PressTouchPoint(1, 1); |
+ SendTouchEvent(); |
+ MoveTouchPoint(0, 5, 5); |
+ SendTouchEvent(); |
+ ReleaseTouchPoint(0); |
+ SendTouchEvent(); |
+ |
+ SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED); |
+ SendInputEventACK(WebInputEvent::TouchMove, INPUT_EVENT_ACK_STATE_CONSUMED); |
+ |
+ // Ensure touch action is still none, as the next touch start hasn't been |
+ // acked yet. ScrollBegin and ScrollEnd don't require acks. |
+ EXPECT_EQ(3U, GetSentMessageCountAndResetSink()); |
+ SimulateGestureEvent(WebInputEvent::GestureScrollBegin, |
+ WebGestureEvent::Touchpad); |
+ EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); |
+ SimulateGestureEvent(WebInputEvent::GestureScrollEnd, |
+ WebGestureEvent::Touchpad); |
+ EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); |
+ |
+ // This allows the next touch sequence to start. |
+ SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED); |
+ |
+ // Ensure touch action has been set to auto, as a new touch sequence has |
+ // started. |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ SimulateGestureEvent(WebInputEvent::GestureScrollBegin, |
+ WebGestureEvent::Touchpad); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ SimulateGestureEvent(WebInputEvent::GestureScrollEnd, |
+ WebGestureEvent::Touchpad); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ |
+ SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED); |
+ SendInputEventACK(WebInputEvent::TouchMove, INPUT_EVENT_ACK_STATE_CONSUMED); |
+ SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED); |
+} |
+ |
} // namespace content |