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 "ui/touch_selection/touch_selection_controller.h" | 5 #include "ui/touch_selection/touch_selection_controller.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "testing/gmock/include/gmock/gmock.h" | 9 #include "testing/gmock/include/gmock/gmock.h" |
10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
11 #include "ui/events/test/motion_event_test_utils.h" | 11 #include "ui/events/test/motion_event_test_utils.h" |
12 | 12 |
13 using testing::ElementsAre; | 13 using testing::ElementsAre; |
14 using testing::IsEmpty; | 14 using testing::IsEmpty; |
15 using ui::test::MockMotionEvent; | 15 using ui::test::MockMotionEvent; |
16 | 16 |
17 namespace ui { | 17 namespace ui { |
18 namespace { | 18 namespace { |
19 | 19 |
20 const int kDefaultTapTimeoutMs = 200; | 20 const int kDefaultTapTimeoutMs = 200; |
21 const float kDefaulTapSlop = 10.f; | 21 const float kDefaulTapSlop = 10.f; |
| 22 const gfx::PointF kIgnoredPoint(0, 0); |
22 | 23 |
23 class MockTouchHandleDrawable : public TouchHandleDrawable { | 24 class MockTouchHandleDrawable : public TouchHandleDrawable { |
24 public: | 25 public: |
25 explicit MockTouchHandleDrawable(bool* contains_point) | 26 explicit MockTouchHandleDrawable(bool* contains_point) |
26 : intersects_rect_(contains_point) {} | 27 : intersects_rect_(contains_point) {} |
27 ~MockTouchHandleDrawable() override {} | 28 ~MockTouchHandleDrawable() override {} |
28 void SetEnabled(bool enabled) override {} | 29 void SetEnabled(bool enabled) override {} |
29 void SetOrientation(TouchHandleOrientation orientation) override {} | 30 void SetOrientation(TouchHandleOrientation orientation) override {} |
30 void SetAlpha(float alpha) override {} | 31 void SetAlpha(float alpha) override {} |
31 void SetFocus(const gfx::PointF& position) override {} | 32 void SetFocus(const gfx::PointF& position) override {} |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
140 SelectionBound start_bound, end_bound; | 141 SelectionBound start_bound, end_bound; |
141 start_bound.set_type(SelectionBound::LEFT); | 142 start_bound.set_type(SelectionBound::LEFT); |
142 end_bound.set_type(SelectionBound::RIGHT); | 143 end_bound.set_type(SelectionBound::RIGHT); |
143 start_bound.SetEdge(start_rect.origin(), start_rect.bottom_left()); | 144 start_bound.SetEdge(start_rect.origin(), start_rect.bottom_left()); |
144 end_bound.SetEdge(end_rect.origin(), end_rect.bottom_left()); | 145 end_bound.SetEdge(end_rect.origin(), end_rect.bottom_left()); |
145 start_bound.set_visible(start_visible); | 146 start_bound.set_visible(start_visible); |
146 end_bound.set_visible(end_visible); | 147 end_bound.set_visible(end_visible); |
147 controller_->OnSelectionBoundsChanged(start_bound, end_bound); | 148 controller_->OnSelectionBoundsChanged(start_bound, end_bound); |
148 } | 149 } |
149 | 150 |
| 151 void OnLongPressEvent() { |
| 152 ASSERT_FALSE(controller().WillHandleLongPressEvent(kIgnoredPoint)); |
| 153 } |
| 154 |
| 155 void OnTapEvent() { |
| 156 ASSERT_FALSE(controller().WillHandleTapEvent(kIgnoredPoint)); |
| 157 } |
| 158 |
150 void Animate() { | 159 void Animate() { |
151 base::TimeTicks now = base::TimeTicks::Now(); | 160 base::TimeTicks now = base::TimeTicks::Now(); |
152 while (needs_animate_) { | 161 while (needs_animate_) { |
153 needs_animate_ = controller_->Animate(now); | 162 needs_animate_ = controller_->Animate(now); |
154 now += base::TimeDelta::FromMilliseconds(16); | 163 now += base::TimeDelta::FromMilliseconds(16); |
155 } | 164 } |
156 } | 165 } |
157 | 166 |
158 bool GetAndResetNeedsAnimate() { | 167 bool GetAndResetNeedsAnimate() { |
159 bool needs_animate = needs_animate_; | 168 bool needs_animate = needs_animate_; |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
212 }; | 221 }; |
213 | 222 |
214 TEST_F(TouchSelectionControllerTest, InsertionBasic) { | 223 TEST_F(TouchSelectionControllerTest, InsertionBasic) { |
215 gfx::RectF insertion_rect(5, 5, 0, 10); | 224 gfx::RectF insertion_rect(5, 5, 0, 10); |
216 bool visible = true; | 225 bool visible = true; |
217 | 226 |
218 // Insertion events are ignored until automatic showing is enabled. | 227 // Insertion events are ignored until automatic showing is enabled. |
219 ChangeInsertion(insertion_rect, visible); | 228 ChangeInsertion(insertion_rect, visible); |
220 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 229 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
221 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 230 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
222 controller().OnTapEvent(); | 231 OnTapEvent(); |
223 | 232 |
224 // Insertion events are ignored until the selection region is marked editable. | 233 // Insertion events are ignored until the selection region is marked editable. |
225 ChangeInsertion(insertion_rect, visible); | 234 ChangeInsertion(insertion_rect, visible); |
226 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 235 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
227 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 236 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
228 | 237 |
229 controller().OnTapEvent(); | 238 OnTapEvent(); |
230 controller().OnSelectionEditable(true); | 239 controller().OnSelectionEditable(true); |
231 ChangeInsertion(insertion_rect, visible); | 240 ChangeInsertion(insertion_rect, visible); |
232 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 241 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
233 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 242 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
234 | 243 |
235 insertion_rect.Offset(1, 0); | 244 insertion_rect.Offset(1, 0); |
236 ChangeInsertion(insertion_rect, visible); | 245 ChangeInsertion(insertion_rect, visible); |
237 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); | 246 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); |
238 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 247 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
239 | 248 |
240 insertion_rect.Offset(0, 1); | 249 insertion_rect.Offset(0, 1); |
241 ChangeInsertion(insertion_rect, visible); | 250 ChangeInsertion(insertion_rect, visible); |
242 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); | 251 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); |
243 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 252 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
244 | 253 |
245 ClearInsertion(); | 254 ClearInsertion(); |
246 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 255 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
247 } | 256 } |
248 | 257 |
249 TEST_F(TouchSelectionControllerTest, InsertionClearedWhenNoLongerEditable) { | 258 TEST_F(TouchSelectionControllerTest, InsertionClearedWhenNoLongerEditable) { |
250 gfx::RectF insertion_rect(5, 5, 0, 10); | 259 gfx::RectF insertion_rect(5, 5, 0, 10); |
251 bool visible = true; | 260 bool visible = true; |
252 controller().OnTapEvent(); | 261 OnTapEvent(); |
253 controller().OnSelectionEditable(true); | 262 controller().OnSelectionEditable(true); |
254 | 263 |
255 ChangeInsertion(insertion_rect, visible); | 264 ChangeInsertion(insertion_rect, visible); |
256 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 265 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
257 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 266 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
258 | 267 |
259 controller().OnSelectionEditable(false); | 268 controller().OnSelectionEditable(false); |
260 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 269 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
261 } | 270 } |
262 | 271 |
263 TEST_F(TouchSelectionControllerTest, InsertionWithNoShowOnTapForEmptyEditable) { | 272 TEST_F(TouchSelectionControllerTest, InsertionWithNoShowOnTapForEmptyEditable) { |
264 gfx::RectF insertion_rect(5, 5, 0, 10); | 273 gfx::RectF insertion_rect(5, 5, 0, 10); |
265 bool visible = true; | 274 bool visible = true; |
266 controller().OnSelectionEditable(true); | 275 controller().OnSelectionEditable(true); |
267 | 276 |
268 // Taps on an empty editable region should be ignored if the controller is | 277 // Taps on an empty editable region should be ignored if the controller is |
269 // created with |show_on_tap_for_empty_editable| set to false. | 278 // created with |show_on_tap_for_empty_editable| set to false. |
270 controller().OnTapEvent(); | 279 OnTapEvent(); |
271 controller().OnSelectionEmpty(true); | 280 controller().OnSelectionEmpty(true); |
272 ChangeInsertion(insertion_rect, visible); | 281 ChangeInsertion(insertion_rect, visible); |
273 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 282 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
274 | 283 |
275 // Once the region becomes non-empty, taps should show the insertion handle. | 284 // Once the region becomes non-empty, taps should show the insertion handle. |
276 controller().OnTapEvent(); | 285 OnTapEvent(); |
277 controller().OnSelectionEmpty(false); | 286 controller().OnSelectionEmpty(false); |
278 ChangeInsertion(insertion_rect, visible); | 287 ChangeInsertion(insertion_rect, visible); |
279 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 288 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
280 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 289 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
281 | 290 |
282 // Reset the selection. | 291 // Reset the selection. |
283 controller().HideAndDisallowShowingAutomatically(); | 292 controller().HideAndDisallowShowingAutomatically(); |
284 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 293 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
285 | 294 |
286 // Long-pressing should show the handle even if the editable region is empty. | 295 // Long-pressing should show the handle even if the editable region is empty. |
287 insertion_rect.Offset(2, -2); | 296 insertion_rect.Offset(2, -2); |
288 controller().OnLongPressEvent(); | 297 OnLongPressEvent(); |
289 controller().OnSelectionEmpty(true); | 298 controller().OnSelectionEmpty(true); |
290 ChangeInsertion(insertion_rect, visible); | 299 ChangeInsertion(insertion_rect, visible); |
291 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 300 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
292 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 301 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
293 | 302 |
294 // Single Tap on an empty edit field should clear insertion handle. | 303 // Single Tap on an empty edit field should clear insertion handle. |
295 controller().OnTapEvent(); | 304 OnTapEvent(); |
296 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 305 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
297 } | 306 } |
298 | 307 |
299 TEST_F(TouchSelectionControllerTest, InsertionWithShowOnTapForEmptyEditable) { | 308 TEST_F(TouchSelectionControllerTest, InsertionWithShowOnTapForEmptyEditable) { |
300 AllowShowingOnTapForEmptyEditable(); | 309 AllowShowingOnTapForEmptyEditable(); |
301 | 310 |
302 gfx::RectF insertion_rect(5, 5, 0, 10); | 311 gfx::RectF insertion_rect(5, 5, 0, 10); |
303 bool visible = true; | 312 bool visible = true; |
304 controller().OnSelectionEditable(true); | 313 controller().OnSelectionEditable(true); |
305 | 314 |
306 // Taps on an empty editable region should show the insertion handle if the | 315 // Taps on an empty editable region should show the insertion handle if the |
307 // controller is created with |show_on_tap_for_empty_editable| set to true. | 316 // controller is created with |show_on_tap_for_empty_editable| set to true. |
308 controller().OnTapEvent(); | 317 OnTapEvent(); |
309 controller().OnSelectionEmpty(true); | 318 controller().OnSelectionEmpty(true); |
310 ChangeInsertion(insertion_rect, visible); | 319 ChangeInsertion(insertion_rect, visible); |
311 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 320 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
312 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 321 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
313 | 322 |
314 // Additional taps should not hide the insertion handle in this case. | 323 // Additional taps should not hide the insertion handle in this case. |
315 controller().OnTapEvent(); | 324 OnTapEvent(); |
316 ChangeInsertion(insertion_rect, visible); | 325 ChangeInsertion(insertion_rect, visible); |
317 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 326 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
318 } | 327 } |
319 | 328 |
320 TEST_F(TouchSelectionControllerTest, InsertionAppearsAfterTapFollowingTyping) { | 329 TEST_F(TouchSelectionControllerTest, InsertionAppearsAfterTapFollowingTyping) { |
321 gfx::RectF insertion_rect(5, 5, 0, 10); | 330 gfx::RectF insertion_rect(5, 5, 0, 10); |
322 bool visible = true; | 331 bool visible = true; |
323 | 332 |
324 // Simulate the user tapping an empty text field. | 333 // Simulate the user tapping an empty text field. |
325 controller().OnTapEvent(); | 334 OnTapEvent(); |
326 controller().OnSelectionEditable(true); | 335 controller().OnSelectionEditable(true); |
327 controller().OnSelectionEmpty(true); | 336 controller().OnSelectionEmpty(true); |
328 ChangeInsertion(insertion_rect, visible); | 337 ChangeInsertion(insertion_rect, visible); |
329 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 338 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
330 | 339 |
331 // Simulate the cursor moving while a user is typing. | 340 // Simulate the cursor moving while a user is typing. |
332 insertion_rect.Offset(10, 0); | 341 insertion_rect.Offset(10, 0); |
333 controller().OnSelectionEmpty(false); | 342 controller().OnSelectionEmpty(false); |
334 ChangeInsertion(insertion_rect, visible); | 343 ChangeInsertion(insertion_rect, visible); |
335 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 344 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
336 | 345 |
337 // If the user taps the *same* position as the cursor at the end of the text | 346 // If the user taps the *same* position as the cursor at the end of the text |
338 // entry, the handle should appear. | 347 // entry, the handle should appear. |
339 controller().OnTapEvent(); | 348 OnTapEvent(); |
340 ChangeInsertion(insertion_rect, visible); | 349 ChangeInsertion(insertion_rect, visible); |
341 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 350 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
342 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 351 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
343 } | 352 } |
344 | 353 |
345 TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) { | 354 TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) { |
346 controller().OnLongPressEvent(); | 355 OnLongPressEvent(); |
347 controller().OnSelectionEditable(true); | 356 controller().OnSelectionEditable(true); |
348 | 357 |
349 gfx::RectF start_rect(5, 5, 0, 10); | 358 gfx::RectF start_rect(5, 5, 0, 10); |
350 gfx::RectF end_rect(50, 5, 0, 10); | 359 gfx::RectF end_rect(50, 5, 0, 10); |
351 bool visible = true; | 360 bool visible = true; |
352 | 361 |
353 ChangeInsertion(start_rect, visible); | 362 ChangeInsertion(start_rect, visible); |
354 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 363 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
355 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 364 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
356 | 365 |
357 ChangeSelection(start_rect, visible, end_rect, visible); | 366 ChangeSelection(start_rect, visible, end_rect, visible); |
358 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, | 367 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, |
359 SELECTION_SHOWN)); | 368 SELECTION_SHOWN)); |
360 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 369 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
361 | 370 |
362 ChangeInsertion(end_rect, visible); | 371 ChangeInsertion(end_rect, visible); |
363 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED, | 372 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED, |
364 INSERTION_SHOWN)); | 373 INSERTION_SHOWN)); |
365 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); | 374 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); |
366 | 375 |
367 controller().HideAndDisallowShowingAutomatically(); | 376 controller().HideAndDisallowShowingAutomatically(); |
368 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 377 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
369 | 378 |
370 controller().OnTapEvent(); | 379 OnTapEvent(); |
371 ChangeInsertion(end_rect, visible); | 380 ChangeInsertion(end_rect, visible); |
372 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 381 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
373 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); | 382 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); |
374 } | 383 } |
375 | 384 |
376 TEST_F(TouchSelectionControllerTest, InsertionDragged) { | 385 TEST_F(TouchSelectionControllerTest, InsertionDragged) { |
377 base::TimeTicks event_time = base::TimeTicks::Now(); | 386 base::TimeTicks event_time = base::TimeTicks::Now(); |
378 controller().OnTapEvent(); | 387 OnTapEvent(); |
379 controller().OnSelectionEditable(true); | 388 controller().OnSelectionEditable(true); |
380 | 389 |
381 // The touch sequence should not be handled if insertion is not active. | 390 // The touch sequence should not be handled if insertion is not active. |
382 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 391 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
383 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 392 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
384 | 393 |
385 float line_height = 10.f; | 394 float line_height = 10.f; |
386 gfx::RectF start_rect(10, 0, 0, line_height); | 395 gfx::RectF start_rect(10, 0, 0, line_height); |
387 bool visible = true; | 396 bool visible = true; |
388 ChangeInsertion(start_rect, visible); | 397 ChangeInsertion(start_rect, visible); |
(...skipping 30 matching lines...) Expand all Loading... |
419 EXPECT_FALSE(GetAndResetCaretMoved()); | 428 EXPECT_FALSE(GetAndResetCaretMoved()); |
420 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STOPPED)); | 429 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STOPPED)); |
421 | 430 |
422 // Once the drag is complete, no more touch events should be consumed until | 431 // Once the drag is complete, no more touch events should be consumed until |
423 // the next ACTION_DOWN. | 432 // the next ACTION_DOWN. |
424 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 433 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
425 } | 434 } |
426 | 435 |
427 TEST_F(TouchSelectionControllerTest, InsertionTapped) { | 436 TEST_F(TouchSelectionControllerTest, InsertionTapped) { |
428 base::TimeTicks event_time = base::TimeTicks::Now(); | 437 base::TimeTicks event_time = base::TimeTicks::Now(); |
429 controller().OnTapEvent(); | 438 OnTapEvent(); |
430 controller().OnSelectionEditable(true); | 439 controller().OnSelectionEditable(true); |
431 SetDraggingEnabled(true); | 440 SetDraggingEnabled(true); |
432 | 441 |
433 gfx::RectF start_rect(10, 0, 0, 10); | 442 gfx::RectF start_rect(10, 0, 0, 10); |
434 bool visible = true; | 443 bool visible = true; |
435 ChangeInsertion(start_rect, visible); | 444 ChangeInsertion(start_rect, visible); |
436 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 445 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
437 | 446 |
438 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 447 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
439 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 448 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
440 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); | 449 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); |
441 | 450 |
442 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 451 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
443 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 452 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
444 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, | 453 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, |
445 INSERTION_DRAG_STOPPED)); | 454 INSERTION_DRAG_STOPPED)); |
446 | 455 |
447 // Reset the insertion. | 456 // Reset the insertion. |
448 ClearInsertion(); | 457 ClearInsertion(); |
449 controller().OnTapEvent(); | 458 OnTapEvent(); |
450 ChangeInsertion(start_rect, visible); | 459 ChangeInsertion(start_rect, visible); |
451 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, | 460 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, |
452 INSERTION_SHOWN)); | 461 INSERTION_SHOWN)); |
453 | 462 |
454 // No tap should be signalled if the time between DOWN and UP was too long. | 463 // No tap should be signalled if the time between DOWN and UP was too long. |
455 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 464 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
456 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 465 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
457 event = MockMotionEvent(MockMotionEvent::ACTION_UP, | 466 event = MockMotionEvent(MockMotionEvent::ACTION_UP, |
458 event_time + base::TimeDelta::FromSeconds(1), | 467 event_time + base::TimeDelta::FromSeconds(1), |
459 0, | 468 0, |
460 0); | 469 0); |
461 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 470 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
462 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, | 471 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, |
463 INSERTION_DRAG_STOPPED)); | 472 INSERTION_DRAG_STOPPED)); |
464 | 473 |
465 // Reset the insertion. | 474 // Reset the insertion. |
466 ClearInsertion(); | 475 ClearInsertion(); |
467 controller().OnTapEvent(); | 476 OnTapEvent(); |
468 ChangeInsertion(start_rect, visible); | 477 ChangeInsertion(start_rect, visible); |
469 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, | 478 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, |
470 INSERTION_SHOWN)); | 479 INSERTION_SHOWN)); |
471 | 480 |
472 // No tap should be signalled if the drag was too long. | 481 // No tap should be signalled if the drag was too long. |
473 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 482 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
474 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 483 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
475 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 100, 0); | 484 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 100, 0); |
476 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 485 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
477 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 100, 0); | 486 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 100, 0); |
478 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 487 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
479 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, | 488 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, |
480 INSERTION_DRAG_STOPPED)); | 489 INSERTION_DRAG_STOPPED)); |
481 | 490 |
482 // Reset the insertion. | 491 // Reset the insertion. |
483 ClearInsertion(); | 492 ClearInsertion(); |
484 controller().OnTapEvent(); | 493 OnTapEvent(); |
485 ChangeInsertion(start_rect, visible); | 494 ChangeInsertion(start_rect, visible); |
486 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, | 495 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, |
487 INSERTION_SHOWN)); | 496 INSERTION_SHOWN)); |
488 | 497 |
489 // No tap should be signalled if the touch sequence is cancelled. | 498 // No tap should be signalled if the touch sequence is cancelled. |
490 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 499 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
491 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 500 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
492 event = MockMotionEvent(MockMotionEvent::ACTION_CANCEL, event_time, 0, 0); | 501 event = MockMotionEvent(MockMotionEvent::ACTION_CANCEL, event_time, 0, 0); |
493 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 502 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
494 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, | 503 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, |
495 INSERTION_DRAG_STOPPED)); | 504 INSERTION_DRAG_STOPPED)); |
496 } | 505 } |
497 | 506 |
498 TEST_F(TouchSelectionControllerTest, InsertionNotResetByRepeatedTapOrPress) { | 507 TEST_F(TouchSelectionControllerTest, InsertionNotResetByRepeatedTapOrPress) { |
499 base::TimeTicks event_time = base::TimeTicks::Now(); | 508 base::TimeTicks event_time = base::TimeTicks::Now(); |
500 controller().OnTapEvent(); | 509 OnTapEvent(); |
501 controller().OnSelectionEditable(true); | 510 controller().OnSelectionEditable(true); |
502 SetDraggingEnabled(true); | 511 SetDraggingEnabled(true); |
503 | 512 |
504 gfx::RectF anchor_rect(10, 0, 0, 10); | 513 gfx::RectF anchor_rect(10, 0, 0, 10); |
505 bool visible = true; | 514 bool visible = true; |
506 ChangeInsertion(anchor_rect, visible); | 515 ChangeInsertion(anchor_rect, visible); |
507 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 516 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
508 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 517 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
509 | 518 |
510 // Tapping again shouldn't reset the active insertion point. | 519 // Tapping again shouldn't reset the active insertion point. |
511 controller().OnTapEvent(); | 520 OnTapEvent(); |
512 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 521 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
513 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 522 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
514 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); | 523 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); |
515 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 524 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
516 | 525 |
517 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 526 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
518 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 527 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
519 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, | 528 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, |
520 INSERTION_DRAG_STOPPED)); | 529 INSERTION_DRAG_STOPPED)); |
521 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 530 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
522 | 531 |
523 anchor_rect.Offset(5, 15); | 532 anchor_rect.Offset(5, 15); |
524 ChangeInsertion(anchor_rect, visible); | 533 ChangeInsertion(anchor_rect, visible); |
525 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); | 534 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); |
526 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 535 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
527 | 536 |
528 // Pressing shouldn't reset the active insertion point. | 537 // Pressing shouldn't reset the active insertion point. |
529 controller().OnLongPressEvent(); | 538 OnLongPressEvent(); |
530 controller().OnSelectionEmpty(true); | 539 controller().OnSelectionEmpty(true); |
531 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 540 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
532 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 541 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
533 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); | 542 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); |
534 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 543 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
535 | 544 |
536 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 545 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
537 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 546 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
538 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, | 547 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, |
539 INSERTION_DRAG_STOPPED)); | 548 INSERTION_DRAG_STOPPED)); |
540 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 549 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
541 } | 550 } |
542 | 551 |
543 TEST_F(TouchSelectionControllerTest, SelectionBasic) { | 552 TEST_F(TouchSelectionControllerTest, SelectionBasic) { |
544 gfx::RectF start_rect(5, 5, 0, 10); | 553 gfx::RectF start_rect(5, 5, 0, 10); |
545 gfx::RectF end_rect(50, 5, 0, 10); | 554 gfx::RectF end_rect(50, 5, 0, 10); |
546 bool visible = true; | 555 bool visible = true; |
547 | 556 |
548 // Selection events are ignored until automatic showing is enabled. | 557 // Selection events are ignored until automatic showing is enabled. |
549 ChangeSelection(start_rect, visible, end_rect, visible); | 558 ChangeSelection(start_rect, visible, end_rect, visible); |
550 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 559 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
551 | 560 |
552 controller().OnLongPressEvent(); | 561 OnLongPressEvent(); |
553 ChangeSelection(start_rect, visible, end_rect, visible); | 562 ChangeSelection(start_rect, visible, end_rect, visible); |
554 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 563 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
555 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 564 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
556 | 565 |
557 start_rect.Offset(1, 0); | 566 start_rect.Offset(1, 0); |
558 ChangeSelection(start_rect, visible, end_rect, visible); | 567 ChangeSelection(start_rect, visible, end_rect, visible); |
559 // Selection movement does not currently trigger a separate event. | 568 // Selection movement does not currently trigger a separate event. |
560 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); | 569 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); |
561 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 570 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
562 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 571 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
563 | 572 |
564 ClearSelection(); | 573 ClearSelection(); |
565 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); | 574 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); |
566 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 575 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
567 } | 576 } |
568 | 577 |
569 TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) { | 578 TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) { |
570 gfx::RectF start_rect(5, 5, 0, 10); | 579 gfx::RectF start_rect(5, 5, 0, 10); |
571 gfx::RectF end_rect(50, 5, 0, 10); | 580 gfx::RectF end_rect(50, 5, 0, 10); |
572 bool visible = true; | 581 bool visible = true; |
573 | 582 |
574 controller().OnLongPressEvent(); | 583 OnLongPressEvent(); |
575 ChangeSelection(start_rect, visible, end_rect, visible); | 584 ChangeSelection(start_rect, visible, end_rect, visible); |
576 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 585 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
577 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 586 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
578 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 587 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
579 | 588 |
580 // A long press triggering a new selection should re-send the SELECTION_SHOWN | 589 // A long press triggering a new selection should re-send the SELECTION_SHOWN |
581 // event notification. | 590 // event notification. |
582 start_rect.Offset(10, 10); | 591 start_rect.Offset(10, 10); |
583 controller().OnLongPressEvent(); | 592 OnLongPressEvent(); |
584 ChangeSelection(start_rect, visible, end_rect, visible); | 593 ChangeSelection(start_rect, visible, end_rect, visible); |
585 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 594 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
586 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 595 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
587 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 596 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
588 } | 597 } |
589 | 598 |
590 TEST_F(TouchSelectionControllerTest, SelectionDragged) { | 599 TEST_F(TouchSelectionControllerTest, SelectionDragged) { |
591 base::TimeTicks event_time = base::TimeTicks::Now(); | 600 base::TimeTicks event_time = base::TimeTicks::Now(); |
592 controller().OnLongPressEvent(); | 601 OnLongPressEvent(); |
593 | 602 |
594 // The touch sequence should not be handled if selection is not active. | 603 // The touch sequence should not be handled if selection is not active. |
595 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 604 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
596 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 605 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
597 | 606 |
598 float line_height = 10.f; | 607 float line_height = 10.f; |
599 gfx::RectF start_rect(0, 0, 0, line_height); | 608 gfx::RectF start_rect(0, 0, 0, line_height); |
600 gfx::RectF end_rect(50, 0, 0, line_height); | 609 gfx::RectF end_rect(50, 0, 0, line_height); |
601 bool visible = true; | 610 bool visible = true; |
602 ChangeSelection(start_rect, visible, end_rect, visible); | 611 ChangeSelection(start_rect, visible, end_rect, visible); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
640 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); | 649 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); |
641 EXPECT_FALSE(GetAndResetSelectionMoved()); | 650 EXPECT_FALSE(GetAndResetSelectionMoved()); |
642 | 651 |
643 // Once the drag is complete, no more touch events should be consumed until | 652 // Once the drag is complete, no more touch events should be consumed until |
644 // the next ACTION_DOWN. | 653 // the next ACTION_DOWN. |
645 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 654 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
646 } | 655 } |
647 | 656 |
648 TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) { | 657 TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) { |
649 base::TimeTicks event_time = base::TimeTicks::Now(); | 658 base::TimeTicks event_time = base::TimeTicks::Now(); |
650 controller().OnLongPressEvent(); | 659 OnLongPressEvent(); |
651 | 660 |
652 float line_height = 10.f; | 661 float line_height = 10.f; |
653 gfx::RectF start_rect(0, 0, 0, line_height); | 662 gfx::RectF start_rect(0, 0, 0, line_height); |
654 gfx::RectF end_rect(50, 0, 0, line_height); | 663 gfx::RectF end_rect(50, 0, 0, line_height); |
655 bool visible = true; | 664 bool visible = true; |
656 ChangeSelection(start_rect, visible, end_rect, visible); | 665 ChangeSelection(start_rect, visible, end_rect, visible); |
657 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 666 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
658 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 667 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
659 | 668 |
660 // The ACTION_DOWN should lock to the closest handle. | 669 // The ACTION_DOWN should lock to the closest handle. |
(...skipping 17 matching lines...) Expand all Loading... |
678 GetLastSelectionEnd()); | 687 GetLastSelectionEnd()); |
679 | 688 |
680 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 689 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
681 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 690 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
682 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); | 691 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); |
683 EXPECT_FALSE(GetAndResetSelectionMoved()); | 692 EXPECT_FALSE(GetAndResetSelectionMoved()); |
684 } | 693 } |
685 | 694 |
686 TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) { | 695 TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) { |
687 base::TimeTicks event_time = base::TimeTicks::Now(); | 696 base::TimeTicks event_time = base::TimeTicks::Now(); |
688 controller().OnLongPressEvent(); | 697 OnLongPressEvent(); |
689 | 698 |
690 float line_height = 10.f; | 699 float line_height = 10.f; |
691 gfx::RectF start_rect(50, line_height, 0, line_height); | 700 gfx::RectF start_rect(50, line_height, 0, line_height); |
692 gfx::RectF end_rect(100, line_height, 0, line_height); | 701 gfx::RectF end_rect(100, line_height, 0, line_height); |
693 bool visible = true; | 702 bool visible = true; |
694 ChangeSelection(start_rect, visible, end_rect, visible); | 703 ChangeSelection(start_rect, visible, end_rect, visible); |
695 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 704 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
696 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 705 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
697 | 706 |
698 SetDraggingEnabled(true); | 707 SetDraggingEnabled(true); |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
797 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); | 806 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); |
798 | 807 |
799 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); | 808 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); |
800 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 809 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
801 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); | 810 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); |
802 EXPECT_FALSE(GetAndResetSelectionMoved()); | 811 EXPECT_FALSE(GetAndResetSelectionMoved()); |
803 } | 812 } |
804 | 813 |
805 TEST_F(TouchSelectionControllerTest, SelectionDragExtremeLineSize) { | 814 TEST_F(TouchSelectionControllerTest, SelectionDragExtremeLineSize) { |
806 base::TimeTicks event_time = base::TimeTicks::Now(); | 815 base::TimeTicks event_time = base::TimeTicks::Now(); |
807 controller().OnLongPressEvent(); | 816 OnLongPressEvent(); |
808 | 817 |
809 float small_line_height = 1.f; | 818 float small_line_height = 1.f; |
810 float large_line_height = 50.f; | 819 float large_line_height = 50.f; |
811 gfx::RectF small_line_rect(0, 0, 0, small_line_height); | 820 gfx::RectF small_line_rect(0, 0, 0, small_line_height); |
812 gfx::RectF large_line_rect(50, 50, 0, large_line_height); | 821 gfx::RectF large_line_rect(50, 50, 0, large_line_height); |
813 bool visible = true; | 822 bool visible = true; |
814 ChangeSelection(small_line_rect, visible, large_line_rect, visible); | 823 ChangeSelection(small_line_rect, visible, large_line_rect, visible); |
815 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 824 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
816 EXPECT_EQ(small_line_rect.bottom_left(), GetLastEventStart()); | 825 EXPECT_EQ(small_line_rect.bottom_left(), GetLastEventStart()); |
817 | 826 |
(...skipping 13 matching lines...) Expand all Loading... |
831 | 840 |
832 small_line_rect += gfx::Vector2dF(25.f, 0); | 841 small_line_rect += gfx::Vector2dF(25.f, 0); |
833 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, | 842 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, |
834 small_line_rect.x(), small_line_rect.y()); | 843 small_line_rect.x(), small_line_rect.y()); |
835 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 844 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
836 EXPECT_TRUE(GetAndResetSelectionMoved()); | 845 EXPECT_TRUE(GetAndResetSelectionMoved()); |
837 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); | 846 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); |
838 } | 847 } |
839 | 848 |
840 TEST_F(TouchSelectionControllerTest, Animation) { | 849 TEST_F(TouchSelectionControllerTest, Animation) { |
841 controller().OnTapEvent(); | 850 OnTapEvent(); |
842 controller().OnSelectionEditable(true); | 851 controller().OnSelectionEditable(true); |
843 | 852 |
844 gfx::RectF insertion_rect(5, 5, 0, 10); | 853 gfx::RectF insertion_rect(5, 5, 0, 10); |
845 | 854 |
846 bool visible = true; | 855 bool visible = true; |
847 ChangeInsertion(insertion_rect, visible); | 856 ChangeInsertion(insertion_rect, visible); |
848 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 857 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
849 | 858 |
850 visible = false; | 859 visible = false; |
851 ChangeInsertion(insertion_rect, visible); | 860 ChangeInsertion(insertion_rect, visible); |
852 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 861 EXPECT_TRUE(GetAndResetNeedsAnimate()); |
853 | 862 |
854 visible = true; | 863 visible = true; |
855 ChangeInsertion(insertion_rect, visible); | 864 ChangeInsertion(insertion_rect, visible); |
856 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 865 EXPECT_TRUE(GetAndResetNeedsAnimate()); |
857 | 866 |
858 // If the handles are explicity hidden, no animation should be triggered. | 867 // If the handles are explicity hidden, no animation should be triggered. |
859 controller().HideAndDisallowShowingAutomatically(); | 868 controller().HideAndDisallowShowingAutomatically(); |
860 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 869 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
861 | 870 |
862 // If the client doesn't support animation, no animation should be triggered. | 871 // If the client doesn't support animation, no animation should be triggered. |
863 SetAnimationEnabled(false); | 872 SetAnimationEnabled(false); |
864 controller().OnTapEvent(); | 873 OnTapEvent(); |
865 visible = true; | 874 visible = true; |
866 ChangeInsertion(insertion_rect, visible); | 875 ChangeInsertion(insertion_rect, visible); |
867 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 876 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
868 } | 877 } |
869 | 878 |
870 TEST_F(TouchSelectionControllerTest, TemporarilyHidden) { | 879 TEST_F(TouchSelectionControllerTest, TemporarilyHidden) { |
871 controller().OnTapEvent(); | 880 OnTapEvent(); |
872 controller().OnSelectionEditable(true); | 881 controller().OnSelectionEditable(true); |
873 | 882 |
874 gfx::RectF insertion_rect(5, 5, 0, 10); | 883 gfx::RectF insertion_rect(5, 5, 0, 10); |
875 | 884 |
876 bool visible = true; | 885 bool visible = true; |
877 ChangeInsertion(insertion_rect, visible); | 886 ChangeInsertion(insertion_rect, visible); |
878 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 887 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
879 | 888 |
880 controller().SetTemporarilyHidden(true); | 889 controller().SetTemporarilyHidden(true); |
881 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 890 EXPECT_TRUE(GetAndResetNeedsAnimate()); |
882 | 891 |
883 visible = false; | 892 visible = false; |
884 ChangeInsertion(insertion_rect, visible); | 893 ChangeInsertion(insertion_rect, visible); |
885 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 894 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
886 | 895 |
887 visible = true; | 896 visible = true; |
888 ChangeInsertion(insertion_rect, visible); | 897 ChangeInsertion(insertion_rect, visible); |
889 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 898 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
890 | 899 |
891 controller().SetTemporarilyHidden(false); | 900 controller().SetTemporarilyHidden(false); |
892 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 901 EXPECT_TRUE(GetAndResetNeedsAnimate()); |
893 } | 902 } |
894 | 903 |
895 TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) { | 904 TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) { |
896 gfx::RectF start_rect(5, 5, 0, 10); | 905 gfx::RectF start_rect(5, 5, 0, 10); |
897 gfx::RectF end_rect(50, 5, 0, 10); | 906 gfx::RectF end_rect(50, 5, 0, 10); |
898 bool visible = true; | 907 bool visible = true; |
899 | 908 |
900 controller().OnLongPressEvent(); | 909 OnLongPressEvent(); |
901 ChangeSelection(start_rect, visible, end_rect, visible); | 910 ChangeSelection(start_rect, visible, end_rect, visible); |
902 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 911 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
903 | 912 |
904 // Selection should not be cleared if the selection bounds have not changed. | 913 // Selection should not be cleared if the selection bounds have not changed. |
905 controller().OnTapEvent(); | 914 OnTapEvent(); |
906 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 915 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
907 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 916 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
908 | 917 |
909 controller().OnTapEvent(); | 918 OnTapEvent(); |
910 ClearSelection(); | 919 ClearSelection(); |
911 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); | 920 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); |
912 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 921 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
913 } | 922 } |
914 | 923 |
915 TEST_F(TouchSelectionControllerTest, NoSelectionAfterLongpressThenTap) { | 924 TEST_F(TouchSelectionControllerTest, NoSelectionAfterLongpressThenTap) { |
916 gfx::RectF start_rect(5, 5, 0, 10); | 925 gfx::RectF start_rect(5, 5, 0, 10); |
917 gfx::RectF end_rect(50, 5, 0, 10); | 926 gfx::RectF end_rect(50, 5, 0, 10); |
918 bool visible = true; | 927 bool visible = true; |
919 | 928 |
920 // Tap-triggered selections should not be allowed. | 929 // Tap-triggered selections should not be allowed. |
921 controller().OnLongPressEvent(); | 930 OnLongPressEvent(); |
922 controller().OnTapEvent(); | 931 OnTapEvent(); |
923 ChangeSelection(start_rect, visible, end_rect, visible); | 932 ChangeSelection(start_rect, visible, end_rect, visible); |
924 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 933 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
925 | 934 |
926 // Subsequent longpress selections will be allowed. | 935 // Subsequent longpress selections will be allowed. |
927 controller().OnLongPressEvent(); | 936 OnLongPressEvent(); |
928 ChangeSelection(start_rect, visible, end_rect, visible); | 937 ChangeSelection(start_rect, visible, end_rect, visible); |
929 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 938 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
930 | 939 |
931 // Tapping again shouldn't have any effect on subsequent selection events. | 940 // Tapping again shouldn't have any effect on subsequent selection events. |
932 controller().OnTapEvent(); | 941 OnTapEvent(); |
933 end_rect.Offset(10, 10); | 942 end_rect.Offset(10, 10); |
934 ChangeSelection(start_rect, visible, end_rect, visible); | 943 ChangeSelection(start_rect, visible, end_rect, visible); |
935 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); | 944 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); |
936 ClearSelection(); | 945 ClearSelection(); |
937 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); | 946 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); |
938 } | 947 } |
939 | 948 |
940 TEST_F(TouchSelectionControllerTest, AllowShowingFromCurrentSelection) { | 949 TEST_F(TouchSelectionControllerTest, AllowShowingFromCurrentSelection) { |
941 gfx::RectF start_rect(5, 5, 0, 10); | 950 gfx::RectF start_rect(5, 5, 0, 10); |
942 gfx::RectF end_rect(50, 5, 0, 10); | 951 gfx::RectF end_rect(50, 5, 0, 10); |
943 bool visible = true; | 952 bool visible = true; |
944 | 953 |
945 // The selection should not be activated, as it wasn't yet allowed. | 954 // The selection should not be activated, as it wasn't yet allowed. |
946 ChangeSelection(start_rect, visible, end_rect, visible); | 955 ChangeSelection(start_rect, visible, end_rect, visible); |
947 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 956 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
948 | 957 |
949 // A longpress should have no immediate effect. | 958 // A longpress should have no immediate effect. |
950 controller().OnLongPressEvent(); | 959 OnLongPressEvent(); |
951 | 960 |
952 // Now explicitly allow showing from the previously supplied bounds. | 961 // Now explicitly allow showing from the previously supplied bounds. |
953 controller().AllowShowingFromCurrentSelection(); | 962 controller().AllowShowingFromCurrentSelection(); |
954 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 963 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
955 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 964 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
956 | 965 |
957 // Repeated calls to show from the current selection should be ignored. | 966 // Repeated calls to show from the current selection should be ignored. |
958 controller().AllowShowingFromCurrentSelection(); | 967 controller().AllowShowingFromCurrentSelection(); |
959 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 968 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
960 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 969 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
961 | 970 |
962 // Trying to show from an empty selection will have no result. | 971 // Trying to show from an empty selection will have no result. |
963 ClearSelection(); | 972 ClearSelection(); |
964 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); | 973 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); |
965 controller().AllowShowingFromCurrentSelection(); | 974 controller().AllowShowingFromCurrentSelection(); |
966 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 975 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
967 | 976 |
968 // Showing the insertion handle should also be supported. | 977 // Showing the insertion handle should also be supported. |
969 controller().OnSelectionEditable(true); | 978 controller().OnSelectionEditable(true); |
970 controller().OnSelectionEmpty(false); | 979 controller().OnSelectionEmpty(false); |
971 controller().HideAndDisallowShowingAutomatically(); | 980 controller().HideAndDisallowShowingAutomatically(); |
972 gfx::RectF insertion_rect(5, 5, 0, 10); | 981 gfx::RectF insertion_rect(5, 5, 0, 10); |
973 ChangeInsertion(insertion_rect, visible); | 982 ChangeInsertion(insertion_rect, visible); |
974 controller().AllowShowingFromCurrentSelection(); | 983 controller().AllowShowingFromCurrentSelection(); |
975 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 984 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
976 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 985 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
977 } | 986 } |
978 | 987 |
| 988 TEST_F(TouchSelectionControllerTest, HandlesShowOnTapInsideRect) { |
| 989 bool visible = false; |
| 990 gfx::RectF start_rect(5, 5, 0, 10); |
| 991 gfx::RectF end_rect(50, 5, 0, 10); |
| 992 gfx::PointF inner_point(25, 10); |
| 993 gfx::PointF outer_point(100, 100); |
| 994 |
| 995 // Establish a selection without handles from 5 to 50 with height 10. |
| 996 ChangeSelection(start_rect, visible, end_rect, visible); |
| 997 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 998 |
| 999 // A point outside the rect should not be handled. |
| 1000 EXPECT_FALSE(controller().WillHandleTapEvent(outer_point)); |
| 1001 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 1002 |
| 1003 // A point inside the rect should be handled. |
| 1004 EXPECT_TRUE(controller().WillHandleTapEvent(inner_point)); |
| 1005 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 1006 } |
| 1007 |
| 1008 TEST_F(TouchSelectionControllerTest, HandlesShowOnLongPressInsideRect) { |
| 1009 bool visible = false; |
| 1010 gfx::RectF start_rect(5, 5, 0, 10); |
| 1011 gfx::RectF end_rect(50, 5, 0, 10); |
| 1012 gfx::PointF inner_point(25, 10); |
| 1013 gfx::PointF outer_point(100, 100); |
| 1014 |
| 1015 // Establish a selection without handles from 5 to 50 with height 10. |
| 1016 ChangeSelection(start_rect, visible, end_rect, visible); |
| 1017 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 1018 |
| 1019 // A point outside the rect should not be handled. |
| 1020 EXPECT_FALSE(controller().WillHandleLongPressEvent(outer_point)); |
| 1021 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 1022 |
| 1023 // A point inside the rect should be handled. |
| 1024 EXPECT_TRUE(controller().WillHandleLongPressEvent(inner_point)); |
| 1025 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 1026 } |
| 1027 |
979 } // namespace ui | 1028 } // namespace ui |
OLD | NEW |