| Index: content/common/input/web_input_event_traits_unittest.cc
|
| diff --git a/content/common/input/web_input_event_traits_unittest.cc b/content/common/input/web_input_event_traits_unittest.cc
|
| index 7c773f4f45a691f5abeece374a86e16e3338af2c..d712f49bb08fae3e19a6ee7b52e3110ae8f2e66e 100644
|
| --- a/content/common/input/web_input_event_traits_unittest.cc
|
| +++ b/content/common/input/web_input_event_traits_unittest.cc
|
| @@ -6,6 +6,7 @@
|
|
|
| #include <limits>
|
|
|
| +#include "content/common/input/event_with_latency_info.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| #include "third_party/WebKit/public/web/WebInputEvent.h"
|
|
|
| @@ -21,6 +22,8 @@ using std::numeric_limits;
|
| namespace content {
|
| namespace {
|
|
|
| +// TODO(tapted): Move the Coalesce tests to event_with_latency_info_unittest.cc.
|
| +// Merge this test harness into EventWithLatencyInfoTest.
|
| class WebInputEventTraitsTest : public testing::Test {
|
| protected:
|
| static WebTouchPoint CreateTouchPoint(WebTouchPoint::State state, int id) {
|
| @@ -30,200 +33,211 @@ class WebInputEventTraitsTest : public testing::Test {
|
| return touch;
|
| }
|
|
|
| - static WebTouchEvent CreateTouch(WebInputEvent::Type type) {
|
| + static TouchEventWithLatencyInfo CreateTouch(WebInputEvent::Type type) {
|
| return CreateTouch(type, 1);
|
| }
|
|
|
| - static WebTouchEvent CreateTouch(WebInputEvent::Type type,
|
| - unsigned touch_count) {
|
| + static TouchEventWithLatencyInfo CreateTouch(WebInputEvent::Type type,
|
| + unsigned touch_count) {
|
| WebTouchEvent event;
|
| event.touchesLength = touch_count;
|
| event.type = type;
|
| - return event;
|
| + return TouchEventWithLatencyInfo(event);
|
| }
|
|
|
| - static WebGestureEvent CreateGesture(WebInputEvent::Type type,
|
| - float x,
|
| - float y) {
|
| + static GestureEventWithLatencyInfo CreateGesture(WebInputEvent::Type type,
|
| + float x,
|
| + float y) {
|
| WebGestureEvent event;
|
| event.type = type;
|
| event.x = x;
|
| event.y = y;
|
| - return event;
|
| + return GestureEventWithLatencyInfo(event);
|
| }
|
|
|
| - static WebMouseWheelEvent CreateMouseWheel(float deltaX, float deltaY) {
|
| + static MouseWheelEventWithLatencyInfo CreateMouseWheel(float deltaX,
|
| + float deltaY) {
|
| WebMouseWheelEvent event;
|
| event.type = WebInputEvent::MouseWheel;
|
| event.deltaX = deltaX;
|
| event.deltaY = deltaY;
|
| - return event;
|
| + return MouseWheelEventWithLatencyInfo(event);
|
| }
|
| };
|
|
|
| +template <class T>
|
| +bool CanCoalesce(const T& event_to_coalesce, const T& event) {
|
| + return event.CanCoalesceWith(event_to_coalesce);
|
| +}
|
| +
|
| +template <class T>
|
| +void Coalesce(const T& event_to_coalesce, T* event) {
|
| + return event->CoalesceWith(event_to_coalesce);
|
| +}
|
| +
|
| TEST_F(WebInputEventTraitsTest, TouchEventCoalescing) {
|
| - WebTouchEvent touch0 = CreateTouch(WebInputEvent::TouchStart);
|
| - WebTouchEvent touch1 = CreateTouch(WebInputEvent::TouchMove);
|
| + TouchEventWithLatencyInfo touch0 = CreateTouch(WebInputEvent::TouchStart);
|
| + TouchEventWithLatencyInfo touch1 = CreateTouch(WebInputEvent::TouchMove);
|
|
|
| // Non touch-moves won't coalesce.
|
| - EXPECT_FALSE(WebInputEventTraits::CanCoalesce(touch0, touch0));
|
| + EXPECT_FALSE(CanCoalesce(touch0, touch0));
|
|
|
| // Touches of different types won't coalesce.
|
| - EXPECT_FALSE(WebInputEventTraits::CanCoalesce(touch0, touch1));
|
| + EXPECT_FALSE(CanCoalesce(touch0, touch1));
|
|
|
| // Touch moves with idential touch lengths and touch ids should coalesce.
|
| - EXPECT_TRUE(WebInputEventTraits::CanCoalesce(touch1, touch1));
|
| + EXPECT_TRUE(CanCoalesce(touch1, touch1));
|
|
|
| // Touch moves with different touch ids should not coalesce.
|
| touch0 = CreateTouch(WebInputEvent::TouchMove);
|
| touch1 = CreateTouch(WebInputEvent::TouchMove);
|
| - touch0.touches[0].id = 7;
|
| - EXPECT_FALSE(WebInputEventTraits::CanCoalesce(touch0, touch1));
|
| + touch0.event.touches[0].id = 7;
|
| + EXPECT_FALSE(CanCoalesce(touch0, touch1));
|
| touch0 = CreateTouch(WebInputEvent::TouchMove, 2);
|
| touch1 = CreateTouch(WebInputEvent::TouchMove, 2);
|
| - touch0.touches[0].id = 1;
|
| - touch1.touches[0].id = 0;
|
| - EXPECT_FALSE(WebInputEventTraits::CanCoalesce(touch0, touch1));
|
| + touch0.event.touches[0].id = 1;
|
| + touch1.event.touches[0].id = 0;
|
| + EXPECT_FALSE(CanCoalesce(touch0, touch1));
|
|
|
| // Touch moves with different touch lengths should not coalesce.
|
| touch0 = CreateTouch(WebInputEvent::TouchMove, 1);
|
| touch1 = CreateTouch(WebInputEvent::TouchMove, 2);
|
| - EXPECT_FALSE(WebInputEventTraits::CanCoalesce(touch0, touch1));
|
| + EXPECT_FALSE(CanCoalesce(touch0, touch1));
|
|
|
| // Touch moves with identical touch ids in different orders should coalesce.
|
| touch0 = CreateTouch(WebInputEvent::TouchMove, 2);
|
| touch1 = CreateTouch(WebInputEvent::TouchMove, 2);
|
| - touch0.touches[0] = touch1.touches[1] =
|
| + touch0.event.touches[0] = touch1.event.touches[1] =
|
| CreateTouchPoint(WebTouchPoint::StateMoved, 1);
|
| - touch0.touches[1] = touch1.touches[0] =
|
| + touch0.event.touches[1] = touch1.event.touches[0] =
|
| CreateTouchPoint(WebTouchPoint::StateMoved, 0);
|
| - EXPECT_TRUE(WebInputEventTraits::CanCoalesce(touch0, touch1));
|
| + EXPECT_TRUE(CanCoalesce(touch0, touch1));
|
|
|
| // Pointers with the same ID's should coalesce.
|
| touch0 = CreateTouch(WebInputEvent::TouchMove, 2);
|
| touch1 = CreateTouch(WebInputEvent::TouchMove, 2);
|
| - touch0.touches[0] = touch1.touches[1] =
|
| + touch0.event.touches[0] = touch1.event.touches[1] =
|
| CreateTouchPoint(WebTouchPoint::StateMoved, 1);
|
| - WebInputEventTraits::Coalesce(touch0, &touch1);
|
| - ASSERT_EQ(1, touch1.touches[0].id);
|
| - ASSERT_EQ(0, touch1.touches[1].id);
|
| - EXPECT_EQ(WebTouchPoint::StateUndefined, touch1.touches[1].state);
|
| - EXPECT_EQ(WebTouchPoint::StateMoved, touch1.touches[0].state);
|
| + Coalesce(touch0, &touch1);
|
| + ASSERT_EQ(1, touch1.event.touches[0].id);
|
| + ASSERT_EQ(0, touch1.event.touches[1].id);
|
| + EXPECT_EQ(WebTouchPoint::StateUndefined, touch1.event.touches[1].state);
|
| + EXPECT_EQ(WebTouchPoint::StateMoved, touch1.event.touches[0].state);
|
|
|
| // Movement from now-stationary pointers should be preserved.
|
| touch0 = touch1 = CreateTouch(WebInputEvent::TouchMove, 2);
|
| - touch0.touches[0] = CreateTouchPoint(WebTouchPoint::StateMoved, 1);
|
| - touch1.touches[1] = CreateTouchPoint(WebTouchPoint::StateStationary, 1);
|
| - touch0.touches[1] = CreateTouchPoint(WebTouchPoint::StateStationary, 0);
|
| - touch1.touches[0] = CreateTouchPoint(WebTouchPoint::StateMoved, 0);
|
| - WebInputEventTraits::Coalesce(touch0, &touch1);
|
| - ASSERT_EQ(1, touch1.touches[0].id);
|
| - ASSERT_EQ(0, touch1.touches[1].id);
|
| - EXPECT_EQ(WebTouchPoint::StateMoved, touch1.touches[0].state);
|
| - EXPECT_EQ(WebTouchPoint::StateMoved, touch1.touches[1].state);
|
| + touch0.event.touches[0] = CreateTouchPoint(WebTouchPoint::StateMoved, 1);
|
| + touch1.event.touches[1] = CreateTouchPoint(WebTouchPoint::StateStationary, 1);
|
| + touch0.event.touches[1] = CreateTouchPoint(WebTouchPoint::StateStationary, 0);
|
| + touch1.event.touches[0] = CreateTouchPoint(WebTouchPoint::StateMoved, 0);
|
| + Coalesce(touch0, &touch1);
|
| + ASSERT_EQ(1, touch1.event.touches[0].id);
|
| + ASSERT_EQ(0, touch1.event.touches[1].id);
|
| + EXPECT_EQ(WebTouchPoint::StateMoved, touch1.event.touches[0].state);
|
| + EXPECT_EQ(WebTouchPoint::StateMoved, touch1.event.touches[1].state);
|
|
|
| // Touch moves with different dispatchTypes coalesce.
|
| touch0 = CreateTouch(WebInputEvent::TouchMove, 2);
|
| - touch0.dispatchType = WebInputEvent::DispatchType::Blocking;
|
| + touch0.event.dispatchType = WebInputEvent::DispatchType::Blocking;
|
| touch1 = CreateTouch(WebInputEvent::TouchMove, 2);
|
| - touch1.dispatchType = WebInputEvent::DispatchType::EventNonBlocking;
|
| - touch0.touches[0] = touch1.touches[1] =
|
| + touch1.event.dispatchType = WebInputEvent::DispatchType::EventNonBlocking;
|
| + touch0.event.touches[0] = touch1.event.touches[1] =
|
| CreateTouchPoint(WebTouchPoint::StateMoved, 1);
|
| - touch0.touches[1] = touch1.touches[0] =
|
| + touch0.event.touches[1] = touch1.event.touches[0] =
|
| CreateTouchPoint(WebTouchPoint::StateMoved, 0);
|
| - EXPECT_TRUE(WebInputEventTraits::CanCoalesce(touch0, touch1));
|
| - WebInputEventTraits::Coalesce(touch0, &touch1);
|
| - ASSERT_EQ(WebInputEvent::DispatchType::Blocking, touch1.dispatchType);
|
| + EXPECT_TRUE(CanCoalesce(touch0, touch1));
|
| + Coalesce(touch0, &touch1);
|
| + ASSERT_EQ(WebInputEvent::DispatchType::Blocking, touch1.event.dispatchType);
|
|
|
| touch0 = CreateTouch(WebInputEvent::TouchMove, 2);
|
| - touch0.dispatchType =
|
| + touch0.event.dispatchType =
|
| WebInputEvent::DispatchType::ListenersForcedNonBlockingPassive;
|
| touch1 = CreateTouch(WebInputEvent::TouchMove, 2);
|
| - touch1.dispatchType =
|
| + touch1.event.dispatchType =
|
| WebInputEvent::DispatchType::ListenersNonBlockingPassive;
|
| - touch0.touches[0] = touch1.touches[1] =
|
| + touch0.event.touches[0] = touch1.event.touches[1] =
|
| CreateTouchPoint(WebTouchPoint::StateMoved, 1);
|
| - touch0.touches[1] = touch1.touches[0] =
|
| + touch0.event.touches[1] = touch1.event.touches[0] =
|
| CreateTouchPoint(WebTouchPoint::StateMoved, 0);
|
| - EXPECT_TRUE(WebInputEventTraits::CanCoalesce(touch0, touch1));
|
| - WebInputEventTraits::Coalesce(touch0, &touch1);
|
| + EXPECT_TRUE(CanCoalesce(touch0, touch1));
|
| + Coalesce(touch0, &touch1);
|
| ASSERT_EQ(WebInputEvent::DispatchType::ListenersNonBlockingPassive,
|
| - touch1.dispatchType);
|
| + touch1.event.dispatchType);
|
| }
|
|
|
| TEST_F(WebInputEventTraitsTest, PinchEventCoalescing) {
|
| - WebGestureEvent pinch0 =
|
| + GestureEventWithLatencyInfo pinch0 =
|
| CreateGesture(WebInputEvent::GesturePinchBegin, 1, 1);
|
| - WebGestureEvent pinch1 =
|
| + GestureEventWithLatencyInfo pinch1 =
|
| CreateGesture(WebInputEvent::GesturePinchUpdate, 2, 2);
|
|
|
| // Only GesturePinchUpdate's coalesce.
|
| - EXPECT_FALSE(WebInputEventTraits::CanCoalesce(pinch0, pinch0));
|
| + EXPECT_FALSE(CanCoalesce(pinch0, pinch0));
|
|
|
| // Pinch gestures of different types should not coalesce.
|
| - EXPECT_FALSE(WebInputEventTraits::CanCoalesce(pinch0, pinch1));
|
| + EXPECT_FALSE(CanCoalesce(pinch0, pinch1));
|
|
|
| // Pinches with different focal points should not coalesce.
|
| pinch0 = CreateGesture(WebInputEvent::GesturePinchUpdate, 1, 1);
|
| pinch1 = CreateGesture(WebInputEvent::GesturePinchUpdate, 2, 2);
|
| - EXPECT_FALSE(WebInputEventTraits::CanCoalesce(pinch0, pinch1));
|
| - EXPECT_TRUE(WebInputEventTraits::CanCoalesce(pinch0, pinch0));
|
| + EXPECT_FALSE(CanCoalesce(pinch0, pinch1));
|
| + EXPECT_TRUE(CanCoalesce(pinch0, pinch0));
|
|
|
| // Coalesced scales are multiplicative.
|
| pinch0 = CreateGesture(WebInputEvent::GesturePinchUpdate, 1, 1);
|
| - pinch0.data.pinchUpdate.scale = 2.f;
|
| + pinch0.event.data.pinchUpdate.scale = 2.f;
|
| pinch1 = CreateGesture(WebInputEvent::GesturePinchUpdate, 1, 1);
|
| - pinch1.data.pinchUpdate.scale = 3.f;
|
| - EXPECT_TRUE(WebInputEventTraits::CanCoalesce(pinch0, pinch0));
|
| - WebInputEventTraits::Coalesce(pinch0, &pinch1);
|
| - EXPECT_EQ(2.f * 3.f, pinch1.data.pinchUpdate.scale);
|
| + pinch1.event.data.pinchUpdate.scale = 3.f;
|
| + EXPECT_TRUE(CanCoalesce(pinch0, pinch0));
|
| + Coalesce(pinch0, &pinch1);
|
| + EXPECT_EQ(2.f * 3.f, pinch1.event.data.pinchUpdate.scale);
|
|
|
| // Scales have a minimum value and can never reach 0.
|
| ASSERT_GT(numeric_limits<float>::min(), 0);
|
| pinch0 = CreateGesture(WebInputEvent::GesturePinchUpdate, 1, 1);
|
| - pinch0.data.pinchUpdate.scale = numeric_limits<float>::min() * 2.0f;
|
| + pinch0.event.data.pinchUpdate.scale = numeric_limits<float>::min() * 2.0f;
|
| pinch1 = CreateGesture(WebInputEvent::GesturePinchUpdate, 1, 1);
|
| - pinch1.data.pinchUpdate.scale = numeric_limits<float>::min() * 5.0f;
|
| - EXPECT_TRUE(WebInputEventTraits::CanCoalesce(pinch0, pinch1));
|
| - WebInputEventTraits::Coalesce(pinch0, &pinch1);
|
| - EXPECT_EQ(numeric_limits<float>::min(), pinch1.data.pinchUpdate.scale);
|
| + pinch1.event.data.pinchUpdate.scale = numeric_limits<float>::min() * 5.0f;
|
| + EXPECT_TRUE(CanCoalesce(pinch0, pinch1));
|
| + Coalesce(pinch0, &pinch1);
|
| + EXPECT_EQ(numeric_limits<float>::min(), pinch1.event.data.pinchUpdate.scale);
|
|
|
| // Scales have a maximum value and can never reach Infinity.
|
| pinch0 = CreateGesture(WebInputEvent::GesturePinchUpdate, 1, 1);
|
| - pinch0.data.pinchUpdate.scale = numeric_limits<float>::max() / 2.0f;
|
| + pinch0.event.data.pinchUpdate.scale = numeric_limits<float>::max() / 2.0f;
|
| pinch1 = CreateGesture(WebInputEvent::GesturePinchUpdate, 1, 1);
|
| - pinch1.data.pinchUpdate.scale = 10.0f;
|
| - EXPECT_TRUE(WebInputEventTraits::CanCoalesce(pinch0, pinch1));
|
| - WebInputEventTraits::Coalesce(pinch0, &pinch1);
|
| - EXPECT_EQ(numeric_limits<float>::max(), pinch1.data.pinchUpdate.scale);
|
| + pinch1.event.data.pinchUpdate.scale = 10.0f;
|
| + EXPECT_TRUE(CanCoalesce(pinch0, pinch1));
|
| + Coalesce(pinch0, &pinch1);
|
| + EXPECT_EQ(numeric_limits<float>::max(), pinch1.event.data.pinchUpdate.scale);
|
| }
|
|
|
| TEST_F(WebInputEventTraitsTest, WebMouseWheelEventCoalescing) {
|
| - WebMouseWheelEvent mouse_wheel_0 = CreateMouseWheel(1, 1);
|
| - WebMouseWheelEvent mouse_wheel_1 = CreateMouseWheel(2, 2);
|
| + MouseWheelEventWithLatencyInfo mouse_wheel_0 = CreateMouseWheel(1, 1);
|
| + MouseWheelEventWithLatencyInfo mouse_wheel_1 = CreateMouseWheel(2, 2);
|
|
|
| // WebMouseWheelEvent objects with same values except different deltaX and
|
| // deltaY should coalesce.
|
| - EXPECT_TRUE(WebInputEventTraits::CanCoalesce(mouse_wheel_0, mouse_wheel_1));
|
| + EXPECT_TRUE(CanCoalesce(mouse_wheel_0, mouse_wheel_1));
|
|
|
| // WebMouseWheelEvent objects with different modifiers should not coalesce.
|
| mouse_wheel_0 = CreateMouseWheel(1, 1);
|
| mouse_wheel_1 = CreateMouseWheel(1, 1);
|
| - mouse_wheel_0.modifiers = blink::WebInputEvent::ControlKey;
|
| - mouse_wheel_1.modifiers = blink::WebInputEvent::ShiftKey;
|
| - EXPECT_FALSE(WebInputEventTraits::CanCoalesce(mouse_wheel_0, mouse_wheel_1));
|
| + mouse_wheel_0.event.modifiers = blink::WebInputEvent::ControlKey;
|
| + mouse_wheel_1.event.modifiers = blink::WebInputEvent::ShiftKey;
|
| + EXPECT_FALSE(CanCoalesce(mouse_wheel_0, mouse_wheel_1));
|
| }
|
|
|
| // Coalescing preserves the newer timestamp.
|
| TEST_F(WebInputEventTraitsTest, TimestampCoalescing) {
|
| - WebMouseWheelEvent mouse_wheel_0 = CreateMouseWheel(1, 1);
|
| - mouse_wheel_0.timeStampSeconds = 5.0;
|
| - WebMouseWheelEvent mouse_wheel_1 = CreateMouseWheel(2, 2);
|
| - mouse_wheel_1.timeStampSeconds = 10.0;
|
| -
|
| - EXPECT_TRUE(WebInputEventTraits::CanCoalesce(mouse_wheel_0, mouse_wheel_1));
|
| - WebInputEventTraits::Coalesce(mouse_wheel_1, &mouse_wheel_0);
|
| - EXPECT_EQ(10.0, mouse_wheel_0.timeStampSeconds);
|
| + MouseWheelEventWithLatencyInfo mouse_wheel_0 = CreateMouseWheel(1, 1);
|
| + mouse_wheel_0.event.timeStampSeconds = 5.0;
|
| + MouseWheelEventWithLatencyInfo mouse_wheel_1 = CreateMouseWheel(2, 2);
|
| + mouse_wheel_1.event.timeStampSeconds = 10.0;
|
| +
|
| + EXPECT_TRUE(CanCoalesce(mouse_wheel_0, mouse_wheel_1));
|
| + Coalesce(mouse_wheel_1, &mouse_wheel_0);
|
| + EXPECT_EQ(10.0, mouse_wheel_0.event.timeStampSeconds);
|
| }
|
|
|
| // Very basic smoke test to ensure stringification doesn't explode.
|
| @@ -240,11 +254,15 @@ TEST_F(WebInputEventTraitsTest, ToString) {
|
| mouse_wheel.type = WebInputEvent::MouseWheel;
|
| EXPECT_FALSE(WebInputEventTraits::ToString(mouse_wheel).empty());
|
|
|
| - WebGestureEvent gesture =
|
| - CreateGesture(WebInputEvent::GesturePinchBegin, 1, 1);
|
| + WebGestureEvent gesture;
|
| + gesture.type = WebInputEvent::GesturePinchBegin;
|
| + gesture.x = 1;
|
| + gesture.y = 1;
|
| EXPECT_FALSE(WebInputEventTraits::ToString(gesture).empty());
|
|
|
| - WebTouchEvent touch = CreateTouch(WebInputEvent::TouchStart);
|
| + WebTouchEvent touch;
|
| + touch.type = WebInputEvent::TouchStart;
|
| + touch.touchesLength = 1;
|
| EXPECT_FALSE(WebInputEventTraits::ToString(touch).empty());
|
| }
|
|
|
|
|