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 "base/command_line.h" | 5 #include "base/command_line.h" |
6 #include "base/strings/utf_string_conversions.h" | 6 #include "base/strings/utf_string_conversions.h" |
7 #include "grit/ui_resources.h" | 7 #include "grit/ui_resources.h" |
8 #include "ui/base/resource/resource_bundle.h" | 8 #include "ui/base/resource/resource_bundle.h" |
9 #include "ui/base/touch/touch_editing_controller.h" | 9 #include "ui/base/touch/touch_editing_controller.h" |
10 #include "ui/base/ui_base_switches.h" | 10 #include "ui/base/ui_base_switches.h" |
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
277 // Tap the textfield to invoke touch selection. | 277 // Tap the textfield to invoke touch selection. |
278 ui::GestureEvent tap(ui::ET_GESTURE_TAP, 0, 0, 0, base::TimeDelta(), | 278 ui::GestureEvent tap(ui::ET_GESTURE_TAP, 0, 0, 0, base::TimeDelta(), |
279 ui::GestureEventDetails(ui::ET_GESTURE_TAP, 1.0f, 0.0f), 0); | 279 ui::GestureEventDetails(ui::ET_GESTURE_TAP, 1.0f, 0.0f), 0); |
280 textfield_view_->OnGestureEvent(&tap); | 280 textfield_view_->OnGestureEvent(&tap); |
281 textfield_->SelectRange(ui::Range(3, 7)); | 281 textfield_->SelectRange(ui::Range(3, 7)); |
282 | 282 |
283 EXPECT_EQ(UTF16ToUTF8(textfield_->GetSelectedText()), "tfie"); | 283 EXPECT_EQ(UTF16ToUTF8(textfield_->GetSelectedText()), "tfie"); |
284 VERIFY_HANDLE_POSITIONS(false); | 284 VERIFY_HANDLE_POSITIONS(false); |
285 | 285 |
286 // Drag selection handle 2 to right by 3 chars. | 286 // Drag selection handle 2 to right by 3 chars. |
287 int x = textfield_->font().GetStringWidth(ASCIIToUTF16("ld ")); | 287 const gfx::Font& font = textfield_->GetPrimaryFont(); |
| 288 int x = font.GetStringWidth(ASCIIToUTF16("ld ")); |
288 SimulateSelectionHandleDrag(gfx::Point(x, 0), 2); | 289 SimulateSelectionHandleDrag(gfx::Point(x, 0), 2); |
289 EXPECT_EQ(UTF16ToUTF8(textfield_->GetSelectedText()), "tfield "); | 290 EXPECT_EQ(UTF16ToUTF8(textfield_->GetSelectedText()), "tfield "); |
290 VERIFY_HANDLE_POSITIONS(false); | 291 VERIFY_HANDLE_POSITIONS(false); |
291 | 292 |
292 // Drag selection handle 1 to the left by a large amount (selection should | 293 // Drag selection handle 1 to the left by a large amount (selection should |
293 // just stick to the beginning of the textfield). | 294 // just stick to the beginning of the textfield). |
294 SimulateSelectionHandleDrag(gfx::Point(-50, 0), 1); | 295 SimulateSelectionHandleDrag(gfx::Point(-50, 0), 1); |
295 EXPECT_EQ(UTF16ToUTF8(textfield_->GetSelectedText()), "textfield "); | 296 EXPECT_EQ(UTF16ToUTF8(textfield_->GetSelectedText()), "textfield "); |
296 VERIFY_HANDLE_POSITIONS(true); | 297 VERIFY_HANDLE_POSITIONS(true); |
297 | 298 |
298 // Drag selection handle 1 across selection handle 2. | 299 // Drag selection handle 1 across selection handle 2. |
299 x = textfield_->font().GetStringWidth(ASCIIToUTF16("textfield with ")); | 300 x = font.GetStringWidth(ASCIIToUTF16("textfield with ")); |
300 SimulateSelectionHandleDrag(gfx::Point(x, 0), 1); | 301 SimulateSelectionHandleDrag(gfx::Point(x, 0), 1); |
301 EXPECT_EQ(UTF16ToUTF8(textfield_->GetSelectedText()), "with "); | 302 EXPECT_EQ(UTF16ToUTF8(textfield_->GetSelectedText()), "with "); |
302 VERIFY_HANDLE_POSITIONS(true); | 303 VERIFY_HANDLE_POSITIONS(true); |
303 | 304 |
304 // Drag selection handle 2 across selection handle 1. | 305 // Drag selection handle 2 across selection handle 1. |
305 x = textfield_->font().GetStringWidth(ASCIIToUTF16("with selected ")); | 306 x = font.GetStringWidth(ASCIIToUTF16("with selected ")); |
306 SimulateSelectionHandleDrag(gfx::Point(x, 0), 2); | 307 SimulateSelectionHandleDrag(gfx::Point(x, 0), 2); |
307 EXPECT_EQ(UTF16ToUTF8(textfield_->GetSelectedText()), "selected "); | 308 EXPECT_EQ(UTF16ToUTF8(textfield_->GetSelectedText()), "selected "); |
308 VERIFY_HANDLE_POSITIONS(false); | 309 VERIFY_HANDLE_POSITIONS(false); |
309 } | 310 } |
310 | 311 |
311 TEST_F(TouchSelectionControllerImplTest, SelectRectInBidiCallbackTest) { | 312 TEST_F(TouchSelectionControllerImplTest, SelectRectInBidiCallbackTest) { |
312 CreateTextfield(); | 313 CreateTextfield(); |
313 textfield_->SetText(WideToUTF16(L"abc\x05e1\x05e2\x05e3" L"def")); | 314 textfield_->SetText(WideToUTF16(L"abc\x05e1\x05e2\x05e3" L"def")); |
314 // Tap the textfield to invoke touch selection. | 315 // Tap the textfield to invoke touch selection. |
315 ui::GestureEvent tap(ui::ET_GESTURE_TAP, 0, 0, 0, base::TimeDelta(), | 316 ui::GestureEvent tap(ui::ET_GESTURE_TAP, 0, 0, 0, base::TimeDelta(), |
316 ui::GestureEventDetails(ui::ET_GESTURE_TAP, 1.0f, 0.0f), 0); | 317 ui::GestureEventDetails(ui::ET_GESTURE_TAP, 1.0f, 0.0f), 0); |
317 textfield_view_->OnGestureEvent(&tap); | 318 textfield_view_->OnGestureEvent(&tap); |
318 | 319 |
319 // Select [c] from left to right. | 320 // Select [c] from left to right. |
320 textfield_->SelectRange(ui::Range(2, 3)); | 321 textfield_->SelectRange(ui::Range(2, 3)); |
321 EXPECT_EQ(WideToUTF16(L"c"), textfield_->GetSelectedText()); | 322 EXPECT_EQ(WideToUTF16(L"c"), textfield_->GetSelectedText()); |
322 VERIFY_HANDLE_POSITIONS(false); | 323 VERIFY_HANDLE_POSITIONS(false); |
323 | 324 |
324 // Drag selection handle 2 to right by 1 char. | 325 // Drag selection handle 2 to right by 1 char. |
325 int x = textfield_->font().GetStringWidth(WideToUTF16(L"\x05e3")); | 326 const gfx::Font& font = textfield_->GetPrimaryFont(); |
| 327 int x = font.GetStringWidth(WideToUTF16(L"\x05e3")); |
326 SimulateSelectionHandleDrag(gfx::Point(x, 0), 2); | 328 SimulateSelectionHandleDrag(gfx::Point(x, 0), 2); |
327 EXPECT_EQ(WideToUTF16(L"c\x05e1\x05e2"), textfield_->GetSelectedText()); | 329 EXPECT_EQ(WideToUTF16(L"c\x05e1\x05e2"), textfield_->GetSelectedText()); |
328 VERIFY_HANDLE_POSITIONS(false); | 330 VERIFY_HANDLE_POSITIONS(false); |
329 | 331 |
330 // Drag selection handle 1 to left by 1 char. | 332 // Drag selection handle 1 to left by 1 char. |
331 x = textfield_->font().GetStringWidth(WideToUTF16(L"b")); | 333 x = font.GetStringWidth(WideToUTF16(L"b")); |
332 SimulateSelectionHandleDrag(gfx::Point(-x, 0), 1); | 334 SimulateSelectionHandleDrag(gfx::Point(-x, 0), 1); |
333 EXPECT_EQ(WideToUTF16(L"bc\x05e1\x05e2"), textfield_->GetSelectedText()); | 335 EXPECT_EQ(WideToUTF16(L"bc\x05e1\x05e2"), textfield_->GetSelectedText()); |
334 VERIFY_HANDLE_POSITIONS(true); | 336 VERIFY_HANDLE_POSITIONS(true); |
335 | 337 |
336 // Select [c] from right to left. | 338 // Select [c] from right to left. |
337 textfield_->SelectRange(ui::Range(3, 2)); | 339 textfield_->SelectRange(ui::Range(3, 2)); |
338 EXPECT_EQ(WideToUTF16(L"c"), textfield_->GetSelectedText()); | 340 EXPECT_EQ(WideToUTF16(L"c"), textfield_->GetSelectedText()); |
339 VERIFY_HANDLE_POSITIONS(false); | 341 VERIFY_HANDLE_POSITIONS(false); |
340 | 342 |
341 // Drag selection handle 1 to right by 1 char. | 343 // Drag selection handle 1 to right by 1 char. |
342 x = textfield_->font().GetStringWidth(WideToUTF16(L"\x05e3")); | 344 x = font.GetStringWidth(WideToUTF16(L"\x05e3")); |
343 SimulateSelectionHandleDrag(gfx::Point(x, 0), 1); | 345 SimulateSelectionHandleDrag(gfx::Point(x, 0), 1); |
344 EXPECT_EQ(WideToUTF16(L"c\x05e1\x05e2"), textfield_->GetSelectedText()); | 346 EXPECT_EQ(WideToUTF16(L"c\x05e1\x05e2"), textfield_->GetSelectedText()); |
345 VERIFY_HANDLE_POSITIONS(true); | 347 VERIFY_HANDLE_POSITIONS(true); |
346 | 348 |
347 // Drag selection handle 2 to left by 1 char. | 349 // Drag selection handle 2 to left by 1 char. |
348 x = textfield_->font().GetStringWidth(WideToUTF16(L"b")); | 350 x = font.GetStringWidth(WideToUTF16(L"b")); |
349 SimulateSelectionHandleDrag(gfx::Point(-x, 0), 2); | 351 SimulateSelectionHandleDrag(gfx::Point(-x, 0), 2); |
350 EXPECT_EQ(WideToUTF16(L"bc\x05e1\x05e2"), textfield_->GetSelectedText()); | 352 EXPECT_EQ(WideToUTF16(L"bc\x05e1\x05e2"), textfield_->GetSelectedText()); |
351 VERIFY_HANDLE_POSITIONS(false); | 353 VERIFY_HANDLE_POSITIONS(false); |
352 | 354 |
353 // Select [\x5e1] from right to left. | 355 // Select [\x5e1] from right to left. |
354 textfield_->SelectRange(ui::Range(3, 4)); | 356 textfield_->SelectRange(ui::Range(3, 4)); |
355 EXPECT_EQ(WideToUTF16(L"\x05e1"), textfield_->GetSelectedText()); | 357 EXPECT_EQ(WideToUTF16(L"\x05e1"), textfield_->GetSelectedText()); |
356 VERIFY_HANDLE_POSITIONS(false); | 358 VERIFY_HANDLE_POSITIONS(false); |
357 | 359 |
358 /* TODO(xji): for bidi text "abcDEF" whose display is "abcFEDhij", when click | 360 /* TODO(xji): for bidi text "abcDEF" whose display is "abcFEDhij", when click |
359 right of 'D' and select [D] then move the left selection handle to left | 361 right of 'D' and select [D] then move the left selection handle to left |
360 by one character, it should select [ED], instead it selects [F]. | 362 by one character, it should select [ED], instead it selects [F]. |
361 Reason: click right of 'D' and left of 'h' return the same x-axis position, | 363 Reason: click right of 'D' and left of 'h' return the same x-axis position, |
362 pass this position to FindCursorPosition() returns index of 'h'. which | 364 pass this position to FindCursorPosition() returns index of 'h'. which |
363 means the selection start changed from 3 to 6. | 365 means the selection start changed from 3 to 6. |
364 Need further investigation on whether this is a bug in Pango and how to | 366 Need further investigation on whether this is a bug in Pango and how to |
365 work around it. | 367 work around it. |
366 // Drag selection handle 2 to left by 1 char. | 368 // Drag selection handle 2 to left by 1 char. |
367 x = textfield_->font().GetStringWidth(WideToUTF16(L"\x05e2")); | 369 x = font.GetStringWidth(WideToUTF16(L"\x05e2")); |
368 SimulateSelectionHandleDrag(gfx::Point(-x, 0), 2); | 370 SimulateSelectionHandleDrag(gfx::Point(-x, 0), 2); |
369 EXPECT_EQ(WideToUTF16(L"\x05e1\x05e2"), textfield_->GetSelectedText()); | 371 EXPECT_EQ(WideToUTF16(L"\x05e1\x05e2"), textfield_->GetSelectedText()); |
370 VERIFY_HANDLE_POSITIONS(false); | 372 VERIFY_HANDLE_POSITIONS(false); |
371 */ | 373 */ |
372 | 374 |
373 // Drag selection handle 1 to right by 1 char. | 375 // Drag selection handle 1 to right by 1 char. |
374 x = textfield_->font().GetStringWidth(WideToUTF16(L"d")); | 376 x = font.GetStringWidth(WideToUTF16(L"d")); |
375 SimulateSelectionHandleDrag(gfx::Point(x, 0), 1); | 377 SimulateSelectionHandleDrag(gfx::Point(x, 0), 1); |
376 EXPECT_EQ(WideToUTF16(L"\x05e2\x05e3" L"d"), textfield_->GetSelectedText()); | 378 EXPECT_EQ(WideToUTF16(L"\x05e2\x05e3" L"d"), textfield_->GetSelectedText()); |
377 VERIFY_HANDLE_POSITIONS(true); | 379 VERIFY_HANDLE_POSITIONS(true); |
378 | 380 |
379 // Select [\x5e1] from left to right. | 381 // Select [\x5e1] from left to right. |
380 textfield_->SelectRange(ui::Range(4, 3)); | 382 textfield_->SelectRange(ui::Range(4, 3)); |
381 EXPECT_EQ(WideToUTF16(L"\x05e1"), textfield_->GetSelectedText()); | 383 EXPECT_EQ(WideToUTF16(L"\x05e1"), textfield_->GetSelectedText()); |
382 VERIFY_HANDLE_POSITIONS(false); | 384 VERIFY_HANDLE_POSITIONS(false); |
383 | 385 |
384 /* TODO(xji): see detail of above commented out test case. | 386 /* TODO(xji): see detail of above commented out test case. |
385 // Drag selection handle 1 to left by 1 char. | 387 // Drag selection handle 1 to left by 1 char. |
386 x = textfield_->font().GetStringWidth(WideToUTF16(L"\x05e2")); | 388 x = font.GetStringWidth(WideToUTF16(L"\x05e2")); |
387 SimulateSelectionHandleDrag(gfx::Point(-x, 0), 1); | 389 SimulateSelectionHandleDrag(gfx::Point(-x, 0), 1); |
388 EXPECT_EQ(WideToUTF16(L"\x05e1\x05e2"), textfield_->GetSelectedText()); | 390 EXPECT_EQ(WideToUTF16(L"\x05e1\x05e2"), textfield_->GetSelectedText()); |
389 VERIFY_HANDLE_POSITIONS(true); | 391 VERIFY_HANDLE_POSITIONS(true); |
390 */ | 392 */ |
391 | 393 |
392 // Drag selection handle 2 to right by 1 char. | 394 // Drag selection handle 2 to right by 1 char. |
393 x = textfield_->font().GetStringWidth(WideToUTF16(L"d")); | 395 x = font.GetStringWidth(WideToUTF16(L"d")); |
394 SimulateSelectionHandleDrag(gfx::Point(x, 0), 2); | 396 SimulateSelectionHandleDrag(gfx::Point(x, 0), 2); |
395 EXPECT_EQ(WideToUTF16(L"\x05e2\x05e3" L"d"), textfield_->GetSelectedText()); | 397 EXPECT_EQ(WideToUTF16(L"\x05e2\x05e3" L"d"), textfield_->GetSelectedText()); |
396 VERIFY_HANDLE_POSITIONS(false); | 398 VERIFY_HANDLE_POSITIONS(false); |
397 | 399 |
398 // Select [\x05r3] from right to left. | 400 // Select [\x05r3] from right to left. |
399 textfield_->SelectRange(ui::Range(5, 6)); | 401 textfield_->SelectRange(ui::Range(5, 6)); |
400 EXPECT_EQ(WideToUTF16(L"\x05e3"), textfield_->GetSelectedText()); | 402 EXPECT_EQ(WideToUTF16(L"\x05e3"), textfield_->GetSelectedText()); |
401 VERIFY_HANDLE_POSITIONS(false); | 403 VERIFY_HANDLE_POSITIONS(false); |
402 | 404 |
403 // Drag selection handle 2 to left by 1 char. | 405 // Drag selection handle 2 to left by 1 char. |
404 x = textfield_->font().GetStringWidth(WideToUTF16(L"c")); | 406 x = font.GetStringWidth(WideToUTF16(L"c")); |
405 SimulateSelectionHandleDrag(gfx::Point(-x, 0), 2); | 407 SimulateSelectionHandleDrag(gfx::Point(-x, 0), 2); |
406 EXPECT_EQ(WideToUTF16(L"c\x05e1\x05e2"), textfield_->GetSelectedText()); | 408 EXPECT_EQ(WideToUTF16(L"c\x05e1\x05e2"), textfield_->GetSelectedText()); |
407 VERIFY_HANDLE_POSITIONS(false); | 409 VERIFY_HANDLE_POSITIONS(false); |
408 | 410 |
409 // Drag selection handle 1 to right by 1 char. | 411 // Drag selection handle 1 to right by 1 char. |
410 x = textfield_->font().GetStringWidth(WideToUTF16(L"\x05e2")); | 412 x = font.GetStringWidth(WideToUTF16(L"\x05e2")); |
411 SimulateSelectionHandleDrag(gfx::Point(x, 0), 1); | 413 SimulateSelectionHandleDrag(gfx::Point(x, 0), 1); |
412 EXPECT_EQ(WideToUTF16(L"c\x05e1"), textfield_->GetSelectedText()); | 414 EXPECT_EQ(WideToUTF16(L"c\x05e1"), textfield_->GetSelectedText()); |
413 VERIFY_HANDLE_POSITIONS(true); | 415 VERIFY_HANDLE_POSITIONS(true); |
414 | 416 |
415 // Select [\x05r3] from left to right. | 417 // Select [\x05r3] from left to right. |
416 textfield_->SelectRange(ui::Range(6, 5)); | 418 textfield_->SelectRange(ui::Range(6, 5)); |
417 EXPECT_EQ(WideToUTF16(L"\x05e3"), textfield_->GetSelectedText()); | 419 EXPECT_EQ(WideToUTF16(L"\x05e3"), textfield_->GetSelectedText()); |
418 VERIFY_HANDLE_POSITIONS(false); | 420 VERIFY_HANDLE_POSITIONS(false); |
419 | 421 |
420 // Drag selection handle 1 to left by 1 char. | 422 // Drag selection handle 1 to left by 1 char. |
421 x = textfield_->font().GetStringWidth(WideToUTF16(L"c")); | 423 x = font.GetStringWidth(WideToUTF16(L"c")); |
422 SimulateSelectionHandleDrag(gfx::Point(-x, 0), 1); | 424 SimulateSelectionHandleDrag(gfx::Point(-x, 0), 1); |
423 EXPECT_EQ(WideToUTF16(L"c\x05e1\x05e2"), textfield_->GetSelectedText()); | 425 EXPECT_EQ(WideToUTF16(L"c\x05e1\x05e2"), textfield_->GetSelectedText()); |
424 VERIFY_HANDLE_POSITIONS(true); | 426 VERIFY_HANDLE_POSITIONS(true); |
425 | 427 |
426 // Drag selection handle 2 to right by 1 char. | 428 // Drag selection handle 2 to right by 1 char. |
427 x = textfield_->font().GetStringWidth(WideToUTF16(L"\x05e2")); | 429 x = font.GetStringWidth(WideToUTF16(L"\x05e2")); |
428 SimulateSelectionHandleDrag(gfx::Point(x, 0), 2); | 430 SimulateSelectionHandleDrag(gfx::Point(x, 0), 2); |
429 EXPECT_EQ(WideToUTF16(L"c\x05e1"), textfield_->GetSelectedText()); | 431 EXPECT_EQ(WideToUTF16(L"c\x05e1"), textfield_->GetSelectedText()); |
430 VERIFY_HANDLE_POSITIONS(false); | 432 VERIFY_HANDLE_POSITIONS(false); |
431 } | 433 } |
432 | 434 |
433 TEST_F(TouchSelectionControllerImplTest, | 435 TEST_F(TouchSelectionControllerImplTest, |
434 HiddenSelectionHandleRetainsCursorPosition) { | 436 HiddenSelectionHandleRetainsCursorPosition) { |
435 // Create a textfield with lots of text in it. | 437 // Create a textfield with lots of text in it. |
436 CreateTextfield(); | 438 CreateTextfield(); |
437 std::string textfield_text("some text"); | 439 std::string textfield_text("some text"); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
486 gfx::Point cursor_pos = GetCursorHandlePosition(); | 488 gfx::Point cursor_pos = GetCursorHandlePosition(); |
487 cursor_pos.Offset(GetHandleImageSize().width() / 2 + kPadding, 0); | 489 cursor_pos.Offset(GetHandleImageSize().width() / 2 + kPadding, 0); |
488 generator.GestureTapAt(cursor_pos); | 490 generator.GestureTapAt(cursor_pos); |
489 generator.GestureTapAt(cursor_pos); | 491 generator.GestureTapAt(cursor_pos); |
490 EXPECT_TRUE(textfield_->HasSelection()); | 492 EXPECT_TRUE(textfield_->HasSelection()); |
491 VERIFY_HANDLE_POSITIONS(false); | 493 VERIFY_HANDLE_POSITIONS(false); |
492 } | 494 } |
493 #endif | 495 #endif |
494 | 496 |
495 } // namespace views | 497 } // namespace views |
OLD | NEW |