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

Side by Side Diff: content/browser/renderer_host/input/touch_handle_unittest.cc

Issue 335943002: [Android] Composited selection handle rendering (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@input_native_handles_final
Patch Set: Test and comments Created 6 years, 5 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 unified diff | Download patch
OLDNEW
(Empty)
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.
4
5 #include "content/browser/renderer_host/input/touch_handle.h"
6
7 #include "testing/gtest/include/gtest/gtest.h"
8 #include "ui/events/test/mock_motion_event.h"
9 #include "ui/gfx/geometry/rect_f.h"
10
11 using ui::test::MockMotionEvent;
12
13 namespace content {
14 namespace {
15
16 const float kDefaultDrawableSize = 10.f;
17
18 struct MockDrawableData {
19 MockDrawableData()
20 : orientation(TOUCH_HANDLE_ORIENTATION_UNDEFINED),
21 alpha(0.f),
22 visible(false),
23 rect(0, 0, kDefaultDrawableSize, kDefaultDrawableSize) {}
24 TouchHandleOrientation orientation;
25 float alpha;
26 bool visible;
27 gfx::RectF rect;
28 };
29
30 class MockTouchHandleDrawable : public TouchHandleDrawable {
31 public:
32 explicit MockTouchHandleDrawable(MockDrawableData& data) : data_(data) {}
33 virtual ~MockTouchHandleDrawable() {}
34
35 virtual void SetOrientation(TouchHandleOrientation orientation) OVERRIDE {
36 data_.orientation = orientation;
37 }
38
39 virtual void SetAlpha(float alpha) OVERRIDE { data_.alpha = alpha; }
40
41 virtual void SetFocus(const gfx::PointF& position) OVERRIDE {
42 // Anchor focus to the top left of the rect (regardless of orientation).
43 data_.rect.set_origin(position);
44 }
45
46 virtual void SetVisible(bool visible) OVERRIDE { data_.visible = visible; }
47
48 virtual bool ContainsPoint(const gfx::PointF& point) const OVERRIDE {
49 return data_.rect.Contains(point);
50 }
51
52 private:
53 MockDrawableData& data_;
54 };
55
56 } // namespace
57
58 class TouchHandleTest : public testing::Test, public TouchHandleClient {
59 public:
60 TouchHandleTest()
61 : dragging_(false),
62 dragged_(false),
63 tapped_(false),
64 needs_animate_(false) {}
65
66 virtual ~TouchHandleTest() {}
67
68 // TouchHandleClient implementation.
69 virtual void OnHandleDragBegin(const TouchHandle& handle) OVERRIDE {
70 dragging_ = true;
71 }
72
73 virtual void OnHandleDragUpdate(const TouchHandle& handle,
74 const gfx::PointF& new_position) OVERRIDE {
75 dragged_ = true;
76 drag_position_ = new_position;
77 }
78
79 virtual void OnHandleDragEnd(const TouchHandle& handle) OVERRIDE {
80 dragging_ = false;
81 }
82
83 virtual void OnHandleTapped(const TouchHandle& handle) OVERRIDE {
84 tapped_ = true;
85 }
86
87 virtual void SetNeedsAnimate() OVERRIDE { needs_animate_ = true; }
88
89 virtual scoped_ptr<TouchHandleDrawable> CreateDrawable() OVERRIDE {
90 return scoped_ptr<TouchHandleDrawable>(
91 new MockTouchHandleDrawable(drawable_data_));
92 }
93
94 void Animate(TouchHandle& handle) {
95 needs_animate_ = false;
96 base::TimeTicks now = base::TimeTicks::Now();
97 while (handle.Animate(now))
98 now += base::TimeDelta::FromMilliseconds(16);
99 }
100
101 bool GetAndResetHandleDragged() {
102 bool dragged = dragged_;
103 dragged_ = false;
104 return dragged;
105 }
106
107 bool GetAndResetHandleTapped() {
108 bool tapped = tapped_;
109 tapped_ = false;
110 return tapped;
111 }
112
113 bool IsDragging() const { return dragging_; }
114 const gfx::PointF& DragPosition() const { return drag_position_; }
115 bool NeedsAnimate() const { return needs_animate_; }
116
117 const MockDrawableData& drawable() { return drawable_data_; }
118
119 private:
120 gfx::PointF drag_position_;
121 bool dragging_;
122 bool dragged_;
123 bool tapped_;
124 bool needs_animate_;
125
126 MockDrawableData drawable_data_;
127 };
128
129 TEST_F(TouchHandleTest, Visibility) {
130 TouchHandle handle(this, TOUCH_HANDLE_CENTER);
131 EXPECT_FALSE(drawable().visible);
132
133 handle.SetVisible(true);
134 EXPECT_TRUE(drawable().visible);
135 EXPECT_EQ(1.f, drawable().alpha);
136
137 handle.SetVisible(false);
138 EXPECT_FALSE(drawable().visible);
139
140 handle.SetVisible(true);
141 EXPECT_TRUE(drawable().visible);
142 EXPECT_EQ(1.f, drawable().alpha);
143 }
144
145 TEST_F(TouchHandleTest, VisibilityAnimation) {
146 TouchHandle handle(this, TOUCH_HANDLE_CENTER);
147 ASSERT_FALSE(NeedsAnimate());
148 ASSERT_FALSE(drawable().visible);
149 ASSERT_EQ(0.f, drawable().alpha);
150
151 handle.SetVisibleAnimated(true);
152 EXPECT_TRUE(NeedsAnimate());
153 EXPECT_TRUE(drawable().visible);
154 EXPECT_EQ(0.f, drawable().alpha);
155
156 Animate(handle);
157 EXPECT_TRUE(drawable().visible);
158 EXPECT_EQ(1.f, drawable().alpha);
159
160 ASSERT_FALSE(NeedsAnimate());
161 handle.SetVisibleAnimated(false);
162 EXPECT_TRUE(NeedsAnimate());
163 EXPECT_TRUE(drawable().visible);
164 EXPECT_EQ(1.f, drawable().alpha);
165
166 Animate(handle);
167 EXPECT_FALSE(drawable().visible);
168 EXPECT_EQ(0.f, drawable().alpha);
169 }
170
171 TEST_F(TouchHandleTest, Orientation) {
172 TouchHandle handle(this, TOUCH_HANDLE_CENTER);
173 EXPECT_EQ(TOUCH_HANDLE_CENTER, drawable().orientation);
174
175 handle.SetOrientation(TOUCH_HANDLE_LEFT);
176 EXPECT_EQ(TOUCH_HANDLE_LEFT, drawable().orientation);
177
178 handle.SetOrientation(TOUCH_HANDLE_RIGHT);
179 EXPECT_EQ(TOUCH_HANDLE_RIGHT, drawable().orientation);
180
181 handle.SetOrientation(TOUCH_HANDLE_CENTER);
182 EXPECT_EQ(TOUCH_HANDLE_CENTER, drawable().orientation);
183 }
184
185 TEST_F(TouchHandleTest, Position) {
186 TouchHandle handle(this, TOUCH_HANDLE_CENTER);
187
188 gfx::PointF position;
189 EXPECT_EQ(gfx::PointF(), drawable().rect.origin());
190
191 position = gfx::PointF(7.3, -3.7);
192 handle.SetPosition(position);
193 EXPECT_EQ(position, drawable().rect.origin());
194
195 position = gfx::PointF(-7.3, 3.7);
196 handle.SetPosition(position);
197 EXPECT_EQ(position, drawable().rect.origin());
198 }
199
200 TEST_F(TouchHandleTest, PositionNotUpdatedWhileFading) {
201 TouchHandle handle(this, TOUCH_HANDLE_CENTER);
202
203 handle.SetVisible(true);
204 ASSERT_TRUE(drawable().visible);
205 ASSERT_FALSE(NeedsAnimate());
206
207 gfx::PointF visible_position(7.3, -3.7);
208 handle.SetPosition(visible_position);
209 ASSERT_EQ(visible_position, drawable().rect.origin());
210
211 handle.SetVisibleAnimated(false);
212 ASSERT_TRUE(NeedsAnimate());
213
214 gfx::PointF invisible_position(3.7, -3.7);
215 handle.SetPosition(invisible_position);
216 EXPECT_NE(invisible_position, drawable().rect.origin());
217 EXPECT_EQ(visible_position, drawable().rect.origin());
218 EXPECT_TRUE(NeedsAnimate());
219
220 Animate(handle);
221 EXPECT_NE(invisible_position, drawable().rect.origin());
222 EXPECT_EQ(visible_position, drawable().rect.origin());
223 }
224
225 TEST_F(TouchHandleTest, Hide) {
226 TouchHandle handle(this, TOUCH_HANDLE_CENTER);
227
228 handle.SetVisible(true);
229 EXPECT_TRUE(drawable().visible);
230
231 handle.Hide();
232 EXPECT_FALSE(drawable().visible);
233 }
234
235 TEST_F(TouchHandleTest, Drag) {
236 TouchHandle handle(this, TOUCH_HANDLE_CENTER);
237
238 base::TimeTicks event_time = base::TimeTicks::Now();
239 const float kOffset = kDefaultDrawableSize / 2.f;
240
241 // The handle must be visible to trigger drag.
242 MockMotionEvent event(
243 MockMotionEvent::ACTION_DOWN, event_time, kOffset, kOffset);
244 EXPECT_FALSE(handle.WillHandleTouchEvent(event));
245 EXPECT_FALSE(IsDragging());
246 handle.SetVisible(true);
247
248 // ACTION_DOWN must fall within the drawable region to trigger drag.
249 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 50, 50);
250 EXPECT_FALSE(handle.WillHandleTouchEvent(event));
251 EXPECT_FALSE(IsDragging());
252
253 // Only ACTION_DOWN will trigger drag.
254 event = MockMotionEvent(
255 MockMotionEvent::ACTION_MOVE, event_time, kOffset, kOffset);
256 EXPECT_FALSE(handle.WillHandleTouchEvent(event));
257 EXPECT_FALSE(IsDragging());
258
259 // Start the drag.
260 event = MockMotionEvent(
261 MockMotionEvent::ACTION_DOWN, event_time, kOffset, kOffset);
262 EXPECT_TRUE(handle.WillHandleTouchEvent(event));
263 EXPECT_TRUE(IsDragging());
264
265 event = MockMotionEvent(
266 MockMotionEvent::ACTION_MOVE, event_time, kOffset + 10, kOffset + 15);
267 EXPECT_TRUE(handle.WillHandleTouchEvent(event));
268 EXPECT_TRUE(GetAndResetHandleDragged());
269 EXPECT_TRUE(IsDragging());
270 EXPECT_EQ(gfx::PointF(10, 15), DragPosition());
271
272 event = MockMotionEvent(
273 MockMotionEvent::ACTION_MOVE, event_time, kOffset - 10, kOffset - 15);
274 EXPECT_TRUE(handle.WillHandleTouchEvent(event));
275 EXPECT_TRUE(GetAndResetHandleDragged());
276 EXPECT_TRUE(IsDragging());
277 EXPECT_EQ(gfx::PointF(-10, -15), DragPosition());
278
279 event = MockMotionEvent(MockMotionEvent::ACTION_UP);
280 EXPECT_TRUE(handle.WillHandleTouchEvent(event));
281 EXPECT_FALSE(GetAndResetHandleDragged());
282 EXPECT_FALSE(IsDragging());
283
284 // Non-ACTION_DOWN events after the drag has terminated should not be handled.
285 event = MockMotionEvent(MockMotionEvent::ACTION_CANCEL);
286 EXPECT_FALSE(handle.WillHandleTouchEvent(event));
287 }
288
289 TEST_F(TouchHandleTest, DragDefersOrientationChange) {
290 TouchHandle handle(this, TOUCH_HANDLE_RIGHT);
291 ASSERT_EQ(drawable().orientation, TOUCH_HANDLE_RIGHT);
292 handle.SetVisible(true);
293
294 MockMotionEvent event(MockMotionEvent::ACTION_DOWN);
295 EXPECT_TRUE(handle.WillHandleTouchEvent(event));
296 EXPECT_TRUE(IsDragging());
297
298 // Orientation changes will be deferred until the drag ends.
299 handle.SetOrientation(TOUCH_HANDLE_LEFT);
300 EXPECT_EQ(TOUCH_HANDLE_RIGHT, drawable().orientation);
301
302 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE);
303 EXPECT_TRUE(handle.WillHandleTouchEvent(event));
304 EXPECT_TRUE(GetAndResetHandleDragged());
305 EXPECT_TRUE(IsDragging());
306 EXPECT_EQ(TOUCH_HANDLE_RIGHT, drawable().orientation);
307
308 event = MockMotionEvent(MockMotionEvent::ACTION_UP);
309 EXPECT_TRUE(handle.WillHandleTouchEvent(event));
310 EXPECT_FALSE(GetAndResetHandleDragged());
311 EXPECT_FALSE(IsDragging());
312 EXPECT_EQ(TOUCH_HANDLE_LEFT, drawable().orientation);
313 }
314
315 TEST_F(TouchHandleTest, DragDefersFade) {
316 TouchHandle handle(this, TOUCH_HANDLE_CENTER);
317 handle.SetVisible(true);
318
319 MockMotionEvent event(MockMotionEvent::ACTION_DOWN);
320 EXPECT_TRUE(handle.WillHandleTouchEvent(event));
321 EXPECT_TRUE(IsDragging());
322
323 // Fade will be deferred until the drag ends.
324 handle.SetVisibleAnimated(false);
325 EXPECT_FALSE(NeedsAnimate());
326 EXPECT_TRUE(drawable().visible);
327 EXPECT_EQ(1.f, drawable().alpha);
328
329 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE);
330 EXPECT_TRUE(handle.WillHandleTouchEvent(event));
331 EXPECT_FALSE(NeedsAnimate());
332 EXPECT_TRUE(drawable().visible);
333
334 event = MockMotionEvent(MockMotionEvent::ACTION_UP);
335 EXPECT_TRUE(handle.WillHandleTouchEvent(event));
336 EXPECT_FALSE(IsDragging());
337 EXPECT_TRUE(NeedsAnimate());
338
339 Animate(handle);
340 EXPECT_FALSE(drawable().visible);
341 EXPECT_EQ(0.f, drawable().alpha);
342 }
343
344 TEST_F(TouchHandleTest, Tap) {
345 TouchHandle handle(this, TOUCH_HANDLE_CENTER);
346 handle.SetVisible(true);
347
348 base::TimeTicks event_time = base::TimeTicks::Now();
349
350 // ACTION_CANCEL shouldn't trigger a tap.
351 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0);
352 EXPECT_TRUE(handle.WillHandleTouchEvent(event));
353 event_time += base::TimeDelta::FromMilliseconds(50);
354 event = MockMotionEvent(MockMotionEvent::ACTION_CANCEL, event_time, 0, 0);
355 EXPECT_TRUE(handle.WillHandleTouchEvent(event));
356 EXPECT_FALSE(GetAndResetHandleTapped());
357
358 // Long press shouldn't trigger a tap.
359 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0);
360 EXPECT_TRUE(handle.WillHandleTouchEvent(event));
361 event_time += base::TimeDelta::FromMilliseconds(500);
362 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0);
363 EXPECT_TRUE(handle.WillHandleTouchEvent(event));
364 EXPECT_FALSE(GetAndResetHandleTapped());
365
366 // Only a brief tap should trigger a tap.
367 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0);
368 EXPECT_TRUE(handle.WillHandleTouchEvent(event));
369 event_time += base::TimeDelta::FromMilliseconds(50);
370 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0);
371 EXPECT_TRUE(handle.WillHandleTouchEvent(event));
372 EXPECT_TRUE(GetAndResetHandleTapped());
373 }
374
375 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698