Chromium Code Reviews| 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..cc74a4f01cc76b689540dae103dfe469f5b54267 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,95 @@ 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); |
| +} |
| + |
| +// Test that TouchActionFilter::OnStartNewTouchSequence is called when a touch |
| +// handler is removed. |
| +TEST_F(InputRouterImplTest, OnStartNewTouchSequenceWhenTouchHandlerRemoved) { |
| + OnHasTouchEventHandlers(true); |
| + |
| + // Sequence 1. |
| + PressTouchPoint(1, 1); |
| + SendTouchEvent(); |
| + OnSetTouchAction(TouchAction::TOUCH_ACTION_NONE); |
| + SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED); |
| + |
| + MoveTouchPoint(0, 5, 5); |
| + SendTouchEvent(); |
| + |
| + // Ensure we have touch-action:none. ScrollBegin and ScrollEnd don't require |
| + // acks. |
| + EXPECT_EQ(2U, GetSentMessageCountAndResetSink()); |
| + SimulateGestureEvent(WebInputEvent::GestureScrollBegin, |
| + WebGestureEvent::Touchpad); |
| + EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); |
| + SimulateGestureEvent(WebInputEvent::GestureScrollEnd, |
| + WebGestureEvent::Touchpad); |
| + EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); |
| + |
| + SendInputEventACK(WebInputEvent::TouchMove, |
|
Rick Byers
2014/02/25 23:03:37
You should probably make this a valid sequence: se
tdresser
2014/02/26 14:04:49
Done.
|
| + INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); |
| + |
| + // Ensure touch action has been set to auto, the touch handler has been |
| + // removed. |
| + EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); |
| + SimulateGestureEvent(WebInputEvent::GestureScrollBegin, |
| + WebGestureEvent::Touchpad); |
| + EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
| + SimulateGestureEvent(WebInputEvent::GestureScrollEnd, |
| + WebGestureEvent::Touchpad); |
| + EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
| +} |
| + |
| } // namespace content |