OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/common/input/web_input_event_traits.h" | 5 #include "content/common/input/web_input_event_traits.h" |
6 | 6 |
7 #include "testing/gtest/include/gtest/gtest.h" | 7 #include "testing/gtest/include/gtest/gtest.h" |
8 #include "third_party/WebKit/public/web/WebInputEvent.h" | 8 #include "third_party/WebKit/public/web/WebInputEvent.h" |
9 | 9 |
| 10 using blink::WebGestureEvent; |
10 using blink::WebInputEvent; | 11 using blink::WebInputEvent; |
11 using blink::WebTouchEvent; | 12 using blink::WebTouchEvent; |
12 using blink::WebTouchPoint; | 13 using blink::WebTouchPoint; |
13 | 14 |
14 namespace content { | 15 namespace content { |
15 namespace { | 16 namespace { |
16 | 17 |
17 class WebInputEventTraitsTest : public testing::Test { | 18 class WebInputEventTraitsTest : public testing::Test { |
18 protected: | 19 protected: |
19 static WebTouchPoint Create(int id, WebTouchPoint::State state) { | 20 static WebTouchPoint CreateTouchPoint(WebTouchPoint::State state, int id) { |
20 WebTouchPoint touch; | 21 WebTouchPoint touch; |
| 22 touch.state = state; |
21 touch.id = id; | 23 touch.id = id; |
22 touch.state = state; | |
23 return touch; | 24 return touch; |
24 } | 25 } |
25 | 26 |
26 static WebTouchEvent Create(WebInputEvent::Type type) { | 27 static WebTouchEvent CreateTouch(WebInputEvent::Type type) { |
27 return Create(type, 1); | 28 return CreateTouch(type, 1); |
28 } | 29 } |
29 | 30 |
30 static WebTouchEvent Create(WebInputEvent::Type type, unsigned touch_count) { | 31 static WebTouchEvent CreateTouch(WebInputEvent::Type type, |
| 32 unsigned touch_count) { |
31 WebTouchEvent event; | 33 WebTouchEvent event; |
32 event.touchesLength = touch_count; | 34 event.touchesLength = touch_count; |
33 event.type = type; | 35 event.type = type; |
34 return event; | 36 return event; |
35 } | 37 } |
| 38 |
| 39 static WebGestureEvent CreateGesture(WebInputEvent::Type type, |
| 40 float x, |
| 41 float y) { |
| 42 WebGestureEvent event; |
| 43 event.type = type; |
| 44 event.x = x; |
| 45 event.y = y; |
| 46 return event; |
| 47 } |
36 }; | 48 }; |
37 | 49 |
38 TEST_F(WebInputEventTraitsTest, TouchEventCoalescing) { | 50 TEST_F(WebInputEventTraitsTest, TouchEventCoalescing) { |
39 WebTouchEvent touch0 = Create(WebInputEvent::TouchStart); | 51 WebTouchEvent touch0 = CreateTouch(WebInputEvent::TouchStart); |
40 WebTouchEvent touch1 = Create(WebInputEvent::TouchMove); | 52 WebTouchEvent touch1 = CreateTouch(WebInputEvent::TouchMove); |
41 | 53 |
42 // Non touch-moves won't coalesce. | 54 // Non touch-moves won't coalesce. |
43 EXPECT_FALSE(WebInputEventTraits::CanCoalesce(touch0, touch0)); | 55 EXPECT_FALSE(WebInputEventTraits::CanCoalesce(touch0, touch0)); |
44 | 56 |
45 // Touches of different types won't coalesce. | 57 // Touches of different types won't coalesce. |
46 EXPECT_FALSE(WebInputEventTraits::CanCoalesce(touch0, touch1)); | 58 EXPECT_FALSE(WebInputEventTraits::CanCoalesce(touch0, touch1)); |
47 | 59 |
48 // Touch moves with idential touch lengths and touch ids should coalesce. | 60 // Touch moves with idential touch lengths and touch ids should coalesce. |
49 EXPECT_TRUE(WebInputEventTraits::CanCoalesce(touch1, touch1)); | 61 EXPECT_TRUE(WebInputEventTraits::CanCoalesce(touch1, touch1)); |
50 | 62 |
51 // Touch moves with different touch ids should not coalesce. | 63 // Touch moves with different touch ids should not coalesce. |
52 touch0 = Create(WebInputEvent::TouchMove); | 64 touch0 = CreateTouch(WebInputEvent::TouchMove); |
53 touch1 = Create(WebInputEvent::TouchMove); | 65 touch1 = CreateTouch(WebInputEvent::TouchMove); |
54 touch0.touches[0].id = 7; | 66 touch0.touches[0].id = 7; |
55 EXPECT_FALSE(WebInputEventTraits::CanCoalesce(touch0, touch1)); | 67 EXPECT_FALSE(WebInputEventTraits::CanCoalesce(touch0, touch1)); |
56 touch0 = Create(WebInputEvent::TouchMove, 2); | 68 touch0 = CreateTouch(WebInputEvent::TouchMove, 2); |
57 touch1 = Create(WebInputEvent::TouchMove, 2); | 69 touch1 = CreateTouch(WebInputEvent::TouchMove, 2); |
58 touch0.touches[0].id = 1; | 70 touch0.touches[0].id = 1; |
59 touch1.touches[0].id = 0; | 71 touch1.touches[0].id = 0; |
60 EXPECT_FALSE(WebInputEventTraits::CanCoalesce(touch0, touch1)); | 72 EXPECT_FALSE(WebInputEventTraits::CanCoalesce(touch0, touch1)); |
61 | 73 |
62 // Touch moves with different touch lengths should not coalesce. | 74 // Touch moves with different touch lengths should not coalesce. |
63 touch0 = Create(WebInputEvent::TouchMove, 1); | 75 touch0 = CreateTouch(WebInputEvent::TouchMove, 1); |
64 touch1 = Create(WebInputEvent::TouchMove, 2); | 76 touch1 = CreateTouch(WebInputEvent::TouchMove, 2); |
65 EXPECT_FALSE(WebInputEventTraits::CanCoalesce(touch0, touch1)); | 77 EXPECT_FALSE(WebInputEventTraits::CanCoalesce(touch0, touch1)); |
66 | 78 |
67 // Touch moves with identical touch ids in different orders should coalesce. | 79 // Touch moves with identical touch ids in different orders should coalesce. |
68 touch0 = Create(WebInputEvent::TouchMove, 2); | 80 touch0 = CreateTouch(WebInputEvent::TouchMove, 2); |
69 touch1 = Create(WebInputEvent::TouchMove, 2); | 81 touch1 = CreateTouch(WebInputEvent::TouchMove, 2); |
70 touch0.touches[0] = touch1.touches[1] = Create(1, WebTouchPoint::StateMoved); | 82 touch0.touches[0] = touch1.touches[1] = |
71 touch0.touches[1] = touch1.touches[0] = Create(0, WebTouchPoint::StateMoved); | 83 CreateTouchPoint(WebTouchPoint::StateMoved, 1); |
| 84 touch0.touches[1] = touch1.touches[0] = |
| 85 CreateTouchPoint(WebTouchPoint::StateMoved, 0); |
72 EXPECT_TRUE(WebInputEventTraits::CanCoalesce(touch0, touch1)); | 86 EXPECT_TRUE(WebInputEventTraits::CanCoalesce(touch0, touch1)); |
73 | 87 |
74 // Pointers with the same ID's should coalesce. | 88 // Pointers with the same ID's should coalesce. |
75 touch0 = Create(WebInputEvent::TouchMove, 2); | 89 touch0 = CreateTouch(WebInputEvent::TouchMove, 2); |
76 touch1 = Create(WebInputEvent::TouchMove, 2); | 90 touch1 = CreateTouch(WebInputEvent::TouchMove, 2); |
77 touch0.touches[0] = touch1.touches[1] = Create(1, WebTouchPoint::StateMoved); | 91 touch0.touches[0] = touch1.touches[1] = |
| 92 CreateTouchPoint(WebTouchPoint::StateMoved, 1); |
78 WebInputEventTraits::Coalesce(touch0, &touch1); | 93 WebInputEventTraits::Coalesce(touch0, &touch1); |
79 ASSERT_EQ(1, touch1.touches[0].id); | 94 ASSERT_EQ(1, touch1.touches[0].id); |
80 ASSERT_EQ(0, touch1.touches[1].id); | 95 ASSERT_EQ(0, touch1.touches[1].id); |
81 EXPECT_EQ(WebTouchPoint::StateUndefined, touch1.touches[1].state); | 96 EXPECT_EQ(WebTouchPoint::StateUndefined, touch1.touches[1].state); |
82 EXPECT_EQ(WebTouchPoint::StateMoved, touch1.touches[0].state); | 97 EXPECT_EQ(WebTouchPoint::StateMoved, touch1.touches[0].state); |
83 | 98 |
84 // Movement from now-stationary pointers should be preserved. | 99 // Movement from now-stationary pointers should be preserved. |
85 touch0 = touch1 = Create(WebInputEvent::TouchMove, 2); | 100 touch0 = touch1 = CreateTouch(WebInputEvent::TouchMove, 2); |
86 touch0.touches[0] = Create(1, WebTouchPoint::StateMoved); | 101 touch0.touches[0] = CreateTouchPoint(WebTouchPoint::StateMoved, 1); |
87 touch1.touches[1] = Create(1, WebTouchPoint::StateStationary); | 102 touch1.touches[1] = CreateTouchPoint(WebTouchPoint::StateStationary, 1); |
88 touch0.touches[1] = Create(0, WebTouchPoint::StateStationary); | 103 touch0.touches[1] = CreateTouchPoint(WebTouchPoint::StateStationary, 0); |
89 touch1.touches[0] = Create(0, WebTouchPoint::StateMoved); | 104 touch1.touches[0] = CreateTouchPoint(WebTouchPoint::StateMoved, 0); |
90 WebInputEventTraits::Coalesce(touch0, &touch1); | 105 WebInputEventTraits::Coalesce(touch0, &touch1); |
91 ASSERT_EQ(1, touch1.touches[0].id); | 106 ASSERT_EQ(1, touch1.touches[0].id); |
92 ASSERT_EQ(0, touch1.touches[1].id); | 107 ASSERT_EQ(0, touch1.touches[1].id); |
93 EXPECT_EQ(WebTouchPoint::StateMoved, touch1.touches[0].state); | 108 EXPECT_EQ(WebTouchPoint::StateMoved, touch1.touches[0].state); |
94 EXPECT_EQ(WebTouchPoint::StateMoved, touch1.touches[1].state); | 109 EXPECT_EQ(WebTouchPoint::StateMoved, touch1.touches[1].state); |
95 } | 110 } |
96 | 111 |
| 112 TEST_F(WebInputEventTraitsTest, PinchEventCoalescing) { |
| 113 WebGestureEvent pinch0 = |
| 114 CreateGesture(WebInputEvent::GesturePinchBegin, 1, 1); |
| 115 WebGestureEvent pinch1 = |
| 116 CreateGesture(WebInputEvent::GesturePinchUpdate, 2, 2); |
| 117 |
| 118 // Only GesturePinchUpdate's coalesce. |
| 119 EXPECT_FALSE(WebInputEventTraits::CanCoalesce(pinch0, pinch0)); |
| 120 |
| 121 // Pinch gestures of different types should not coalesce. |
| 122 EXPECT_FALSE(WebInputEventTraits::CanCoalesce(pinch0, pinch1)); |
| 123 |
| 124 // Pinches with different focal points should not coalesce. |
| 125 pinch0 = CreateGesture(WebInputEvent::GesturePinchUpdate, 1, 1); |
| 126 pinch1 = CreateGesture(WebInputEvent::GesturePinchUpdate, 2, 2); |
| 127 EXPECT_FALSE(WebInputEventTraits::CanCoalesce(pinch0, pinch1)); |
| 128 EXPECT_TRUE(WebInputEventTraits::CanCoalesce(pinch0, pinch0)); |
| 129 |
| 130 // Coalesced scales are multiplicative. |
| 131 pinch0 = CreateGesture(WebInputEvent::GesturePinchUpdate, 1, 1); |
| 132 pinch0.data.pinchUpdate.scale = 2.f; |
| 133 pinch1 = CreateGesture(WebInputEvent::GesturePinchUpdate, 1, 1); |
| 134 pinch1.data.pinchUpdate.scale = 3.f; |
| 135 EXPECT_TRUE(WebInputEventTraits::CanCoalesce(pinch0, pinch0)); |
| 136 WebInputEventTraits::Coalesce(pinch0, &pinch1); |
| 137 EXPECT_EQ(2.f * 3.f, pinch1.data.pinchUpdate.scale); |
| 138 } |
| 139 |
97 } // namespace | 140 } // namespace |
98 } // namespace content | 141 } // namespace content |
OLD | NEW |