| 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 <math.h> | 5 #include <math.h> |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/command_line.h" | |
| 9 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
| 11 #include "content/browser/renderer_host/input/gesture_event_queue.h" | 10 #include "content/browser/renderer_host/input/gesture_event_queue.h" |
| 12 #include "content/browser/renderer_host/input/input_router_client.h" | 11 #include "content/browser/renderer_host/input/input_router_client.h" |
| 13 #include "content/browser/renderer_host/input/input_router_impl.h" | 12 #include "content/browser/renderer_host/input/input_router_impl.h" |
| 14 #include "content/browser/renderer_host/input/mock_input_ack_handler.h" | 13 #include "content/browser/renderer_host/input/mock_input_ack_handler.h" |
| 15 #include "content/browser/renderer_host/input/mock_input_router_client.h" | 14 #include "content/browser/renderer_host/input/mock_input_router_client.h" |
| 16 #include "content/common/content_constants_internal.h" | 15 #include "content/common/content_constants_internal.h" |
| 17 #include "content/common/edit_command.h" | 16 #include "content/common/edit_command.h" |
| 18 #include "content/common/input/synthetic_web_input_event_builders.h" | 17 #include "content/common/input/synthetic_web_input_event_builders.h" |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 InputRouterImplTest() {} | 143 InputRouterImplTest() {} |
| 145 virtual ~InputRouterImplTest() {} | 144 virtual ~InputRouterImplTest() {} |
| 146 | 145 |
| 147 protected: | 146 protected: |
| 148 // testing::Test | 147 // testing::Test |
| 149 virtual void SetUp() override { | 148 virtual void SetUp() override { |
| 150 browser_context_.reset(new TestBrowserContext()); | 149 browser_context_.reset(new TestBrowserContext()); |
| 151 process_.reset(new MockRenderProcessHost(browser_context_.get())); | 150 process_.reset(new MockRenderProcessHost(browser_context_.get())); |
| 152 client_.reset(new MockInputRouterClient()); | 151 client_.reset(new MockInputRouterClient()); |
| 153 ack_handler_.reset(new MockInputAckHandler()); | 152 ack_handler_.reset(new MockInputAckHandler()); |
| 154 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); | |
| 155 command_line->AppendSwitch(switches::kValidateInputEventStream); | |
| 156 input_router_.reset(new InputRouterImpl(process_.get(), | 153 input_router_.reset(new InputRouterImpl(process_.get(), |
| 157 client_.get(), | 154 client_.get(), |
| 158 ack_handler_.get(), | 155 ack_handler_.get(), |
| 159 MSG_ROUTING_NONE, | 156 MSG_ROUTING_NONE, |
| 160 config_)); | 157 config_)); |
| 161 client_->set_input_router(input_router()); | 158 client_->set_input_router(input_router()); |
| 162 ack_handler_->set_input_router(input_router()); | 159 ack_handler_->set_input_router(input_router()); |
| 163 } | 160 } |
| 164 | 161 |
| 165 virtual void TearDown() override { | 162 virtual void TearDown() override { |
| 166 // Process all pending tasks to avoid leaks. | 163 // Process all pending tasks to avoid leaks. |
| 167 base::MessageLoop::current()->RunUntilIdle(); | 164 base::MessageLoop::current()->RunUntilIdle(); |
| 168 | 165 |
| 169 input_router_.reset(); | 166 input_router_.reset(); |
| 170 client_.reset(); | 167 client_.reset(); |
| 171 process_.reset(); | 168 process_.reset(); |
| 172 browser_context_.reset(); | 169 browser_context_.reset(); |
| 173 } | 170 } |
| 174 | 171 |
| 175 void SetUpForTouchAckTimeoutTest(int timeout_ms) { | 172 void SetUpForTouchAckTimeoutTest(int timeout_ms) { |
| 176 config_.touch_config.touch_ack_timeout_delay = | 173 config_.touch_config.touch_ack_timeout_delay = |
| 177 base::TimeDelta::FromMilliseconds(timeout_ms); | 174 base::TimeDelta::FromMilliseconds(timeout_ms); |
| 178 config_.touch_config.touch_ack_timeout_supported = true; | 175 config_.touch_config.touch_ack_timeout_supported = true; |
| 176 config_.validate_event_stream = true; |
| 179 TearDown(); | 177 TearDown(); |
| 180 SetUp(); | 178 SetUp(); |
| 181 } | 179 } |
| 182 | 180 |
| 183 void SimulateKeyboardEvent(WebInputEvent::Type type, bool is_shortcut) { | 181 void SimulateKeyboardEvent(WebInputEvent::Type type, bool is_shortcut) { |
| 184 WebKeyboardEvent event = SyntheticWebKeyboardEventBuilder::Build(type); | 182 WebKeyboardEvent event = SyntheticWebKeyboardEventBuilder::Build(type); |
| 185 NativeWebKeyboardEvent native_event; | 183 NativeWebKeyboardEvent native_event; |
| 186 memcpy(&native_event, &event, sizeof(event)); | 184 memcpy(&native_event, &event, sizeof(event)); |
| 187 input_router_->SendKeyboardEvent( | 185 input_router_->SendKeyboardEvent( |
| 188 native_event, | 186 native_event, |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 280 } | 278 } |
| 281 | 279 |
| 282 bool TouchEventQueueEmpty() const { | 280 bool TouchEventQueueEmpty() const { |
| 283 return input_router()->touch_event_queue_.empty(); | 281 return input_router()->touch_event_queue_.empty(); |
| 284 } | 282 } |
| 285 | 283 |
| 286 bool TouchEventTimeoutEnabled() const { | 284 bool TouchEventTimeoutEnabled() const { |
| 287 return input_router()->touch_event_queue_.IsAckTimeoutEnabled(); | 285 return input_router()->touch_event_queue_.IsAckTimeoutEnabled(); |
| 288 } | 286 } |
| 289 | 287 |
| 290 void Flush() const { | 288 void RequestFlushedNotification() const { |
| 291 return input_router_->Flush(); | 289 return input_router_->RequestFlushedNotification(); |
| 292 } | 290 } |
| 293 | 291 |
| 294 size_t GetAndResetDidFlushCount() { | 292 size_t GetAndResetDidFlushCount() { |
| 295 return client_->GetAndResetDidFlushCount(); | 293 return client_->GetAndResetDidFlushCount(); |
| 296 } | 294 } |
| 297 | 295 |
| 298 bool HasPendingEvents() const { | 296 bool HasPendingEvents() const { |
| 299 return input_router_->HasPendingEvents(); | 297 return input_router_->HasPendingEvents(); |
| 300 } | 298 } |
| 301 | 299 |
| (...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 616 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); | 614 EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); |
| 617 EXPECT_EQ(WebInputEvent::TouchMove, | 615 EXPECT_EQ(WebInputEvent::TouchMove, |
| 618 ack_handler_->acked_touch_event().event.type); | 616 ack_handler_->acked_touch_event().event.type); |
| 619 EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); | 617 EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); |
| 620 } | 618 } |
| 621 | 619 |
| 622 // Tests that the touch-queue is emptied after a page stops listening for touch | 620 // Tests that the touch-queue is emptied after a page stops listening for touch |
| 623 // events and the outstanding ack is received. | 621 // events and the outstanding ack is received. |
| 624 TEST_F(InputRouterImplTest, TouchEventQueueFlush) { | 622 TEST_F(InputRouterImplTest, TouchEventQueueFlush) { |
| 625 OnHasTouchEventHandlers(true); | 623 OnHasTouchEventHandlers(true); |
| 626 EXPECT_TRUE(client_->has_touch_handler()); | |
| 627 EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); | 624 EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); |
| 628 EXPECT_TRUE(TouchEventQueueEmpty()); | 625 EXPECT_TRUE(TouchEventQueueEmpty()); |
| 629 | 626 |
| 630 EXPECT_TRUE(input_router_->ShouldForwardTouchEvent()); | 627 EXPECT_TRUE(input_router_->ShouldForwardTouchEvent()); |
| 631 | 628 |
| 632 // Send a touch-press event. | 629 // Send a touch-press event. |
| 633 PressTouchPoint(1, 1); | 630 PressTouchPoint(1, 1); |
| 634 SendTouchEvent(); | 631 SendTouchEvent(); |
| 635 MoveTouchPoint(0, 2, 2); | 632 MoveTouchPoint(0, 2, 2); |
| 636 MoveTouchPoint(0, 3, 3); | 633 MoveTouchPoint(0, 3, 3); |
| 637 EXPECT_FALSE(TouchEventQueueEmpty()); | 634 EXPECT_FALSE(TouchEventQueueEmpty()); |
| 638 EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); | 635 EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
| 639 | 636 |
| 640 // The page stops listening for touch-events. Note that flushing is deferred | 637 // The page stops listening for touch-events. Note that flushing is deferred |
| 641 // until the outstanding ack is received. | 638 // until the outstanding ack is received. |
| 642 OnHasTouchEventHandlers(false); | 639 OnHasTouchEventHandlers(false); |
| 643 EXPECT_FALSE(client_->has_touch_handler()); | |
| 644 EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); | 640 EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); |
| 645 EXPECT_FALSE(TouchEventQueueEmpty()); | 641 EXPECT_FALSE(TouchEventQueueEmpty()); |
| 646 EXPECT_TRUE(input_router_->ShouldForwardTouchEvent()); | 642 EXPECT_TRUE(input_router_->ShouldForwardTouchEvent()); |
| 647 | 643 |
| 648 // After the ack, the touch-event queue should be empty, and none of the | 644 // After the ack, the touch-event queue should be empty, and none of the |
| 649 // flushed touch-events should have been sent to the renderer. | 645 // flushed touch-events should have been sent to the renderer. |
| 650 SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED); | 646 SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED); |
| 651 EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); | 647 EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); |
| 652 EXPECT_TRUE(TouchEventQueueEmpty()); | 648 EXPECT_TRUE(TouchEventQueueEmpty()); |
| 653 EXPECT_FALSE(input_router_->ShouldForwardTouchEvent()); | 649 EXPECT_FALSE(input_router_->ShouldForwardTouchEvent()); |
| (...skipping 700 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1354 SendInputEventACK(WebInputEvent::GestureTap, INPUT_EVENT_ACK_STATE_CONSUMED); | 1350 SendInputEventACK(WebInputEvent::GestureTap, INPUT_EVENT_ACK_STATE_CONSUMED); |
| 1355 EXPECT_EQ(0, client_->in_flight_event_count()); | 1351 EXPECT_EQ(0, client_->in_flight_event_count()); |
| 1356 } | 1352 } |
| 1357 | 1353 |
| 1358 // Test that the router will call the client's |DidFlush| after all events have | 1354 // Test that the router will call the client's |DidFlush| after all events have |
| 1359 // been dispatched following a call to |Flush|. | 1355 // been dispatched following a call to |Flush|. |
| 1360 TEST_F(InputRouterImplTest, InputFlush) { | 1356 TEST_F(InputRouterImplTest, InputFlush) { |
| 1361 EXPECT_FALSE(HasPendingEvents()); | 1357 EXPECT_FALSE(HasPendingEvents()); |
| 1362 | 1358 |
| 1363 // Flushing an empty router should immediately trigger DidFlush. | 1359 // Flushing an empty router should immediately trigger DidFlush. |
| 1364 Flush(); | 1360 RequestFlushedNotification(); |
| 1365 EXPECT_EQ(1U, GetAndResetDidFlushCount()); | 1361 EXPECT_EQ(1U, GetAndResetDidFlushCount()); |
| 1366 EXPECT_FALSE(HasPendingEvents()); | 1362 EXPECT_FALSE(HasPendingEvents()); |
| 1367 | 1363 |
| 1368 // Queue a TouchStart. | 1364 // Queue a TouchStart. |
| 1369 OnHasTouchEventHandlers(true); | 1365 OnHasTouchEventHandlers(true); |
| 1370 PressTouchPoint(1, 1); | 1366 PressTouchPoint(1, 1); |
| 1371 SendTouchEvent(); | 1367 SendTouchEvent(); |
| 1372 EXPECT_TRUE(HasPendingEvents()); | 1368 EXPECT_TRUE(HasPendingEvents()); |
| 1373 | 1369 |
| 1374 // DidFlush should be called only after the event is ack'ed. | 1370 // DidFlush should be called only after the event is ack'ed. |
| 1375 Flush(); | 1371 RequestFlushedNotification(); |
| 1376 EXPECT_EQ(0U, GetAndResetDidFlushCount()); | 1372 EXPECT_EQ(0U, GetAndResetDidFlushCount()); |
| 1377 SendInputEventACK(WebInputEvent::TouchStart, | 1373 SendInputEventACK(WebInputEvent::TouchStart, |
| 1378 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1374 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1379 EXPECT_EQ(1U, GetAndResetDidFlushCount()); | 1375 EXPECT_EQ(1U, GetAndResetDidFlushCount()); |
| 1380 | 1376 |
| 1381 // Ensure different types of enqueued events will prevent the DidFlush call | 1377 // Ensure different types of enqueued events will prevent the DidFlush call |
| 1382 // until all such events have been fully dispatched. | 1378 // until all such events have been fully dispatched. |
| 1383 MoveTouchPoint(0, 50, 50); | 1379 MoveTouchPoint(0, 50, 50); |
| 1384 SendTouchEvent(); | 1380 SendTouchEvent(); |
| 1385 ASSERT_TRUE(HasPendingEvents()); | 1381 ASSERT_TRUE(HasPendingEvents()); |
| 1386 SimulateGestureEvent(WebInputEvent::GestureScrollBegin, | 1382 SimulateGestureEvent(WebInputEvent::GestureScrollBegin, |
| 1387 blink::WebGestureDeviceTouchscreen); | 1383 blink::WebGestureDeviceTouchscreen); |
| 1388 SimulateGestureEvent(WebInputEvent::GestureScrollUpdate, | 1384 SimulateGestureEvent(WebInputEvent::GestureScrollUpdate, |
| 1389 blink::WebGestureDeviceTouchscreen); | 1385 blink::WebGestureDeviceTouchscreen); |
| 1390 SimulateGestureEvent(WebInputEvent::GesturePinchBegin, | 1386 SimulateGestureEvent(WebInputEvent::GesturePinchBegin, |
| 1391 blink::WebGestureDeviceTouchscreen); | 1387 blink::WebGestureDeviceTouchscreen); |
| 1392 SimulateGestureEvent(WebInputEvent::GesturePinchUpdate, | 1388 SimulateGestureEvent(WebInputEvent::GesturePinchUpdate, |
| 1393 blink::WebGestureDeviceTouchscreen); | 1389 blink::WebGestureDeviceTouchscreen); |
| 1394 Flush(); | 1390 RequestFlushedNotification(); |
| 1395 EXPECT_EQ(0U, GetAndResetDidFlushCount()); | 1391 EXPECT_EQ(0U, GetAndResetDidFlushCount()); |
| 1396 | 1392 |
| 1397 // Repeated flush calls should have no effect. | 1393 // Repeated flush calls should have no effect. |
| 1398 Flush(); | 1394 RequestFlushedNotification(); |
| 1399 EXPECT_EQ(0U, GetAndResetDidFlushCount()); | 1395 EXPECT_EQ(0U, GetAndResetDidFlushCount()); |
| 1400 | 1396 |
| 1401 // There are still pending gestures. | 1397 // There are still pending gestures. |
| 1402 SendInputEventACK(WebInputEvent::TouchMove, | 1398 SendInputEventACK(WebInputEvent::TouchMove, |
| 1403 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1399 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 1404 EXPECT_EQ(0U, GetAndResetDidFlushCount()); | 1400 EXPECT_EQ(0U, GetAndResetDidFlushCount()); |
| 1405 EXPECT_TRUE(HasPendingEvents()); | 1401 EXPECT_TRUE(HasPendingEvents()); |
| 1406 | 1402 |
| 1407 // One more gesture to go. | 1403 // One more gesture to go. |
| 1408 SendInputEventACK(WebInputEvent::GestureScrollUpdate, | 1404 SendInputEventACK(WebInputEvent::GestureScrollUpdate, |
| (...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1710 | 1706 |
| 1711 client_overscroll = client_->GetAndResetOverscroll(); | 1707 client_overscroll = client_->GetAndResetOverscroll(); |
| 1712 EXPECT_EQ(wheel_overscroll.accumulated_overscroll, | 1708 EXPECT_EQ(wheel_overscroll.accumulated_overscroll, |
| 1713 client_overscroll.accumulated_overscroll); | 1709 client_overscroll.accumulated_overscroll); |
| 1714 EXPECT_EQ(wheel_overscroll.latest_overscroll_delta, | 1710 EXPECT_EQ(wheel_overscroll.latest_overscroll_delta, |
| 1715 client_overscroll.latest_overscroll_delta); | 1711 client_overscroll.latest_overscroll_delta); |
| 1716 EXPECT_EQ(wheel_overscroll.current_fling_velocity, | 1712 EXPECT_EQ(wheel_overscroll.current_fling_velocity, |
| 1717 client_overscroll.current_fling_velocity); | 1713 client_overscroll.current_fling_velocity); |
| 1718 } | 1714 } |
| 1719 | 1715 |
| 1716 TEST_F(InputRouterImplTest, Recycle) { |
| 1717 // TODO(jdduke): Implement. |
| 1718 } |
| 1719 |
| 1720 } // namespace content | 1720 } // namespace content |
| OLD | NEW |