| 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/command_line.h" | 6 #include "base/command_line.h" |
| 7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" |
| 9 #include "content/browser/renderer_host/input/gesture_event_queue.h" | 9 #include "content/browser/renderer_host/input/gesture_event_queue.h" |
| 10 #include "content/browser/renderer_host/input/input_router_client.h" | 10 #include "content/browser/renderer_host/input/input_router_client.h" |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 138 | 138 |
| 139 protected: | 139 protected: |
| 140 // testing::Test | 140 // testing::Test |
| 141 virtual void SetUp() OVERRIDE { | 141 virtual void SetUp() OVERRIDE { |
| 142 browser_context_.reset(new TestBrowserContext()); | 142 browser_context_.reset(new TestBrowserContext()); |
| 143 process_.reset(new MockRenderProcessHost(browser_context_.get())); | 143 process_.reset(new MockRenderProcessHost(browser_context_.get())); |
| 144 client_.reset(new MockInputRouterClient()); | 144 client_.reset(new MockInputRouterClient()); |
| 145 ack_handler_.reset(new MockInputAckHandler()); | 145 ack_handler_.reset(new MockInputAckHandler()); |
| 146 CommandLine* command_line = CommandLine::ForCurrentProcess(); | 146 CommandLine* command_line = CommandLine::ForCurrentProcess(); |
| 147 command_line->AppendSwitch(switches::kValidateInputEventStream); | 147 command_line->AppendSwitch(switches::kValidateInputEventStream); |
| 148 input_router_.reset(new InputRouterImpl( | 148 input_router_.reset(new InputRouterImpl(process_.get(), |
| 149 process_.get(), client_.get(), ack_handler_.get(), MSG_ROUTING_NONE)); | 149 client_.get(), |
| 150 input_router_->gesture_event_queue_.set_debounce_enabled_for_testing( | 150 ack_handler_.get(), |
| 151 false); | 151 MSG_ROUTING_NONE, |
| 152 config_)); |
| 152 client_->set_input_router(input_router()); | 153 client_->set_input_router(input_router()); |
| 153 ack_handler_->set_input_router(input_router()); | 154 ack_handler_->set_input_router(input_router()); |
| 154 } | 155 } |
| 155 | 156 |
| 156 virtual void TearDown() OVERRIDE { | 157 virtual void TearDown() OVERRIDE { |
| 157 // Process all pending tasks to avoid leaks. | 158 // Process all pending tasks to avoid leaks. |
| 158 base::MessageLoop::current()->RunUntilIdle(); | 159 base::MessageLoop::current()->RunUntilIdle(); |
| 159 | 160 |
| 160 input_router_.reset(); | 161 input_router_.reset(); |
| 161 client_.reset(); | 162 client_.reset(); |
| 162 process_.reset(); | 163 process_.reset(); |
| 163 browser_context_.reset(); | 164 browser_context_.reset(); |
| 164 } | 165 } |
| 165 | 166 |
| 167 void SetUpForTouchAckTimeoutTest(int timeout_ms) { |
| 168 config_.touch_config.touch_ack_timeout_delay = |
| 169 base::TimeDelta::FromMilliseconds(timeout_ms); |
| 170 config_.touch_config.touch_ack_timeout_supported = true; |
| 171 TearDown(); |
| 172 SetUp(); |
| 173 } |
| 174 |
| 166 void SimulateKeyboardEvent(WebInputEvent::Type type, bool is_shortcut) { | 175 void SimulateKeyboardEvent(WebInputEvent::Type type, bool is_shortcut) { |
| 167 WebKeyboardEvent event = SyntheticWebKeyboardEventBuilder::Build(type); | 176 WebKeyboardEvent event = SyntheticWebKeyboardEventBuilder::Build(type); |
| 168 NativeWebKeyboardEvent native_event; | 177 NativeWebKeyboardEvent native_event; |
| 169 memcpy(&native_event, &event, sizeof(event)); | 178 memcpy(&native_event, &event, sizeof(event)); |
| 170 input_router_->SendKeyboardEvent( | 179 input_router_->SendKeyboardEvent( |
| 171 native_event, | 180 native_event, |
| 172 ui::LatencyInfo(), | 181 ui::LatencyInfo(), |
| 173 is_shortcut); | 182 is_shortcut); |
| 174 } | 183 } |
| 175 | 184 |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 323 process_->sink().ClearMessages(); | 332 process_->sink().ClearMessages(); |
| 324 return count; | 333 return count; |
| 325 } | 334 } |
| 326 | 335 |
| 327 static void RunTasksAndWait(base::TimeDelta delay) { | 336 static void RunTasksAndWait(base::TimeDelta delay) { |
| 328 base::MessageLoop::current()->PostDelayedTask( | 337 base::MessageLoop::current()->PostDelayedTask( |
| 329 FROM_HERE, base::MessageLoop::QuitClosure(), delay); | 338 FROM_HERE, base::MessageLoop::QuitClosure(), delay); |
| 330 base::MessageLoop::current()->Run(); | 339 base::MessageLoop::current()->Run(); |
| 331 } | 340 } |
| 332 | 341 |
| 342 InputRouterImpl::Config config_; |
| 333 scoped_ptr<MockRenderProcessHost> process_; | 343 scoped_ptr<MockRenderProcessHost> process_; |
| 334 scoped_ptr<MockInputRouterClient> client_; | 344 scoped_ptr<MockInputRouterClient> client_; |
| 335 scoped_ptr<MockInputAckHandler> ack_handler_; | 345 scoped_ptr<MockInputAckHandler> ack_handler_; |
| 336 scoped_ptr<InputRouterImpl> input_router_; | 346 scoped_ptr<InputRouterImpl> input_router_; |
| 337 | 347 |
| 338 private: | 348 private: |
| 339 base::MessageLoopForUI message_loop_; | 349 base::MessageLoopForUI message_loop_; |
| 340 SyntheticWebTouchEvent touch_event_; | 350 SyntheticWebTouchEvent touch_event_; |
| 341 | 351 |
| 342 scoped_ptr<TestBrowserContext> browser_context_; | 352 scoped_ptr<TestBrowserContext> browser_context_; |
| (...skipping 661 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1004 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); | 1014 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); |
| 1005 | 1015 |
| 1006 SendInputEventACK(WebInputEvent::GesturePinchUpdate, | 1016 SendInputEventACK(WebInputEvent::GesturePinchUpdate, |
| 1007 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1017 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1008 // Now that the Tap has been ACKed, the ShowPress events should receive | 1018 // Now that the Tap has been ACKed, the ShowPress events should receive |
| 1009 // synthetic acks, and fire immediately. | 1019 // synthetic acks, and fire immediately. |
| 1010 EXPECT_EQ(2U, GetSentMessageCountAndResetSink()); | 1020 EXPECT_EQ(2U, GetSentMessageCountAndResetSink()); |
| 1011 EXPECT_EQ(3U, ack_handler_->GetAndResetAckCount()); | 1021 EXPECT_EQ(3U, ack_handler_->GetAndResetAckCount()); |
| 1012 } | 1022 } |
| 1013 | 1023 |
| 1014 // Test that touch ack timeout behavior is properly configured via the command | 1024 // Test that touch ack timeout behavior is properly toggled by view update flags |
| 1015 // line, and toggled by view update flags and allowed touch actions. | 1025 // and allowed touch actions. |
| 1016 TEST_F(InputRouterImplTest, TouchAckTimeoutConfigured) { | 1026 TEST_F(InputRouterImplTest, TouchAckTimeoutConfigured) { |
| 1017 // Unless explicitly supported via the command-line, the touch timeout should | 1027 const int timeout_ms = 1; |
| 1018 // be disabled. | 1028 SetUpForTouchAckTimeoutTest(timeout_ms); |
| 1019 EXPECT_FALSE(TouchEventTimeoutEnabled()); | |
| 1020 | |
| 1021 CommandLine::ForCurrentProcess()->AppendSwitchASCII( | |
| 1022 switches::kTouchAckTimeoutDelayMs, "1"); | |
| 1023 TearDown(); | |
| 1024 SetUp(); | |
| 1025 ASSERT_TRUE(TouchEventTimeoutEnabled()); | 1029 ASSERT_TRUE(TouchEventTimeoutEnabled()); |
| 1026 | 1030 |
| 1027 // Verify that the touch ack timeout fires upon the delayed ack. | 1031 // Verify that the touch ack timeout fires upon the delayed ack. |
| 1028 PressTouchPoint(1, 1); | 1032 PressTouchPoint(1, 1); |
| 1029 SendTouchEvent(); | 1033 SendTouchEvent(); |
| 1030 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); | 1034 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); |
| 1031 EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); | 1035 EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
| 1032 RunTasksAndWait(base::TimeDelta::FromMilliseconds(2)); | 1036 RunTasksAndWait(base::TimeDelta::FromMilliseconds(timeout_ms + 1)); |
| 1033 | 1037 |
| 1034 // The timed-out event should have been ack'ed. | 1038 // The timed-out event should have been ack'ed. |
| 1035 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); | 1039 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); |
| 1036 EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); | 1040 EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); |
| 1037 | 1041 |
| 1038 // Ack'ing the timed-out event should fire a TouchCancel. | 1042 // Ack'ing the timed-out event should fire a TouchCancel. |
| 1039 SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED); | 1043 SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED); |
| 1040 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); | 1044 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); |
| 1041 EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); | 1045 EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
| 1042 | 1046 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1088 // should be restored. | 1092 // should be restored. |
| 1089 PressTouchPoint(1, 1); | 1093 PressTouchPoint(1, 1); |
| 1090 SendTouchEvent(); | 1094 SendTouchEvent(); |
| 1091 EXPECT_TRUE(TouchEventTimeoutEnabled()); | 1095 EXPECT_TRUE(TouchEventTimeoutEnabled()); |
| 1092 } | 1096 } |
| 1093 | 1097 |
| 1094 // Test that a touch sequenced preceded by TOUCH_ACTION_NONE is not affected by | 1098 // Test that a touch sequenced preceded by TOUCH_ACTION_NONE is not affected by |
| 1095 // the touch timeout. | 1099 // the touch timeout. |
| 1096 TEST_F(InputRouterImplTest, | 1100 TEST_F(InputRouterImplTest, |
| 1097 TouchAckTimeoutDisabledForTouchSequenceAfterTouchActionNone) { | 1101 TouchAckTimeoutDisabledForTouchSequenceAfterTouchActionNone) { |
| 1098 CommandLine::ForCurrentProcess()->AppendSwitchASCII( | 1102 const int timeout_ms = 1; |
| 1099 switches::kTouchAckTimeoutDelayMs, "1"); | 1103 SetUpForTouchAckTimeoutTest(timeout_ms); |
| 1100 TearDown(); | |
| 1101 SetUp(); | |
| 1102 ASSERT_TRUE(TouchEventTimeoutEnabled()); | 1104 ASSERT_TRUE(TouchEventTimeoutEnabled()); |
| 1103 OnHasTouchEventHandlers(true); | 1105 OnHasTouchEventHandlers(true); |
| 1104 | 1106 |
| 1105 // Start a touch sequence. | 1107 // Start a touch sequence. |
| 1106 PressTouchPoint(1, 1); | 1108 PressTouchPoint(1, 1); |
| 1107 SendTouchEvent(); | 1109 SendTouchEvent(); |
| 1108 | 1110 |
| 1109 // TOUCH_ACTION_NONE should disable the timeout. | 1111 // TOUCH_ACTION_NONE should disable the timeout. |
| 1110 OnSetTouchAction(TOUCH_ACTION_NONE); | 1112 OnSetTouchAction(TOUCH_ACTION_NONE); |
| 1111 SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED); | 1113 SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED); |
| 1112 EXPECT_FALSE(TouchEventTimeoutEnabled()); | 1114 EXPECT_FALSE(TouchEventTimeoutEnabled()); |
| 1113 | 1115 |
| 1114 // End the touch sequence. | 1116 // End the touch sequence. |
| 1115 ReleaseTouchPoint(0); | 1117 ReleaseTouchPoint(0); |
| 1116 SendTouchEvent(); | 1118 SendTouchEvent(); |
| 1117 SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED); | 1119 SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED); |
| 1118 EXPECT_FALSE(TouchEventTimeoutEnabled()); | 1120 EXPECT_FALSE(TouchEventTimeoutEnabled()); |
| 1119 ack_handler_->GetAndResetAckCount(); | 1121 ack_handler_->GetAndResetAckCount(); |
| 1120 GetSentMessageCountAndResetSink(); | 1122 GetSentMessageCountAndResetSink(); |
| 1121 | 1123 |
| 1122 // Start another touch sequence. While this does restore the touch timeout | 1124 // Start another touch sequence. While this does restore the touch timeout |
| 1123 // the timeout will not apply until the *next* touch sequence. This affords a | 1125 // the timeout will not apply until the *next* touch sequence. This affords a |
| 1124 // touch-action response from the renderer without racing against the timeout. | 1126 // touch-action response from the renderer without racing against the timeout. |
| 1125 PressTouchPoint(1, 1); | 1127 PressTouchPoint(1, 1); |
| 1126 SendTouchEvent(); | 1128 SendTouchEvent(); |
| 1127 EXPECT_TRUE(TouchEventTimeoutEnabled()); | 1129 EXPECT_TRUE(TouchEventTimeoutEnabled()); |
| 1128 EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); | 1130 EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
| 1129 | 1131 |
| 1130 // Delay the ack. The timeout should *not* fire. | 1132 // Delay the ack. The timeout should *not* fire. |
| 1131 RunTasksAndWait(base::TimeDelta::FromMilliseconds(2)); | 1133 RunTasksAndWait(base::TimeDelta::FromMilliseconds(timeout_ms + 1)); |
| 1132 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); | 1134 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); |
| 1133 EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); | 1135 EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); |
| 1134 | 1136 |
| 1135 // Finally send the ack. The touch sequence should not have been cancelled. | 1137 // Finally send the ack. The touch sequence should not have been cancelled. |
| 1136 SendInputEventACK(WebInputEvent::TouchStart, | 1138 SendInputEventACK(WebInputEvent::TouchStart, |
| 1137 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1139 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1138 EXPECT_TRUE(TouchEventTimeoutEnabled()); | 1140 EXPECT_TRUE(TouchEventTimeoutEnabled()); |
| 1139 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); | 1141 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); |
| 1140 EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); | 1142 EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); |
| 1141 | 1143 |
| 1142 // End the sequence. | 1144 // End the sequence. |
| 1143 ReleaseTouchPoint(0); | 1145 ReleaseTouchPoint(0); |
| 1144 SendTouchEvent(); | 1146 SendTouchEvent(); |
| 1145 SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED); | 1147 SendInputEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED); |
| 1146 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); | 1148 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); |
| 1147 EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); | 1149 EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
| 1148 | 1150 |
| 1149 // A new touch sequence should (finally) be subject to the timeout. | 1151 // A new touch sequence should (finally) be subject to the timeout. |
| 1150 PressTouchPoint(1, 1); | 1152 PressTouchPoint(1, 1); |
| 1151 SendTouchEvent(); | 1153 SendTouchEvent(); |
| 1152 EXPECT_TRUE(TouchEventTimeoutEnabled()); | 1154 EXPECT_TRUE(TouchEventTimeoutEnabled()); |
| 1153 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); | 1155 EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); |
| 1154 EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); | 1156 EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
| 1155 | 1157 |
| 1156 // Wait for the touch ack timeout to fire. | 1158 // Wait for the touch ack timeout to fire. |
| 1157 RunTasksAndWait(base::TimeDelta::FromMilliseconds(2)); | 1159 RunTasksAndWait(base::TimeDelta::FromMilliseconds(timeout_ms + 1)); |
| 1158 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); | 1160 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); |
| 1159 } | 1161 } |
| 1160 | 1162 |
| 1161 // Test that TouchActionFilter::ResetTouchAction is called before the | 1163 // Test that TouchActionFilter::ResetTouchAction is called before the |
| 1162 // first touch event for a touch sequence reaches the renderer. | 1164 // first touch event for a touch sequence reaches the renderer. |
| 1163 TEST_F(InputRouterImplTest, ResetTouchActionBeforeEventReachesRenderer) { | 1165 TEST_F(InputRouterImplTest, ResetTouchActionBeforeEventReachesRenderer) { |
| 1164 OnHasTouchEventHandlers(true); | 1166 OnHasTouchEventHandlers(true); |
| 1165 | 1167 |
| 1166 // Sequence 1. | 1168 // Sequence 1. |
| 1167 PressTouchPoint(1, 1); | 1169 PressTouchPoint(1, 1); |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1428 | 1430 |
| 1429 // Ack the second scroll. | 1431 // Ack the second scroll. |
| 1430 SendInputEventACK(WebInputEvent::GestureScrollUpdate, | 1432 SendInputEventACK(WebInputEvent::GestureScrollUpdate, |
| 1431 INPUT_EVENT_ACK_STATE_CONSUMED); | 1433 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 1432 EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); | 1434 EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); |
| 1433 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); | 1435 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); |
| 1434 EXPECT_EQ(0, client_->in_flight_event_count()); | 1436 EXPECT_EQ(0, client_->in_flight_event_count()); |
| 1435 } | 1437 } |
| 1436 | 1438 |
| 1437 } // namespace content | 1439 } // namespace content |
| OLD | NEW |