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