Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / content / common / input / web_input_event_traits_unittest.cc
blob6ae3d93661664f7aea47cdc41d5ae2e8f4d65b3e
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "content/common/input/web_input_event_traits.h"
7 #include <limits>
9 #include "testing/gtest/include/gtest/gtest.h"
10 #include "third_party/WebKit/public/web/WebInputEvent.h"
12 using blink::WebGestureEvent;
13 using blink::WebInputEvent;
14 using blink::WebKeyboardEvent;
15 using blink::WebMouseEvent;
16 using blink::WebMouseWheelEvent;
17 using blink::WebTouchEvent;
18 using blink::WebTouchPoint;
19 using std::numeric_limits;
21 namespace content {
22 namespace {
24 class WebInputEventTraitsTest : public testing::Test {
25 protected:
26 static WebTouchPoint CreateTouchPoint(WebTouchPoint::State state, int id) {
27 WebTouchPoint touch;
28 touch.state = state;
29 touch.id = id;
30 return touch;
33 static WebTouchEvent CreateTouch(WebInputEvent::Type type) {
34 return CreateTouch(type, 1);
37 static WebTouchEvent CreateTouch(WebInputEvent::Type type,
38 unsigned touch_count) {
39 WebTouchEvent event;
40 event.touchesLength = touch_count;
41 event.type = type;
42 return event;
45 static WebGestureEvent CreateGesture(WebInputEvent::Type type,
46 float x,
47 float y) {
48 WebGestureEvent event;
49 event.type = type;
50 event.x = x;
51 event.y = y;
52 return event;
55 static WebMouseWheelEvent CreateMouseWheel(float deltaX,
56 float deltaY,
57 bool canScroll) {
58 WebMouseWheelEvent event;
59 event.type = WebInputEvent::MouseWheel;
60 event.deltaX = deltaX;
61 event.deltaY = deltaY;
62 event.canScroll = canScroll;
63 return event;
67 TEST_F(WebInputEventTraitsTest, TouchEventCoalescing) {
68 WebTouchEvent touch0 = CreateTouch(WebInputEvent::TouchStart);
69 WebTouchEvent touch1 = CreateTouch(WebInputEvent::TouchMove);
71 // Non touch-moves won't coalesce.
72 EXPECT_FALSE(WebInputEventTraits::CanCoalesce(touch0, touch0));
74 // Touches of different types won't coalesce.
75 EXPECT_FALSE(WebInputEventTraits::CanCoalesce(touch0, touch1));
77 // Touch moves with idential touch lengths and touch ids should coalesce.
78 EXPECT_TRUE(WebInputEventTraits::CanCoalesce(touch1, touch1));
80 // Touch moves with different touch ids should not coalesce.
81 touch0 = CreateTouch(WebInputEvent::TouchMove);
82 touch1 = CreateTouch(WebInputEvent::TouchMove);
83 touch0.touches[0].id = 7;
84 EXPECT_FALSE(WebInputEventTraits::CanCoalesce(touch0, touch1));
85 touch0 = CreateTouch(WebInputEvent::TouchMove, 2);
86 touch1 = CreateTouch(WebInputEvent::TouchMove, 2);
87 touch0.touches[0].id = 1;
88 touch1.touches[0].id = 0;
89 EXPECT_FALSE(WebInputEventTraits::CanCoalesce(touch0, touch1));
91 // Touch moves with different touch lengths should not coalesce.
92 touch0 = CreateTouch(WebInputEvent::TouchMove, 1);
93 touch1 = CreateTouch(WebInputEvent::TouchMove, 2);
94 EXPECT_FALSE(WebInputEventTraits::CanCoalesce(touch0, touch1));
96 // Touch moves with identical touch ids in different orders should coalesce.
97 touch0 = CreateTouch(WebInputEvent::TouchMove, 2);
98 touch1 = CreateTouch(WebInputEvent::TouchMove, 2);
99 touch0.touches[0] = touch1.touches[1] =
100 CreateTouchPoint(WebTouchPoint::StateMoved, 1);
101 touch0.touches[1] = touch1.touches[0] =
102 CreateTouchPoint(WebTouchPoint::StateMoved, 0);
103 EXPECT_TRUE(WebInputEventTraits::CanCoalesce(touch0, touch1));
105 // Pointers with the same ID's should coalesce.
106 touch0 = CreateTouch(WebInputEvent::TouchMove, 2);
107 touch1 = CreateTouch(WebInputEvent::TouchMove, 2);
108 touch0.touches[0] = touch1.touches[1] =
109 CreateTouchPoint(WebTouchPoint::StateMoved, 1);
110 WebInputEventTraits::Coalesce(touch0, &touch1);
111 ASSERT_EQ(1, touch1.touches[0].id);
112 ASSERT_EQ(0, touch1.touches[1].id);
113 EXPECT_EQ(WebTouchPoint::StateUndefined, touch1.touches[1].state);
114 EXPECT_EQ(WebTouchPoint::StateMoved, touch1.touches[0].state);
116 // Movement from now-stationary pointers should be preserved.
117 touch0 = touch1 = CreateTouch(WebInputEvent::TouchMove, 2);
118 touch0.touches[0] = CreateTouchPoint(WebTouchPoint::StateMoved, 1);
119 touch1.touches[1] = CreateTouchPoint(WebTouchPoint::StateStationary, 1);
120 touch0.touches[1] = CreateTouchPoint(WebTouchPoint::StateStationary, 0);
121 touch1.touches[0] = CreateTouchPoint(WebTouchPoint::StateMoved, 0);
122 WebInputEventTraits::Coalesce(touch0, &touch1);
123 ASSERT_EQ(1, touch1.touches[0].id);
124 ASSERT_EQ(0, touch1.touches[1].id);
125 EXPECT_EQ(WebTouchPoint::StateMoved, touch1.touches[0].state);
126 EXPECT_EQ(WebTouchPoint::StateMoved, touch1.touches[1].state);
129 TEST_F(WebInputEventTraitsTest, PinchEventCoalescing) {
130 WebGestureEvent pinch0 =
131 CreateGesture(WebInputEvent::GesturePinchBegin, 1, 1);
132 WebGestureEvent pinch1 =
133 CreateGesture(WebInputEvent::GesturePinchUpdate, 2, 2);
135 // Only GesturePinchUpdate's coalesce.
136 EXPECT_FALSE(WebInputEventTraits::CanCoalesce(pinch0, pinch0));
138 // Pinch gestures of different types should not coalesce.
139 EXPECT_FALSE(WebInputEventTraits::CanCoalesce(pinch0, pinch1));
141 // Pinches with different focal points should not coalesce.
142 pinch0 = CreateGesture(WebInputEvent::GesturePinchUpdate, 1, 1);
143 pinch1 = CreateGesture(WebInputEvent::GesturePinchUpdate, 2, 2);
144 EXPECT_FALSE(WebInputEventTraits::CanCoalesce(pinch0, pinch1));
145 EXPECT_TRUE(WebInputEventTraits::CanCoalesce(pinch0, pinch0));
147 // Coalesced scales are multiplicative.
148 pinch0 = CreateGesture(WebInputEvent::GesturePinchUpdate, 1, 1);
149 pinch0.data.pinchUpdate.scale = 2.f;
150 pinch1 = CreateGesture(WebInputEvent::GesturePinchUpdate, 1, 1);
151 pinch1.data.pinchUpdate.scale = 3.f;
152 EXPECT_TRUE(WebInputEventTraits::CanCoalesce(pinch0, pinch0));
153 WebInputEventTraits::Coalesce(pinch0, &pinch1);
154 EXPECT_EQ(2.f * 3.f, pinch1.data.pinchUpdate.scale);
156 // Scales have a minimum value and can never reach 0.
157 ASSERT_GT(numeric_limits<float>::min(), 0);
158 pinch0 = CreateGesture(WebInputEvent::GesturePinchUpdate, 1, 1);
159 pinch0.data.pinchUpdate.scale = numeric_limits<float>::min() * 2.0f;
160 pinch1 = CreateGesture(WebInputEvent::GesturePinchUpdate, 1, 1);
161 pinch1.data.pinchUpdate.scale = numeric_limits<float>::min() * 5.0f;
162 EXPECT_TRUE(WebInputEventTraits::CanCoalesce(pinch0, pinch1));
163 WebInputEventTraits::Coalesce(pinch0, &pinch1);
164 EXPECT_EQ(numeric_limits<float>::min(), pinch1.data.pinchUpdate.scale);
166 // Scales have a maximum value and can never reach Infinity.
167 pinch0 = CreateGesture(WebInputEvent::GesturePinchUpdate, 1, 1);
168 pinch0.data.pinchUpdate.scale = numeric_limits<float>::max() / 2.0f;
169 pinch1 = CreateGesture(WebInputEvent::GesturePinchUpdate, 1, 1);
170 pinch1.data.pinchUpdate.scale = 10.0f;
171 EXPECT_TRUE(WebInputEventTraits::CanCoalesce(pinch0, pinch1));
172 WebInputEventTraits::Coalesce(pinch0, &pinch1);
173 EXPECT_EQ(numeric_limits<float>::max(), pinch1.data.pinchUpdate.scale);
176 TEST_F(WebInputEventTraitsTest, WebMouseWheelEventCoalescing) {
177 WebMouseWheelEvent mouse_wheel_0 =
178 CreateMouseWheel(1, 1, true);
179 WebMouseWheelEvent mouse_wheel_1 =
180 CreateMouseWheel(2, 2, true);
182 // WebMouseWheelEvent objects with same values except different deltaX and
183 // deltaY should coalesce.
184 EXPECT_TRUE(WebInputEventTraits::CanCoalesce(mouse_wheel_0, mouse_wheel_1));
186 mouse_wheel_0 = CreateMouseWheel(1, 1, true);
187 mouse_wheel_1 = CreateMouseWheel(1, 1, false);
189 // WebMouseWheelEvent objects with different canScroll values should not
190 // coalesce.
191 EXPECT_FALSE(WebInputEventTraits::CanCoalesce(mouse_wheel_0, mouse_wheel_1));
193 // WebMouseWheelEvent objects with different modifiers should not coalesce.
194 mouse_wheel_0 = CreateMouseWheel(1, 1, true);
195 mouse_wheel_1 = CreateMouseWheel(1, 1, true);
196 mouse_wheel_0.modifiers = blink::WebInputEvent::ControlKey;
197 mouse_wheel_1.modifiers = blink::WebInputEvent::ShiftKey;
198 EXPECT_FALSE(WebInputEventTraits::CanCoalesce(mouse_wheel_0, mouse_wheel_1));
201 // Coalescing preserves the newer timestamp.
202 TEST_F(WebInputEventTraitsTest, TimestampCoalescing) {
203 WebMouseWheelEvent mouse_wheel_0 = CreateMouseWheel(1, 1, true);
204 mouse_wheel_0.timeStampSeconds = 5.0;
205 WebMouseWheelEvent mouse_wheel_1 = CreateMouseWheel(2, 2, true);
206 mouse_wheel_1.timeStampSeconds = 10.0;
208 EXPECT_TRUE(WebInputEventTraits::CanCoalesce(mouse_wheel_0, mouse_wheel_1));
209 WebInputEventTraits::Coalesce(mouse_wheel_1, &mouse_wheel_0);
210 EXPECT_EQ(10.0, mouse_wheel_0.timeStampSeconds);
213 // Very basic smoke test to ensure stringification doesn't explode.
214 TEST_F(WebInputEventTraitsTest, ToString) {
215 WebKeyboardEvent key;
216 key.type = WebInputEvent::RawKeyDown;
217 EXPECT_FALSE(WebInputEventTraits::ToString(key).empty());
219 WebMouseEvent mouse;
220 mouse.type = WebInputEvent::MouseMove;
221 EXPECT_FALSE(WebInputEventTraits::ToString(mouse).empty());
223 WebMouseWheelEvent mouse_wheel;
224 mouse_wheel.type = WebInputEvent::MouseWheel;
225 EXPECT_FALSE(WebInputEventTraits::ToString(mouse_wheel).empty());
227 WebGestureEvent gesture =
228 CreateGesture(WebInputEvent::GesturePinchBegin, 1, 1);
229 EXPECT_FALSE(WebInputEventTraits::ToString(gesture).empty());
231 WebTouchEvent touch = CreateTouch(WebInputEvent::TouchStart);
232 EXPECT_FALSE(WebInputEventTraits::ToString(touch).empty());
235 } // namespace
236 } // namespace content