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 "base/macros.h" | 9 #include "base/macros.h" |
10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
138 start_bound.set_type(gfx::SelectionBound::LEFT); | 138 start_bound.set_type(gfx::SelectionBound::LEFT); |
139 end_bound.set_type(gfx::SelectionBound::RIGHT); | 139 end_bound.set_type(gfx::SelectionBound::RIGHT); |
140 start_bound.SetEdge(start_rect.origin(), start_rect.bottom_left()); | 140 start_bound.SetEdge(start_rect.origin(), start_rect.bottom_left()); |
141 end_bound.SetEdge(end_rect.origin(), end_rect.bottom_left()); | 141 end_bound.SetEdge(end_rect.origin(), end_rect.bottom_left()); |
142 start_bound.set_visible(start_visible); | 142 start_bound.set_visible(start_visible); |
143 end_bound.set_visible(end_visible); | 143 end_bound.set_visible(end_visible); |
144 controller_->OnSelectionBoundsChanged(start_bound, end_bound); | 144 controller_->OnSelectionBoundsChanged(start_bound, end_bound); |
145 } | 145 } |
146 | 146 |
147 void OnLongPressEvent() { | 147 void OnLongPressEvent() { |
148 ASSERT_FALSE(controller().WillHandleLongPressEvent(base::TimeTicks(), | 148 controller().WillHandleLongPressEvent(base::TimeTicks(), |
149 kIgnoredPoint)); | 149 kIgnoredPoint); |
150 } | 150 } |
151 | 151 |
152 void OnTapEvent() { | 152 void OnTapEvent() { |
153 ASSERT_FALSE(controller().WillHandleTapEvent(kIgnoredPoint, 1)); | 153 controller().WillHandleTapEvent(kIgnoredPoint, 1); |
154 } | 154 } |
155 | 155 |
156 void OnDoubleTapEvent() { | 156 void OnDoubleTapEvent() { |
157 ASSERT_FALSE(controller().WillHandleTapEvent(kIgnoredPoint, 2)); | 157 controller().WillHandleTapEvent(kIgnoredPoint, 2); |
158 } | 158 } |
159 | 159 |
160 void Animate() { | 160 void Animate() { |
161 base::TimeTicks now = base::TimeTicks::Now(); | 161 base::TimeTicks now = base::TimeTicks::Now(); |
162 while (needs_animate_) { | 162 while (needs_animate_) { |
163 needs_animate_ = controller_->Animate(now); | 163 needs_animate_ = controller_->Animate(now); |
164 now += base::TimeDelta::FromMilliseconds(16); | 164 now += base::TimeDelta::FromMilliseconds(16); |
165 } | 165 } |
166 } | 166 } |
167 | 167 |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
233 bool dragging_enabled_; | 233 bool dragging_enabled_; |
234 std::unique_ptr<TouchSelectionController> controller_; | 234 std::unique_ptr<TouchSelectionController> controller_; |
235 | 235 |
236 DISALLOW_COPY_AND_ASSIGN(TouchSelectionControllerTest); | 236 DISALLOW_COPY_AND_ASSIGN(TouchSelectionControllerTest); |
237 }; | 237 }; |
238 | 238 |
239 TEST_F(TouchSelectionControllerTest, InsertionBasic) { | 239 TEST_F(TouchSelectionControllerTest, InsertionBasic) { |
240 gfx::RectF insertion_rect(5, 5, 0, 10); | 240 gfx::RectF insertion_rect(5, 5, 0, 10); |
241 bool visible = true; | 241 bool visible = true; |
242 | 242 |
243 // Insertion handles are not shown until automatic showing is enabled. | |
244 ChangeInsertion(insertion_rect, visible); | |
245 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_ESTABLISHED)); | |
246 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
247 OnTapEvent(); | 243 OnTapEvent(); |
248 | |
249 // Insertion handles are not shown until the selection region is | |
250 // marked editable. | |
251 ChangeInsertion(insertion_rect, visible); | |
252 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | |
253 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
254 | |
255 OnTapEvent(); | |
256 controller().OnSelectionEditable(true); | |
257 ChangeInsertion(insertion_rect, visible); | 244 ChangeInsertion(insertion_rect, visible); |
258 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_SHOWN)); | 245 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_SHOWN)); |
259 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 246 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
260 | 247 |
261 insertion_rect.Offset(1, 0); | 248 insertion_rect.Offset(1, 0); |
262 ChangeInsertion(insertion_rect, visible); | 249 ChangeInsertion(insertion_rect, visible); |
263 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_MOVED)); | 250 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_MOVED)); |
264 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 251 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
265 | 252 |
266 insertion_rect.Offset(0, 1); | 253 insertion_rect.Offset(0, 1); |
267 ChangeInsertion(insertion_rect, visible); | 254 ChangeInsertion(insertion_rect, visible); |
268 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_MOVED)); | 255 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_MOVED)); |
269 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 256 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
270 | 257 |
271 ClearInsertion(); | 258 ClearInsertion(); |
272 EXPECT_THAT(GetAndResetEvents(), | 259 EXPECT_THAT(GetAndResetEvents(), |
273 ElementsAre(SELECTION_DISSOLVED, INSERTION_HANDLE_CLEARED)); | 260 ElementsAre(INSERTION_HANDLE_CLEARED)); |
274 } | |
275 | |
276 TEST_F(TouchSelectionControllerTest, InsertionClearedWhenNoLongerEditable) { | |
277 gfx::RectF insertion_rect(5, 5, 0, 10); | |
278 bool visible = true; | |
279 OnTapEvent(); | |
280 controller().OnSelectionEditable(true); | |
281 | |
282 ChangeInsertion(insertion_rect, visible); | |
283 EXPECT_THAT(GetAndResetEvents(), | |
284 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | |
285 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | |
286 | |
287 controller().OnSelectionEditable(false); | |
288 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_CLEARED)); | |
289 } | |
290 | |
291 TEST_F(TouchSelectionControllerTest, InsertionEmptyEditable) { | |
292 gfx::RectF insertion_rect(5, 5, 0, 10); | |
293 bool visible = true; | |
294 controller().OnSelectionEditable(true); | |
295 | |
296 // Taps on an empty editable region should be ignored | |
297 OnTapEvent(); | |
298 controller().OnSelectionEmpty(true); | |
299 ChangeInsertion(insertion_rect, visible); | |
300 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
301 | |
302 // Once the region becomes non-empty, taps should show the insertion handle. | |
303 OnTapEvent(); | |
304 controller().OnSelectionEmpty(false); | |
305 ChangeInsertion(insertion_rect, visible); | |
306 EXPECT_THAT(GetAndResetEvents(), | |
307 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | |
308 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | |
309 | |
310 // Reset the selection. | |
311 controller().HideAndDisallowShowingAutomatically(); | |
312 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_CLEARED)); | |
313 | |
314 // Long-pressing should show the handle even if the editable region is empty. | |
315 insertion_rect.Offset(2, -2); | |
316 OnLongPressEvent(); | |
317 controller().OnSelectionEmpty(true); | |
318 ChangeInsertion(insertion_rect, visible); | |
319 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_SHOWN)); | |
320 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | |
321 | |
322 // Single Tap on an empty edit field should clear insertion handle. | |
323 OnTapEvent(); | |
324 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_CLEARED)); | |
325 } | |
326 | |
327 TEST_F(TouchSelectionControllerTest, InsertionAppearsAfterTapFollowingTyping) { | |
328 gfx::RectF insertion_rect(5, 5, 0, 10); | |
329 bool visible = true; | |
330 | |
331 // Simulate the user tapping an empty text field. | |
332 OnTapEvent(); | |
333 controller().OnSelectionEditable(true); | |
334 controller().OnSelectionEmpty(true); | |
335 ChangeInsertion(insertion_rect, visible); | |
336 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
337 | |
338 // Simulate the cursor moving while a user is typing. | |
339 insertion_rect.Offset(10, 0); | |
340 controller().OnSelectionEmpty(false); | |
341 ChangeInsertion(insertion_rect, visible); | |
342 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
343 | |
344 // If the user taps the *same* position as the cursor at the end of the text | |
345 // entry, the handle should appear. | |
346 OnTapEvent(); | |
347 ChangeInsertion(insertion_rect, visible); | |
348 EXPECT_THAT(GetAndResetEvents(), | |
349 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | |
350 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | |
351 } | 261 } |
352 | 262 |
353 TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) { | 263 TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) { |
354 OnLongPressEvent(); | 264 OnLongPressEvent(); |
355 controller().OnSelectionEditable(true); | |
356 | 265 |
357 gfx::RectF start_rect(5, 5, 0, 10); | 266 gfx::RectF start_rect(5, 5, 0, 10); |
358 gfx::RectF end_rect(50, 5, 0, 10); | 267 gfx::RectF end_rect(50, 5, 0, 10); |
359 bool visible = true; | 268 bool visible = true; |
360 | 269 |
361 ChangeInsertion(start_rect, visible); | 270 ChangeInsertion(start_rect, visible); |
362 EXPECT_THAT(GetAndResetEvents(), | 271 EXPECT_THAT(GetAndResetEvents(), |
363 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | 272 ElementsAre(INSERTION_HANDLE_SHOWN)); |
364 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 273 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
365 | 274 |
366 ChangeSelection(start_rect, visible, end_rect, visible); | 275 ChangeSelection(start_rect, visible, end_rect, visible); |
367 EXPECT_THAT(GetAndResetEvents(), | 276 EXPECT_THAT(GetAndResetEvents(), |
368 ElementsAre(INSERTION_HANDLE_CLEARED, SELECTION_HANDLES_SHOWN)); | 277 ElementsAre(INSERTION_HANDLE_CLEARED, SELECTION_HANDLES_SHOWN)); |
369 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 278 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
370 | 279 |
371 ChangeInsertion(end_rect, visible); | 280 ChangeInsertion(end_rect, visible); |
372 EXPECT_THAT(GetAndResetEvents(), | 281 EXPECT_THAT(GetAndResetEvents(), |
373 ElementsAre(SELECTION_HANDLES_CLEARED, INSERTION_HANDLE_SHOWN)); | 282 ElementsAre(SELECTION_HANDLES_CLEARED, INSERTION_HANDLE_SHOWN)); |
374 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); | 283 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); |
375 | 284 |
376 controller().HideAndDisallowShowingAutomatically(); | 285 controller().HideAndDisallowShowingAutomatically(); |
377 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_CLEARED)); | 286 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_CLEARED)); |
378 | 287 |
379 OnTapEvent(); | 288 OnTapEvent(); |
380 ChangeInsertion(end_rect, visible); | 289 ChangeInsertion(end_rect, visible); |
381 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_SHOWN)); | 290 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_SHOWN)); |
382 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); | 291 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); |
383 } | 292 } |
384 | 293 |
385 TEST_F(TouchSelectionControllerTest, InsertionDragged) { | 294 TEST_F(TouchSelectionControllerTest, InsertionDragged) { |
386 base::TimeTicks event_time = base::TimeTicks::Now(); | 295 base::TimeTicks event_time = base::TimeTicks::Now(); |
387 OnTapEvent(); | 296 OnTapEvent(); |
388 controller().OnSelectionEditable(true); | |
389 | 297 |
390 // The touch sequence should not be handled if insertion is not active. | 298 // The touch sequence should not be handled if insertion is not active. |
391 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 299 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
392 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 300 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
393 | 301 |
394 float line_height = 10.f; | 302 float line_height = 10.f; |
395 gfx::RectF start_rect(10, 0, 0, line_height); | 303 gfx::RectF start_rect(10, 0, 0, line_height); |
396 bool visible = true; | 304 bool visible = true; |
397 ChangeInsertion(start_rect, visible); | 305 ChangeInsertion(start_rect, visible); |
398 EXPECT_THAT(GetAndResetEvents(), | 306 EXPECT_THAT(GetAndResetEvents(), |
399 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | 307 ElementsAre(INSERTION_HANDLE_SHOWN)); |
400 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 308 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
401 | 309 |
402 // The touch sequence should be handled only if the drawable reports a hit. | 310 // The touch sequence should be handled only if the drawable reports a hit. |
403 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 311 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
404 SetDraggingEnabled(true); | 312 SetDraggingEnabled(true); |
405 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 313 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
406 EXPECT_FALSE(GetAndResetCaretMoved()); | 314 EXPECT_FALSE(GetAndResetCaretMoved()); |
407 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); | 315 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); |
408 | 316 |
409 // The MoveCaret() result should reflect the movement. | 317 // The MoveCaret() result should reflect the movement. |
(...skipping 20 matching lines...) Expand all Loading... |
430 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STOPPED)); | 338 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STOPPED)); |
431 | 339 |
432 // Once the drag is complete, no more touch events should be consumed until | 340 // Once the drag is complete, no more touch events should be consumed until |
433 // the next ACTION_DOWN. | 341 // the next ACTION_DOWN. |
434 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 342 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
435 } | 343 } |
436 | 344 |
437 TEST_F(TouchSelectionControllerTest, InsertionTapped) { | 345 TEST_F(TouchSelectionControllerTest, InsertionTapped) { |
438 base::TimeTicks event_time = base::TimeTicks::Now(); | 346 base::TimeTicks event_time = base::TimeTicks::Now(); |
439 OnTapEvent(); | 347 OnTapEvent(); |
440 controller().OnSelectionEditable(true); | |
441 SetDraggingEnabled(true); | 348 SetDraggingEnabled(true); |
442 | 349 |
443 gfx::RectF start_rect(10, 0, 0, 10); | 350 gfx::RectF start_rect(10, 0, 0, 10); |
444 bool visible = true; | 351 bool visible = true; |
445 ChangeInsertion(start_rect, visible); | 352 ChangeInsertion(start_rect, visible); |
446 EXPECT_THAT(GetAndResetEvents(), | 353 EXPECT_THAT(GetAndResetEvents(), |
447 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | 354 ElementsAre(INSERTION_HANDLE_SHOWN)); |
448 | 355 |
449 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 356 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
450 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 357 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
451 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); | 358 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); |
452 | 359 |
453 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 360 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
454 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 361 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
455 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_TAPPED, | 362 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_TAPPED, |
456 INSERTION_HANDLE_DRAG_STOPPED)); | 363 INSERTION_HANDLE_DRAG_STOPPED)); |
457 | 364 |
458 // Reset the insertion. | 365 // Reset the insertion. |
459 ClearInsertion(); | 366 ClearInsertion(); |
460 OnTapEvent(); | 367 OnTapEvent(); |
461 ChangeInsertion(start_rect, visible); | 368 ChangeInsertion(start_rect, visible); |
462 EXPECT_THAT(GetAndResetEvents(), | 369 EXPECT_THAT(GetAndResetEvents(), |
463 ElementsAre(SELECTION_DISSOLVED, INSERTION_HANDLE_CLEARED, | 370 ElementsAre(INSERTION_HANDLE_CLEARED, INSERTION_HANDLE_SHOWN)); |
464 SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | |
465 | 371 |
466 // No tap should be signalled if the time between DOWN and UP was too long. | 372 // No tap should be signalled if the time between DOWN and UP was too long. |
467 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 373 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
468 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 374 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
469 event = MockMotionEvent(MockMotionEvent::ACTION_UP, | 375 event = MockMotionEvent(MockMotionEvent::ACTION_UP, |
470 event_time + base::TimeDelta::FromSeconds(1), | 376 event_time + base::TimeDelta::FromSeconds(1), |
471 0, | 377 0, |
472 0); | 378 0); |
473 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 379 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
474 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED, | 380 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED, |
475 INSERTION_HANDLE_DRAG_STOPPED)); | 381 INSERTION_HANDLE_DRAG_STOPPED)); |
476 | 382 |
477 // Reset the insertion. | 383 // Reset the insertion. |
478 ClearInsertion(); | 384 ClearInsertion(); |
479 OnTapEvent(); | 385 OnTapEvent(); |
480 ChangeInsertion(start_rect, visible); | 386 ChangeInsertion(start_rect, visible); |
481 EXPECT_THAT(GetAndResetEvents(), | 387 EXPECT_THAT(GetAndResetEvents(), |
482 ElementsAre(SELECTION_DISSOLVED, INSERTION_HANDLE_CLEARED, | 388 ElementsAre(INSERTION_HANDLE_CLEARED, INSERTION_HANDLE_SHOWN)); |
483 SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | |
484 | 389 |
485 // No tap should be signalled if the drag was too long. | 390 // No tap should be signalled if the drag was too long. |
486 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 391 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
487 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 392 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
488 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 100, 0); | 393 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 100, 0); |
489 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 394 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
490 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 100, 0); | 395 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 100, 0); |
491 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 396 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
492 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED, | 397 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED, |
493 INSERTION_HANDLE_DRAG_STOPPED)); | 398 INSERTION_HANDLE_DRAG_STOPPED)); |
494 | 399 |
495 // Reset the insertion. | 400 // Reset the insertion. |
496 ClearInsertion(); | 401 ClearInsertion(); |
497 OnTapEvent(); | 402 OnTapEvent(); |
498 ChangeInsertion(start_rect, visible); | 403 ChangeInsertion(start_rect, visible); |
499 EXPECT_THAT(GetAndResetEvents(), | 404 EXPECT_THAT(GetAndResetEvents(), |
500 ElementsAre(SELECTION_DISSOLVED, INSERTION_HANDLE_CLEARED, | 405 ElementsAre(INSERTION_HANDLE_CLEARED, INSERTION_HANDLE_SHOWN)); |
501 SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | |
502 | 406 |
503 // No tap should be signalled if the touch sequence is cancelled. | 407 // No tap should be signalled if the touch sequence is cancelled. |
504 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 408 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
505 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 409 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
506 event = MockMotionEvent(MockMotionEvent::ACTION_CANCEL, event_time, 0, 0); | 410 event = MockMotionEvent(MockMotionEvent::ACTION_CANCEL, event_time, 0, 0); |
507 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 411 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
508 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED, | 412 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED, |
509 INSERTION_HANDLE_DRAG_STOPPED)); | 413 INSERTION_HANDLE_DRAG_STOPPED)); |
510 } | 414 } |
511 | 415 |
512 TEST_F(TouchSelectionControllerTest, InsertionNotResetByRepeatedTapOrPress) { | 416 TEST_F(TouchSelectionControllerTest, InsertionNotResetByRepeatedTapOrPress) { |
513 base::TimeTicks event_time = base::TimeTicks::Now(); | 417 base::TimeTicks event_time = base::TimeTicks::Now(); |
514 OnTapEvent(); | 418 OnTapEvent(); |
515 controller().OnSelectionEditable(true); | |
516 SetDraggingEnabled(true); | 419 SetDraggingEnabled(true); |
517 | 420 |
518 gfx::RectF anchor_rect(10, 0, 0, 10); | 421 gfx::RectF anchor_rect(10, 0, 0, 10); |
519 bool visible = true; | 422 bool visible = true; |
520 ChangeInsertion(anchor_rect, visible); | 423 ChangeInsertion(anchor_rect, visible); |
521 EXPECT_THAT(GetAndResetEvents(), | 424 EXPECT_THAT(GetAndResetEvents(), |
522 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | 425 ElementsAre(INSERTION_HANDLE_SHOWN)); |
523 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 426 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
524 | 427 |
525 // Tapping again shouldn't reset the active insertion point. | 428 // Tapping again shouldn't reset the active insertion point. |
526 OnTapEvent(); | 429 OnTapEvent(); |
527 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 430 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
528 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 431 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
529 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); | 432 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); |
530 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 433 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
531 | 434 |
532 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 435 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
533 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 436 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
534 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_TAPPED, | 437 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_TAPPED, |
535 INSERTION_HANDLE_DRAG_STOPPED)); | 438 INSERTION_HANDLE_DRAG_STOPPED)); |
536 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 439 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
537 | 440 |
538 anchor_rect.Offset(5, 15); | 441 anchor_rect.Offset(5, 15); |
539 ChangeInsertion(anchor_rect, visible); | 442 ChangeInsertion(anchor_rect, visible); |
540 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_MOVED)); | 443 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_MOVED)); |
541 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 444 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
542 | 445 |
543 // Pressing shouldn't reset the active insertion point. | 446 // Pressing shouldn't reset the active insertion point. |
544 OnLongPressEvent(); | 447 OnLongPressEvent(); |
545 controller().OnSelectionEmpty(true); | |
546 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 448 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
547 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 449 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
548 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); | 450 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); |
549 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 451 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
550 | 452 |
551 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 453 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
552 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 454 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
553 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_TAPPED, | 455 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_TAPPED, |
554 INSERTION_HANDLE_DRAG_STOPPED)); | 456 INSERTION_HANDLE_DRAG_STOPPED)); |
555 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 457 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
556 } | 458 } |
557 | 459 |
558 TEST_F(TouchSelectionControllerTest, SelectionBasic) { | 460 TEST_F(TouchSelectionControllerTest, SelectionBasic) { |
559 gfx::RectF start_rect(5, 5, 0, 10); | 461 gfx::RectF start_rect(5, 5, 0, 10); |
560 gfx::RectF end_rect(50, 5, 0, 10); | 462 gfx::RectF end_rect(50, 5, 0, 10); |
561 bool visible = true; | 463 bool visible = true; |
562 | 464 |
563 // Selection events are ignored until automatic showing is enabled. | |
564 ChangeSelection(start_rect, visible, end_rect, visible); | |
565 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
566 | |
567 OnLongPressEvent(); | 465 OnLongPressEvent(); |
568 ChangeSelection(start_rect, visible, end_rect, visible); | 466 ChangeSelection(start_rect, visible, end_rect, visible); |
569 EXPECT_THAT(GetAndResetEvents(), | 467 EXPECT_THAT(GetAndResetEvents(), |
570 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 468 ElementsAre(SELECTION_HANDLES_SHOWN)); |
571 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 469 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
572 | 470 |
573 start_rect.Offset(1, 0); | 471 start_rect.Offset(1, 0); |
574 ChangeSelection(start_rect, visible, end_rect, visible); | 472 ChangeSelection(start_rect, visible, end_rect, visible); |
575 // Selection movement does not currently trigger a separate event. | 473 // Selection movement does not currently trigger a separate event. |
576 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); | 474 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); |
577 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 475 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
578 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 476 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
579 | 477 |
580 ClearSelection(); | 478 ClearSelection(); |
581 EXPECT_THAT(GetAndResetEvents(), | 479 EXPECT_THAT(GetAndResetEvents(), |
582 ElementsAre(SELECTION_DISSOLVED, SELECTION_HANDLES_CLEARED)); | 480 ElementsAre(SELECTION_HANDLES_CLEARED)); |
583 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
584 } | 481 } |
585 | 482 |
586 TEST_F(TouchSelectionControllerTest, SelectionAllowedByDoubleTap) { | 483 TEST_F(TouchSelectionControllerTest, SelectionAllowedByDoubleTap) { |
587 gfx::RectF start_rect(5, 5, 0, 10); | 484 gfx::RectF start_rect(5, 5, 0, 10); |
588 gfx::RectF end_rect(50, 5, 0, 10); | 485 gfx::RectF end_rect(50, 5, 0, 10); |
589 bool visible = true; | 486 bool visible = true; |
590 | 487 |
591 OnDoubleTapEvent(); | 488 OnDoubleTapEvent(); |
592 ChangeSelection(start_rect, visible, end_rect, visible); | 489 ChangeSelection(start_rect, visible, end_rect, visible); |
593 EXPECT_THAT(GetAndResetEvents(), | 490 EXPECT_THAT(GetAndResetEvents(), |
594 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 491 ElementsAre(SELECTION_HANDLES_SHOWN)); |
595 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 492 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
596 } | 493 } |
597 | 494 |
598 TEST_F(TouchSelectionControllerTest, SelectionAllowedByDoubleTapOnEditable) { | 495 TEST_F(TouchSelectionControllerTest, SelectionAllowedByDoubleTapOnEditable) { |
599 gfx::RectF start_rect(5, 5, 0, 10); | 496 gfx::RectF start_rect(5, 5, 0, 10); |
600 gfx::RectF end_rect(50, 5, 0, 10); | 497 gfx::RectF end_rect(50, 5, 0, 10); |
601 bool visible = true; | 498 bool visible = true; |
602 | 499 |
603 controller().OnSelectionEditable(true); | |
604 | |
605 // If the user double tap selects text in an editable region, the first tap | 500 // If the user double tap selects text in an editable region, the first tap |
606 // will register insertion and the second tap selection. | 501 // will register insertion and the second tap selection. |
607 OnTapEvent(); | 502 OnTapEvent(); |
608 ChangeInsertion(start_rect, visible); | 503 ChangeInsertion(start_rect, visible); |
609 EXPECT_THAT(GetAndResetEvents(), | 504 EXPECT_THAT(GetAndResetEvents(), |
610 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | 505 ElementsAre(INSERTION_HANDLE_SHOWN)); |
611 | 506 |
612 OnDoubleTapEvent(); | 507 OnDoubleTapEvent(); |
613 ChangeSelection(start_rect, visible, end_rect, visible); | 508 ChangeSelection(start_rect, visible, end_rect, visible); |
614 EXPECT_THAT(GetAndResetEvents(), | 509 EXPECT_THAT(GetAndResetEvents(), |
615 ElementsAre(INSERTION_HANDLE_CLEARED, SELECTION_HANDLES_SHOWN)); | 510 ElementsAre(INSERTION_HANDLE_CLEARED, SELECTION_HANDLES_SHOWN)); |
616 } | 511 } |
617 | 512 |
618 TEST_F(TouchSelectionControllerTest, SelectionAllowsEmptyUpdateAfterLongPress) { | 513 TEST_F(TouchSelectionControllerTest, SelectionAllowsEmptyUpdateAfterLongPress) { |
619 gfx::RectF start_rect(5, 5, 0, 10); | 514 gfx::RectF start_rect(5, 5, 0, 10); |
620 gfx::RectF end_rect(50, 5, 0, 10); | 515 gfx::RectF end_rect(50, 5, 0, 10); |
621 bool visible = true; | 516 bool visible = true; |
622 | 517 |
623 OnLongPressEvent(); | 518 OnLongPressEvent(); |
624 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 519 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
625 | 520 |
626 // There may be several empty updates after a longpress due to the | 521 // There may be several empty updates after a longpress due to the |
627 // asynchronous response. These empty updates should not prevent the selection | 522 // asynchronous response. These empty updates should not prevent the selection |
628 // handles from (eventually) activating. | 523 // handles from (eventually) activating. |
629 ClearSelection(); | 524 ClearSelection(); |
630 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 525 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
631 | 526 |
632 ClearSelection(); | 527 ClearSelection(); |
633 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 528 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
634 | 529 |
635 ChangeSelection(start_rect, visible, end_rect, visible); | 530 ChangeSelection(start_rect, visible, end_rect, visible); |
636 EXPECT_THAT(GetAndResetEvents(), | 531 EXPECT_THAT(GetAndResetEvents(), |
637 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 532 ElementsAre(SELECTION_HANDLES_SHOWN)); |
638 } | 533 } |
639 | 534 |
640 TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) { | 535 TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) { |
641 gfx::RectF start_rect(5, 5, 0, 10); | 536 gfx::RectF start_rect(5, 5, 0, 10); |
642 gfx::RectF end_rect(50, 5, 0, 10); | 537 gfx::RectF end_rect(50, 5, 0, 10); |
643 bool visible = true; | 538 bool visible = true; |
644 | 539 |
645 OnLongPressEvent(); | 540 OnLongPressEvent(); |
646 ChangeSelection(start_rect, visible, end_rect, visible); | 541 ChangeSelection(start_rect, visible, end_rect, visible); |
647 EXPECT_THAT(GetAndResetEvents(), | 542 EXPECT_THAT(GetAndResetEvents(), |
648 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 543 ElementsAre(SELECTION_HANDLES_SHOWN)); |
649 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 544 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
650 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 545 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
651 | 546 |
652 // A long press triggering a new selection should re-send the | 547 // A long press triggering a new selection should re-send the |
653 // SELECTION_HANDLES_SHOWN | 548 // SELECTION_HANDLES_SHOWN |
654 // event notification. | 549 // event notification. |
655 start_rect.Offset(10, 10); | 550 start_rect.Offset(10, 10); |
656 OnLongPressEvent(); | 551 OnLongPressEvent(); |
657 ChangeSelection(start_rect, visible, end_rect, visible); | 552 ChangeSelection(start_rect, visible, end_rect, visible); |
658 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_SHOWN)); | 553 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_SHOWN)); |
659 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 554 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
660 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 555 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
661 } | 556 } |
662 | 557 |
663 TEST_F(TouchSelectionControllerTest, SelectionDragged) { | 558 TEST_F(TouchSelectionControllerTest, SelectionDragged) { |
664 base::TimeTicks event_time = base::TimeTicks::Now(); | 559 base::TimeTicks event_time = base::TimeTicks::Now(); |
665 OnLongPressEvent(); | 560 OnLongPressEvent(); |
666 | 561 |
667 // The touch sequence should not be handled if selection is not active. | 562 // The touch sequence should not be handled if selection is not active. |
668 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 563 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
669 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 564 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
670 | 565 |
671 float line_height = 10.f; | 566 float line_height = 10.f; |
672 gfx::RectF start_rect(0, 0, 0, line_height); | 567 gfx::RectF start_rect(0, 0, 0, line_height); |
673 gfx::RectF end_rect(50, 0, 0, line_height); | 568 gfx::RectF end_rect(50, 0, 0, line_height); |
674 bool visible = true; | 569 bool visible = true; |
675 ChangeSelection(start_rect, visible, end_rect, visible); | 570 ChangeSelection(start_rect, visible, end_rect, visible); |
676 EXPECT_THAT(GetAndResetEvents(), | 571 EXPECT_THAT(GetAndResetEvents(), |
677 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 572 ElementsAre(SELECTION_HANDLES_SHOWN)); |
678 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 573 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
679 | 574 |
680 // The touch sequence should be handled only if the drawable reports a hit. | 575 // The touch sequence should be handled only if the drawable reports a hit. |
681 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 576 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
682 SetDraggingEnabled(true); | 577 SetDraggingEnabled(true); |
683 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 578 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
684 EXPECT_FALSE(GetAndResetSelectionMoved()); | 579 EXPECT_FALSE(GetAndResetSelectionMoved()); |
685 | 580 |
686 // The SelectBetweenCoordinates() result should reflect the movement. Note | 581 // The SelectBetweenCoordinates() result should reflect the movement. Note |
687 // that the start coordinate will always reflect the "fixed" handle's | 582 // that the start coordinate will always reflect the "fixed" handle's |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
722 TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) { | 617 TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) { |
723 base::TimeTicks event_time = base::TimeTicks::Now(); | 618 base::TimeTicks event_time = base::TimeTicks::Now(); |
724 OnLongPressEvent(); | 619 OnLongPressEvent(); |
725 | 620 |
726 float line_height = 10.f; | 621 float line_height = 10.f; |
727 gfx::RectF start_rect(0, 0, 0, line_height); | 622 gfx::RectF start_rect(0, 0, 0, line_height); |
728 gfx::RectF end_rect(50, 0, 0, line_height); | 623 gfx::RectF end_rect(50, 0, 0, line_height); |
729 bool visible = true; | 624 bool visible = true; |
730 ChangeSelection(start_rect, visible, end_rect, visible); | 625 ChangeSelection(start_rect, visible, end_rect, visible); |
731 EXPECT_THAT(GetAndResetEvents(), | 626 EXPECT_THAT(GetAndResetEvents(), |
732 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 627 ElementsAre(SELECTION_HANDLES_SHOWN)); |
733 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 628 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
734 | 629 |
735 // The ACTION_DOWN should lock to the closest handle. | 630 // The ACTION_DOWN should lock to the closest handle. |
736 gfx::PointF end_offset = end_rect.CenterPoint(); | 631 gfx::PointF end_offset = end_rect.CenterPoint(); |
737 gfx::PointF fixed_offset = start_rect.CenterPoint(); | 632 gfx::PointF fixed_offset = start_rect.CenterPoint(); |
738 float touch_down_x = (end_offset.x() + fixed_offset.x()) / 2 + 1.f; | 633 float touch_down_x = (end_offset.x() + fixed_offset.x()) / 2 + 1.f; |
739 MockMotionEvent event( | 634 MockMotionEvent event( |
740 MockMotionEvent::ACTION_DOWN, event_time, touch_down_x, 0); | 635 MockMotionEvent::ACTION_DOWN, event_time, touch_down_x, 0); |
741 SetDraggingEnabled(true); | 636 SetDraggingEnabled(true); |
742 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 637 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
(...skipping 18 matching lines...) Expand all Loading... |
761 TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) { | 656 TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) { |
762 base::TimeTicks event_time = base::TimeTicks::Now(); | 657 base::TimeTicks event_time = base::TimeTicks::Now(); |
763 OnLongPressEvent(); | 658 OnLongPressEvent(); |
764 | 659 |
765 float line_height = 10.f; | 660 float line_height = 10.f; |
766 gfx::RectF start_rect(50, line_height, 0, line_height); | 661 gfx::RectF start_rect(50, line_height, 0, line_height); |
767 gfx::RectF end_rect(100, line_height, 0, line_height); | 662 gfx::RectF end_rect(100, line_height, 0, line_height); |
768 bool visible = true; | 663 bool visible = true; |
769 ChangeSelection(start_rect, visible, end_rect, visible); | 664 ChangeSelection(start_rect, visible, end_rect, visible); |
770 EXPECT_THAT(GetAndResetEvents(), | 665 EXPECT_THAT(GetAndResetEvents(), |
771 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 666 ElementsAre(SELECTION_HANDLES_SHOWN)); |
772 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 667 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
773 | 668 |
774 SetDraggingEnabled(true); | 669 SetDraggingEnabled(true); |
775 | 670 |
776 // Move the extent, not triggering a swap of points. | 671 // Move the extent, not triggering a swap of points. |
777 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, | 672 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, |
778 end_rect.x(), end_rect.bottom()); | 673 end_rect.x(), end_rect.bottom()); |
779 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 674 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
780 EXPECT_FALSE(GetAndResetSelectionMoved()); | 675 EXPECT_FALSE(GetAndResetSelectionMoved()); |
781 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); | 676 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
882 base::TimeTicks event_time = base::TimeTicks::Now(); | 777 base::TimeTicks event_time = base::TimeTicks::Now(); |
883 OnLongPressEvent(); | 778 OnLongPressEvent(); |
884 | 779 |
885 float small_line_height = 1.f; | 780 float small_line_height = 1.f; |
886 float large_line_height = 50.f; | 781 float large_line_height = 50.f; |
887 gfx::RectF small_line_rect(0, 0, 0, small_line_height); | 782 gfx::RectF small_line_rect(0, 0, 0, small_line_height); |
888 gfx::RectF large_line_rect(50, 50, 0, large_line_height); | 783 gfx::RectF large_line_rect(50, 50, 0, large_line_height); |
889 bool visible = true; | 784 bool visible = true; |
890 ChangeSelection(small_line_rect, visible, large_line_rect, visible); | 785 ChangeSelection(small_line_rect, visible, large_line_rect, visible); |
891 EXPECT_THAT(GetAndResetEvents(), | 786 EXPECT_THAT(GetAndResetEvents(), |
892 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 787 ElementsAre(SELECTION_HANDLES_SHOWN)); |
893 EXPECT_EQ(small_line_rect.bottom_left(), GetLastEventStart()); | 788 EXPECT_EQ(small_line_rect.bottom_left(), GetLastEventStart()); |
894 | 789 |
895 // Start dragging the handle on the small line. | 790 // Start dragging the handle on the small line. |
896 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, | 791 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, |
897 small_line_rect.x(), small_line_rect.y()); | 792 small_line_rect.x(), small_line_rect.y()); |
898 SetDraggingEnabled(true); | 793 SetDraggingEnabled(true); |
899 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 794 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
900 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STARTED)); | 795 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STARTED)); |
901 // The drag coordinate for large lines should be capped to a reasonable | 796 // The drag coordinate for large lines should be capped to a reasonable |
902 // offset, allowing seamless transition to neighboring lines with different | 797 // offset, allowing seamless transition to neighboring lines with different |
903 // sizes. The drag coordinate for small lines should have an offset | 798 // sizes. The drag coordinate for small lines should have an offset |
904 // commensurate with the small line size. | 799 // commensurate with the small line size. |
905 EXPECT_EQ(large_line_rect.bottom_left() - gfx::Vector2dF(0, 8.f), | 800 EXPECT_EQ(large_line_rect.bottom_left() - gfx::Vector2dF(0, 8.f), |
906 GetLastSelectionStart()); | 801 GetLastSelectionStart()); |
907 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); | 802 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); |
908 | 803 |
909 small_line_rect += gfx::Vector2dF(25.f, 0); | 804 small_line_rect += gfx::Vector2dF(25.f, 0); |
910 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, | 805 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, |
911 small_line_rect.x(), small_line_rect.y()); | 806 small_line_rect.x(), small_line_rect.y()); |
912 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 807 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
913 EXPECT_TRUE(GetAndResetSelectionMoved()); | 808 EXPECT_TRUE(GetAndResetSelectionMoved()); |
914 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); | 809 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); |
915 } | 810 } |
916 | 811 |
917 TEST_F(TouchSelectionControllerTest, Animation) { | 812 TEST_F(TouchSelectionControllerTest, Animation) { |
918 OnTapEvent(); | 813 OnTapEvent(); |
919 controller().OnSelectionEditable(true); | |
920 | 814 |
921 gfx::RectF insertion_rect(5, 5, 0, 10); | 815 gfx::RectF insertion_rect(5, 5, 0, 10); |
922 | 816 |
923 bool visible = true; | 817 bool visible = true; |
924 ChangeInsertion(insertion_rect, visible); | 818 ChangeInsertion(insertion_rect, visible); |
925 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 819 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
926 | 820 |
927 visible = false; | 821 visible = false; |
928 ChangeInsertion(insertion_rect, visible); | 822 ChangeInsertion(insertion_rect, visible); |
929 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 823 EXPECT_TRUE(GetAndResetNeedsAnimate()); |
(...skipping 11 matching lines...) Expand all Loading... |
941 OnTapEvent(); | 835 OnTapEvent(); |
942 visible = true; | 836 visible = true; |
943 ChangeInsertion(insertion_rect, visible); | 837 ChangeInsertion(insertion_rect, visible); |
944 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 838 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
945 } | 839 } |
946 | 840 |
947 TEST_F(TouchSelectionControllerTest, TemporarilyHidden) { | 841 TEST_F(TouchSelectionControllerTest, TemporarilyHidden) { |
948 TouchSelectionControllerTestApi test_controller(&controller()); | 842 TouchSelectionControllerTestApi test_controller(&controller()); |
949 | 843 |
950 OnTapEvent(); | 844 OnTapEvent(); |
951 controller().OnSelectionEditable(true); | |
952 | 845 |
953 gfx::RectF insertion_rect(5, 5, 0, 10); | 846 gfx::RectF insertion_rect(5, 5, 0, 10); |
954 | 847 |
955 bool visible = true; | 848 bool visible = true; |
956 ChangeInsertion(insertion_rect, visible); | 849 ChangeInsertion(insertion_rect, visible); |
957 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 850 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
958 EXPECT_TRUE(test_controller.GetStartVisible()); | 851 EXPECT_TRUE(test_controller.GetStartVisible()); |
959 EXPECT_TRUE(test_controller.GetEndVisible()); | 852 EXPECT_TRUE(test_controller.GetEndVisible()); |
960 | 853 |
961 controller().SetTemporarilyHidden(true); | 854 controller().SetTemporarilyHidden(true); |
(...skipping 17 matching lines...) Expand all Loading... |
979 } | 872 } |
980 | 873 |
981 TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) { | 874 TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) { |
982 gfx::RectF start_rect(5, 5, 0, 10); | 875 gfx::RectF start_rect(5, 5, 0, 10); |
983 gfx::RectF end_rect(50, 5, 0, 10); | 876 gfx::RectF end_rect(50, 5, 0, 10); |
984 bool visible = true; | 877 bool visible = true; |
985 | 878 |
986 OnLongPressEvent(); | 879 OnLongPressEvent(); |
987 ChangeSelection(start_rect, visible, end_rect, visible); | 880 ChangeSelection(start_rect, visible, end_rect, visible); |
988 EXPECT_THAT(GetAndResetEvents(), | 881 EXPECT_THAT(GetAndResetEvents(), |
989 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 882 ElementsAre(SELECTION_HANDLES_SHOWN)); |
990 | 883 |
991 // Selection should not be cleared if the selection bounds have not changed. | 884 // Selection should not be cleared if the selection bounds have not changed. |
992 OnTapEvent(); | 885 OnTapEvent(); |
993 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 886 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
994 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 887 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
995 | 888 |
996 OnTapEvent(); | 889 OnTapEvent(); |
997 ClearSelection(); | 890 ClearSelection(); |
998 EXPECT_THAT(GetAndResetEvents(), | 891 EXPECT_THAT(GetAndResetEvents(), |
999 ElementsAre(SELECTION_DISSOLVED, SELECTION_HANDLES_CLEARED)); | 892 ElementsAre(SELECTION_HANDLES_CLEARED)); |
1000 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
1001 } | |
1002 | |
1003 TEST_F(TouchSelectionControllerTest, NoSelectionAfterLongpressThenTap) { | |
1004 gfx::RectF start_rect(5, 5, 0, 10); | |
1005 gfx::RectF end_rect(50, 5, 0, 10); | |
1006 bool visible = true; | |
1007 | |
1008 // Tap-triggered selections should not be allowed. | |
1009 OnLongPressEvent(); | |
1010 OnTapEvent(); | |
1011 ChangeSelection(start_rect, visible, end_rect, visible); | |
1012 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_ESTABLISHED)); | |
1013 | |
1014 // Subsequent longpress selections will be allowed. | |
1015 OnLongPressEvent(); | |
1016 ChangeSelection(start_rect, visible, end_rect, visible); | |
1017 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_SHOWN)); | |
1018 | |
1019 // Tapping again shouldn't have any effect on subsequent selection events. | |
1020 OnTapEvent(); | |
1021 end_rect.Offset(10, 10); | |
1022 ChangeSelection(start_rect, visible, end_rect, visible); | |
1023 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); | |
1024 ClearSelection(); | |
1025 EXPECT_THAT(GetAndResetEvents(), | |
1026 ElementsAre(SELECTION_DISSOLVED, SELECTION_HANDLES_CLEARED)); | |
1027 } | |
1028 | |
1029 TEST_F(TouchSelectionControllerTest, AllowShowingFromCurrentSelection) { | |
1030 gfx::RectF start_rect(5, 5, 0, 10); | |
1031 gfx::RectF end_rect(50, 5, 0, 10); | |
1032 bool visible = true; | |
1033 | |
1034 // The selection should not be activated, as it wasn't yet allowed. | |
1035 ChangeSelection(start_rect, visible, end_rect, visible); | |
1036 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
1037 | |
1038 // A longpress should have no immediate effect. | |
1039 OnLongPressEvent(); | |
1040 | |
1041 // Now explicitly allow showing from the previously supplied bounds. | |
1042 controller().AllowShowingFromCurrentSelection(); | |
1043 EXPECT_THAT(GetAndResetEvents(), | |
1044 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | |
1045 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | |
1046 | |
1047 // Repeated calls to show from the current selection should be ignored. | |
1048 controller().AllowShowingFromCurrentSelection(); | |
1049 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | |
1050 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | |
1051 | |
1052 // Trying to show from an empty selection will have no result. | |
1053 ClearSelection(); | |
1054 EXPECT_THAT(GetAndResetEvents(), | |
1055 ElementsAre(SELECTION_DISSOLVED, SELECTION_HANDLES_CLEARED)); | |
1056 controller().AllowShowingFromCurrentSelection(); | |
1057 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | |
1058 | |
1059 // Showing the insertion handle should also be supported. | |
1060 controller().OnSelectionEditable(true); | |
1061 controller().OnSelectionEmpty(false); | |
1062 controller().HideAndDisallowShowingAutomatically(); | |
1063 gfx::RectF insertion_rect(5, 5, 0, 10); | |
1064 ChangeInsertion(insertion_rect, visible); | |
1065 controller().AllowShowingFromCurrentSelection(); | |
1066 EXPECT_THAT(GetAndResetEvents(), | |
1067 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | |
1068 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | |
1069 } | |
1070 | |
1071 TEST_F(TouchSelectionControllerTest, HandlesShowOnTapInsideRect) { | |
1072 bool visible = false; | |
1073 gfx::RectF start_rect(5, 5, 0, 10); | |
1074 gfx::RectF end_rect(50, 5, 0, 10); | |
1075 gfx::PointF inner_point(25, 10); | |
1076 gfx::PointF outer_point(100, 100); | |
1077 | |
1078 // Establish a selection without handles from 5 to 50 with height 10. | |
1079 ChangeSelection(start_rect, visible, end_rect, visible); | |
1080 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_ESTABLISHED)); | |
1081 | |
1082 // A point outside the rect should not be handled. | |
1083 EXPECT_FALSE(controller().WillHandleTapEvent(outer_point, 1)); | |
1084 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | |
1085 | |
1086 // A point inside the rect should be handled. | |
1087 EXPECT_TRUE(controller().WillHandleTapEvent(inner_point, 1)); | |
1088 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_SHOWN)); | |
1089 } | |
1090 | |
1091 TEST_F(TouchSelectionControllerTest, HandlesShowOnLongPressInsideRect) { | |
1092 bool visible = false; | |
1093 gfx::RectF start_rect(5, 5, 0, 10); | |
1094 gfx::RectF end_rect(50, 5, 0, 10); | |
1095 gfx::PointF inner_point(25, 10); | |
1096 gfx::PointF outer_point(100, 100); | |
1097 | |
1098 // Establish a selection without handles from 5 to 50 with height 10. | |
1099 ChangeSelection(start_rect, visible, end_rect, visible); | |
1100 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_ESTABLISHED)); | |
1101 | |
1102 // A point outside the rect should not be handled. | |
1103 EXPECT_FALSE( | |
1104 controller().WillHandleLongPressEvent(base::TimeTicks(), outer_point)); | |
1105 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | |
1106 | |
1107 // A point inside the rect should be handled. | |
1108 EXPECT_TRUE( | |
1109 controller().WillHandleLongPressEvent(base::TimeTicks(), inner_point)); | |
1110 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_SHOWN)); | |
1111 } | 893 } |
1112 | 894 |
1113 TEST_F(TouchSelectionControllerTest, LongPressDrag) { | 895 TEST_F(TouchSelectionControllerTest, LongPressDrag) { |
1114 EnableLongPressDragSelection(); | 896 EnableLongPressDragSelection(); |
1115 TouchSelectionControllerTestApi test_controller(&controller()); | 897 TouchSelectionControllerTestApi test_controller(&controller()); |
1116 | 898 |
1117 gfx::RectF start_rect(-50, 0, 0, 10); | 899 gfx::RectF start_rect(-50, 0, 0, 10); |
1118 gfx::RectF end_rect(50, 0, 0, 10); | 900 gfx::RectF end_rect(50, 0, 0, 10); |
1119 bool visible = true; | 901 bool visible = true; |
1120 | 902 |
1121 // Start a touch sequence. | 903 // Start a touch sequence. |
1122 MockMotionEvent event; | 904 MockMotionEvent event; |
1123 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0))); | 905 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0))); |
1124 | 906 |
1125 // Activate a longpress-triggered selection. | 907 // Activate a longpress-triggered selection. |
1126 OnLongPressEvent(); | 908 OnLongPressEvent(); |
1127 ChangeSelection(start_rect, visible, end_rect, visible); | 909 ChangeSelection(start_rect, visible, end_rect, visible); |
1128 EXPECT_THAT(GetAndResetEvents(), | 910 EXPECT_THAT(GetAndResetEvents(), |
1129 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 911 ElementsAre(SELECTION_HANDLES_SHOWN)); |
1130 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 912 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
1131 | 913 |
1132 // The handles should remain invisible while the touch release and longpress | 914 // The handles should remain invisible while the touch release and longpress |
1133 // drag gesture are pending. | 915 // drag gesture are pending. |
1134 EXPECT_FALSE(test_controller.GetStartVisible()); | 916 EXPECT_FALSE(test_controller.GetStartVisible()); |
1135 EXPECT_FALSE(test_controller.GetEndVisible()); | 917 EXPECT_FALSE(test_controller.GetEndVisible()); |
1136 | 918 |
1137 // The selection coordinates should reflect the drag movement. | 919 // The selection coordinates should reflect the drag movement. |
1138 gfx::PointF fixed_offset = start_rect.CenterPoint(); | 920 gfx::PointF fixed_offset = start_rect.CenterPoint(); |
1139 gfx::PointF end_offset = end_rect.CenterPoint(); | 921 gfx::PointF end_offset = end_rect.CenterPoint(); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1185 bool visible = true; | 967 bool visible = true; |
1186 | 968 |
1187 // Start a touch sequence. | 969 // Start a touch sequence. |
1188 MockMotionEvent event; | 970 MockMotionEvent event; |
1189 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0))); | 971 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0))); |
1190 | 972 |
1191 // Activate a longpress-triggered selection. | 973 // Activate a longpress-triggered selection. |
1192 OnLongPressEvent(); | 974 OnLongPressEvent(); |
1193 ChangeSelection(start_rect, visible, end_rect, visible); | 975 ChangeSelection(start_rect, visible, end_rect, visible); |
1194 EXPECT_THAT(GetAndResetEvents(), | 976 EXPECT_THAT(GetAndResetEvents(), |
1195 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 977 ElementsAre(SELECTION_HANDLES_SHOWN)); |
1196 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 978 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
1197 | 979 |
1198 // The handles should remain invisible while the touch release and longpress | 980 // The handles should remain invisible while the touch release and longpress |
1199 // drag gesture are pending. | 981 // drag gesture are pending. |
1200 EXPECT_FALSE(test_controller.GetStartVisible()); | 982 EXPECT_FALSE(test_controller.GetStartVisible()); |
1201 EXPECT_FALSE(test_controller.GetEndVisible()); | 983 EXPECT_FALSE(test_controller.GetEndVisible()); |
1202 | 984 |
1203 // If no drag movement occurs, the handles should reappear after the touch | 985 // If no drag movement occurs, the handles should reappear after the touch |
1204 // is released. | 986 // is released. |
1205 EXPECT_FALSE(controller().WillHandleTouchEvent(event.ReleasePoint())); | 987 EXPECT_FALSE(controller().WillHandleTouchEvent(event.ReleasePoint())); |
(...skipping 11 matching lines...) Expand all Loading... |
1217 bool visible = true; | 999 bool visible = true; |
1218 | 1000 |
1219 // Start a touch sequence. | 1001 // Start a touch sequence. |
1220 MockMotionEvent event; | 1002 MockMotionEvent event; |
1221 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0))); | 1003 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0))); |
1222 | 1004 |
1223 // Activate a longpress-triggered selection. | 1005 // Activate a longpress-triggered selection. |
1224 OnLongPressEvent(); | 1006 OnLongPressEvent(); |
1225 ChangeSelection(start_rect, visible, end_rect, visible); | 1007 ChangeSelection(start_rect, visible, end_rect, visible); |
1226 EXPECT_THAT(GetAndResetEvents(), | 1008 EXPECT_THAT(GetAndResetEvents(), |
1227 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 1009 ElementsAre(SELECTION_HANDLES_SHOWN)); |
1228 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 1010 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
1229 EXPECT_TRUE(test_controller.GetStartVisible()); | 1011 EXPECT_TRUE(test_controller.GetStartVisible()); |
1230 EXPECT_TRUE(test_controller.GetEndVisible()); | 1012 EXPECT_TRUE(test_controller.GetEndVisible()); |
1231 | 1013 |
1232 // Subsequent motion of the same touch sequence after longpress shouldn't | 1014 // Subsequent motion of the same touch sequence after longpress shouldn't |
1233 // trigger drag selection. | 1015 // trigger drag selection. |
1234 EXPECT_FALSE(controller().WillHandleTouchEvent(event.MovePoint(0, 0, 0))); | 1016 EXPECT_FALSE(controller().WillHandleTouchEvent(event.MovePoint(0, 0, 0))); |
1235 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 1017 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
1236 | 1018 |
1237 EXPECT_FALSE(controller().WillHandleTouchEvent( | 1019 EXPECT_FALSE(controller().WillHandleTouchEvent( |
1238 event.MovePoint(0, 0, kDefaulTapSlop * 10))); | 1020 event.MovePoint(0, 0, kDefaulTapSlop * 10))); |
1239 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 1021 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
1240 | 1022 |
1241 // Releasing the touch sequence should have no effect. | 1023 // Releasing the touch sequence should have no effect. |
1242 EXPECT_FALSE(controller().WillHandleTouchEvent(event.ReleasePoint())); | 1024 EXPECT_FALSE(controller().WillHandleTouchEvent(event.ReleasePoint())); |
1243 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 1025 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
1244 EXPECT_TRUE(test_controller.GetStartVisible()); | 1026 EXPECT_TRUE(test_controller.GetStartVisible()); |
1245 EXPECT_TRUE(test_controller.GetEndVisible()); | 1027 EXPECT_TRUE(test_controller.GetEndVisible()); |
1246 } | 1028 } |
1247 | 1029 |
1248 // When there is a selection on the page and long-press drag is performed | |
1249 // somewhere that has nothing to select, long-press drag selector should not get | |
1250 // activated so the page can scroll. | |
1251 TEST_F(TouchSelectionControllerTest, LongPressDragScroll) { | |
1252 EnableLongPressDragSelection(); | |
1253 TouchSelectionControllerTestApi test_controller(&controller()); | |
1254 | |
1255 gfx::RectF start_rect(10, 0, 0, 10); | |
1256 gfx::RectF end_rect(20, 0, 0, 10); | |
1257 gfx::PointF touch_point(0, 0); | |
1258 bool visible = true; | |
1259 MockMotionEvent event; | |
1260 | |
1261 // Pre-select something. | |
1262 ChangeSelection(start_rect, visible, end_rect, visible); | |
1263 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_ESTABLISHED)); | |
1264 | |
1265 // Start the touch sequence and perform the long-press out of the existing | |
1266 // selection. | |
1267 EXPECT_FALSE(controller().WillHandleTouchEvent( | |
1268 event.PressPoint(touch_point.x(), touch_point.y()))); | |
1269 OnLongPressEvent(); | |
1270 | |
1271 // Drag down. Selection controller should not consume the touch-move event. | |
1272 touch_point.Offset(0, 2 * kDefaulTapSlop); | |
1273 EXPECT_FALSE(controller().WillHandleTouchEvent( | |
1274 event.MovePoint(0, touch_point.x(), touch_point.y()))); | |
1275 | |
1276 // Begin page scroll and update the selection. Selection handles should not be | |
1277 // shown which means long-press drag selector is not activated. | |
1278 controller().OnScrollBeginEvent(); | |
1279 start_rect.Offset(0, 2 * kDefaulTapSlop); | |
1280 end_rect.Offset(0, 2 * kDefaulTapSlop); | |
1281 ChangeSelection(start_rect, visible, end_rect, visible); | |
1282 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | |
1283 | |
1284 // Release the touch sequence. | |
1285 EXPECT_FALSE(controller().WillHandleTouchEvent(event.ReleasePoint())); | |
1286 } | |
1287 | |
1288 TEST_F(TouchSelectionControllerTest, RectBetweenBounds) { | 1030 TEST_F(TouchSelectionControllerTest, RectBetweenBounds) { |
1289 gfx::RectF start_rect(5, 5, 0, 10); | 1031 gfx::RectF start_rect(5, 5, 0, 10); |
1290 gfx::RectF end_rect(50, 5, 0, 10); | 1032 gfx::RectF end_rect(50, 5, 0, 10); |
1291 bool visible = true; | 1033 bool visible = true; |
1292 | 1034 |
1293 EXPECT_EQ(gfx::RectF(), controller().GetRectBetweenBounds()); | 1035 EXPECT_EQ(gfx::RectF(), controller().GetRectBetweenBounds()); |
1294 | 1036 |
1295 OnLongPressEvent(); | 1037 OnLongPressEvent(); |
1296 ChangeSelection(start_rect, visible, end_rect, visible); | 1038 ChangeSelection(start_rect, visible, end_rect, visible); |
1297 ASSERT_THAT(GetAndResetEvents(), | 1039 ASSERT_THAT(GetAndResetEvents(), |
1298 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 1040 ElementsAre(SELECTION_HANDLES_SHOWN)); |
1299 EXPECT_EQ(gfx::RectF(5, 5, 45, 10), controller().GetRectBetweenBounds()); | 1041 EXPECT_EQ(gfx::RectF(5, 5, 45, 10), controller().GetRectBetweenBounds()); |
1300 | 1042 |
1301 // The result of |GetRectBetweenBounds| should be available within the | 1043 // The result of |GetRectBetweenBounds| should be available within the |
1302 // |OnSelectionEvent| callback, as stored by |GetLastEventBoundsRect()|. | 1044 // |OnSelectionEvent| callback, as stored by |GetLastEventBoundsRect()|. |
1303 EXPECT_EQ(GetLastEventBoundsRect(), controller().GetRectBetweenBounds()); | 1045 EXPECT_EQ(GetLastEventBoundsRect(), controller().GetRectBetweenBounds()); |
1304 | 1046 |
1305 start_rect.Offset(1, 0); | 1047 start_rect.Offset(1, 0); |
1306 ChangeSelection(start_rect, visible, end_rect, visible); | 1048 ChangeSelection(start_rect, visible, end_rect, visible); |
1307 ASSERT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); | 1049 ASSERT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); |
1308 EXPECT_EQ(gfx::RectF(6, 5, 44, 10), controller().GetRectBetweenBounds()); | 1050 EXPECT_EQ(gfx::RectF(6, 5, 44, 10), controller().GetRectBetweenBounds()); |
(...skipping 12 matching lines...) Expand all Loading... |
1321 EXPECT_EQ(GetLastEventBoundsRect(), controller().GetRectBetweenBounds()); | 1063 EXPECT_EQ(GetLastEventBoundsRect(), controller().GetRectBetweenBounds()); |
1322 | 1064 |
1323 // If both bounds are visible, the full bounding rect should be returned. | 1065 // If both bounds are visible, the full bounding rect should be returned. |
1324 ChangeSelection(start_rect, false, end_rect, false); | 1066 ChangeSelection(start_rect, false, end_rect, false); |
1325 ASSERT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); | 1067 ASSERT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); |
1326 EXPECT_EQ(gfx::RectF(6, 5, 44, 10), controller().GetRectBetweenBounds()); | 1068 EXPECT_EQ(gfx::RectF(6, 5, 44, 10), controller().GetRectBetweenBounds()); |
1327 EXPECT_EQ(GetLastEventBoundsRect(), controller().GetRectBetweenBounds()); | 1069 EXPECT_EQ(GetLastEventBoundsRect(), controller().GetRectBetweenBounds()); |
1328 | 1070 |
1329 ClearSelection(); | 1071 ClearSelection(); |
1330 ASSERT_THAT(GetAndResetEvents(), | 1072 ASSERT_THAT(GetAndResetEvents(), |
1331 ElementsAre(SELECTION_DISSOLVED, SELECTION_HANDLES_CLEARED)); | 1073 ElementsAre(SELECTION_HANDLES_CLEARED)); |
1332 EXPECT_EQ(gfx::RectF(), controller().GetRectBetweenBounds()); | 1074 EXPECT_EQ(gfx::RectF(), controller().GetRectBetweenBounds()); |
1333 } | 1075 } |
1334 | 1076 |
1335 TEST_F(TouchSelectionControllerTest, SelectionNoOrientationChangeWhenSwapped) { | 1077 TEST_F(TouchSelectionControllerTest, SelectionNoOrientationChangeWhenSwapped) { |
1336 TouchSelectionControllerTestApi test_controller(&controller()); | 1078 TouchSelectionControllerTestApi test_controller(&controller()); |
1337 base::TimeTicks event_time = base::TimeTicks::Now(); | 1079 base::TimeTicks event_time = base::TimeTicks::Now(); |
1338 OnLongPressEvent(); | 1080 OnLongPressEvent(); |
1339 | 1081 |
1340 float line_height = 10.f; | 1082 float line_height = 10.f; |
1341 gfx::RectF start_rect(50, line_height, 0, line_height); | 1083 gfx::RectF start_rect(50, line_height, 0, line_height); |
1342 gfx::RectF end_rect(100, line_height, 0, line_height); | 1084 gfx::RectF end_rect(100, line_height, 0, line_height); |
1343 bool visible = true; | 1085 bool visible = true; |
1344 ChangeSelection(start_rect, visible, end_rect, visible); | 1086 ChangeSelection(start_rect, visible, end_rect, visible); |
1345 EXPECT_THAT(GetAndResetEvents(), | 1087 EXPECT_THAT(GetAndResetEvents(), |
1346 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 1088 ElementsAre(SELECTION_HANDLES_SHOWN)); |
1347 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 1089 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
1348 EXPECT_EQ(test_controller.GetStartHandleOrientation(), | 1090 EXPECT_EQ(test_controller.GetStartHandleOrientation(), |
1349 TouchHandleOrientation::LEFT); | 1091 TouchHandleOrientation::LEFT); |
1350 EXPECT_EQ(test_controller.GetEndHandleOrientation(), | 1092 EXPECT_EQ(test_controller.GetEndHandleOrientation(), |
1351 TouchHandleOrientation::RIGHT); | 1093 TouchHandleOrientation::RIGHT); |
1352 | 1094 |
1353 SetDraggingEnabled(true); | 1095 SetDraggingEnabled(true); |
1354 | 1096 |
1355 // Simulate moving the base, not triggering a swap of points. | 1097 // Simulate moving the base, not triggering a swap of points. |
1356 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, | 1098 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1444 offset_rect.x(), offset_rect.bottom()); | 1186 offset_rect.x(), offset_rect.bottom()); |
1445 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 1187 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
1446 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STOPPED)); | 1188 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STOPPED)); |
1447 EXPECT_EQ(test_controller.GetStartHandleOrientation(), | 1189 EXPECT_EQ(test_controller.GetStartHandleOrientation(), |
1448 TouchHandleOrientation::LEFT); | 1190 TouchHandleOrientation::LEFT); |
1449 EXPECT_EQ(test_controller.GetEndHandleOrientation(), | 1191 EXPECT_EQ(test_controller.GetEndHandleOrientation(), |
1450 TouchHandleOrientation::RIGHT); | 1192 TouchHandleOrientation::RIGHT); |
1451 } | 1193 } |
1452 | 1194 |
1453 } // namespace ui | 1195 } // namespace ui |
OLD | NEW |