| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <stddef.h> | 5 #include <stddef.h> |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/macros.h" | 8 #include "base/macros.h" |
| 9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
| 10 #include "ui/aura/client/screen_position_client.h" | 10 #include "ui/aura/client/screen_position_client.h" |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 146 void SimulateSelectionHandleDrag(gfx::Vector2d v, int selection_handle) { | 146 void SimulateSelectionHandleDrag(gfx::Vector2d v, int selection_handle) { |
| 147 TouchSelectionControllerImpl* controller = GetSelectionController(); | 147 TouchSelectionControllerImpl* controller = GetSelectionController(); |
| 148 views::WidgetDelegateView* handle = nullptr; | 148 views::WidgetDelegateView* handle = nullptr; |
| 149 if (selection_handle == 1) | 149 if (selection_handle == 1) |
| 150 handle = controller->GetHandle1View(); | 150 handle = controller->GetHandle1View(); |
| 151 else | 151 else |
| 152 handle = controller->GetHandle2View(); | 152 handle = controller->GetHandle2View(); |
| 153 | 153 |
| 154 gfx::Point grip_location = gfx::Point(handle->size().width() / 2, | 154 gfx::Point grip_location = gfx::Point(handle->size().width() / 2, |
| 155 handle->size().height() / 2); | 155 handle->size().height() / 2); |
| 156 base::TimeDelta time_stamp = base::TimeDelta(); | 156 base::TimeTicks time_stamp = base::TimeTicks(); |
| 157 { | 157 { |
| 158 ui::GestureEventDetails details(ui::ET_GESTURE_SCROLL_BEGIN); | 158 ui::GestureEventDetails details(ui::ET_GESTURE_SCROLL_BEGIN); |
| 159 ui::GestureEvent scroll_begin( | 159 ui::GestureEvent scroll_begin( |
| 160 grip_location.x(), grip_location.y(), 0, time_stamp, details); | 160 grip_location.x(), grip_location.y(), 0, time_stamp, details); |
| 161 handle->OnGestureEvent(&scroll_begin); | 161 handle->OnGestureEvent(&scroll_begin); |
| 162 } | 162 } |
| 163 test_cursor_client_->DisableMouseEvents(); | 163 test_cursor_client_->DisableMouseEvents(); |
| 164 { | 164 { |
| 165 ui::GestureEventDetails details(ui::ET_GESTURE_SCROLL_UPDATE); | 165 ui::GestureEventDetails details(ui::ET_GESTURE_SCROLL_UPDATE); |
| 166 gfx::Point update_location = grip_location + v; | 166 gfx::Point update_location = grip_location + v; |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 281 CreateTextfield(); | 281 CreateTextfield(); |
| 282 std::string some_text("some text"); | 282 std::string some_text("some text"); |
| 283 std::string textfield_text; | 283 std::string textfield_text; |
| 284 for (int i = 0; i < 10; ++i) | 284 for (int i = 0; i < 10; ++i) |
| 285 textfield_text += some_text; | 285 textfield_text += some_text; |
| 286 textfield_->SetText(ASCIIToUTF16(textfield_text)); | 286 textfield_->SetText(ASCIIToUTF16(textfield_text)); |
| 287 | 287 |
| 288 // Tap the textfield to invoke selection. | 288 // Tap the textfield to invoke selection. |
| 289 ui::GestureEventDetails details(ui::ET_GESTURE_TAP); | 289 ui::GestureEventDetails details(ui::ET_GESTURE_TAP); |
| 290 details.set_tap_count(1); | 290 details.set_tap_count(1); |
| 291 ui::GestureEvent tap(0, 0, 0, base::TimeDelta(), details); | 291 ui::GestureEvent tap(0, 0, 0, base::TimeTicks(), details); |
| 292 textfield_->OnGestureEvent(&tap); | 292 textfield_->OnGestureEvent(&tap); |
| 293 | 293 |
| 294 // Select some text such that one handle is hidden. | 294 // Select some text such that one handle is hidden. |
| 295 textfield_->SelectRange(gfx::Range( | 295 textfield_->SelectRange(gfx::Range( |
| 296 selection_start, static_cast<uint32_t>(textfield_text.length()))); | 296 selection_start, static_cast<uint32_t>(textfield_text.length()))); |
| 297 | 297 |
| 298 // Check that one selection handle is hidden. | 298 // Check that one selection handle is hidden. |
| 299 EXPECT_FALSE(IsSelectionHandle1Visible()); | 299 EXPECT_FALSE(IsSelectionHandle1Visible()); |
| 300 EXPECT_TRUE(IsSelectionHandle2Visible()); | 300 EXPECT_TRUE(IsSelectionHandle2Visible()); |
| 301 EXPECT_EQ(gfx::Range(selection_start, | 301 EXPECT_EQ(gfx::Range(selection_start, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 316 }; | 316 }; |
| 317 | 317 |
| 318 // Tests that the selection handles are placed appropriately when selection in | 318 // Tests that the selection handles are placed appropriately when selection in |
| 319 // a Textfield changes. | 319 // a Textfield changes. |
| 320 TEST_F(TouchSelectionControllerImplTest, SelectionInTextfieldTest) { | 320 TEST_F(TouchSelectionControllerImplTest, SelectionInTextfieldTest) { |
| 321 CreateTextfield(); | 321 CreateTextfield(); |
| 322 textfield_->SetText(ASCIIToUTF16("some text")); | 322 textfield_->SetText(ASCIIToUTF16("some text")); |
| 323 // Tap the textfield to invoke touch selection. | 323 // Tap the textfield to invoke touch selection. |
| 324 ui::GestureEventDetails details(ui::ET_GESTURE_TAP); | 324 ui::GestureEventDetails details(ui::ET_GESTURE_TAP); |
| 325 details.set_tap_count(1); | 325 details.set_tap_count(1); |
| 326 ui::GestureEvent tap(0, 0, 0, base::TimeDelta(), details); | 326 ui::GestureEvent tap(0, 0, 0, base::TimeTicks(), details); |
| 327 textfield_->OnGestureEvent(&tap); | 327 textfield_->OnGestureEvent(&tap); |
| 328 | 328 |
| 329 // Test selecting a range. | 329 // Test selecting a range. |
| 330 textfield_->SelectRange(gfx::Range(3, 7)); | 330 textfield_->SelectRange(gfx::Range(3, 7)); |
| 331 VerifyHandlePositions(false, true, FROM_HERE); | 331 VerifyHandlePositions(false, true, FROM_HERE); |
| 332 | 332 |
| 333 // Test selecting everything. | 333 // Test selecting everything. |
| 334 textfield_->SelectAll(false); | 334 textfield_->SelectAll(false); |
| 335 VerifyHandlePositions(false, true, FROM_HERE); | 335 VerifyHandlePositions(false, true, FROM_HERE); |
| 336 | 336 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 349 VerifyHandlePositions(false, true, FROM_HERE); | 349 VerifyHandlePositions(false, true, FROM_HERE); |
| 350 } | 350 } |
| 351 | 351 |
| 352 // Tests that the selection handles are placed appropriately in bidi text. | 352 // Tests that the selection handles are placed appropriately in bidi text. |
| 353 TEST_F(TouchSelectionControllerImplTest, SelectionInBidiTextfieldTest) { | 353 TEST_F(TouchSelectionControllerImplTest, SelectionInBidiTextfieldTest) { |
| 354 CreateTextfield(); | 354 CreateTextfield(); |
| 355 textfield_->SetText(WideToUTF16(L"abc\x05d0\x05d1\x05d2")); | 355 textfield_->SetText(WideToUTF16(L"abc\x05d0\x05d1\x05d2")); |
| 356 // Tap the textfield to invoke touch selection. | 356 // Tap the textfield to invoke touch selection. |
| 357 ui::GestureEventDetails details(ui::ET_GESTURE_TAP); | 357 ui::GestureEventDetails details(ui::ET_GESTURE_TAP); |
| 358 details.set_tap_count(1); | 358 details.set_tap_count(1); |
| 359 ui::GestureEvent tap(0, 0, 0, base::TimeDelta(), details); | 359 ui::GestureEvent tap(0, 0, 0, base::TimeTicks(), details); |
| 360 textfield_->OnGestureEvent(&tap); | 360 textfield_->OnGestureEvent(&tap); |
| 361 | 361 |
| 362 // Test cursor at run boundary and with empty selection. | 362 // Test cursor at run boundary and with empty selection. |
| 363 textfield_->SelectSelectionModel( | 363 textfield_->SelectSelectionModel( |
| 364 gfx::SelectionModel(3, gfx::CURSOR_BACKWARD)); | 364 gfx::SelectionModel(3, gfx::CURSOR_BACKWARD)); |
| 365 VerifyHandlePositions(false, true, FROM_HERE); | 365 VerifyHandlePositions(false, true, FROM_HERE); |
| 366 | 366 |
| 367 // Test selection range inside one run and starts or ends at run boundary. | 367 // Test selection range inside one run and starts or ends at run boundary. |
| 368 textfield_->SelectRange(gfx::Range(2, 3)); | 368 textfield_->SelectRange(gfx::Range(2, 3)); |
| 369 VerifyHandlePositions(false, true, FROM_HERE); | 369 VerifyHandlePositions(false, true, FROM_HERE); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 401 } | 401 } |
| 402 | 402 |
| 403 // Tests if the SelectRect callback is called appropriately when selection | 403 // Tests if the SelectRect callback is called appropriately when selection |
| 404 // handles are moved. | 404 // handles are moved. |
| 405 TEST_F(TouchSelectionControllerImplTest, SelectRectCallbackTest) { | 405 TEST_F(TouchSelectionControllerImplTest, SelectRectCallbackTest) { |
| 406 CreateTextfield(); | 406 CreateTextfield(); |
| 407 textfield_->SetText(ASCIIToUTF16("textfield with selected text")); | 407 textfield_->SetText(ASCIIToUTF16("textfield with selected text")); |
| 408 // Tap the textfield to invoke touch selection. | 408 // Tap the textfield to invoke touch selection. |
| 409 ui::GestureEventDetails details(ui::ET_GESTURE_TAP); | 409 ui::GestureEventDetails details(ui::ET_GESTURE_TAP); |
| 410 details.set_tap_count(1); | 410 details.set_tap_count(1); |
| 411 ui::GestureEvent tap(0, 0, 0, base::TimeDelta(), details); | 411 ui::GestureEvent tap(0, 0, 0, base::TimeTicks(), details); |
| 412 textfield_->OnGestureEvent(&tap); | 412 textfield_->OnGestureEvent(&tap); |
| 413 textfield_->SelectRange(gfx::Range(3, 7)); | 413 textfield_->SelectRange(gfx::Range(3, 7)); |
| 414 | 414 |
| 415 gfx::Point textfield_origin; | 415 gfx::Point textfield_origin; |
| 416 textfield_->ConvertPointToScreen(&textfield_origin); | 416 textfield_->ConvertPointToScreen(&textfield_origin); |
| 417 | 417 |
| 418 EXPECT_EQ("tfie", UTF16ToUTF8(textfield_->GetSelectedText())); | 418 EXPECT_EQ("tfie", UTF16ToUTF8(textfield_->GetSelectedText())); |
| 419 VerifyHandlePositions(false, true, FROM_HERE); | 419 VerifyHandlePositions(false, true, FROM_HERE); |
| 420 | 420 |
| 421 // Drag selection handle 2 to right by 3 chars. | 421 // Drag selection handle 2 to right by 3 chars. |
| (...skipping 21 matching lines...) Expand all Loading... |
| 443 EXPECT_EQ("selected ", UTF16ToUTF8(textfield_->GetSelectedText())); | 443 EXPECT_EQ("selected ", UTF16ToUTF8(textfield_->GetSelectedText())); |
| 444 VerifyHandlePositions(false, true, FROM_HERE); | 444 VerifyHandlePositions(false, true, FROM_HERE); |
| 445 } | 445 } |
| 446 | 446 |
| 447 TEST_F(TouchSelectionControllerImplTest, SelectRectInBidiCallbackTest) { | 447 TEST_F(TouchSelectionControllerImplTest, SelectRectInBidiCallbackTest) { |
| 448 CreateTextfield(); | 448 CreateTextfield(); |
| 449 textfield_->SetText(WideToUTF16(L"abc\x05e1\x05e2\x05e3" L"def")); | 449 textfield_->SetText(WideToUTF16(L"abc\x05e1\x05e2\x05e3" L"def")); |
| 450 // Tap the textfield to invoke touch selection. | 450 // Tap the textfield to invoke touch selection. |
| 451 ui::GestureEventDetails details(ui::ET_GESTURE_TAP); | 451 ui::GestureEventDetails details(ui::ET_GESTURE_TAP); |
| 452 details.set_tap_count(1); | 452 details.set_tap_count(1); |
| 453 ui::GestureEvent tap(0, 0, 0, base::TimeDelta(), details); | 453 ui::GestureEvent tap(0, 0, 0, base::TimeTicks(), details); |
| 454 textfield_->OnGestureEvent(&tap); | 454 textfield_->OnGestureEvent(&tap); |
| 455 | 455 |
| 456 // Select [c] from left to right. | 456 // Select [c] from left to right. |
| 457 textfield_->SelectRange(gfx::Range(2, 3)); | 457 textfield_->SelectRange(gfx::Range(2, 3)); |
| 458 EXPECT_EQ(WideToUTF16(L"c"), textfield_->GetSelectedText()); | 458 EXPECT_EQ(WideToUTF16(L"c"), textfield_->GetSelectedText()); |
| 459 VerifyHandlePositions(false, true, FROM_HERE); | 459 VerifyHandlePositions(false, true, FROM_HERE); |
| 460 | 460 |
| 461 // Drag selection handle 2 to right by 1 char. | 461 // Drag selection handle 2 to right by 1 char. |
| 462 const gfx::FontList& font_list = textfield_->GetFontList(); | 462 const gfx::FontList& font_list = textfield_->GetFontList(); |
| 463 int x = gfx::Canvas::GetStringWidth(WideToUTF16(L"\x05e3"), font_list); | 463 int x = gfx::Canvas::GetStringWidth(WideToUTF16(L"\x05e3"), font_list); |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 568 x = gfx::Canvas::GetStringWidth(WideToUTF16(L"\x05e2"), font_list); | 568 x = gfx::Canvas::GetStringWidth(WideToUTF16(L"\x05e2"), font_list); |
| 569 SimulateSelectionHandleDrag(gfx::Vector2d(x, 0), 2); | 569 SimulateSelectionHandleDrag(gfx::Vector2d(x, 0), 2); |
| 570 EXPECT_EQ(WideToUTF16(L"c\x05e1"), textfield_->GetSelectedText()); | 570 EXPECT_EQ(WideToUTF16(L"c\x05e1"), textfield_->GetSelectedText()); |
| 571 VerifyHandlePositions(false, false, FROM_HERE); | 571 VerifyHandlePositions(false, false, FROM_HERE); |
| 572 } | 572 } |
| 573 | 573 |
| 574 TEST_F(TouchSelectionControllerImplTest, | 574 TEST_F(TouchSelectionControllerImplTest, |
| 575 HiddenSelectionHandleRetainsCursorPosition) { | 575 HiddenSelectionHandleRetainsCursorPosition) { |
| 576 static const uint32_t selection_start = 10u; | 576 static const uint32_t selection_start = 10u; |
| 577 SetupSelectionInvisibleHandle(selection_start); | 577 SetupSelectionInvisibleHandle(selection_start); |
| 578 | |
| 579 // Drag the visible handle around and make sure the selection end point of the | 578 // Drag the visible handle around and make sure the selection end point of the |
| 580 // invisible handle does not change. | 579 // invisible handle does not change. |
| 581 size_t visible_handle_position = textfield_->GetSelectedRange().end(); | 580 size_t visible_handle_position = textfield_->GetSelectedRange().end(); |
| 582 for (int i = 0; i < 10; ++i) { | 581 for (int i = 0; i < 10; ++i) { |
| 583 static const int drag_diff = -10; | 582 static const int drag_diff = -10; |
| 584 SimulateSelectionHandleDrag(gfx::Vector2d(drag_diff, 0), 2); | 583 SimulateSelectionHandleDrag(gfx::Vector2d(drag_diff, 0), 2); |
| 585 // Make sure that the visible handle is being dragged. | 584 // Make sure that the visible handle is being dragged. |
| 586 EXPECT_NE(visible_handle_position, textfield_->GetSelectedRange().end()); | 585 EXPECT_NE(visible_handle_position, textfield_->GetSelectedRange().end()); |
| 587 visible_handle_position = textfield_->GetSelectedRange().end(); | 586 visible_handle_position = textfield_->GetSelectedRange().end(); |
| 588 EXPECT_EQ((size_t) 10, textfield_->GetSelectedRange().start()); | 587 EXPECT_EQ((size_t) 10, textfield_->GetSelectedRange().start()); |
| (...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 844 | 843 |
| 845 ui::test::EventGenerator generator( | 844 ui::test::EventGenerator generator( |
| 846 textfield_widget_->GetNativeView()->GetRootWindow()); | 845 textfield_widget_->GetNativeView()->GetRootWindow()); |
| 847 RunPendingMessages(); | 846 RunPendingMessages(); |
| 848 | 847 |
| 849 // Start touch editing; then generate a mouse-capture-changed event and ensure | 848 // Start touch editing; then generate a mouse-capture-changed event and ensure |
| 850 // it does not deactivate touch selection. | 849 // it does not deactivate touch selection. |
| 851 StartTouchEditing(); | 850 StartTouchEditing(); |
| 852 EXPECT_TRUE(GetSelectionController()); | 851 EXPECT_TRUE(GetSelectionController()); |
| 853 ui::MouseEvent capture_changed(ui::ET_MOUSE_CAPTURE_CHANGED, gfx::Point(5, 5), | 852 ui::MouseEvent capture_changed(ui::ET_MOUSE_CAPTURE_CHANGED, gfx::Point(5, 5), |
| 854 gfx::Point(5, 5), base::TimeDelta(), 0, 0); | 853 gfx::Point(5, 5), base::TimeTicks(), 0, 0); |
| 855 generator.Dispatch(&capture_changed); | 854 generator.Dispatch(&capture_changed); |
| 856 RunPendingMessages(); | 855 RunPendingMessages(); |
| 857 EXPECT_TRUE(GetSelectionController()); | 856 EXPECT_TRUE(GetSelectionController()); |
| 858 } | 857 } |
| 859 | 858 |
| 860 TEST_F(TouchSelectionControllerImplTest, KeyEventDeactivatesTouchSelection) { | 859 TEST_F(TouchSelectionControllerImplTest, KeyEventDeactivatesTouchSelection) { |
| 861 CreateTextfield(); | 860 CreateTextfield(); |
| 862 EXPECT_FALSE(GetSelectionController()); | 861 EXPECT_FALSE(GetSelectionController()); |
| 863 | 862 |
| 864 ui::test::EventGenerator generator( | 863 ui::test::EventGenerator generator( |
| 865 textfield_widget_->GetNativeView()->GetRootWindow()); | 864 textfield_widget_->GetNativeView()->GetRootWindow()); |
| 866 | 865 |
| 867 RunPendingMessages(); | 866 RunPendingMessages(); |
| 868 | 867 |
| 869 // Start touch editing; then press a key and ensure it deactivates touch | 868 // Start touch editing; then press a key and ensure it deactivates touch |
| 870 // selection. | 869 // selection. |
| 871 StartTouchEditing(); | 870 StartTouchEditing(); |
| 872 EXPECT_TRUE(GetSelectionController()); | 871 EXPECT_TRUE(GetSelectionController()); |
| 873 generator.PressKey(ui::VKEY_A, 0); | 872 generator.PressKey(ui::VKEY_A, 0); |
| 874 RunPendingMessages(); | 873 RunPendingMessages(); |
| 875 EXPECT_FALSE(GetSelectionController()); | 874 EXPECT_FALSE(GetSelectionController()); |
| 876 } | 875 } |
| 877 | 876 |
| 878 } // namespace views | 877 } // namespace views |
| OLD | NEW |