OLD | NEW |
| (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/motion_event_test_utils.h" | |
9 #include "ui/gfx/geometry/rect_f.h" | |
10 | |
11 using ui::test::MockMotionEvent; | |
12 | |
13 namespace content { | |
14 namespace { | |
15 | |
16 const int kDefaultTapTimeoutMs = 200; | |
17 const float kDefaultTapSlop = 10.f; | |
18 const float kDefaultDrawableSize = 10.f; | |
19 | |
20 struct MockDrawableData { | |
21 MockDrawableData() | |
22 : orientation(TOUCH_HANDLE_ORIENTATION_UNDEFINED), | |
23 alpha(0.f), | |
24 enabled(false), | |
25 visible(false), | |
26 rect(0, 0, kDefaultDrawableSize, kDefaultDrawableSize) {} | |
27 TouchHandleOrientation orientation; | |
28 float alpha; | |
29 bool enabled; | |
30 bool visible; | |
31 gfx::RectF rect; | |
32 }; | |
33 | |
34 class MockTouchHandleDrawable : public TouchHandleDrawable { | |
35 public: | |
36 explicit MockTouchHandleDrawable(MockDrawableData* data) : data_(data) {} | |
37 ~MockTouchHandleDrawable() override {} | |
38 | |
39 void SetEnabled(bool enabled) override { data_->enabled = enabled; } | |
40 | |
41 void SetOrientation(TouchHandleOrientation orientation) override { | |
42 data_->orientation = orientation; | |
43 } | |
44 | |
45 void SetAlpha(float alpha) override { | |
46 data_->alpha = alpha; | |
47 data_->visible = alpha > 0; | |
48 } | |
49 | |
50 void SetFocus(const gfx::PointF& position) override { | |
51 // Anchor focus to the top left of the rect (regardless of orientation). | |
52 data_->rect.set_origin(position); | |
53 } | |
54 | |
55 bool IntersectsWith(const gfx::RectF& rect) const override { | |
56 return data_->rect.Intersects(rect); | |
57 } | |
58 | |
59 private: | |
60 MockDrawableData* data_; | |
61 }; | |
62 | |
63 } // namespace | |
64 | |
65 class TouchHandleTest : public testing::Test, public TouchHandleClient { | |
66 public: | |
67 TouchHandleTest() | |
68 : dragging_(false), | |
69 dragged_(false), | |
70 tapped_(false), | |
71 needs_animate_(false) {} | |
72 | |
73 ~TouchHandleTest() override {} | |
74 | |
75 // TouchHandleClient implementation. | |
76 void OnHandleDragBegin(const TouchHandle& handle) override { | |
77 dragging_ = true; | |
78 } | |
79 | |
80 void OnHandleDragUpdate(const TouchHandle& handle, | |
81 const gfx::PointF& new_position) override { | |
82 dragged_ = true; | |
83 drag_position_ = new_position; | |
84 } | |
85 | |
86 void OnHandleDragEnd(const TouchHandle& handle) override { | |
87 dragging_ = false; | |
88 } | |
89 | |
90 void OnHandleTapped(const TouchHandle& handle) override { tapped_ = true; } | |
91 | |
92 void SetNeedsAnimate() override { needs_animate_ = true; } | |
93 | |
94 scoped_ptr<TouchHandleDrawable> CreateDrawable() override { | |
95 return scoped_ptr<TouchHandleDrawable>( | |
96 new MockTouchHandleDrawable(&drawable_data_)); | |
97 } | |
98 | |
99 base::TimeDelta GetTapTimeout() const override { | |
100 return base::TimeDelta::FromMilliseconds(kDefaultTapTimeoutMs); | |
101 } | |
102 | |
103 float GetTapSlop() const override { return kDefaultTapSlop; } | |
104 | |
105 void Animate(TouchHandle& handle) { | |
106 needs_animate_ = false; | |
107 base::TimeTicks now = base::TimeTicks::Now(); | |
108 while (handle.Animate(now)) | |
109 now += base::TimeDelta::FromMilliseconds(16); | |
110 } | |
111 | |
112 bool GetAndResetHandleDragged() { | |
113 bool dragged = dragged_; | |
114 dragged_ = false; | |
115 return dragged; | |
116 } | |
117 | |
118 bool GetAndResetHandleTapped() { | |
119 bool tapped = tapped_; | |
120 tapped_ = false; | |
121 return tapped; | |
122 } | |
123 | |
124 bool GetAndResetNeedsAnimate() { | |
125 bool needs_animate = needs_animate_; | |
126 needs_animate_ = false; | |
127 return needs_animate; | |
128 } | |
129 | |
130 bool IsDragging() const { return dragging_; } | |
131 const gfx::PointF& DragPosition() const { return drag_position_; } | |
132 bool NeedsAnimate() const { return needs_animate_; } | |
133 | |
134 const MockDrawableData& drawable() { return drawable_data_; } | |
135 | |
136 private: | |
137 gfx::PointF drag_position_; | |
138 bool dragging_; | |
139 bool dragged_; | |
140 bool tapped_; | |
141 bool needs_animate_; | |
142 | |
143 MockDrawableData drawable_data_; | |
144 }; | |
145 | |
146 TEST_F(TouchHandleTest, Visibility) { | |
147 TouchHandle handle(this, TOUCH_HANDLE_CENTER); | |
148 EXPECT_FALSE(drawable().visible); | |
149 | |
150 handle.SetVisible(true, TouchHandle::ANIMATION_NONE); | |
151 EXPECT_TRUE(drawable().visible); | |
152 EXPECT_EQ(1.f, drawable().alpha); | |
153 | |
154 handle.SetVisible(false, TouchHandle::ANIMATION_NONE); | |
155 EXPECT_FALSE(drawable().visible); | |
156 | |
157 handle.SetVisible(true, TouchHandle::ANIMATION_NONE); | |
158 EXPECT_TRUE(drawable().visible); | |
159 EXPECT_EQ(1.f, drawable().alpha); | |
160 } | |
161 | |
162 TEST_F(TouchHandleTest, VisibilityAnimation) { | |
163 TouchHandle handle(this, TOUCH_HANDLE_CENTER); | |
164 ASSERT_FALSE(NeedsAnimate()); | |
165 ASSERT_FALSE(drawable().visible); | |
166 ASSERT_EQ(0.f, drawable().alpha); | |
167 | |
168 handle.SetVisible(true, TouchHandle::ANIMATION_SMOOTH); | |
169 EXPECT_TRUE(NeedsAnimate()); | |
170 EXPECT_FALSE(drawable().visible); | |
171 EXPECT_EQ(0.f, drawable().alpha); | |
172 | |
173 Animate(handle); | |
174 EXPECT_TRUE(drawable().visible); | |
175 EXPECT_EQ(1.f, drawable().alpha); | |
176 | |
177 ASSERT_FALSE(NeedsAnimate()); | |
178 handle.SetVisible(false, TouchHandle::ANIMATION_SMOOTH); | |
179 EXPECT_TRUE(NeedsAnimate()); | |
180 EXPECT_TRUE(drawable().visible); | |
181 EXPECT_EQ(1.f, drawable().alpha); | |
182 | |
183 Animate(handle); | |
184 EXPECT_FALSE(drawable().visible); | |
185 EXPECT_EQ(0.f, drawable().alpha); | |
186 | |
187 handle.SetVisible(true, TouchHandle::ANIMATION_NONE); | |
188 EXPECT_EQ(1.f, drawable().alpha); | |
189 EXPECT_FALSE(GetAndResetNeedsAnimate()); | |
190 handle.SetVisible(false, TouchHandle::ANIMATION_SMOOTH); | |
191 EXPECT_EQ(1.f, drawable().alpha); | |
192 EXPECT_TRUE(GetAndResetNeedsAnimate()); | |
193 handle.SetVisible(true, TouchHandle::ANIMATION_SMOOTH); | |
194 EXPECT_EQ(1.f, drawable().alpha); | |
195 EXPECT_FALSE(GetAndResetNeedsAnimate()); | |
196 } | |
197 | |
198 TEST_F(TouchHandleTest, Orientation) { | |
199 TouchHandle handle(this, TOUCH_HANDLE_CENTER); | |
200 EXPECT_EQ(TOUCH_HANDLE_CENTER, drawable().orientation); | |
201 | |
202 handle.SetOrientation(TOUCH_HANDLE_LEFT); | |
203 EXPECT_EQ(TOUCH_HANDLE_LEFT, drawable().orientation); | |
204 | |
205 handle.SetOrientation(TOUCH_HANDLE_RIGHT); | |
206 EXPECT_EQ(TOUCH_HANDLE_RIGHT, drawable().orientation); | |
207 | |
208 handle.SetOrientation(TOUCH_HANDLE_CENTER); | |
209 EXPECT_EQ(TOUCH_HANDLE_CENTER, drawable().orientation); | |
210 } | |
211 | |
212 TEST_F(TouchHandleTest, Position) { | |
213 TouchHandle handle(this, TOUCH_HANDLE_CENTER); | |
214 handle.SetVisible(true, TouchHandle::ANIMATION_NONE); | |
215 | |
216 gfx::PointF position; | |
217 EXPECT_EQ(gfx::PointF(), drawable().rect.origin()); | |
218 | |
219 position = gfx::PointF(7.3f, -3.7f); | |
220 handle.SetPosition(position); | |
221 EXPECT_EQ(position, drawable().rect.origin()); | |
222 | |
223 position = gfx::PointF(-7.3f, 3.7f); | |
224 handle.SetPosition(position); | |
225 EXPECT_EQ(position, drawable().rect.origin()); | |
226 } | |
227 | |
228 TEST_F(TouchHandleTest, PositionNotUpdatedWhileFadingOrInvisible) { | |
229 TouchHandle handle(this, TOUCH_HANDLE_CENTER); | |
230 | |
231 handle.SetVisible(true, TouchHandle::ANIMATION_NONE); | |
232 ASSERT_TRUE(drawable().visible); | |
233 ASSERT_FALSE(NeedsAnimate()); | |
234 | |
235 gfx::PointF old_position(7.3f, -3.7f); | |
236 handle.SetPosition(old_position); | |
237 ASSERT_EQ(old_position, drawable().rect.origin()); | |
238 | |
239 handle.SetVisible(false, TouchHandle::ANIMATION_SMOOTH); | |
240 ASSERT_TRUE(NeedsAnimate()); | |
241 | |
242 gfx::PointF new_position(3.7f, -3.7f); | |
243 handle.SetPosition(new_position); | |
244 EXPECT_EQ(old_position, drawable().rect.origin()); | |
245 EXPECT_TRUE(NeedsAnimate()); | |
246 | |
247 // While the handle is fading, the new position should not take affect. | |
248 base::TimeTicks now = base::TimeTicks::Now(); | |
249 while (handle.Animate(now)) { | |
250 EXPECT_EQ(old_position, drawable().rect.origin()); | |
251 now += base::TimeDelta::FromMilliseconds(16); | |
252 } | |
253 | |
254 // Even after the animation terminates, the new position will not be pushed. | |
255 EXPECT_EQ(old_position, drawable().rect.origin()); | |
256 | |
257 // As soon as the handle becomes visible, the new position will be pushed. | |
258 handle.SetVisible(true, TouchHandle::ANIMATION_SMOOTH); | |
259 EXPECT_EQ(new_position, drawable().rect.origin()); | |
260 } | |
261 | |
262 TEST_F(TouchHandleTest, Enabled) { | |
263 // A newly created handle defaults to enabled. | |
264 TouchHandle handle(this, TOUCH_HANDLE_CENTER); | |
265 EXPECT_TRUE(drawable().enabled); | |
266 | |
267 handle.SetVisible(true, TouchHandle::ANIMATION_SMOOTH); | |
268 EXPECT_TRUE(GetAndResetNeedsAnimate()); | |
269 EXPECT_EQ(0.f, drawable().alpha); | |
270 handle.SetEnabled(false); | |
271 EXPECT_FALSE(drawable().enabled); | |
272 | |
273 // Dragging should not be allowed while the handle is disabled. | |
274 base::TimeTicks event_time = base::TimeTicks::Now(); | |
275 const float kOffset = kDefaultDrawableSize / 2.f; | |
276 MockMotionEvent event( | |
277 MockMotionEvent::ACTION_DOWN, event_time, kOffset, kOffset); | |
278 EXPECT_FALSE(handle.WillHandleTouchEvent(event)); | |
279 | |
280 // Disabling mid-animation should cancel the animation. | |
281 handle.SetEnabled(true); | |
282 handle.SetVisible(false, TouchHandle::ANIMATION_SMOOTH); | |
283 EXPECT_TRUE(drawable().visible); | |
284 EXPECT_TRUE(GetAndResetNeedsAnimate()); | |
285 handle.SetEnabled(false); | |
286 EXPECT_FALSE(drawable().enabled); | |
287 EXPECT_FALSE(drawable().visible); | |
288 EXPECT_FALSE(handle.Animate(base::TimeTicks::Now())); | |
289 | |
290 // Disabling mid-drag should cancel the drag. | |
291 handle.SetEnabled(true); | |
292 handle.SetVisible(true, TouchHandle::ANIMATION_NONE); | |
293 EXPECT_TRUE(handle.WillHandleTouchEvent(event)); | |
294 EXPECT_TRUE(IsDragging()); | |
295 handle.SetEnabled(false); | |
296 EXPECT_FALSE(IsDragging()); | |
297 EXPECT_FALSE(handle.WillHandleTouchEvent(event)); | |
298 } | |
299 | |
300 TEST_F(TouchHandleTest, Drag) { | |
301 TouchHandle handle(this, TOUCH_HANDLE_CENTER); | |
302 | |
303 base::TimeTicks event_time = base::TimeTicks::Now(); | |
304 const float kOffset = kDefaultDrawableSize / 2.f; | |
305 | |
306 // The handle must be visible to trigger drag. | |
307 MockMotionEvent event( | |
308 MockMotionEvent::ACTION_DOWN, event_time, kOffset, kOffset); | |
309 EXPECT_FALSE(handle.WillHandleTouchEvent(event)); | |
310 EXPECT_FALSE(IsDragging()); | |
311 handle.SetVisible(true, TouchHandle::ANIMATION_NONE); | |
312 | |
313 // ACTION_DOWN must fall within the drawable region to trigger drag. | |
314 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 50, 50); | |
315 EXPECT_FALSE(handle.WillHandleTouchEvent(event)); | |
316 EXPECT_FALSE(IsDragging()); | |
317 | |
318 // Only ACTION_DOWN will trigger drag. | |
319 event = MockMotionEvent( | |
320 MockMotionEvent::ACTION_MOVE, event_time, kOffset, kOffset); | |
321 EXPECT_FALSE(handle.WillHandleTouchEvent(event)); | |
322 EXPECT_FALSE(IsDragging()); | |
323 | |
324 // Start the drag. | |
325 event = MockMotionEvent( | |
326 MockMotionEvent::ACTION_DOWN, event_time, kOffset, kOffset); | |
327 EXPECT_TRUE(handle.WillHandleTouchEvent(event)); | |
328 EXPECT_TRUE(IsDragging()); | |
329 | |
330 event = MockMotionEvent( | |
331 MockMotionEvent::ACTION_MOVE, event_time, kOffset + 10, kOffset + 15); | |
332 EXPECT_TRUE(handle.WillHandleTouchEvent(event)); | |
333 EXPECT_TRUE(GetAndResetHandleDragged()); | |
334 EXPECT_TRUE(IsDragging()); | |
335 EXPECT_EQ(gfx::PointF(10, 15), DragPosition()); | |
336 | |
337 event = MockMotionEvent( | |
338 MockMotionEvent::ACTION_MOVE, event_time, kOffset - 10, kOffset - 15); | |
339 EXPECT_TRUE(handle.WillHandleTouchEvent(event)); | |
340 EXPECT_TRUE(GetAndResetHandleDragged()); | |
341 EXPECT_TRUE(IsDragging()); | |
342 EXPECT_EQ(gfx::PointF(-10, -15), DragPosition()); | |
343 | |
344 event = MockMotionEvent(MockMotionEvent::ACTION_UP); | |
345 EXPECT_TRUE(handle.WillHandleTouchEvent(event)); | |
346 EXPECT_FALSE(GetAndResetHandleDragged()); | |
347 EXPECT_FALSE(IsDragging()); | |
348 | |
349 // Non-ACTION_DOWN events after the drag has terminated should not be handled. | |
350 event = MockMotionEvent(MockMotionEvent::ACTION_CANCEL); | |
351 EXPECT_FALSE(handle.WillHandleTouchEvent(event)); | |
352 } | |
353 | |
354 TEST_F(TouchHandleTest, DragDefersOrientationChange) { | |
355 TouchHandle handle(this, TOUCH_HANDLE_RIGHT); | |
356 ASSERT_EQ(drawable().orientation, TOUCH_HANDLE_RIGHT); | |
357 handle.SetVisible(true, TouchHandle::ANIMATION_NONE); | |
358 | |
359 MockMotionEvent event(MockMotionEvent::ACTION_DOWN); | |
360 EXPECT_TRUE(handle.WillHandleTouchEvent(event)); | |
361 EXPECT_TRUE(IsDragging()); | |
362 | |
363 // Orientation changes will be deferred until the drag ends. | |
364 handle.SetOrientation(TOUCH_HANDLE_LEFT); | |
365 EXPECT_EQ(TOUCH_HANDLE_RIGHT, drawable().orientation); | |
366 | |
367 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE); | |
368 EXPECT_TRUE(handle.WillHandleTouchEvent(event)); | |
369 EXPECT_TRUE(GetAndResetHandleDragged()); | |
370 EXPECT_TRUE(IsDragging()); | |
371 EXPECT_EQ(TOUCH_HANDLE_RIGHT, drawable().orientation); | |
372 | |
373 event = MockMotionEvent(MockMotionEvent::ACTION_UP); | |
374 EXPECT_TRUE(handle.WillHandleTouchEvent(event)); | |
375 EXPECT_FALSE(GetAndResetHandleDragged()); | |
376 EXPECT_FALSE(IsDragging()); | |
377 EXPECT_EQ(TOUCH_HANDLE_LEFT, drawable().orientation); | |
378 } | |
379 | |
380 TEST_F(TouchHandleTest, DragDefersFade) { | |
381 TouchHandle handle(this, TOUCH_HANDLE_CENTER); | |
382 handle.SetVisible(true, TouchHandle::ANIMATION_NONE); | |
383 | |
384 MockMotionEvent event(MockMotionEvent::ACTION_DOWN); | |
385 EXPECT_TRUE(handle.WillHandleTouchEvent(event)); | |
386 EXPECT_TRUE(IsDragging()); | |
387 | |
388 // Fade will be deferred until the drag ends. | |
389 handle.SetVisible(false, TouchHandle::ANIMATION_SMOOTH); | |
390 EXPECT_FALSE(NeedsAnimate()); | |
391 EXPECT_TRUE(drawable().visible); | |
392 EXPECT_EQ(1.f, drawable().alpha); | |
393 | |
394 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE); | |
395 EXPECT_TRUE(handle.WillHandleTouchEvent(event)); | |
396 EXPECT_FALSE(NeedsAnimate()); | |
397 EXPECT_TRUE(drawable().visible); | |
398 | |
399 event = MockMotionEvent(MockMotionEvent::ACTION_UP); | |
400 EXPECT_TRUE(handle.WillHandleTouchEvent(event)); | |
401 EXPECT_FALSE(IsDragging()); | |
402 EXPECT_TRUE(NeedsAnimate()); | |
403 | |
404 Animate(handle); | |
405 EXPECT_FALSE(drawable().visible); | |
406 EXPECT_EQ(0.f, drawable().alpha); | |
407 } | |
408 | |
409 TEST_F(TouchHandleTest, DragTargettingUsesTouchSize) { | |
410 TouchHandle handle(this, TOUCH_HANDLE_CENTER); | |
411 handle.SetVisible(true, TouchHandle::ANIMATION_NONE); | |
412 | |
413 base::TimeTicks event_time = base::TimeTicks::Now(); | |
414 const float kTouchSize = 24.f; | |
415 const float kOffset = kDefaultDrawableSize + kTouchSize / 2.001f; | |
416 | |
417 MockMotionEvent event( | |
418 MockMotionEvent::ACTION_DOWN, event_time, kOffset, kOffset); | |
419 event.SetTouchMajor(0.f); | |
420 EXPECT_FALSE(handle.WillHandleTouchEvent(event)); | |
421 EXPECT_FALSE(IsDragging()); | |
422 | |
423 event.SetTouchMajor(kTouchSize / 2.f); | |
424 EXPECT_FALSE(handle.WillHandleTouchEvent(event)); | |
425 EXPECT_FALSE(IsDragging()); | |
426 | |
427 event.SetTouchMajor(kTouchSize); | |
428 EXPECT_TRUE(handle.WillHandleTouchEvent(event)); | |
429 EXPECT_TRUE(IsDragging()); | |
430 | |
431 event.SetTouchMajor(kTouchSize * 2.f); | |
432 EXPECT_TRUE(handle.WillHandleTouchEvent(event)); | |
433 EXPECT_TRUE(IsDragging()); | |
434 | |
435 // Ensure a touch size of 0 can still register a hit. | |
436 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, | |
437 event_time, | |
438 kDefaultDrawableSize / 2.f, | |
439 kDefaultDrawableSize / 2.f); | |
440 event.SetTouchMajor(0); | |
441 EXPECT_TRUE(handle.WillHandleTouchEvent(event)); | |
442 EXPECT_TRUE(IsDragging()); | |
443 } | |
444 | |
445 TEST_F(TouchHandleTest, Tap) { | |
446 TouchHandle handle(this, TOUCH_HANDLE_CENTER); | |
447 handle.SetVisible(true, TouchHandle::ANIMATION_NONE); | |
448 | |
449 base::TimeTicks event_time = base::TimeTicks::Now(); | |
450 | |
451 // ACTION_CANCEL shouldn't trigger a tap. | |
452 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | |
453 EXPECT_TRUE(handle.WillHandleTouchEvent(event)); | |
454 event_time += base::TimeDelta::FromMilliseconds(50); | |
455 event = MockMotionEvent(MockMotionEvent::ACTION_CANCEL, event_time, 0, 0); | |
456 EXPECT_TRUE(handle.WillHandleTouchEvent(event)); | |
457 EXPECT_FALSE(GetAndResetHandleTapped()); | |
458 | |
459 // Long press shouldn't trigger a tap. | |
460 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | |
461 EXPECT_TRUE(handle.WillHandleTouchEvent(event)); | |
462 event_time += 2 * GetTapTimeout(); | |
463 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | |
464 EXPECT_TRUE(handle.WillHandleTouchEvent(event)); | |
465 EXPECT_FALSE(GetAndResetHandleTapped()); | |
466 | |
467 // Only a brief tap within the slop region should trigger a tap. | |
468 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | |
469 EXPECT_TRUE(handle.WillHandleTouchEvent(event)); | |
470 event_time += GetTapTimeout() / 2; | |
471 event = MockMotionEvent( | |
472 MockMotionEvent::ACTION_MOVE, event_time, kDefaultTapSlop / 2.f, 0); | |
473 EXPECT_TRUE(handle.WillHandleTouchEvent(event)); | |
474 event = MockMotionEvent( | |
475 MockMotionEvent::ACTION_UP, event_time, kDefaultTapSlop / 2.f, 0); | |
476 EXPECT_TRUE(handle.WillHandleTouchEvent(event)); | |
477 EXPECT_TRUE(GetAndResetHandleTapped()); | |
478 | |
479 // Moving beyond the slop region shouldn't trigger a tap. | |
480 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | |
481 EXPECT_TRUE(handle.WillHandleTouchEvent(event)); | |
482 event_time += GetTapTimeout() / 2; | |
483 event = MockMotionEvent( | |
484 MockMotionEvent::ACTION_MOVE, event_time, kDefaultTapSlop * 2.f, 0); | |
485 EXPECT_TRUE(handle.WillHandleTouchEvent(event)); | |
486 event = MockMotionEvent( | |
487 MockMotionEvent::ACTION_UP, event_time, kDefaultTapSlop * 2.f, 0); | |
488 EXPECT_TRUE(handle.WillHandleTouchEvent(event)); | |
489 EXPECT_FALSE(GetAndResetHandleTapped()); | |
490 } | |
491 | |
492 } // namespace content | |
OLD | NEW |