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 554ce74af2c58faafc2b4ab2226c61e71de2316b..d3d8c30771ad46d85ccb77d572598de21fb2440e 100644 |
| --- a/content/browser/renderer_host/input/input_router_impl_unittest.cc |
| +++ b/content/browser/renderer_host/input/input_router_impl_unittest.cc |
| @@ -1817,4 +1817,407 @@ TEST_F(InputRouterImplTest, OverscrollDispatch) { |
| client_overscroll.current_fling_velocity); |
| } |
| +namespace { |
| + |
| +class InputRouterImplScaleEventTest : public InputRouterImplTest { |
| + public: |
| + InputRouterImplScaleEventTest() {} |
| + |
| + void SetUp() override { |
| + InputRouterImplTest::SetUp(); |
| + input_router_->SetDeviceScaleFactor(2.f); |
| + } |
| + |
| + template <typename T> |
| + const T* GetSentWebInputEvent() const { |
| + EXPECT_EQ(1u, process_->sink().message_count()); |
| + |
| + InputMsg_HandleInputEvent::Schema::Param param; |
| + InputMsg_HandleInputEvent::Read(process_->sink().GetMessageAt(0), ¶m); |
| + return static_cast<const T*>(base::get<0>(param)); |
| + } |
| + |
| + template <typename T> |
| + const T* GetFilterWebInputEvent() const { |
| + return static_cast<const T*>(client_->last_filter_event()); |
| + } |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(InputRouterImplScaleEventTest); |
| +}; |
| + |
| +class InputRouterImplScaleMouseEventTest |
| + : public InputRouterImplScaleEventTest { |
| + public: |
| + InputRouterImplScaleMouseEventTest() {} |
| + |
| + void RunMouseEventTest(const std::string& name, WebInputEvent::Type type) { |
| + SCOPED_TRACE(name); |
| + SimulateMouseEvent(type, 10, 10); |
| + const WebMouseEvent* sent_event = GetSentWebInputEvent<WebMouseEvent>(); |
| + EXPECT_EQ(20, sent_event->x); |
| + EXPECT_EQ(20, sent_event->y); |
| + |
| + const WebMouseEvent* filter_event = GetFilterWebInputEvent<WebMouseEvent>(); |
| + EXPECT_EQ(10, filter_event->x); |
| + EXPECT_EQ(10, filter_event->y); |
| + |
| + process_->sink().ClearMessages(); |
| + } |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(InputRouterImplScaleMouseEventTest); |
| +}; |
| + |
| +} // namespace |
| + |
| +TEST_F(InputRouterImplScaleMouseEventTest, ScaleMouseEventTest) { |
| + RunMouseEventTest("Enter", WebInputEvent::MouseEnter); |
| + RunMouseEventTest("Down", WebInputEvent::MouseDown); |
| + RunMouseEventTest("Move", WebInputEvent::MouseMove); |
| + RunMouseEventTest("Up", WebInputEvent::MouseUp); |
| +} |
| + |
| +TEST_F(InputRouterImplScaleEventTest, ScaleMouseWheelEventTest) { |
| + ASSERT_EQ(0u, process_->sink().message_count()); |
| + SimulateWheelEvent(10, 10, 0, false); |
| + ASSERT_EQ(1u, process_->sink().message_count()); |
| + |
| + const WebMouseWheelEvent* sent_event = |
| + GetSentWebInputEvent<WebMouseWheelEvent>(); |
| + EXPECT_EQ(20, sent_event->deltaX); |
| + EXPECT_EQ(20, sent_event->deltaY); |
| + EXPECT_EQ(2, sent_event->wheelTicksX); |
| + EXPECT_EQ(2, sent_event->wheelTicksY); |
| + |
| + const WebMouseWheelEvent* filter_event = |
| + GetFilterWebInputEvent<WebMouseWheelEvent>(); |
| + EXPECT_EQ(10, filter_event->deltaX); |
| + EXPECT_EQ(10, filter_event->deltaY); |
| + EXPECT_EQ(1, filter_event->wheelTicksX); |
| + EXPECT_EQ(1, filter_event->wheelTicksY); |
| + |
| + EXPECT_EQ(sent_event->accelerationRatioX, filter_event->accelerationRatioX); |
| + EXPECT_EQ(sent_event->accelerationRatioY, filter_event->accelerationRatioY); |
| +} |
| + |
| +namespace { |
| + |
| +class InputRouterImplScaleTouchEventTest |
| + : public InputRouterImplScaleEventTest { |
| + public: |
| + InputRouterImplScaleTouchEventTest() {} |
| + |
| + void RunTouchEventTest(const std::string& name, WebTouchPoint::State state) { |
|
tdresser
2015/11/27 21:35:20
Add a comment indicating the setup required to use
oshima
2015/11/30 23:01:12
Done.
|
| + SCOPED_TRACE(name); |
| + ASSERT_EQ(1u, process_->sink().message_count()); |
| + const WebTouchEvent* sent_event = GetSentWebInputEvent<WebTouchEvent>(); |
| + ASSERT_EQ(2u, sent_event->touchesLength); |
| + EXPECT_EQ(state, sent_event->touches[0].state); |
| + EXPECT_EQ(20, sent_event->touches[0].position.x); |
| + EXPECT_EQ(40, sent_event->touches[0].position.y); |
| + EXPECT_EQ(10, sent_event->touches[0].screenPosition.x); |
| + EXPECT_EQ(20, sent_event->touches[0].screenPosition.y); |
| + EXPECT_EQ(2, sent_event->touches[0].radiusX); |
| + EXPECT_EQ(2, sent_event->touches[0].radiusY); |
| + |
| + EXPECT_EQ(200, sent_event->touches[1].position.x); |
| + EXPECT_EQ(400, sent_event->touches[1].position.y); |
| + EXPECT_EQ(100, sent_event->touches[1].screenPosition.x); |
| + EXPECT_EQ(200, sent_event->touches[1].screenPosition.y); |
| + EXPECT_EQ(2, sent_event->touches[1].radiusX); |
| + EXPECT_EQ(2, sent_event->touches[1].radiusY); |
| + |
| + const WebTouchEvent* filter_event = GetFilterWebInputEvent<WebTouchEvent>(); |
| + ASSERT_EQ(2u, filter_event->touchesLength); |
| + EXPECT_EQ(10, filter_event->touches[0].position.x); |
| + EXPECT_EQ(20, filter_event->touches[0].position.y); |
| + EXPECT_EQ(10, filter_event->touches[0].screenPosition.x); |
| + EXPECT_EQ(20, filter_event->touches[0].screenPosition.y); |
| + EXPECT_EQ(1, filter_event->touches[0].radiusX); |
| + EXPECT_EQ(1, filter_event->touches[0].radiusY); |
| + |
| + EXPECT_EQ(100, filter_event->touches[1].position.x); |
| + EXPECT_EQ(200, filter_event->touches[1].position.y); |
| + EXPECT_EQ(100, filter_event->touches[1].screenPosition.x); |
| + EXPECT_EQ(200, filter_event->touches[1].screenPosition.y); |
| + EXPECT_EQ(1, filter_event->touches[1].radiusX); |
| + EXPECT_EQ(1, filter_event->touches[1].radiusY); |
| + } |
| + |
| + void FlushTouchEvent(WebInputEvent::Type type) { |
| + uint32 touch_event_id = SendTouchEvent(); |
| + SendTouchEventACK(type, INPUT_EVENT_ACK_STATE_CONSUMED, touch_event_id); |
| + ASSERT_TRUE(TouchEventQueueEmpty()); |
| + ASSERT_NE(0u, process_->sink().message_count()); |
| + } |
| + |
| + void ReleaseTouchPointAndAck(int index) { |
| + ReleaseTouchPoint(index); |
| + int release_event_id = SendTouchEvent(); |
| + SendTouchEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED, |
| + release_event_id); |
| + } |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(InputRouterImplScaleTouchEventTest); |
| +}; |
| + |
| +} // namespace |
| + |
| +TEST_F(InputRouterImplScaleTouchEventTest, ScaleTouchEventTest) { |
| + // Press |
| + PressTouchPoint(10, 20); |
| + PressTouchPoint(100, 200); |
| + FlushTouchEvent(WebInputEvent::TouchStart); |
| + |
| + RunTouchEventTest("Press", WebTouchPoint::StatePressed); |
| + ReleaseTouchPointAndAck(1); |
| + ReleaseTouchPointAndAck(0); |
| + EXPECT_EQ(3u, GetSentMessageCountAndResetSink()); |
| + |
| + // Move |
| + PressTouchPoint(0, 0); |
| + PressTouchPoint(0, 0); |
| + FlushTouchEvent(WebInputEvent::TouchStart); |
| + process_->sink().ClearMessages(); |
| + |
| + MoveTouchPoint(0, 10, 20); |
| + MoveTouchPoint(1, 100, 200); |
| + FlushTouchEvent(WebInputEvent::TouchMove); |
| + RunTouchEventTest("Move", WebTouchPoint::StateMoved); |
| + ReleaseTouchPointAndAck(1); |
| + ReleaseTouchPointAndAck(0); |
| + EXPECT_EQ(3u, GetSentMessageCountAndResetSink()); |
| + |
| + // Release |
| + PressTouchPoint(10, 20); |
| + PressTouchPoint(100, 200); |
| + FlushTouchEvent(WebInputEvent::TouchMove); |
| + process_->sink().ClearMessages(); |
| + |
| + ReleaseTouchPoint(0); |
| + ReleaseTouchPoint(1); |
| + FlushTouchEvent(WebInputEvent::TouchEnd); |
| + RunTouchEventTest("Release", WebTouchPoint::StateReleased); |
| + |
| + // Cancel |
| + PressTouchPoint(10, 20); |
| + PressTouchPoint(100, 200); |
| + FlushTouchEvent(WebInputEvent::TouchStart); |
| + process_->sink().ClearMessages(); |
| + |
| + CancelTouchPoint(0); |
| + CancelTouchPoint(1); |
| + FlushTouchEvent(WebInputEvent::TouchCancel); |
| + RunTouchEventTest("Cancel", WebTouchPoint::StateCancelled); |
| +} |
| + |
| +namespace { |
| + |
| +class InputRouterImplScaleGestureEventTest |
| + : public InputRouterImplScaleEventTest { |
| + public: |
| + InputRouterImplScaleGestureEventTest() {} |
| + |
| + WebGestureEvent BuildGestureEvent(WebInputEvent::Type type, int x, int y) { |
| + auto event = SyntheticWebGestureEventBuilder::Build( |
|
tdresser
2015/11/27 21:35:20
Some of the use of auto here seems a bit suspect t
oshima
2015/11/30 23:01:12
Done.
|
| + type, blink::WebGestureDeviceTouchpad); |
| + event.globalX = event.x = x; |
| + event.globalY = event.y = y; |
| + return event; |
| + } |
| + |
| + void TestTap(const std::string& name, WebInputEvent::Type type) { |
| + SCOPED_TRACE(name); |
| + auto event = BuildGestureEvent(type, 10, 20); |
| + event.data.tap.width = 30; |
| + event.data.tap.height = 40; |
| + SimulateGestureEvent(event); |
| + FlushGestureEvent(type); |
| + |
| + const WebGestureEvent* sent_event = GetSentWebInputEvent<WebGestureEvent>(); |
| + TestLocationInSentEvent(sent_event); |
| + EXPECT_EQ(60, sent_event->data.tap.width); |
| + EXPECT_EQ(80, sent_event->data.tap.height); |
| + |
| + const WebGestureEvent* filter_event = |
| + GetFilterWebInputEvent<WebGestureEvent>(); |
| + TestLocationInFilterEvent(filter_event); |
| + EXPECT_EQ(30, filter_event->data.tap.width); |
| + EXPECT_EQ(40, filter_event->data.tap.height); |
| + process_->sink().ClearMessages(); |
| + } |
| + |
| + void TestLongPress(const std::string& name, WebInputEvent::Type type) { |
| + auto event = BuildGestureEvent(type, 10, 20); |
| + event.data.longPress.width = 30; |
| + event.data.longPress.height = 40; |
| + SimulateGestureEvent(event); |
| + FlushGestureEvent(type); |
| + const WebGestureEvent* sent_event = GetSentWebInputEvent<WebGestureEvent>(); |
| + TestLocationInSentEvent(sent_event); |
| + EXPECT_EQ(60, sent_event->data.longPress.width); |
| + EXPECT_EQ(80, sent_event->data.longPress.height); |
| + |
| + const WebGestureEvent* filter_event = |
| + GetFilterWebInputEvent<WebGestureEvent>(); |
| + TestLocationInFilterEvent(filter_event); |
| + EXPECT_EQ(30, filter_event->data.longPress.width); |
| + EXPECT_EQ(40, filter_event->data.longPress.height); |
| + process_->sink().ClearMessages(); |
| + } |
| + |
| + void FlushGestureEvent(WebInputEvent::Type type) { |
| + SendInputEventACK(type, INPUT_EVENT_ACK_STATE_CONSUMED); |
| + ASSERT_NE(0u, process_->sink().message_count()); |
| + } |
| + |
| + void TestLocationInSentEvent(const WebGestureEvent* sent_event) { |
|
tdresser
2015/11/27 21:35:20
Could we take the co-ordinates here as parameters?
oshima
2015/11/30 23:01:12
Done.
|
| + EXPECT_EQ(20, sent_event->x); |
| + EXPECT_EQ(40, sent_event->y); |
| + EXPECT_EQ(10, sent_event->globalX); |
| + EXPECT_EQ(20, sent_event->globalY); |
| + } |
| + |
| + void TestLocationInFilterEvent(const WebGestureEvent* filter_event) { |
| + EXPECT_EQ(10, filter_event->x); |
| + EXPECT_EQ(20, filter_event->y); |
| + EXPECT_EQ(10, filter_event->globalX); |
| + EXPECT_EQ(20, filter_event->globalY); |
| + } |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(InputRouterImplScaleGestureEventTest); |
| +}; |
| + |
| +} // namespace |
| + |
| +TEST_F(InputRouterImplScaleGestureEventTest, GestureScrollUpdate) { |
| + SimulateGestureScrollUpdateEvent(10.f, 20, 0, |
| + blink::WebGestureDeviceTouchpad); |
| + FlushGestureEvent(WebInputEvent::GestureScrollUpdate); |
| + const WebGestureEvent* sent_event = GetSentWebInputEvent<WebGestureEvent>(); |
| + |
| + EXPECT_EQ(20.f, sent_event->data.scrollUpdate.deltaX); |
| + EXPECT_EQ(40.f, sent_event->data.scrollUpdate.deltaY); |
| + |
| + const WebGestureEvent* filter_event = |
| + GetFilterWebInputEvent<WebGestureEvent>(); |
| + EXPECT_EQ(10.f, filter_event->data.scrollUpdate.deltaX); |
| + EXPECT_EQ(20.f, filter_event->data.scrollUpdate.deltaY); |
| +} |
| + |
| +TEST_F(InputRouterImplScaleGestureEventTest, GestureScrollBegin) { |
| + SimulateGestureEvent( |
| + SyntheticWebGestureEventBuilder::BuildScrollBegin(10.f, 20.f)); |
| + const WebGestureEvent* sent_event = GetSentWebInputEvent<WebGestureEvent>(); |
| + EXPECT_EQ(20.f, sent_event->data.scrollBegin.deltaXHint); |
| + EXPECT_EQ(40.f, sent_event->data.scrollBegin.deltaYHint); |
| + |
| + const WebGestureEvent* filter_event = |
| + GetFilterWebInputEvent<WebGestureEvent>(); |
| + EXPECT_EQ(10.f, filter_event->data.scrollBegin.deltaXHint); |
| + EXPECT_EQ(20.f, filter_event->data.scrollBegin.deltaYHint); |
| +} |
| + |
| +TEST_F(InputRouterImplScaleGestureEventTest, GesturePinchUpdate) { |
| + SimulateGesturePinchUpdateEvent(1.5f, 10, 20, 0, |
| + blink::WebGestureDeviceTouchpad); |
| + FlushGestureEvent(WebInputEvent::GesturePinchUpdate); |
| + const WebGestureEvent* sent_event = GetSentWebInputEvent<WebGestureEvent>(); |
| + TestLocationInSentEvent(sent_event); |
| + EXPECT_EQ(1.5f, sent_event->data.pinchUpdate.scale); |
| + |
| + const WebGestureEvent* filter_event = |
| + GetFilterWebInputEvent<WebGestureEvent>(); |
| + TestLocationInFilterEvent(filter_event); |
| + EXPECT_EQ(1.5f, filter_event->data.pinchUpdate.scale); |
| +} |
| + |
| +TEST_F(InputRouterImplScaleGestureEventTest, GestureTapDown) { |
| + auto event = BuildGestureEvent(WebInputEvent::GestureTapDown, 10, 20); |
| + event.data.tapDown.width = 30; |
| + event.data.tapDown.height = 40; |
| + SimulateGestureEvent(event); |
| + // FlushGestureEvent(WebInputEvent::GestureTapDown); |
| + const WebGestureEvent* sent_event = GetSentWebInputEvent<WebGestureEvent>(); |
| + TestLocationInSentEvent(sent_event); |
| + EXPECT_EQ(60, sent_event->data.tapDown.width); |
| + EXPECT_EQ(80, sent_event->data.tapDown.height); |
| + |
| + const WebGestureEvent* filter_event = |
| + GetFilterWebInputEvent<WebGestureEvent>(); |
| + TestLocationInFilterEvent(filter_event); |
| + EXPECT_EQ(30, filter_event->data.tapDown.width); |
| + EXPECT_EQ(40, filter_event->data.tapDown.height); |
| +} |
| + |
| +TEST_F(InputRouterImplScaleGestureEventTest, GestureTapOthers) { |
| + TestTap("GestureDoubleTap", WebInputEvent::GestureDoubleTap); |
| + TestTap("GestureTap", WebInputEvent::GestureTap); |
| + TestTap("GestureTapUnconfirmed", WebInputEvent::GestureTapUnconfirmed); |
| +} |
| + |
| +TEST_F(InputRouterImplScaleGestureEventTest, GestureShowPress) { |
| + auto event = BuildGestureEvent(WebInputEvent::GestureShowPress, 10, 20); |
| + event.data.showPress.width = 30; |
| + event.data.showPress.height = 40; |
| + SimulateGestureEvent(event); |
| + |
| + const WebGestureEvent* sent_event = GetSentWebInputEvent<WebGestureEvent>(); |
| + TestLocationInSentEvent(sent_event); |
| + EXPECT_EQ(60, sent_event->data.showPress.width); |
| + EXPECT_EQ(80, sent_event->data.showPress.height); |
| + |
| + const WebGestureEvent* filter_event = |
| + GetFilterWebInputEvent<WebGestureEvent>(); |
| + TestLocationInFilterEvent(filter_event); |
| + EXPECT_EQ(30, filter_event->data.showPress.width); |
| + EXPECT_EQ(40, filter_event->data.showPress.height); |
| +} |
| + |
| +TEST_F(InputRouterImplScaleGestureEventTest, GestureLongPress) { |
| + TestLongPress("LongPress", WebInputEvent::GestureLongPress); |
| + TestLongPress("LongPap", WebInputEvent::GestureLongTap); |
| +} |
| + |
| +TEST_F(InputRouterImplScaleGestureEventTest, GestureTwoFingerTap) { |
| + auto event = BuildGestureEvent(WebInputEvent::GestureTwoFingerTap, 10, 20); |
| + event.data.twoFingerTap.firstFingerWidth = 30; |
| + event.data.twoFingerTap.firstFingerHeight = 40; |
| + SimulateGestureEvent(event); |
| + |
| + const WebGestureEvent* sent_event = GetSentWebInputEvent<WebGestureEvent>(); |
| + EXPECT_EQ(20, sent_event->x); |
| + EXPECT_EQ(40, sent_event->y); |
| + EXPECT_EQ(60, sent_event->data.twoFingerTap.firstFingerWidth); |
| + EXPECT_EQ(80, sent_event->data.twoFingerTap.firstFingerHeight); |
| + |
| + const WebGestureEvent* filter_event = |
| + GetFilterWebInputEvent<WebGestureEvent>(); |
| + EXPECT_EQ(10, filter_event->x); |
| + EXPECT_EQ(20, filter_event->y); |
| + EXPECT_EQ(30, filter_event->data.twoFingerTap.firstFingerWidth); |
| + EXPECT_EQ(40, filter_event->data.twoFingerTap.firstFingerHeight); |
| +} |
| + |
| +TEST_F(InputRouterImplScaleGestureEventTest, GestureFlingStart) { |
| + auto event = BuildGestureEvent(WebInputEvent::GestureFlingStart, 10, 20); |
| + event.data.flingStart.velocityX = 30; |
| + event.data.flingStart.velocityY = 40; |
| + SimulateGestureEvent(event); |
| + |
| + const WebGestureEvent* sent_event = GetSentWebInputEvent<WebGestureEvent>(); |
| + TestLocationInSentEvent(sent_event); |
| + EXPECT_EQ(60, sent_event->data.flingStart.velocityX); |
| + EXPECT_EQ(80, sent_event->data.flingStart.velocityY); |
| + |
| + const WebGestureEvent* filter_event = |
| + GetFilterWebInputEvent<WebGestureEvent>(); |
| + TestLocationInFilterEvent(filter_event); |
| + EXPECT_EQ(30, filter_event->data.flingStart.velocityX); |
| + EXPECT_EQ(40, filter_event->data.flingStart.velocityY); |
| +} |
| + |
| } // namespace content |