Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(373)

Unified Diff: content/common/input/event_with_latency_info_unittest.cc

Issue 2110363003: Consolidate WebInputEvent Coalescing unit tests (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: nit diff Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | content/common/input/web_input_event_traits_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/common/input/event_with_latency_info_unittest.cc
diff --git a/content/common/input/event_with_latency_info_unittest.cc b/content/common/input/event_with_latency_info_unittest.cc
index 8ae533dd605dc08e366a6143c30330b75cd7f1c9..45907f7117b11d39e2b7bb7b1b33b9d729671047 100644
--- a/content/common/input/event_with_latency_info_unittest.cc
+++ b/content/common/input/event_with_latency_info_unittest.cc
@@ -4,6 +4,8 @@
#include "content/common/input/event_with_latency_info.h"
+#include <limits>
+
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/WebKit/public/web/WebInputEvent.h"
@@ -12,44 +14,54 @@ using blink::WebInputEvent;
using blink::WebMouseEvent;
using blink::WebMouseWheelEvent;
using blink::WebTouchEvent;
+using blink::WebTouchPoint;
+using std::numeric_limits;
namespace content {
namespace {
-class EventWithLatencyInfoTest : public testing::Test {
- protected:
- TouchEventWithLatencyInfo CreateTouchEvent(WebInputEvent::Type type,
- double timestamp) {
- TouchEventWithLatencyInfo touch;
- touch.event.touchesLength = 1;
- touch.event.type = type;
- touch.event.timeStampSeconds = timestamp;
- return touch;
- }
-
- MouseEventWithLatencyInfo CreateMouseEvent(WebInputEvent::Type type,
- double timestamp) {
- MouseEventWithLatencyInfo mouse;
- mouse.event.type = type;
- mouse.event.timeStampSeconds = timestamp;
- return mouse;
- }
-
- MouseWheelEventWithLatencyInfo CreateMouseWheelEvent(double timestamp) {
- MouseWheelEventWithLatencyInfo mouse_wheel;
- mouse_wheel.event.type = WebInputEvent::MouseWheel;
- mouse_wheel.event.timeStampSeconds = timestamp;
- return mouse_wheel;
- }
-
- GestureEventWithLatencyInfo CreateGestureEvent(WebInputEvent::Type type,
- double timestamp) {
- GestureEventWithLatencyInfo gesture;
- gesture.event.type = type;
- gesture.event.timeStampSeconds = timestamp;
- return gesture;
- }
-};
+using EventWithLatencyInfoTest = testing::Test;
+
+TouchEventWithLatencyInfo CreateTouchEvent(WebInputEvent::Type type,
+ double timestamp,
+ unsigned touch_count = 1) {
+ TouchEventWithLatencyInfo touch;
+ touch.event.touchesLength = touch_count;
+ touch.event.type = type;
+ touch.event.timeStampSeconds = timestamp;
+ return touch;
+}
+
+MouseEventWithLatencyInfo CreateMouseEvent(WebInputEvent::Type type,
+ double timestamp) {
+ MouseEventWithLatencyInfo mouse;
+ mouse.event.type = type;
+ mouse.event.timeStampSeconds = timestamp;
+ return mouse;
+}
+
+MouseWheelEventWithLatencyInfo CreateMouseWheelEvent(double timestamp,
+ float deltaX = 0.0f,
+ float deltaY = 0.0f) {
+ MouseWheelEventWithLatencyInfo mouse_wheel;
+ mouse_wheel.event.type = WebInputEvent::MouseWheel;
+ mouse_wheel.event.deltaX = deltaX;
+ mouse_wheel.event.deltaY = deltaY;
+ mouse_wheel.event.timeStampSeconds = timestamp;
+ return mouse_wheel;
+}
+
+GestureEventWithLatencyInfo CreateGestureEvent(WebInputEvent::Type type,
+ double timestamp,
+ float x = 0.0f,
+ float y = 0.0f) {
+ GestureEventWithLatencyInfo gesture;
+ gesture.event.type = type;
+ gesture.event.x = x;
+ gesture.event.y = y;
+ gesture.event.timeStampSeconds = timestamp;
+ return gesture;
+}
TEST_F(EventWithLatencyInfoTest, TimestampCoalescingForMouseEvent) {
MouseEventWithLatencyInfo mouse_0 = CreateMouseEvent(
@@ -118,5 +130,202 @@ TEST_F(EventWithLatencyInfoTest, LatencyInfoCoalescing) {
ui::INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT, 0, &component));
}
+WebTouchPoint CreateTouchPoint(WebTouchPoint::State state, int id) {
+ WebTouchPoint touch;
+ touch.state = state;
+ touch.id = id;
+ return touch;
+}
+
+TouchEventWithLatencyInfo CreateTouch(WebInputEvent::Type type,
+ unsigned touch_count = 1) {
+ return CreateTouchEvent(type, 0.0, touch_count);
+}
+
+GestureEventWithLatencyInfo CreateGesture(WebInputEvent::Type type,
+ float x,
+ float y) {
+ return CreateGestureEvent(type, 0.0, x, y);
+}
+
+MouseWheelEventWithLatencyInfo CreateMouseWheel(float deltaX, float deltaY) {
+ return CreateMouseWheelEvent(0.0, deltaX, deltaY);
+}
+
+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);
+}
+
tapted 2016/07/01 07:39:40 Everything below here is a verbatim move except wi
tdresser 2016/07/01 12:52:42 If anything, I'd be a fan of getting rid of the Ca
+TEST_F(EventWithLatencyInfoTest, TouchEventCoalescing) {
+ TouchEventWithLatencyInfo touch0 = CreateTouch(WebInputEvent::TouchStart);
+ TouchEventWithLatencyInfo touch1 = CreateTouch(WebInputEvent::TouchMove);
+
+ // Non touch-moves won't coalesce.
+ EXPECT_FALSE(CanCoalesce(touch0, touch0));
+
+ // Touches of different types won't coalesce.
+ EXPECT_FALSE(CanCoalesce(touch0, touch1));
+
+ // Touch moves with idential touch lengths and touch ids should coalesce.
+ EXPECT_TRUE(CanCoalesce(touch1, touch1));
+
+ // Touch moves with different touch ids should not coalesce.
+ touch0 = CreateTouch(WebInputEvent::TouchMove);
+ touch1 = CreateTouch(WebInputEvent::TouchMove);
+ touch0.event.touches[0].id = 7;
+ EXPECT_FALSE(CanCoalesce(touch0, touch1));
+ touch0 = CreateTouch(WebInputEvent::TouchMove, 2);
+ touch1 = CreateTouch(WebInputEvent::TouchMove, 2);
+ 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(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.event.touches[0] = touch1.event.touches[1] =
+ CreateTouchPoint(WebTouchPoint::StateMoved, 1);
+ touch0.event.touches[1] = touch1.event.touches[0] =
+ CreateTouchPoint(WebTouchPoint::StateMoved, 0);
+ EXPECT_TRUE(CanCoalesce(touch0, touch1));
+
+ // Pointers with the same ID's should coalesce.
+ touch0 = CreateTouch(WebInputEvent::TouchMove, 2);
+ touch1 = CreateTouch(WebInputEvent::TouchMove, 2);
+ touch0.event.touches[0] = touch1.event.touches[1] =
+ CreateTouchPoint(WebTouchPoint::StateMoved, 1);
+ 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.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.event.dispatchType = WebInputEvent::DispatchType::Blocking;
+ touch1 = CreateTouch(WebInputEvent::TouchMove, 2);
+ touch1.event.dispatchType = WebInputEvent::DispatchType::EventNonBlocking;
+ touch0.event.touches[0] = touch1.event.touches[1] =
+ CreateTouchPoint(WebTouchPoint::StateMoved, 1);
+ touch0.event.touches[1] = touch1.event.touches[0] =
+ CreateTouchPoint(WebTouchPoint::StateMoved, 0);
+ EXPECT_TRUE(CanCoalesce(touch0, touch1));
+ Coalesce(touch0, &touch1);
+ ASSERT_EQ(WebInputEvent::DispatchType::Blocking, touch1.event.dispatchType);
+
+ touch0 = CreateTouch(WebInputEvent::TouchMove, 2);
+ touch0.event.dispatchType =
+ WebInputEvent::DispatchType::ListenersForcedNonBlockingPassive;
+ touch1 = CreateTouch(WebInputEvent::TouchMove, 2);
+ touch1.event.dispatchType =
+ WebInputEvent::DispatchType::ListenersNonBlockingPassive;
+ touch0.event.touches[0] = touch1.event.touches[1] =
+ CreateTouchPoint(WebTouchPoint::StateMoved, 1);
+ touch0.event.touches[1] = touch1.event.touches[0] =
+ CreateTouchPoint(WebTouchPoint::StateMoved, 0);
+ EXPECT_TRUE(CanCoalesce(touch0, touch1));
+ Coalesce(touch0, &touch1);
+ ASSERT_EQ(WebInputEvent::DispatchType::ListenersNonBlockingPassive,
+ touch1.event.dispatchType);
+}
+
+TEST_F(EventWithLatencyInfoTest, PinchEventCoalescing) {
+ GestureEventWithLatencyInfo pinch0 =
+ CreateGesture(WebInputEvent::GesturePinchBegin, 1, 1);
+ GestureEventWithLatencyInfo pinch1 =
+ CreateGesture(WebInputEvent::GesturePinchUpdate, 2, 2);
+
+ // Only GesturePinchUpdate's coalesce.
+ EXPECT_FALSE(CanCoalesce(pinch0, pinch0));
+
+ // Pinch gestures of different types should not coalesce.
+ 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(CanCoalesce(pinch0, pinch1));
+ EXPECT_TRUE(CanCoalesce(pinch0, pinch0));
+
+ // Coalesced scales are multiplicative.
+ pinch0 = CreateGesture(WebInputEvent::GesturePinchUpdate, 1, 1);
+ pinch0.event.data.pinchUpdate.scale = 2.f;
+ pinch1 = CreateGesture(WebInputEvent::GesturePinchUpdate, 1, 1);
+ 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.event.data.pinchUpdate.scale = numeric_limits<float>::min() * 2.0f;
+ pinch1 = CreateGesture(WebInputEvent::GesturePinchUpdate, 1, 1);
+ 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.event.data.pinchUpdate.scale = numeric_limits<float>::max() / 2.0f;
+ pinch1 = CreateGesture(WebInputEvent::GesturePinchUpdate, 1, 1);
+ 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(EventWithLatencyInfoTest, WebMouseWheelEventCoalescing) {
+ 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(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.event.modifiers = WebInputEvent::ControlKey;
+ mouse_wheel_1.event.modifiers = WebInputEvent::ShiftKey;
+ EXPECT_FALSE(CanCoalesce(mouse_wheel_0, mouse_wheel_1));
+}
+
+// Coalescing preserves the newer timestamp.
+TEST_F(EventWithLatencyInfoTest, TimestampCoalescing) {
+ 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);
+}
+
} // namespace
} // namespace content
« no previous file with comments | « no previous file | content/common/input/web_input_event_traits_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698