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"
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
;
24 class WebInputEventTraitsTest
: public testing::Test
{
26 static WebTouchPoint
CreateTouchPoint(WebTouchPoint::State state
, int id
) {
33 static WebTouchEvent
CreateTouch(WebInputEvent::Type type
) {
34 return CreateTouch(type
, 1);
37 static WebTouchEvent
CreateTouch(WebInputEvent::Type type
,
38 unsigned touch_count
) {
40 event
.touchesLength
= touch_count
;
45 static WebGestureEvent
CreateGesture(WebInputEvent::Type type
,
48 WebGestureEvent event
;
55 static WebMouseWheelEvent
CreateMouseWheel(float deltaX
,
58 WebMouseWheelEvent event
;
59 event
.type
= WebInputEvent::MouseWheel
;
60 event
.deltaX
= deltaX
;
61 event
.deltaY
= deltaY
;
62 event
.canScroll
= canScroll
;
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
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 // Very basic smoke test to ensure stringification doesn't explode.
202 TEST_F(WebInputEventTraitsTest
, ToString
) {
203 WebKeyboardEvent key
;
204 key
.type
= WebInputEvent::RawKeyDown
;
205 EXPECT_FALSE(WebInputEventTraits::ToString(key
).empty());
208 mouse
.type
= WebInputEvent::MouseMove
;
209 EXPECT_FALSE(WebInputEventTraits::ToString(mouse
).empty());
211 WebMouseWheelEvent mouse_wheel
;
212 mouse_wheel
.type
= WebInputEvent::MouseWheel
;
213 EXPECT_FALSE(WebInputEventTraits::ToString(mouse_wheel
).empty());
215 WebGestureEvent gesture
=
216 CreateGesture(WebInputEvent::GesturePinchBegin
, 1, 1);
217 EXPECT_FALSE(WebInputEventTraits::ToString(gesture
).empty());
219 WebTouchEvent touch
= CreateTouch(WebInputEvent::TouchStart
);
220 EXPECT_FALSE(WebInputEventTraits::ToString(touch
).empty());
224 } // namespace content