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

Side by Side Diff: ui/gfx/render_text_unittest.cc

Issue 10693061: Fix RenderTextWin base dir and adjacent char code; remove test exceptions; etc. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address comments. Created 8 years, 5 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 | Annotate | Revision Log
« no previous file with comments | « ui/gfx/canvas_skia.cc ('k') | ui/gfx/render_text_win.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "ui/gfx/render_text.h" 5 #include "ui/gfx/render_text.h"
6 6
7 #include "base/memory/scoped_ptr.h" 7 #include "base/memory/scoped_ptr.h"
8 #include "base/utf_string_conversions.h" 8 #include "base/utf_string_conversions.h"
9 #include "testing/gtest/include/gtest/gtest.h" 9 #include "testing/gtest/include/gtest/gtest.h"
10 #include "ui/base/l10n/l10n_util.h" 10 #include "ui/base/l10n/l10n_util.h"
11 11
12 #if defined(OS_WIN) 12 #if defined(OS_WIN)
13 #include "base/win/windows_version.h" 13 #include "base/win/windows_version.h"
14 #endif 14 #endif
15 15
16 #if defined(TOOLKIT_GTK)
17 #include <gtk/gtk.h>
18 #endif
19
16 namespace gfx { 20 namespace gfx {
17 21
18 namespace { 22 namespace {
19 23
20 // Checks whether |range| contains |index|. This is not the same as calling 24 // Checks whether |range| contains |index|. This is not the same as calling
21 // |range.Contains(ui::Range(index))| - as that would return true when 25 // |range.Contains(ui::Range(index))| - as that would return true when
22 // |index| == |range.end()|. 26 // |index| == |range.end()|.
23 bool IndexInRange(const ui::Range& range, size_t index) { 27 bool IndexInRange(const ui::Range& range, size_t index) {
24 return index >= range.start() && index < range.end(); 28 return index >= range.start() && index < range.end();
25 } 29 }
26 30
31 // A test utility function to set the application default text direction.
32 void SetRTL(bool rtl) {
33 // Override the current locale/direction.
34 base::i18n::SetICUDefaultLocale(rtl ? "he" : "en");
35 #if defined(TOOLKIT_GTK)
36 // Do the same for GTK, which does not rely on the ICU default locale.
37 gtk_widget_set_default_direction(rtl ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR);
38 #endif
39 EXPECT_EQ(rtl, base::i18n::IsRTL());
40 }
41
27 } // namespace 42 } // namespace
28 43
29 class RenderTextTest : public testing::Test { 44 class RenderTextTest : public testing::Test {
30 }; 45 };
31 46
32 TEST_F(RenderTextTest, DefaultStyle) { 47 TEST_F(RenderTextTest, DefaultStyle) {
33 // Defaults to empty text with no styles. 48 // Defaults to empty text with no styles.
34 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); 49 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText());
35 EXPECT_TRUE(render_text->text().empty()); 50 EXPECT_TRUE(render_text->text().empty());
36 EXPECT_TRUE(render_text->style_ranges().empty()); 51 EXPECT_TRUE(render_text->style_ranges().empty());
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after
328 render_text->SetText(seuss); 343 render_text->SetText(seuss);
329 render_text->SetObscured(true); 344 render_text->SetObscured(true);
330 EXPECT_EQ(seuss, render_text->text()); 345 EXPECT_EQ(seuss, render_text->text());
331 EXPECT_EQ(no_seuss, render_text->GetDisplayText()); 346 EXPECT_EQ(no_seuss, render_text->GetDisplayText());
332 render_text->SetObscured(false); 347 render_text->SetObscured(false);
333 EXPECT_EQ(seuss, render_text->text()); 348 EXPECT_EQ(seuss, render_text->text());
334 EXPECT_EQ(seuss, render_text->GetDisplayText()); 349 EXPECT_EQ(seuss, render_text->GetDisplayText());
335 350
336 // TODO(benrg): No Windows implementation yet. 351 // TODO(benrg): No Windows implementation yet.
337 #if !defined(OS_WIN) 352 #if !defined(OS_WIN)
338
339 render_text->SetObscured(true); 353 render_text->SetObscured(true);
340 354
341 // Surrogate pairs are counted as one code point. 355 // Surrogate pairs are counted as one code point.
342 const char16 invalid_surrogates[] = {0xDC00, 0xD800, 0}; 356 const char16 invalid_surrogates[] = {0xDC00, 0xD800, 0};
343 render_text->SetText(invalid_surrogates); 357 render_text->SetText(invalid_surrogates);
344 EXPECT_EQ(ASCIIToUTF16("**"), render_text->GetDisplayText()); 358 EXPECT_EQ(ASCIIToUTF16("**"), render_text->GetDisplayText());
345 const char16 valid_surrogates[] = {0xD800, 0xDC00, 0}; 359 const char16 valid_surrogates[] = {0xD800, 0xDC00, 0};
346 render_text->SetText(valid_surrogates); 360 render_text->SetText(valid_surrogates);
347 EXPECT_EQ(ASCIIToUTF16("*"), render_text->GetDisplayText()); 361 EXPECT_EQ(ASCIIToUTF16("*"), render_text->GetDisplayText());
348 EXPECT_EQ(0U, render_text->cursor_position()); 362 EXPECT_EQ(0U, render_text->cursor_position());
349 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); 363 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false);
350 EXPECT_EQ(2U, render_text->cursor_position()); 364 EXPECT_EQ(2U, render_text->cursor_position());
351 365
352 // Cursoring is independent of the underlying characters when the text is 366 // Cursoring is independent of the underlying characters when the text is
353 // obscured. 367 // obscured.
354 const wchar_t* const texts[] = { 368 const wchar_t* const texts[] = {
355 L"hop on pop", // word boundaries 369 L"hop on pop", // word boundaries
356 L"ab \x5D0\x5D1" L"12", // bidi embedding level of 2 370 L"ab \x5D0\x5D1" L"12", // bidi embedding level of 2
357 L"\x5D0\x5D1" L"12", // RTL paragraph direction on Linux 371 L"\x5D0\x5D1" L"12", // RTL paragraph direction on Linux
358 L"\x5D0\x5D1" // pure RTL 372 L"\x5D0\x5D1" // pure RTL
359 }; 373 };
360 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(texts); ++i) { 374 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(texts); ++i) {
361 string16 text = WideToUTF16(texts[i]); 375 string16 text = WideToUTF16(texts[i]);
362 TestVisualCursorMotionInObscuredField(render_text.get(), text, false); 376 TestVisualCursorMotionInObscuredField(render_text.get(), text, false);
363 TestVisualCursorMotionInObscuredField(render_text.get(), text, true); 377 TestVisualCursorMotionInObscuredField(render_text.get(), text, true);
364 } 378 }
365 #endif // !defined(OS_WIN) 379 #endif // !defined(OS_WIN)
366 } 380 }
367 381
382 TEST_F(RenderTextTest, GetTextDirection) {
383 const bool was_rtl = base::i18n::IsRTL();
384 // Ensure that text direction is set by the first strong character direction.
385 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText());
386 for (size_t i = 0; i < 2; ++i) {
387 // Toggle the application default text direction (to try each direction).
388 SetRTL(!base::i18n::IsRTL());
389
390 // Blank strings (and those without directionality) default to LTR.
391 render_text->SetText(string16());
392 EXPECT_EQ(base::i18n::LEFT_TO_RIGHT, render_text->GetTextDirection());
393 render_text->SetText(ASCIIToUTF16(" "));
394 EXPECT_EQ(base::i18n::LEFT_TO_RIGHT, render_text->GetTextDirection());
395
396 // Pure LTR.
397 render_text->SetText(ASCIIToUTF16("abc"));
398 EXPECT_EQ(base::i18n::LEFT_TO_RIGHT, render_text->GetTextDirection());
399 // LTR-RTL
400 render_text->SetText(WideToUTF16(L"abc\x05d0\x05d1\x05d2"));
401 EXPECT_EQ(base::i18n::LEFT_TO_RIGHT, render_text->GetTextDirection());
402 // LTR-RTL-LTR.
403 render_text->SetText(WideToUTF16(L"a"L"\x05d1"L"b"));
404 EXPECT_EQ(base::i18n::LEFT_TO_RIGHT, render_text->GetTextDirection());
405 // Pure RTL.
406 render_text->SetText(WideToUTF16(L"\x05d0\x05d1\x05d2"));
407 EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, render_text->GetTextDirection());
408 // RTL-LTR
409 render_text->SetText(WideToUTF16(L"\x05d0\x05d1\x05d2"L"abc"));
410 EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, render_text->GetTextDirection());
411 // RTL-LTR-RTL.
412 render_text->SetText(WideToUTF16(L"\x05d0"L"a"L"\x05d1"));
413 EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, render_text->GetTextDirection());
414 }
415 EXPECT_EQ(was_rtl, base::i18n::IsRTL());
416 }
417
368 void RunMoveCursorLeftRightTest(RenderText* render_text, 418 void RunMoveCursorLeftRightTest(RenderText* render_text,
369 const std::vector<SelectionModel>& expected, 419 const std::vector<SelectionModel>& expected,
370 VisualCursorDirection direction) { 420 VisualCursorDirection direction) {
371 for (size_t i = 0; i < expected.size(); ++i) { 421 for (size_t i = 0; i < expected.size(); ++i) {
372 EXPECT_EQ(expected[i], render_text->selection_model()); 422 EXPECT_EQ(expected[i], render_text->selection_model());
373 render_text->MoveCursor(CHARACTER_BREAK, direction, false); 423 render_text->MoveCursor(CHARACTER_BREAK, direction, false);
374 } 424 }
375 // Check that cursoring is clamped at the line edge. 425 // Check that cursoring is clamped at the line edge.
376 EXPECT_EQ(expected.back(), render_text->selection_model()); 426 EXPECT_EQ(expected.back(), render_text->selection_model());
377 // Check that it is the line edge. 427 // Check that it is the line edge.
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
452 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_LEFT); 502 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_LEFT);
453 } 503 }
454 504
455 TEST_F(RenderTextTest, MoveCursorLeftRightInRtl) { 505 TEST_F(RenderTextTest, MoveCursorLeftRightInRtl) {
456 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); 506 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText());
457 // Pure RTL. 507 // Pure RTL.
458 render_text->SetText(WideToUTF16(L"\x05d0\x05d1\x05d2")); 508 render_text->SetText(WideToUTF16(L"\x05d0\x05d1\x05d2"));
459 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false); 509 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false);
460 std::vector<SelectionModel> expected; 510 std::vector<SelectionModel> expected;
461 511
462 #if defined(OS_LINUX)
463 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); 512 expected.push_back(SelectionModel(0, CURSOR_BACKWARD));
464 #else
465 expected.push_back(SelectionModel(3, CURSOR_FORWARD));
466 #endif
467 expected.push_back(SelectionModel(1, CURSOR_BACKWARD)); 513 expected.push_back(SelectionModel(1, CURSOR_BACKWARD));
468 expected.push_back(SelectionModel(2, CURSOR_BACKWARD)); 514 expected.push_back(SelectionModel(2, CURSOR_BACKWARD));
469 expected.push_back(SelectionModel(3, CURSOR_BACKWARD)); 515 expected.push_back(SelectionModel(3, CURSOR_BACKWARD));
470 #if defined(OS_LINUX)
471 expected.push_back(SelectionModel(3, CURSOR_FORWARD)); 516 expected.push_back(SelectionModel(3, CURSOR_FORWARD));
472 #else
473 expected.push_back(SelectionModel(0, CURSOR_BACKWARD));
474 #endif
475 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_LEFT); 517 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_LEFT);
476 518
477 expected.clear(); 519 expected.clear();
478 520
479 #if defined(OS_LINUX)
480 expected.push_back(SelectionModel(3, CURSOR_FORWARD)); 521 expected.push_back(SelectionModel(3, CURSOR_FORWARD));
481 #else
482 expected.push_back(SelectionModel(0, CURSOR_BACKWARD));
483 #endif
484 expected.push_back(SelectionModel(2, CURSOR_FORWARD)); 522 expected.push_back(SelectionModel(2, CURSOR_FORWARD));
485 expected.push_back(SelectionModel(1, CURSOR_FORWARD)); 523 expected.push_back(SelectionModel(1, CURSOR_FORWARD));
486 expected.push_back(SelectionModel(0, CURSOR_FORWARD)); 524 expected.push_back(SelectionModel(0, CURSOR_FORWARD));
487 #if defined(OS_LINUX)
488 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); 525 expected.push_back(SelectionModel(0, CURSOR_BACKWARD));
489 #else
490 expected.push_back(SelectionModel(3, CURSOR_FORWARD));
491 #endif
492 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_RIGHT); 526 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_RIGHT);
493 } 527 }
494 528
495 TEST_F(RenderTextTest, MoveCursorLeftRightInRtlLtr) { 529 TEST_F(RenderTextTest, MoveCursorLeftRightInRtlLtr) {
496 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); 530 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText());
497 // RTL-LTR 531 // RTL-LTR
498 render_text->SetText(WideToUTF16(L"\x05d0\x05d1\x05d2"L"abc")); 532 render_text->SetText(WideToUTF16(L"\x05d0\x05d1\x05d2"L"abc"));
499 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false); 533 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false);
500 std::vector<SelectionModel> expected; 534 std::vector<SelectionModel> expected;
501 #if defined(OS_LINUX)
502 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); 535 expected.push_back(SelectionModel(0, CURSOR_BACKWARD));
503 expected.push_back(SelectionModel(1, CURSOR_BACKWARD)); 536 expected.push_back(SelectionModel(1, CURSOR_BACKWARD));
504 expected.push_back(SelectionModel(2, CURSOR_BACKWARD)); 537 expected.push_back(SelectionModel(2, CURSOR_BACKWARD));
505 expected.push_back(SelectionModel(3, CURSOR_BACKWARD)); 538 expected.push_back(SelectionModel(3, CURSOR_BACKWARD));
506 expected.push_back(SelectionModel(5, CURSOR_FORWARD)); 539 expected.push_back(SelectionModel(5, CURSOR_FORWARD));
507 expected.push_back(SelectionModel(4, CURSOR_FORWARD)); 540 expected.push_back(SelectionModel(4, CURSOR_FORWARD));
508 expected.push_back(SelectionModel(3, CURSOR_FORWARD)); 541 expected.push_back(SelectionModel(3, CURSOR_FORWARD));
509 expected.push_back(SelectionModel(6, CURSOR_FORWARD)); 542 expected.push_back(SelectionModel(6, CURSOR_FORWARD));
510 #else
511 expected.push_back(SelectionModel(6, CURSOR_FORWARD));
512 expected.push_back(SelectionModel(5, CURSOR_FORWARD));
513 expected.push_back(SelectionModel(4, CURSOR_FORWARD));
514 expected.push_back(SelectionModel(3, CURSOR_FORWARD));
515 expected.push_back(SelectionModel(1, CURSOR_BACKWARD));
516 expected.push_back(SelectionModel(2, CURSOR_BACKWARD));
517 expected.push_back(SelectionModel(3, CURSOR_BACKWARD));
518 expected.push_back(SelectionModel(0, CURSOR_BACKWARD));
519 #endif
520
521 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_LEFT); 543 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_LEFT);
522 544
523 expected.clear(); 545 expected.clear();
524 #if defined(OS_LINUX)
525 expected.push_back(SelectionModel(6, CURSOR_FORWARD)); 546 expected.push_back(SelectionModel(6, CURSOR_FORWARD));
526 expected.push_back(SelectionModel(4, CURSOR_BACKWARD)); 547 expected.push_back(SelectionModel(4, CURSOR_BACKWARD));
527 expected.push_back(SelectionModel(5, CURSOR_BACKWARD)); 548 expected.push_back(SelectionModel(5, CURSOR_BACKWARD));
528 expected.push_back(SelectionModel(6, CURSOR_BACKWARD)); 549 expected.push_back(SelectionModel(6, CURSOR_BACKWARD));
529 expected.push_back(SelectionModel(2, CURSOR_FORWARD)); 550 expected.push_back(SelectionModel(2, CURSOR_FORWARD));
530 expected.push_back(SelectionModel(1, CURSOR_FORWARD)); 551 expected.push_back(SelectionModel(1, CURSOR_FORWARD));
531 expected.push_back(SelectionModel(0, CURSOR_FORWARD)); 552 expected.push_back(SelectionModel(0, CURSOR_FORWARD));
532 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); 553 expected.push_back(SelectionModel(0, CURSOR_BACKWARD));
533 #else
534 expected.push_back(SelectionModel(0, CURSOR_BACKWARD));
535 expected.push_back(SelectionModel(2, CURSOR_FORWARD));
536 expected.push_back(SelectionModel(1, CURSOR_FORWARD));
537 expected.push_back(SelectionModel(0, CURSOR_FORWARD));
538 expected.push_back(SelectionModel(4, CURSOR_BACKWARD));
539 expected.push_back(SelectionModel(5, CURSOR_BACKWARD));
540 expected.push_back(SelectionModel(6, CURSOR_BACKWARD));
541 expected.push_back(SelectionModel(6, CURSOR_FORWARD));
542 #endif
543 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_RIGHT); 554 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_RIGHT);
544 } 555 }
545 556
546 TEST_F(RenderTextTest, MoveCursorLeftRightInRtlLtrRtl) { 557 TEST_F(RenderTextTest, MoveCursorLeftRightInRtlLtrRtl) {
547 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); 558 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText());
548 // RTL-LTR-RTL. 559 // RTL-LTR-RTL.
549 render_text->SetText(WideToUTF16(L"\x05d0"L"a"L"\x05d1")); 560 render_text->SetText(WideToUTF16(L"\x05d0"L"a"L"\x05d1"));
550 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false); 561 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false);
551 std::vector<SelectionModel> expected; 562 std::vector<SelectionModel> expected;
552 #if defined(OS_LINUX)
553 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); 563 expected.push_back(SelectionModel(0, CURSOR_BACKWARD));
554 expected.push_back(SelectionModel(1, CURSOR_BACKWARD)); 564 expected.push_back(SelectionModel(1, CURSOR_BACKWARD));
555 expected.push_back(SelectionModel(1, CURSOR_FORWARD)); 565 expected.push_back(SelectionModel(1, CURSOR_FORWARD));
556 expected.push_back(SelectionModel(3, CURSOR_BACKWARD)); 566 expected.push_back(SelectionModel(3, CURSOR_BACKWARD));
557 expected.push_back(SelectionModel(3, CURSOR_FORWARD)); 567 expected.push_back(SelectionModel(3, CURSOR_FORWARD));
558 #else
559 expected.push_back(SelectionModel(3, CURSOR_FORWARD));
560 expected.push_back(SelectionModel(3, CURSOR_BACKWARD));
561 expected.push_back(SelectionModel(1, CURSOR_FORWARD));
562 expected.push_back(SelectionModel(1, CURSOR_BACKWARD));
563 expected.push_back(SelectionModel(0, CURSOR_BACKWARD));
564 #endif
565 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_LEFT); 568 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_LEFT);
566 569
567 expected.clear(); 570 expected.clear();
568 #if defined(OS_LINUX)
569 expected.push_back(SelectionModel(3, CURSOR_FORWARD)); 571 expected.push_back(SelectionModel(3, CURSOR_FORWARD));
570 expected.push_back(SelectionModel(2, CURSOR_FORWARD)); 572 expected.push_back(SelectionModel(2, CURSOR_FORWARD));
571 expected.push_back(SelectionModel(2, CURSOR_BACKWARD)); 573 expected.push_back(SelectionModel(2, CURSOR_BACKWARD));
572 expected.push_back(SelectionModel(0, CURSOR_FORWARD)); 574 expected.push_back(SelectionModel(0, CURSOR_FORWARD));
573 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); 575 expected.push_back(SelectionModel(0, CURSOR_BACKWARD));
574 #else
575 expected.push_back(SelectionModel(0, CURSOR_BACKWARD));
576 expected.push_back(SelectionModel(0, CURSOR_FORWARD));
577 expected.push_back(SelectionModel(2, CURSOR_BACKWARD));
578 expected.push_back(SelectionModel(2, CURSOR_FORWARD));
579 expected.push_back(SelectionModel(3, CURSOR_FORWARD));
580 #endif
581 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_RIGHT); 576 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_RIGHT);
582 } 577 }
583 578
584 // TODO(xji): temporarily disable in platform Win since the complex script 579 // TODO(xji): temporarily disable in platform Win since the complex script
585 // characters turned into empty square due to font regression. So, not able 580 // characters turned into empty square due to font regression. So, not able
586 // to test 2 characters belong to the same grapheme. 581 // to test 2 characters belong to the same grapheme.
587 #if defined(OS_LINUX) 582 #if defined(OS_LINUX)
588 TEST_F(RenderTextTest, MoveCursorLeftRight_ComplexScript) { 583 TEST_F(RenderTextTest, MoveCursorLeftRight_ComplexScript) {
589 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); 584 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText());
590 585
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
699 const string16 kHebrewLatin = WideToUTF16(L"\x05e0\x05b8"L"a"L"\x05e0\x05b8"); 694 const string16 kHebrewLatin = WideToUTF16(L"\x05e0\x05b8"L"a"L"\x05e0\x05b8");
700 695
701 struct { 696 struct {
702 string16 text; 697 string16 text;
703 base::i18n::TextDirection expected_text_direction; 698 base::i18n::TextDirection expected_text_direction;
704 } cases[] = { 699 } cases[] = {
705 { string16(), base::i18n::LEFT_TO_RIGHT }, 700 { string16(), base::i18n::LEFT_TO_RIGHT },
706 { kLatin, base::i18n::LEFT_TO_RIGHT }, 701 { kLatin, base::i18n::LEFT_TO_RIGHT },
707 { kLTRGrapheme, base::i18n::LEFT_TO_RIGHT }, 702 { kLTRGrapheme, base::i18n::LEFT_TO_RIGHT },
708 { kHindiLatin, base::i18n::LEFT_TO_RIGHT }, 703 { kHindiLatin, base::i18n::LEFT_TO_RIGHT },
709 #if defined(OS_LINUX)
710 // On Linux, the whole string is displayed RTL, rather than individual runs.
711 { kRTLGrapheme, base::i18n::RIGHT_TO_LEFT }, 704 { kRTLGrapheme, base::i18n::RIGHT_TO_LEFT },
712 { kHebrewLatin, base::i18n::RIGHT_TO_LEFT }, 705 { kHebrewLatin, base::i18n::RIGHT_TO_LEFT },
713 #else
714 { kRTLGrapheme, base::i18n::LEFT_TO_RIGHT },
715 { kHebrewLatin, base::i18n::LEFT_TO_RIGHT },
716 #endif
717 }; 706 };
718 707
719 // TODO(asvitkine): Disable tests that fail on XP bots due to lack of complete 708 // TODO(asvitkine): Disable tests that fail on XP bots due to lack of complete
720 // font support for some scripts - http://crbug.com/106450 709 // font support for some scripts - http://crbug.com/106450
721 #if defined(OS_WIN) 710 #if defined(OS_WIN)
722 if (base::win::GetVersion() < base::win::VERSION_VISTA) 711 if (base::win::GetVersion() < base::win::VERSION_VISTA)
723 return; 712 return;
724 #endif 713 #endif
725 714
726 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); 715 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText());
(...skipping 453 matching lines...) Expand 10 before | Expand all | Expand 10 after
1180 // Ensure that the text will pan to fill its expanding display rectangle. 1169 // Ensure that the text will pan to fill its expanding display rectangle.
1181 render_text->SetDisplayRect(Rect(width - 5, 1)); 1170 render_text->SetDisplayRect(Rect(width - 5, 1));
1182 EXPECT_EQ(render_text->display_rect().width() - 1, 1171 EXPECT_EQ(render_text->display_rect().width() - 1,
1183 render_text->GetUpdatedCursorBounds().x()); 1172 render_text->GetUpdatedCursorBounds().x());
1184 1173
1185 // Ensure that a sufficiently large display rectangle shows all the text. 1174 // Ensure that a sufficiently large display rectangle shows all the text.
1186 render_text->SetDisplayRect(Rect(width + 10, 1)); 1175 render_text->SetDisplayRect(Rect(width + 10, 1));
1187 EXPECT_EQ(width, render_text->GetUpdatedCursorBounds().x()); 1176 EXPECT_EQ(width, render_text->GetUpdatedCursorBounds().x());
1188 } 1177 }
1189 1178
1190 // TODO(asvitkine): This test fails on desktop Linux. http://crbug.com/134009
1191 #if !defined(OS_LINUX) || defined(OS_CHROMEOS)
1192 TEST_F(RenderTextTest, DisplayRectShowsCursorRTL) { 1179 TEST_F(RenderTextTest, DisplayRectShowsCursorRTL) {
1193 // Set the locale to Hebrew for RTL UI. 1180 // Set the application default text direction to RTL.
1194 std::string locale = l10n_util::GetApplicationLocale(""); 1181 const bool was_rtl = base::i18n::IsRTL();
1195 base::i18n::SetICUDefaultLocale("he"); 1182 SetRTL(true);
1196 1183
1197 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); 1184 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText());
1198 render_text->SetText(WideToUTF16(L"abcdefghijklmnopqrstuvwxzyabcdefg")); 1185 render_text->SetText(WideToUTF16(L"abcdefghijklmnopqrstuvwxzyabcdefg"));
1199 render_text->MoveCursorTo(SelectionModel(0, CURSOR_FORWARD)); 1186 render_text->MoveCursorTo(SelectionModel(0, CURSOR_FORWARD));
1200 int width = render_text->GetStringSize().width(); 1187 int width = render_text->GetStringSize().width();
1201 ASSERT_GT(width, 10); 1188 ASSERT_GT(width, 10);
1202 1189
1203 // Ensure that the cursor is placed at the width of its preceding text. 1190 // Ensure that the cursor is placed at the width of its preceding text.
1204 render_text->SetDisplayRect(Rect(width + 10, 1)); 1191 render_text->SetDisplayRect(Rect(width + 10, 1));
1205 EXPECT_EQ(render_text->display_rect().width() - width - 1, 1192 EXPECT_EQ(render_text->display_rect().width() - width - 1,
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1237 1224
1238 // Ensure that the text will pan to fill its expanding display rectangle. 1225 // Ensure that the text will pan to fill its expanding display rectangle.
1239 render_text->SetDisplayRect(Rect(width - 5, 1)); 1226 render_text->SetDisplayRect(Rect(width - 5, 1));
1240 EXPECT_EQ(0, render_text->GetUpdatedCursorBounds().x()); 1227 EXPECT_EQ(0, render_text->GetUpdatedCursorBounds().x());
1241 1228
1242 // Ensure that a sufficiently large display rectangle shows all the text. 1229 // Ensure that a sufficiently large display rectangle shows all the text.
1243 render_text->SetDisplayRect(Rect(width + 10, 1)); 1230 render_text->SetDisplayRect(Rect(width + 10, 1));
1244 EXPECT_EQ(render_text->display_rect().width() - width - 1, 1231 EXPECT_EQ(render_text->display_rect().width() - width - 1,
1245 render_text->GetUpdatedCursorBounds().x()); 1232 render_text->GetUpdatedCursorBounds().x());
1246 1233
1247 // Reset locale. 1234 // Reset the application default text direction to LTR.
1248 base::i18n::SetICUDefaultLocale(locale); 1235 SetRTL(was_rtl);
1236 EXPECT_EQ(was_rtl, base::i18n::IsRTL());
1249 } 1237 }
1250 #endif // !defined(OS_LINUX) || defined(OS_CHROMEOS)
1251 1238
1252 } // namespace gfx 1239 } // namespace gfx
OLDNEW
« no previous file with comments | « ui/gfx/canvas_skia.cc ('k') | ui/gfx/render_text_win.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698