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

Side by Side Diff: ui/touch_selection/touch_selection_controller_unittest.cc

Issue 1102933003: [Contextual Search] Add support for tap on the selection. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Moved implementation methods to match declaration order. Used INACTIVE for active_status_ state ch… Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ui/touch_selection/touch_selection_controller.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « ui/touch_selection/touch_selection_controller.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698