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

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

Issue 1868363002: Replace scoped_ptr with std::unique_ptr in //ui (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@scopedptrcc
Patch Set: scopedptrui: rebase-make_scoped_ptr Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ui/gfx/render_text_mac.mm ('k') | ui/gfx/screen_mac.mm » ('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 <limits.h> 7 #include <limits.h>
8 #include <stddef.h> 8 #include <stddef.h>
9 #include <stdint.h> 9 #include <stdint.h>
10 10
11 #include <algorithm> 11 #include <algorithm>
12 #include <memory>
12 13
13 #include "base/format_macros.h" 14 #include "base/format_macros.h"
14 #include "base/i18n/break_iterator.h" 15 #include "base/i18n/break_iterator.h"
15 #include "base/macros.h" 16 #include "base/macros.h"
16 #include "base/memory/scoped_ptr.h"
17 #include "base/strings/string_split.h" 17 #include "base/strings/string_split.h"
18 #include "base/strings/string_util.h" 18 #include "base/strings/string_util.h"
19 #include "base/strings/stringprintf.h" 19 #include "base/strings/stringprintf.h"
20 #include "base/strings/utf_string_conversions.h" 20 #include "base/strings/utf_string_conversions.h"
21 #include "build/build_config.h" 21 #include "build/build_config.h"
22 #include "testing/gtest/include/gtest/gtest.h" 22 #include "testing/gtest/include/gtest/gtest.h"
23 #include "third_party/skia/include/core/SkSurface.h" 23 #include "third_party/skia/include/core/SkSurface.h"
24 #include "ui/gfx/break_list.h" 24 #include "ui/gfx/break_list.h"
25 #include "ui/gfx/canvas.h" 25 #include "ui/gfx/canvas.h"
26 #include "ui/gfx/color_utils.h" 26 #include "ui/gfx/color_utils.h"
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 235
236 DISALLOW_COPY_AND_ASSIGN(TestRectangleBuffer); 236 DISALLOW_COPY_AND_ASSIGN(TestRectangleBuffer);
237 }; 237 };
238 238
239 } // namespace 239 } // namespace
240 240
241 using RenderTextTest = testing::Test; 241 using RenderTextTest = testing::Test;
242 242
243 TEST_F(RenderTextTest, DefaultStyles) { 243 TEST_F(RenderTextTest, DefaultStyles) {
244 // Check the default styles applied to new instances and adjusted text. 244 // Check the default styles applied to new instances and adjusted text.
245 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 245 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
246 EXPECT_TRUE(render_text->text().empty()); 246 EXPECT_TRUE(render_text->text().empty());
247 const wchar_t* const cases[] = { kWeak, kLtr, L"Hello", kRtl, L"", L"" }; 247 const wchar_t* const cases[] = { kWeak, kLtr, L"Hello", kRtl, L"", L"" };
248 for (size_t i = 0; i < arraysize(cases); ++i) { 248 for (size_t i = 0; i < arraysize(cases); ++i) {
249 EXPECT_TRUE(render_text->colors().EqualsValueForTesting(SK_ColorBLACK)); 249 EXPECT_TRUE(render_text->colors().EqualsValueForTesting(SK_ColorBLACK));
250 EXPECT_TRUE( 250 EXPECT_TRUE(
251 render_text->baselines().EqualsValueForTesting(NORMAL_BASELINE)); 251 render_text->baselines().EqualsValueForTesting(NORMAL_BASELINE));
252 for (size_t style = 0; style < NUM_TEXT_STYLES; ++style) 252 for (size_t style = 0; style < NUM_TEXT_STYLES; ++style)
253 EXPECT_TRUE(render_text->styles()[style].EqualsValueForTesting(false)); 253 EXPECT_TRUE(render_text->styles()[style].EqualsValueForTesting(false));
254 render_text->SetText(WideToUTF16(cases[i])); 254 render_text->SetText(WideToUTF16(cases[i]));
255 } 255 }
256 } 256 }
257 257
258 TEST_F(RenderTextTest, SetStyles) { 258 TEST_F(RenderTextTest, SetStyles) {
259 // Ensure custom default styles persist across setting and clearing text. 259 // Ensure custom default styles persist across setting and clearing text.
260 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 260 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
261 const SkColor color = SK_ColorRED; 261 const SkColor color = SK_ColorRED;
262 render_text->SetColor(color); 262 render_text->SetColor(color);
263 render_text->SetBaselineStyle(SUPERSCRIPT); 263 render_text->SetBaselineStyle(SUPERSCRIPT);
264 render_text->SetStyle(BOLD, true); 264 render_text->SetStyle(BOLD, true);
265 render_text->SetStyle(UNDERLINE, false); 265 render_text->SetStyle(UNDERLINE, false);
266 const wchar_t* const cases[] = { kWeak, kLtr, L"Hello", kRtl, L"", L"" }; 266 const wchar_t* const cases[] = { kWeak, kLtr, L"Hello", kRtl, L"", L"" };
267 for (size_t i = 0; i < arraysize(cases); ++i) { 267 for (size_t i = 0; i < arraysize(cases); ++i) {
268 EXPECT_TRUE(render_text->colors().EqualsValueForTesting(color)); 268 EXPECT_TRUE(render_text->colors().EqualsValueForTesting(color));
269 EXPECT_TRUE(render_text->baselines().EqualsValueForTesting(SUPERSCRIPT)); 269 EXPECT_TRUE(render_text->baselines().EqualsValueForTesting(SUPERSCRIPT));
270 EXPECT_TRUE(render_text->styles()[BOLD].EqualsValueForTesting(true)); 270 EXPECT_TRUE(render_text->styles()[BOLD].EqualsValueForTesting(true));
271 EXPECT_TRUE(render_text->styles()[UNDERLINE].EqualsValueForTesting(false)); 271 EXPECT_TRUE(render_text->styles()[UNDERLINE].EqualsValueForTesting(false));
272 render_text->SetText(WideToUTF16(cases[i])); 272 render_text->SetText(WideToUTF16(cases[i]));
273 273
274 // Ensure custom default styles can be applied after text has been set. 274 // Ensure custom default styles can be applied after text has been set.
275 if (i == 1) 275 if (i == 1)
276 render_text->SetStyle(STRIKE, true); 276 render_text->SetStyle(STRIKE, true);
277 if (i >= 1) 277 if (i >= 1)
278 EXPECT_TRUE(render_text->styles()[STRIKE].EqualsValueForTesting(true)); 278 EXPECT_TRUE(render_text->styles()[STRIKE].EqualsValueForTesting(true));
279 } 279 }
280 } 280 }
281 281
282 TEST_F(RenderTextTest, ApplyStyles) { 282 TEST_F(RenderTextTest, ApplyStyles) {
283 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 283 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
284 render_text->SetText(ASCIIToUTF16("012345678")); 284 render_text->SetText(ASCIIToUTF16("012345678"));
285 285
286 // Apply a ranged color and style and check the resulting breaks. 286 // Apply a ranged color and style and check the resulting breaks.
287 render_text->ApplyColor(SK_ColorRED, Range(1, 4)); 287 render_text->ApplyColor(SK_ColorRED, Range(1, 4));
288 render_text->ApplyBaselineStyle(SUPERIOR, Range(2, 4)); 288 render_text->ApplyBaselineStyle(SUPERIOR, Range(2, 4));
289 render_text->ApplyStyle(BOLD, true, Range(2, 5)); 289 render_text->ApplyStyle(BOLD, true, Range(2, 5));
290 std::vector<std::pair<size_t, SkColor> > expected_color; 290 std::vector<std::pair<size_t, SkColor> > expected_color;
291 expected_color.push_back(std::pair<size_t, SkColor>(0, SK_ColorBLACK)); 291 expected_color.push_back(std::pair<size_t, SkColor>(0, SK_ColorBLACK));
292 expected_color.push_back(std::pair<size_t, SkColor>(1, SK_ColorRED)); 292 expected_color.push_back(std::pair<size_t, SkColor>(1, SK_ColorRED));
293 expected_color.push_back(std::pair<size_t, SkColor>(4, SK_ColorBLACK)); 293 expected_color.push_back(std::pair<size_t, SkColor>(4, SK_ColorBLACK));
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 std::vector<std::pair<size_t, bool> > expected_underline; 370 std::vector<std::pair<size_t, bool> > expected_underline;
371 expected_underline.push_back(std::pair<size_t, bool>(0, false)); 371 expected_underline.push_back(std::pair<size_t, bool>(0, false));
372 expected_underline.push_back(std::pair<size_t, bool>(1, true)); 372 expected_underline.push_back(std::pair<size_t, bool>(1, true));
373 expected_underline.push_back(std::pair<size_t, bool>(6, false)); 373 expected_underline.push_back(std::pair<size_t, bool>(6, false));
374 EXPECT_TRUE(render_text->styles()[UNDERLINE].EqualsForTesting( 374 EXPECT_TRUE(render_text->styles()[UNDERLINE].EqualsForTesting(
375 expected_underline)); 375 expected_underline));
376 #endif // !defined(OS_MACOSX) 376 #endif // !defined(OS_MACOSX)
377 } 377 }
378 378
379 TEST_F(RenderTextTest, AppendTextKeepsStyles) { 379 TEST_F(RenderTextTest, AppendTextKeepsStyles) {
380 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 380 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
381 // Setup basic functionality. 381 // Setup basic functionality.
382 render_text->SetText(ASCIIToUTF16("abc")); 382 render_text->SetText(ASCIIToUTF16("abc"));
383 render_text->ApplyColor(SK_ColorRED, Range(0, 1)); 383 render_text->ApplyColor(SK_ColorRED, Range(0, 1));
384 render_text->ApplyBaselineStyle(SUPERSCRIPT, Range(1, 2)); 384 render_text->ApplyBaselineStyle(SUPERSCRIPT, Range(1, 2));
385 render_text->ApplyStyle(UNDERLINE, true, Range(2, 3)); 385 render_text->ApplyStyle(UNDERLINE, true, Range(2, 3));
386 // Verify basic functionality. 386 // Verify basic functionality.
387 std::vector<std::pair<size_t, SkColor>> expected_color; 387 std::vector<std::pair<size_t, SkColor>> expected_color;
388 expected_color.push_back(std::pair<size_t, SkColor>(0, SK_ColorRED)); 388 expected_color.push_back(std::pair<size_t, SkColor>(0, SK_ColorRED));
389 expected_color.push_back(std::pair<size_t, SkColor>(1, SK_ColorBLACK)); 389 expected_color.push_back(std::pair<size_t, SkColor>(1, SK_ColorBLACK));
390 EXPECT_TRUE(render_text->colors().EqualsForTesting(expected_color)); 390 EXPECT_TRUE(render_text->colors().EqualsForTesting(expected_color));
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
435 render_text->selection_model()); 435 render_text->selection_model());
436 render_text->MoveCursor(WORD_BREAK, CURSOR_LEFT, select); 436 render_text->MoveCursor(WORD_BREAK, CURSOR_LEFT, select);
437 EXPECT_EQ(SelectionModel(0, CURSOR_BACKWARD), render_text->selection_model()); 437 EXPECT_EQ(SelectionModel(0, CURSOR_BACKWARD), render_text->selection_model());
438 } 438 }
439 439
440 // TODO(asvitkine): RenderTextMac cursor movements. http://crbug.com/131618 440 // TODO(asvitkine): RenderTextMac cursor movements. http://crbug.com/131618
441 #if !defined(OS_MACOSX) 441 #if !defined(OS_MACOSX)
442 TEST_F(RenderTextTest, ObscuredText) { 442 TEST_F(RenderTextTest, ObscuredText) {
443 const base::string16 seuss = ASCIIToUTF16("hop on pop"); 443 const base::string16 seuss = ASCIIToUTF16("hop on pop");
444 const base::string16 no_seuss = ASCIIToUTF16("**********"); 444 const base::string16 no_seuss = ASCIIToUTF16("**********");
445 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 445 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
446 446
447 // GetLayoutText() returns asterisks when the obscured bit is set. 447 // GetLayoutText() returns asterisks when the obscured bit is set.
448 render_text->SetText(seuss); 448 render_text->SetText(seuss);
449 render_text->SetObscured(true); 449 render_text->SetObscured(true);
450 EXPECT_EQ(seuss, render_text->text()); 450 EXPECT_EQ(seuss, render_text->text());
451 EXPECT_EQ(no_seuss, render_text->GetDisplayText()); 451 EXPECT_EQ(no_seuss, render_text->GetDisplayText());
452 render_text->SetObscured(false); 452 render_text->SetObscured(false);
453 EXPECT_EQ(seuss, render_text->text()); 453 EXPECT_EQ(seuss, render_text->text());
454 EXPECT_EQ(seuss, render_text->GetDisplayText()); 454 EXPECT_EQ(seuss, render_text->GetDisplayText());
455 455
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
499 base::string16 text = WideToUTF16(texts[i]); 499 base::string16 text = WideToUTF16(texts[i]);
500 TestVisualCursorMotionInObscuredField(render_text.get(), text, false); 500 TestVisualCursorMotionInObscuredField(render_text.get(), text, false);
501 TestVisualCursorMotionInObscuredField(render_text.get(), text, true); 501 TestVisualCursorMotionInObscuredField(render_text.get(), text, true);
502 } 502 }
503 } 503 }
504 #endif // !defined(OS_MACOSX) 504 #endif // !defined(OS_MACOSX)
505 505
506 TEST_F(RenderTextTest, RevealObscuredText) { 506 TEST_F(RenderTextTest, RevealObscuredText) {
507 const base::string16 seuss = ASCIIToUTF16("hop on pop"); 507 const base::string16 seuss = ASCIIToUTF16("hop on pop");
508 const base::string16 no_seuss = ASCIIToUTF16("**********"); 508 const base::string16 no_seuss = ASCIIToUTF16("**********");
509 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 509 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
510 510
511 render_text->SetText(seuss); 511 render_text->SetText(seuss);
512 render_text->SetObscured(true); 512 render_text->SetObscured(true);
513 EXPECT_EQ(seuss, render_text->text()); 513 EXPECT_EQ(seuss, render_text->text());
514 EXPECT_EQ(no_seuss, render_text->GetDisplayText()); 514 EXPECT_EQ(no_seuss, render_text->GetDisplayText());
515 515
516 // Valid reveal index and new revealed index clears previous one. 516 // Valid reveal index and new revealed index clears previous one.
517 render_text->RenderText::SetObscuredRevealIndex(0); 517 render_text->RenderText::SetObscuredRevealIndex(0);
518 EXPECT_EQ(ASCIIToUTF16("h*********"), render_text->GetDisplayText()); 518 EXPECT_EQ(ASCIIToUTF16("h*********"), render_text->GetDisplayText());
519 render_text->RenderText::SetObscuredRevealIndex(1); 519 render_text->RenderText::SetObscuredRevealIndex(1);
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
621 // U+05E9 U+05BC U+05C1 U+05B8 forms a four-character compound glyph. Again, 621 // U+05E9 U+05BC U+05C1 U+05B8 forms a four-character compound glyph. Again,
622 // it should be either fully elided, or not elided at all. If completely 622 // it should be either fully elided, or not elided at all. If completely
623 // elided, an LTR Mark (U+200E) should be added. 623 // elided, an LTR Mark (U+200E) should be added.
624 { L"0\x05e9\x05bc\x05c1\x05b8", L"0\x05e9\x05bc\x05c1\x05b8", false }, 624 { L"0\x05e9\x05bc\x05c1\x05b8", L"0\x05e9\x05bc\x05c1\x05b8", false },
625 { L"0\x05e9\x05bc\x05c1\x05b8", L"0\x2026\x200E" , true }, 625 { L"0\x05e9\x05bc\x05c1\x05b8", L"0\x2026\x200E" , true },
626 { L"01\x05e9\x05bc\x05c1\x05b8", L"01\x2026\x200E" , true }, 626 { L"01\x05e9\x05bc\x05c1\x05b8", L"01\x2026\x200E" , true },
627 { L"012\x05e9\x05bc\x05c1\x05b8", L"012\x2026\x200E" , true }, 627 { L"012\x05e9\x05bc\x05c1\x05b8", L"012\x2026\x200E" , true },
628 { L"012\xF0\x9D\x84\x9E", L"012\xF0\x2026" , true }, 628 { L"012\xF0\x9D\x84\x9E", L"012\xF0\x2026" , true },
629 }; 629 };
630 630
631 scoped_ptr<RenderText> expected_render_text(RenderText::CreateInstance()); 631 std::unique_ptr<RenderText> expected_render_text(
632 RenderText::CreateInstance());
632 expected_render_text->SetFontList(FontList("serif, Sans serif, 12px")); 633 expected_render_text->SetFontList(FontList("serif, Sans serif, 12px"));
633 expected_render_text->SetDisplayRect(Rect(0, 0, 9999, 100)); 634 expected_render_text->SetDisplayRect(Rect(0, 0, 9999, 100));
634 635
635 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 636 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
636 render_text->SetFontList(FontList("serif, Sans serif, 12px")); 637 render_text->SetFontList(FontList("serif, Sans serif, 12px"));
637 render_text->SetElideBehavior(ELIDE_TAIL); 638 render_text->SetElideBehavior(ELIDE_TAIL);
638 639
639 for (size_t i = 0; i < arraysize(cases); i++) { 640 for (size_t i = 0; i < arraysize(cases); i++) {
640 SCOPED_TRACE(base::StringPrintf("Testing cases[%" PRIuS "] '%ls'", i, 641 SCOPED_TRACE(base::StringPrintf("Testing cases[%" PRIuS "] '%ls'", i,
641 cases[i].text)); 642 cases[i].text));
642 643
643 // Compute expected width 644 // Compute expected width
644 expected_render_text->SetText(WideToUTF16(cases[i].display_text)); 645 expected_render_text->SetText(WideToUTF16(cases[i].display_text));
645 int expected_width = expected_render_text->GetContentWidth(); 646 int expected_width = expected_render_text->GetContentWidth();
646 647
647 base::string16 input = WideToUTF16(cases[i].text); 648 base::string16 input = WideToUTF16(cases[i].text);
648 // Extend the input text to ensure that it is wider than the display_text, 649 // Extend the input text to ensure that it is wider than the display_text,
649 // and so it will get elided. 650 // and so it will get elided.
650 if (cases[i].elision_expected) 651 if (cases[i].elision_expected)
651 input.append(WideToUTF16(L" MMMMMMMMMMM")); 652 input.append(WideToUTF16(L" MMMMMMMMMMM"));
652 render_text->SetText(input); 653 render_text->SetText(input);
653 render_text->SetDisplayRect(Rect(0, 0, expected_width, 100)); 654 render_text->SetDisplayRect(Rect(0, 0, expected_width, 100));
654 EXPECT_EQ(input, render_text->text()); 655 EXPECT_EQ(input, render_text->text());
655 EXPECT_EQ(WideToUTF16(cases[i].display_text), 656 EXPECT_EQ(WideToUTF16(cases[i].display_text),
656 render_text->GetDisplayText()); 657 render_text->GetDisplayText());
657 expected_render_text->SetText(base::string16()); 658 expected_render_text->SetText(base::string16());
658 } 659 }
659 } 660 }
660 661
661 TEST_F(RenderTextTest, ElidedObscuredText) { 662 TEST_F(RenderTextTest, ElidedObscuredText) {
662 scoped_ptr<RenderText> expected_render_text(RenderText::CreateInstance()); 663 std::unique_ptr<RenderText> expected_render_text(
664 RenderText::CreateInstance());
663 expected_render_text->SetFontList(FontList("serif, Sans serif, 12px")); 665 expected_render_text->SetFontList(FontList("serif, Sans serif, 12px"));
664 expected_render_text->SetDisplayRect(Rect(0, 0, 9999, 100)); 666 expected_render_text->SetDisplayRect(Rect(0, 0, 9999, 100));
665 expected_render_text->SetText(WideToUTF16(L"**\x2026")); 667 expected_render_text->SetText(WideToUTF16(L"**\x2026"));
666 668
667 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 669 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
668 render_text->SetFontList(FontList("serif, Sans serif, 12px")); 670 render_text->SetFontList(FontList("serif, Sans serif, 12px"));
669 render_text->SetElideBehavior(ELIDE_TAIL); 671 render_text->SetElideBehavior(ELIDE_TAIL);
670 render_text->SetDisplayRect( 672 render_text->SetDisplayRect(
671 Rect(0, 0, expected_render_text->GetContentWidth(), 100)); 673 Rect(0, 0, expected_render_text->GetContentWidth(), 100));
672 render_text->SetObscured(true); 674 render_text->SetObscured(true);
673 render_text->SetText(WideToUTF16(L"abcdef")); 675 render_text->SetText(WideToUTF16(L"abcdef"));
674 EXPECT_EQ(WideToUTF16(L"abcdef"), render_text->text()); 676 EXPECT_EQ(WideToUTF16(L"abcdef"), render_text->text());
675 EXPECT_EQ(WideToUTF16(L"**\x2026"), render_text->GetDisplayText()); 677 EXPECT_EQ(WideToUTF16(L"**\x2026"), render_text->GetDisplayText());
676 } 678 }
677 #endif // !defined(OS_MACOSX) 679 #endif // !defined(OS_MACOSX)
678 680
679 TEST_F(RenderTextTest, ElidedEmail) { 681 TEST_F(RenderTextTest, ElidedEmail) {
680 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 682 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
681 render_text->SetText(ASCIIToUTF16("test@example.com")); 683 render_text->SetText(ASCIIToUTF16("test@example.com"));
682 const gfx::Size size = render_text->GetStringSize(); 684 const gfx::Size size = render_text->GetStringSize();
683 685
684 const base::string16 long_email = 686 const base::string16 long_email =
685 ASCIIToUTF16("longemailaddresstest@example.com"); 687 ASCIIToUTF16("longemailaddresstest@example.com");
686 render_text->SetText(long_email); 688 render_text->SetText(long_email);
687 render_text->SetElideBehavior(ELIDE_EMAIL); 689 render_text->SetElideBehavior(ELIDE_EMAIL);
688 render_text->SetDisplayRect(gfx::Rect(size)); 690 render_text->SetDisplayRect(gfx::Rect(size));
689 EXPECT_GE(size.width(), render_text->GetStringSize().width()); 691 EXPECT_GE(size.width(), render_text->GetStringSize().width());
690 EXPECT_GT(long_email.size(), render_text->GetDisplayText().size()); 692 EXPECT_GT(long_email.size(), render_text->GetDisplayText().size());
(...skipping 27 matching lines...) Expand all
718 // Surrogate pairs should be truncated reasonably enough. 720 // Surrogate pairs should be truncated reasonably enough.
719 { L"0123\x0915\x093f", L"0123\x2026" }, 721 { L"0123\x0915\x093f", L"0123\x2026" },
720 { L"0\x05e9\x05bc\x05c1\x05b8", L"0\x05e9\x05bc\x05c1\x05b8" }, 722 { L"0\x05e9\x05bc\x05c1\x05b8", L"0\x05e9\x05bc\x05c1\x05b8" },
721 { L"01\x05e9\x05bc\x05c1\x05b8", L"01\x05e9\x05bc\x2026" }, 723 { L"01\x05e9\x05bc\x05c1\x05b8", L"01\x05e9\x05bc\x2026" },
722 { L"012\x05e9\x05bc\x05c1\x05b8", L"012\x05e9\x2026" }, 724 { L"012\x05e9\x05bc\x05c1\x05b8", L"012\x05e9\x2026" },
723 { L"0123\x05e9\x05bc\x05c1\x05b8", L"0123\x2026" }, 725 { L"0123\x05e9\x05bc\x05c1\x05b8", L"0123\x2026" },
724 { L"01234\x05e9\x05bc\x05c1\x05b8", L"0123\x2026" }, 726 { L"01234\x05e9\x05bc\x05c1\x05b8", L"0123\x2026" },
725 { L"012\xF0\x9D\x84\x9E", L"012\xF0\x2026" }, 727 { L"012\xF0\x9D\x84\x9E", L"012\xF0\x2026" },
726 }; 728 };
727 729
728 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 730 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
729 render_text->set_truncate_length(5); 731 render_text->set_truncate_length(5);
730 for (size_t i = 0; i < arraysize(cases); i++) { 732 for (size_t i = 0; i < arraysize(cases); i++) {
731 render_text->SetText(WideToUTF16(cases[i].text)); 733 render_text->SetText(WideToUTF16(cases[i].text));
732 EXPECT_EQ(WideToUTF16(cases[i].text), render_text->text()); 734 EXPECT_EQ(WideToUTF16(cases[i].text), render_text->text());
733 EXPECT_EQ(WideToUTF16(cases[i].display_text), render_text->GetDisplayText()) 735 EXPECT_EQ(WideToUTF16(cases[i].display_text), render_text->GetDisplayText())
734 << "For case " << i << ": " << cases[i].text; 736 << "For case " << i << ": " << cases[i].text;
735 } 737 }
736 } 738 }
737 739
738 TEST_F(RenderTextTest, TruncatedObscuredText) { 740 TEST_F(RenderTextTest, TruncatedObscuredText) {
739 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 741 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
740 render_text->set_truncate_length(3); 742 render_text->set_truncate_length(3);
741 render_text->SetObscured(true); 743 render_text->SetObscured(true);
742 render_text->SetText(WideToUTF16(L"abcdef")); 744 render_text->SetText(WideToUTF16(L"abcdef"));
743 EXPECT_EQ(WideToUTF16(L"abcdef"), render_text->text()); 745 EXPECT_EQ(WideToUTF16(L"abcdef"), render_text->text());
744 EXPECT_EQ(WideToUTF16(L"**\x2026"), render_text->GetDisplayText()); 746 EXPECT_EQ(WideToUTF16(L"**\x2026"), render_text->GetDisplayText());
745 } 747 }
746 748
747 // TODO(asvitkine): RenderTextMac cursor movements. http://crbug.com/131618 749 // TODO(asvitkine): RenderTextMac cursor movements. http://crbug.com/131618
748 #if !defined(OS_MACOSX) 750 #if !defined(OS_MACOSX)
749 TEST_F(RenderTextTest, TruncatedCursorMovementLTR) { 751 TEST_F(RenderTextTest, TruncatedCursorMovementLTR) {
750 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 752 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
751 render_text->set_truncate_length(2); 753 render_text->set_truncate_length(2);
752 render_text->SetText(WideToUTF16(L"abcd")); 754 render_text->SetText(WideToUTF16(L"abcd"));
753 755
754 EXPECT_EQ(SelectionModel(0, CURSOR_BACKWARD), render_text->selection_model()); 756 EXPECT_EQ(SelectionModel(0, CURSOR_BACKWARD), render_text->selection_model());
755 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false); 757 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false);
756 EXPECT_EQ(SelectionModel(4, CURSOR_FORWARD), render_text->selection_model()); 758 EXPECT_EQ(SelectionModel(4, CURSOR_FORWARD), render_text->selection_model());
757 render_text->MoveCursor(LINE_BREAK, CURSOR_LEFT, false); 759 render_text->MoveCursor(LINE_BREAK, CURSOR_LEFT, false);
758 EXPECT_EQ(SelectionModel(0, CURSOR_BACKWARD), render_text->selection_model()); 760 EXPECT_EQ(SelectionModel(0, CURSOR_BACKWARD), render_text->selection_model());
759 761
760 std::vector<SelectionModel> expected; 762 std::vector<SelectionModel> expected;
761 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); 763 expected.push_back(SelectionModel(0, CURSOR_BACKWARD));
762 expected.push_back(SelectionModel(1, CURSOR_BACKWARD)); 764 expected.push_back(SelectionModel(1, CURSOR_BACKWARD));
763 // The cursor hops over the ellipsis and elided text to the line end. 765 // The cursor hops over the ellipsis and elided text to the line end.
764 expected.push_back(SelectionModel(4, CURSOR_BACKWARD)); 766 expected.push_back(SelectionModel(4, CURSOR_BACKWARD));
765 expected.push_back(SelectionModel(4, CURSOR_FORWARD)); 767 expected.push_back(SelectionModel(4, CURSOR_FORWARD));
766 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_RIGHT); 768 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_RIGHT);
767 769
768 expected.clear(); 770 expected.clear();
769 expected.push_back(SelectionModel(4, CURSOR_FORWARD)); 771 expected.push_back(SelectionModel(4, CURSOR_FORWARD));
770 // The cursor hops over the elided text to preceeding text. 772 // The cursor hops over the elided text to preceeding text.
771 expected.push_back(SelectionModel(1, CURSOR_FORWARD)); 773 expected.push_back(SelectionModel(1, CURSOR_FORWARD));
772 expected.push_back(SelectionModel(0, CURSOR_FORWARD)); 774 expected.push_back(SelectionModel(0, CURSOR_FORWARD));
773 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); 775 expected.push_back(SelectionModel(0, CURSOR_BACKWARD));
774 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_LEFT); 776 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_LEFT);
775 } 777 }
776 778
777 TEST_F(RenderTextTest, TruncatedCursorMovementRTL) { 779 TEST_F(RenderTextTest, TruncatedCursorMovementRTL) {
778 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 780 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
779 render_text->set_truncate_length(2); 781 render_text->set_truncate_length(2);
780 render_text->SetText(WideToUTF16(L"\x5d0\x5d1\x5d2\x5d3")); 782 render_text->SetText(WideToUTF16(L"\x5d0\x5d1\x5d2\x5d3"));
781 783
782 EXPECT_EQ(SelectionModel(0, CURSOR_BACKWARD), render_text->selection_model()); 784 EXPECT_EQ(SelectionModel(0, CURSOR_BACKWARD), render_text->selection_model());
783 render_text->MoveCursor(LINE_BREAK, CURSOR_LEFT, false); 785 render_text->MoveCursor(LINE_BREAK, CURSOR_LEFT, false);
784 EXPECT_EQ(SelectionModel(4, CURSOR_FORWARD), render_text->selection_model()); 786 EXPECT_EQ(SelectionModel(4, CURSOR_FORWARD), render_text->selection_model());
785 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false); 787 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false);
786 EXPECT_EQ(SelectionModel(0, CURSOR_BACKWARD), render_text->selection_model()); 788 EXPECT_EQ(SelectionModel(0, CURSOR_BACKWARD), render_text->selection_model());
787 789
788 std::vector<SelectionModel> expected; 790 std::vector<SelectionModel> expected;
(...skipping 25 matching lines...) Expand all
814 // Strings that begin with strong LTR characters. 816 // Strings that begin with strong LTR characters.
815 { kLtr, base::i18n::LEFT_TO_RIGHT }, 817 { kLtr, base::i18n::LEFT_TO_RIGHT },
816 { kLtrRtl, base::i18n::LEFT_TO_RIGHT }, 818 { kLtrRtl, base::i18n::LEFT_TO_RIGHT },
817 { kLtrRtlLtr, base::i18n::LEFT_TO_RIGHT }, 819 { kLtrRtlLtr, base::i18n::LEFT_TO_RIGHT },
818 // Strings that begin with strong RTL characters. 820 // Strings that begin with strong RTL characters.
819 { kRtl, base::i18n::RIGHT_TO_LEFT }, 821 { kRtl, base::i18n::RIGHT_TO_LEFT },
820 { kRtlLtr, base::i18n::RIGHT_TO_LEFT }, 822 { kRtlLtr, base::i18n::RIGHT_TO_LEFT },
821 { kRtlLtrRtl, base::i18n::RIGHT_TO_LEFT }, 823 { kRtlLtrRtl, base::i18n::RIGHT_TO_LEFT },
822 }; 824 };
823 825
824 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 826 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
825 const bool was_rtl = base::i18n::IsRTL(); 827 const bool was_rtl = base::i18n::IsRTL();
826 828
827 for (size_t i = 0; i < 2; ++i) { 829 for (size_t i = 0; i < 2; ++i) {
828 // Toggle the application default text direction (to try each direction). 830 // Toggle the application default text direction (to try each direction).
829 SetRTL(!base::i18n::IsRTL()); 831 SetRTL(!base::i18n::IsRTL());
830 const base::i18n::TextDirection ui_direction = base::i18n::IsRTL() ? 832 const base::i18n::TextDirection ui_direction = base::i18n::IsRTL() ?
831 base::i18n::RIGHT_TO_LEFT : base::i18n::LEFT_TO_RIGHT; 833 base::i18n::RIGHT_TO_LEFT : base::i18n::LEFT_TO_RIGHT;
832 834
833 // Ensure that directionality modes yield the correct text directions. 835 // Ensure that directionality modes yield the correct text directions.
834 for (size_t j = 0; j < arraysize(cases); j++) { 836 for (size_t j = 0; j < arraysize(cases); j++) {
(...skipping 17 matching lines...) Expand all
852 render_text->SetDirectionalityMode(DIRECTIONALITY_FROM_TEXT); 854 render_text->SetDirectionalityMode(DIRECTIONALITY_FROM_TEXT);
853 render_text->SetText(WideToUTF16(kLtr)); 855 render_text->SetText(WideToUTF16(kLtr));
854 EXPECT_EQ(render_text->GetDisplayTextDirection(), base::i18n::LEFT_TO_RIGHT); 856 EXPECT_EQ(render_text->GetDisplayTextDirection(), base::i18n::LEFT_TO_RIGHT);
855 render_text->SetText(WideToUTF16(kRtl)); 857 render_text->SetText(WideToUTF16(kRtl));
856 EXPECT_EQ(render_text->GetDisplayTextDirection(), base::i18n::RIGHT_TO_LEFT); 858 EXPECT_EQ(render_text->GetDisplayTextDirection(), base::i18n::RIGHT_TO_LEFT);
857 } 859 }
858 860
859 // TODO(asvitkine): RenderTextMac cursor movements. http://crbug.com/131618 861 // TODO(asvitkine): RenderTextMac cursor movements. http://crbug.com/131618
860 #if !defined(OS_MACOSX) 862 #if !defined(OS_MACOSX)
861 TEST_F(RenderTextTest, MoveCursorLeftRightInLtr) { 863 TEST_F(RenderTextTest, MoveCursorLeftRightInLtr) {
862 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 864 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
863 865
864 // Pure LTR. 866 // Pure LTR.
865 render_text->SetText(ASCIIToUTF16("abc")); 867 render_text->SetText(ASCIIToUTF16("abc"));
866 // |expected| saves the expected SelectionModel when moving cursor from left 868 // |expected| saves the expected SelectionModel when moving cursor from left
867 // to right. 869 // to right.
868 std::vector<SelectionModel> expected; 870 std::vector<SelectionModel> expected;
869 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); 871 expected.push_back(SelectionModel(0, CURSOR_BACKWARD));
870 expected.push_back(SelectionModel(1, CURSOR_BACKWARD)); 872 expected.push_back(SelectionModel(1, CURSOR_BACKWARD));
871 expected.push_back(SelectionModel(2, CURSOR_BACKWARD)); 873 expected.push_back(SelectionModel(2, CURSOR_BACKWARD));
872 expected.push_back(SelectionModel(3, CURSOR_BACKWARD)); 874 expected.push_back(SelectionModel(3, CURSOR_BACKWARD));
873 expected.push_back(SelectionModel(3, CURSOR_FORWARD)); 875 expected.push_back(SelectionModel(3, CURSOR_FORWARD));
874 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_RIGHT); 876 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_RIGHT);
875 877
876 expected.clear(); 878 expected.clear();
877 expected.push_back(SelectionModel(3, CURSOR_FORWARD)); 879 expected.push_back(SelectionModel(3, CURSOR_FORWARD));
878 expected.push_back(SelectionModel(2, CURSOR_FORWARD)); 880 expected.push_back(SelectionModel(2, CURSOR_FORWARD));
879 expected.push_back(SelectionModel(1, CURSOR_FORWARD)); 881 expected.push_back(SelectionModel(1, CURSOR_FORWARD));
880 expected.push_back(SelectionModel(0, CURSOR_FORWARD)); 882 expected.push_back(SelectionModel(0, CURSOR_FORWARD));
881 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); 883 expected.push_back(SelectionModel(0, CURSOR_BACKWARD));
882 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_LEFT); 884 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_LEFT);
883 } 885 }
884 886
885 TEST_F(RenderTextTest, MoveCursorLeftRightInLtrRtl) { 887 TEST_F(RenderTextTest, MoveCursorLeftRightInLtrRtl) {
886 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 888 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
887 // LTR-RTL 889 // LTR-RTL
888 render_text->SetText(WideToUTF16(L"abc\x05d0\x05d1\x05d2")); 890 render_text->SetText(WideToUTF16(L"abc\x05d0\x05d1\x05d2"));
889 // The last one is the expected END position. 891 // The last one is the expected END position.
890 std::vector<SelectionModel> expected; 892 std::vector<SelectionModel> expected;
891 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); 893 expected.push_back(SelectionModel(0, CURSOR_BACKWARD));
892 expected.push_back(SelectionModel(1, CURSOR_BACKWARD)); 894 expected.push_back(SelectionModel(1, CURSOR_BACKWARD));
893 expected.push_back(SelectionModel(2, CURSOR_BACKWARD)); 895 expected.push_back(SelectionModel(2, CURSOR_BACKWARD));
894 expected.push_back(SelectionModel(3, CURSOR_BACKWARD)); 896 expected.push_back(SelectionModel(3, CURSOR_BACKWARD));
895 expected.push_back(SelectionModel(5, CURSOR_FORWARD)); 897 expected.push_back(SelectionModel(5, CURSOR_FORWARD));
896 expected.push_back(SelectionModel(4, CURSOR_FORWARD)); 898 expected.push_back(SelectionModel(4, CURSOR_FORWARD));
897 expected.push_back(SelectionModel(3, CURSOR_FORWARD)); 899 expected.push_back(SelectionModel(3, CURSOR_FORWARD));
898 expected.push_back(SelectionModel(6, CURSOR_FORWARD)); 900 expected.push_back(SelectionModel(6, CURSOR_FORWARD));
899 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_RIGHT); 901 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_RIGHT);
900 902
901 expected.clear(); 903 expected.clear();
902 expected.push_back(SelectionModel(6, CURSOR_FORWARD)); 904 expected.push_back(SelectionModel(6, CURSOR_FORWARD));
903 expected.push_back(SelectionModel(4, CURSOR_BACKWARD)); 905 expected.push_back(SelectionModel(4, CURSOR_BACKWARD));
904 expected.push_back(SelectionModel(5, CURSOR_BACKWARD)); 906 expected.push_back(SelectionModel(5, CURSOR_BACKWARD));
905 expected.push_back(SelectionModel(6, CURSOR_BACKWARD)); 907 expected.push_back(SelectionModel(6, CURSOR_BACKWARD));
906 expected.push_back(SelectionModel(2, CURSOR_FORWARD)); 908 expected.push_back(SelectionModel(2, CURSOR_FORWARD));
907 expected.push_back(SelectionModel(1, CURSOR_FORWARD)); 909 expected.push_back(SelectionModel(1, CURSOR_FORWARD));
908 expected.push_back(SelectionModel(0, CURSOR_FORWARD)); 910 expected.push_back(SelectionModel(0, CURSOR_FORWARD));
909 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); 911 expected.push_back(SelectionModel(0, CURSOR_BACKWARD));
910 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_LEFT); 912 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_LEFT);
911 } 913 }
912 914
913 TEST_F(RenderTextTest, MoveCursorLeftRightInLtrRtlLtr) { 915 TEST_F(RenderTextTest, MoveCursorLeftRightInLtrRtlLtr) {
914 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 916 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
915 // LTR-RTL-LTR. 917 // LTR-RTL-LTR.
916 render_text->SetText(WideToUTF16(L"a" L"\x05d1" L"b")); 918 render_text->SetText(WideToUTF16(L"a" L"\x05d1" L"b"));
917 std::vector<SelectionModel> expected; 919 std::vector<SelectionModel> expected;
918 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); 920 expected.push_back(SelectionModel(0, CURSOR_BACKWARD));
919 expected.push_back(SelectionModel(1, CURSOR_BACKWARD)); 921 expected.push_back(SelectionModel(1, CURSOR_BACKWARD));
920 expected.push_back(SelectionModel(1, CURSOR_FORWARD)); 922 expected.push_back(SelectionModel(1, CURSOR_FORWARD));
921 expected.push_back(SelectionModel(3, CURSOR_BACKWARD)); 923 expected.push_back(SelectionModel(3, CURSOR_BACKWARD));
922 expected.push_back(SelectionModel(3, CURSOR_FORWARD)); 924 expected.push_back(SelectionModel(3, CURSOR_FORWARD));
923 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_RIGHT); 925 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_RIGHT);
924 926
925 expected.clear(); 927 expected.clear();
926 expected.push_back(SelectionModel(3, CURSOR_FORWARD)); 928 expected.push_back(SelectionModel(3, CURSOR_FORWARD));
927 expected.push_back(SelectionModel(2, CURSOR_FORWARD)); 929 expected.push_back(SelectionModel(2, CURSOR_FORWARD));
928 expected.push_back(SelectionModel(2, CURSOR_BACKWARD)); 930 expected.push_back(SelectionModel(2, CURSOR_BACKWARD));
929 expected.push_back(SelectionModel(0, CURSOR_FORWARD)); 931 expected.push_back(SelectionModel(0, CURSOR_FORWARD));
930 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); 932 expected.push_back(SelectionModel(0, CURSOR_BACKWARD));
931 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_LEFT); 933 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_LEFT);
932 } 934 }
933 935
934 TEST_F(RenderTextTest, MoveCursorLeftRightInRtl) { 936 TEST_F(RenderTextTest, MoveCursorLeftRightInRtl) {
935 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 937 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
936 // Pure RTL. 938 // Pure RTL.
937 render_text->SetText(WideToUTF16(L"\x05d0\x05d1\x05d2")); 939 render_text->SetText(WideToUTF16(L"\x05d0\x05d1\x05d2"));
938 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false); 940 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false);
939 std::vector<SelectionModel> expected; 941 std::vector<SelectionModel> expected;
940 942
941 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); 943 expected.push_back(SelectionModel(0, CURSOR_BACKWARD));
942 expected.push_back(SelectionModel(1, CURSOR_BACKWARD)); 944 expected.push_back(SelectionModel(1, CURSOR_BACKWARD));
943 expected.push_back(SelectionModel(2, CURSOR_BACKWARD)); 945 expected.push_back(SelectionModel(2, CURSOR_BACKWARD));
944 expected.push_back(SelectionModel(3, CURSOR_BACKWARD)); 946 expected.push_back(SelectionModel(3, CURSOR_BACKWARD));
945 expected.push_back(SelectionModel(3, CURSOR_FORWARD)); 947 expected.push_back(SelectionModel(3, CURSOR_FORWARD));
946 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_LEFT); 948 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_LEFT);
947 949
948 expected.clear(); 950 expected.clear();
949 951
950 expected.push_back(SelectionModel(3, CURSOR_FORWARD)); 952 expected.push_back(SelectionModel(3, CURSOR_FORWARD));
951 expected.push_back(SelectionModel(2, CURSOR_FORWARD)); 953 expected.push_back(SelectionModel(2, CURSOR_FORWARD));
952 expected.push_back(SelectionModel(1, CURSOR_FORWARD)); 954 expected.push_back(SelectionModel(1, CURSOR_FORWARD));
953 expected.push_back(SelectionModel(0, CURSOR_FORWARD)); 955 expected.push_back(SelectionModel(0, CURSOR_FORWARD));
954 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); 956 expected.push_back(SelectionModel(0, CURSOR_BACKWARD));
955 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_RIGHT); 957 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_RIGHT);
956 } 958 }
957 959
958 TEST_F(RenderTextTest, MoveCursorLeftRightInRtlLtr) { 960 TEST_F(RenderTextTest, MoveCursorLeftRightInRtlLtr) {
959 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 961 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
960 // RTL-LTR 962 // RTL-LTR
961 render_text->SetText(WideToUTF16(L"\x05d0\x05d1\x05d2" L"abc")); 963 render_text->SetText(WideToUTF16(L"\x05d0\x05d1\x05d2" L"abc"));
962 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false); 964 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false);
963 std::vector<SelectionModel> expected; 965 std::vector<SelectionModel> expected;
964 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); 966 expected.push_back(SelectionModel(0, CURSOR_BACKWARD));
965 expected.push_back(SelectionModel(1, CURSOR_BACKWARD)); 967 expected.push_back(SelectionModel(1, CURSOR_BACKWARD));
966 expected.push_back(SelectionModel(2, CURSOR_BACKWARD)); 968 expected.push_back(SelectionModel(2, CURSOR_BACKWARD));
967 expected.push_back(SelectionModel(3, CURSOR_BACKWARD)); 969 expected.push_back(SelectionModel(3, CURSOR_BACKWARD));
968 expected.push_back(SelectionModel(5, CURSOR_FORWARD)); 970 expected.push_back(SelectionModel(5, CURSOR_FORWARD));
969 expected.push_back(SelectionModel(4, CURSOR_FORWARD)); 971 expected.push_back(SelectionModel(4, CURSOR_FORWARD));
970 expected.push_back(SelectionModel(3, CURSOR_FORWARD)); 972 expected.push_back(SelectionModel(3, CURSOR_FORWARD));
971 expected.push_back(SelectionModel(6, CURSOR_FORWARD)); 973 expected.push_back(SelectionModel(6, CURSOR_FORWARD));
972 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_LEFT); 974 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_LEFT);
973 975
974 expected.clear(); 976 expected.clear();
975 expected.push_back(SelectionModel(6, CURSOR_FORWARD)); 977 expected.push_back(SelectionModel(6, CURSOR_FORWARD));
976 expected.push_back(SelectionModel(4, CURSOR_BACKWARD)); 978 expected.push_back(SelectionModel(4, CURSOR_BACKWARD));
977 expected.push_back(SelectionModel(5, CURSOR_BACKWARD)); 979 expected.push_back(SelectionModel(5, CURSOR_BACKWARD));
978 expected.push_back(SelectionModel(6, CURSOR_BACKWARD)); 980 expected.push_back(SelectionModel(6, CURSOR_BACKWARD));
979 expected.push_back(SelectionModel(2, CURSOR_FORWARD)); 981 expected.push_back(SelectionModel(2, CURSOR_FORWARD));
980 expected.push_back(SelectionModel(1, CURSOR_FORWARD)); 982 expected.push_back(SelectionModel(1, CURSOR_FORWARD));
981 expected.push_back(SelectionModel(0, CURSOR_FORWARD)); 983 expected.push_back(SelectionModel(0, CURSOR_FORWARD));
982 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); 984 expected.push_back(SelectionModel(0, CURSOR_BACKWARD));
983 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_RIGHT); 985 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_RIGHT);
984 } 986 }
985 987
986 TEST_F(RenderTextTest, MoveCursorLeftRightInRtlLtrRtl) { 988 TEST_F(RenderTextTest, MoveCursorLeftRightInRtlLtrRtl) {
987 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 989 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
988 // RTL-LTR-RTL. 990 // RTL-LTR-RTL.
989 render_text->SetText(WideToUTF16(L"\x05d0" L"a" L"\x05d1")); 991 render_text->SetText(WideToUTF16(L"\x05d0" L"a" L"\x05d1"));
990 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false); 992 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false);
991 std::vector<SelectionModel> expected; 993 std::vector<SelectionModel> expected;
992 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); 994 expected.push_back(SelectionModel(0, CURSOR_BACKWARD));
993 expected.push_back(SelectionModel(1, CURSOR_BACKWARD)); 995 expected.push_back(SelectionModel(1, CURSOR_BACKWARD));
994 expected.push_back(SelectionModel(1, CURSOR_FORWARD)); 996 expected.push_back(SelectionModel(1, CURSOR_FORWARD));
995 expected.push_back(SelectionModel(3, CURSOR_BACKWARD)); 997 expected.push_back(SelectionModel(3, CURSOR_BACKWARD));
996 expected.push_back(SelectionModel(3, CURSOR_FORWARD)); 998 expected.push_back(SelectionModel(3, CURSOR_FORWARD));
997 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_LEFT); 999 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_LEFT);
998 1000
999 expected.clear(); 1001 expected.clear();
1000 expected.push_back(SelectionModel(3, CURSOR_FORWARD)); 1002 expected.push_back(SelectionModel(3, CURSOR_FORWARD));
1001 expected.push_back(SelectionModel(2, CURSOR_FORWARD)); 1003 expected.push_back(SelectionModel(2, CURSOR_FORWARD));
1002 expected.push_back(SelectionModel(2, CURSOR_BACKWARD)); 1004 expected.push_back(SelectionModel(2, CURSOR_BACKWARD));
1003 expected.push_back(SelectionModel(0, CURSOR_FORWARD)); 1005 expected.push_back(SelectionModel(0, CURSOR_FORWARD));
1004 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); 1006 expected.push_back(SelectionModel(0, CURSOR_BACKWARD));
1005 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_RIGHT); 1007 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_RIGHT);
1006 } 1008 }
1007 1009
1008 TEST_F(RenderTextTest, MoveCursorLeftRight_ComplexScript) { 1010 TEST_F(RenderTextTest, MoveCursorLeftRight_ComplexScript) {
1009 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1011 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1010 1012
1011 render_text->SetText(WideToUTF16(L"\x0915\x093f\x0915\x094d\x0915")); 1013 render_text->SetText(WideToUTF16(L"\x0915\x093f\x0915\x094d\x0915"));
1012 EXPECT_EQ(0U, render_text->cursor_position()); 1014 EXPECT_EQ(0U, render_text->cursor_position());
1013 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); 1015 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false);
1014 EXPECT_EQ(2U, render_text->cursor_position()); 1016 EXPECT_EQ(2U, render_text->cursor_position());
1015 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); 1017 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false);
1016 EXPECT_EQ(4U, render_text->cursor_position()); 1018 EXPECT_EQ(4U, render_text->cursor_position());
1017 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); 1019 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false);
1018 EXPECT_EQ(5U, render_text->cursor_position()); 1020 EXPECT_EQ(5U, render_text->cursor_position());
1019 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); 1021 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false);
1020 EXPECT_EQ(5U, render_text->cursor_position()); 1022 EXPECT_EQ(5U, render_text->cursor_position());
1021 1023
1022 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); 1024 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false);
1023 EXPECT_EQ(4U, render_text->cursor_position()); 1025 EXPECT_EQ(4U, render_text->cursor_position());
1024 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); 1026 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false);
1025 EXPECT_EQ(2U, render_text->cursor_position()); 1027 EXPECT_EQ(2U, render_text->cursor_position());
1026 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); 1028 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false);
1027 EXPECT_EQ(0U, render_text->cursor_position()); 1029 EXPECT_EQ(0U, render_text->cursor_position());
1028 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); 1030 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false);
1029 EXPECT_EQ(0U, render_text->cursor_position()); 1031 EXPECT_EQ(0U, render_text->cursor_position());
1030 } 1032 }
1031 1033
1032 TEST_F(RenderTextTest, MoveCursorLeftRight_MeiryoUILigatures) { 1034 TEST_F(RenderTextTest, MoveCursorLeftRight_MeiryoUILigatures) {
1033 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1035 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1034 // Meiryo UI uses single-glyph ligatures for 'ff' and 'ffi', but each letter 1036 // Meiryo UI uses single-glyph ligatures for 'ff' and 'ffi', but each letter
1035 // (code point) has unique bounds, so mid-glyph cursoring should be possible. 1037 // (code point) has unique bounds, so mid-glyph cursoring should be possible.
1036 render_text->SetFontList(FontList("Meiryo UI, 12px")); 1038 render_text->SetFontList(FontList("Meiryo UI, 12px"));
1037 render_text->SetText(WideToUTF16(L"ff ffi")); 1039 render_text->SetText(WideToUTF16(L"ff ffi"));
1038 EXPECT_EQ(0U, render_text->cursor_position()); 1040 EXPECT_EQ(0U, render_text->cursor_position());
1039 for (size_t i = 0; i < render_text->text().length(); ++i) { 1041 for (size_t i = 0; i < render_text->text().length(); ++i) {
1040 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); 1042 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false);
1041 EXPECT_EQ(i + 1, render_text->cursor_position()); 1043 EXPECT_EQ(i + 1, render_text->cursor_position());
1042 } 1044 }
1043 EXPECT_EQ(6U, render_text->cursor_position()); 1045 EXPECT_EQ(6U, render_text->cursor_position());
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1096 { kText3, 7, 6, 6 }, 1098 { kText3, 7, 6, 6 },
1097 { kText3, 50, 6, 6 }, 1099 { kText3, 50, 6, 6 },
1098 }; 1100 };
1099 1101
1100 #if defined(OS_WIN) 1102 #if defined(OS_WIN)
1101 // TODO(msw): XP fails due to lack of font support: http://crbug.com/106450 1103 // TODO(msw): XP fails due to lack of font support: http://crbug.com/106450
1102 if (base::win::GetVersion() < base::win::VERSION_VISTA) 1104 if (base::win::GetVersion() < base::win::VERSION_VISTA)
1103 return; 1105 return;
1104 #endif 1106 #endif
1105 1107
1106 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1108 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1107 for (size_t i = 0; i < arraysize(cases); i++) { 1109 for (size_t i = 0; i < arraysize(cases); i++) {
1108 SCOPED_TRACE(base::StringPrintf("Testing cases[%" PRIuS "]", i)); 1110 SCOPED_TRACE(base::StringPrintf("Testing cases[%" PRIuS "]", i));
1109 render_text->SetText(cases[i].text); 1111 render_text->SetText(cases[i].text);
1110 1112
1111 size_t next = render_text->IndexOfAdjacentGrapheme(cases[i].index, 1113 size_t next = render_text->IndexOfAdjacentGrapheme(cases[i].index,
1112 CURSOR_FORWARD); 1114 CURSOR_FORWARD);
1113 EXPECT_EQ(cases[i].expected_next, next); 1115 EXPECT_EQ(cases[i].expected_next, next);
1114 EXPECT_TRUE(render_text->IsValidCursorIndex(next)); 1116 EXPECT_TRUE(render_text->IsValidCursorIndex(next));
1115 1117
1116 size_t previous = render_text->IndexOfAdjacentGrapheme(cases[i].index, 1118 size_t previous = render_text->IndexOfAdjacentGrapheme(cases[i].index,
1117 CURSOR_BACKWARD); 1119 CURSOR_BACKWARD);
1118 EXPECT_EQ(cases[i].expected_previous, previous); 1120 EXPECT_EQ(cases[i].expected_previous, previous);
1119 EXPECT_TRUE(render_text->IsValidCursorIndex(previous)); 1121 EXPECT_TRUE(render_text->IsValidCursorIndex(previous));
1120 } 1122 }
1121 } 1123 }
1122 1124
1123 TEST_F(RenderTextTest, MidGraphemeSelectionBounds) { 1125 TEST_F(RenderTextTest, MidGraphemeSelectionBounds) {
1124 #if defined(OS_WIN) 1126 #if defined(OS_WIN)
1125 // TODO(msw): XP fails due to lack of font support: http://crbug.com/106450 1127 // TODO(msw): XP fails due to lack of font support: http://crbug.com/106450
1126 if (base::win::GetVersion() < base::win::VERSION_VISTA) 1128 if (base::win::GetVersion() < base::win::VERSION_VISTA)
1127 return; 1129 return;
1128 #endif 1130 #endif
1129 1131
1130 // Test that selection bounds may be set amid multi-character graphemes. 1132 // Test that selection bounds may be set amid multi-character graphemes.
1131 const base::string16 kHindi = WideToUTF16(L"\x0915\x093f"); 1133 const base::string16 kHindi = WideToUTF16(L"\x0915\x093f");
1132 const base::string16 kThai = WideToUTF16(L"\x0e08\x0e33"); 1134 const base::string16 kThai = WideToUTF16(L"\x0e08\x0e33");
1133 const base::string16 cases[] = { kHindi, kThai }; 1135 const base::string16 cases[] = { kHindi, kThai };
1134 1136
1135 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1137 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1136 for (size_t i = 0; i < arraysize(cases); i++) { 1138 for (size_t i = 0; i < arraysize(cases); i++) {
1137 SCOPED_TRACE(base::StringPrintf("Testing cases[%" PRIuS "]", i)); 1139 SCOPED_TRACE(base::StringPrintf("Testing cases[%" PRIuS "]", i));
1138 render_text->SetText(cases[i]); 1140 render_text->SetText(cases[i]);
1139 EXPECT_TRUE(render_text->IsValidLogicalIndex(1)); 1141 EXPECT_TRUE(render_text->IsValidLogicalIndex(1));
1140 EXPECT_FALSE(render_text->IsValidCursorIndex(1)); 1142 EXPECT_FALSE(render_text->IsValidCursorIndex(1));
1141 EXPECT_TRUE(render_text->SelectRange(Range(2, 1))); 1143 EXPECT_TRUE(render_text->SelectRange(Range(2, 1)));
1142 EXPECT_EQ(Range(2, 1), render_text->selection()); 1144 EXPECT_EQ(Range(2, 1), render_text->selection());
1143 EXPECT_EQ(1U, render_text->cursor_position()); 1145 EXPECT_EQ(1U, render_text->cursor_position());
1144 // Although selection bounds may be set within a multi-character grapheme, 1146 // Although selection bounds may be set within a multi-character grapheme,
1145 // cursor movement (e.g. via arrow key) should avoid those indices. 1147 // cursor movement (e.g. via arrow key) should avoid those indices.
1146 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); 1148 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false);
1147 EXPECT_EQ(0U, render_text->cursor_position()); 1149 EXPECT_EQ(0U, render_text->cursor_position());
1148 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); 1150 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false);
1149 EXPECT_EQ(2U, render_text->cursor_position()); 1151 EXPECT_EQ(2U, render_text->cursor_position());
1150 } 1152 }
1151 } 1153 }
1152 1154
1153 TEST_F(RenderTextTest, FindCursorPosition) { 1155 TEST_F(RenderTextTest, FindCursorPosition) {
1154 const wchar_t* kTestStrings[] = { kLtrRtl, kLtrRtlLtr, kRtlLtr, kRtlLtrRtl }; 1156 const wchar_t* kTestStrings[] = { kLtrRtl, kLtrRtlLtr, kRtlLtr, kRtlLtrRtl };
1155 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1157 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1156 render_text->SetDisplayRect(Rect(0, 0, 100, 20)); 1158 render_text->SetDisplayRect(Rect(0, 0, 100, 20));
1157 for (size_t i = 0; i < arraysize(kTestStrings); ++i) { 1159 for (size_t i = 0; i < arraysize(kTestStrings); ++i) {
1158 SCOPED_TRACE(base::StringPrintf("Testing case[%" PRIuS "]", i)); 1160 SCOPED_TRACE(base::StringPrintf("Testing case[%" PRIuS "]", i));
1159 render_text->SetText(WideToUTF16(kTestStrings[i])); 1161 render_text->SetText(WideToUTF16(kTestStrings[i]));
1160 for(size_t j = 0; j < render_text->text().length(); ++j) { 1162 for(size_t j = 0; j < render_text->text().length(); ++j) {
1161 const Range range(render_text->GetGlyphBounds(j)); 1163 const Range range(render_text->GetGlyphBounds(j));
1162 // Test a point just inside the leading edge of the glyph bounds. 1164 // Test a point just inside the leading edge of the glyph bounds.
1163 int x = range.is_reversed() ? range.GetMax() - 1 : range.GetMin() + 1; 1165 int x = range.is_reversed() ? range.GetMax() - 1 : range.GetMin() + 1;
1164 EXPECT_EQ(j, render_text->FindCursorPosition(Point(x, 0)).caret_pos()); 1166 EXPECT_EQ(j, render_text->FindCursorPosition(Point(x, 0)).caret_pos());
1165 } 1167 }
(...skipping 26 matching lines...) Expand all
1192 { kRTLGrapheme, base::i18n::RIGHT_TO_LEFT }, 1194 { kRTLGrapheme, base::i18n::RIGHT_TO_LEFT },
1193 { kHebrewLatin, base::i18n::RIGHT_TO_LEFT }, 1195 { kHebrewLatin, base::i18n::RIGHT_TO_LEFT },
1194 }; 1196 };
1195 1197
1196 #if defined(OS_WIN) 1198 #if defined(OS_WIN)
1197 // TODO(msw): XP fails due to lack of font support: http://crbug.com/106450 1199 // TODO(msw): XP fails due to lack of font support: http://crbug.com/106450
1198 if (base::win::GetVersion() < base::win::VERSION_VISTA) 1200 if (base::win::GetVersion() < base::win::VERSION_VISTA)
1199 return; 1201 return;
1200 #endif 1202 #endif
1201 1203
1202 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1204 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1203 for (size_t i = 0; i < arraysize(cases); i++) { 1205 for (size_t i = 0; i < arraysize(cases); i++) {
1204 render_text->SetText(cases[i].text); 1206 render_text->SetText(cases[i].text);
1205 bool ltr = (cases[i].expected_text_direction == base::i18n::LEFT_TO_RIGHT); 1207 bool ltr = (cases[i].expected_text_direction == base::i18n::LEFT_TO_RIGHT);
1206 1208
1207 SelectionModel start_edge = 1209 SelectionModel start_edge =
1208 render_text->EdgeSelectionModel(ltr ? CURSOR_LEFT : CURSOR_RIGHT); 1210 render_text->EdgeSelectionModel(ltr ? CURSOR_LEFT : CURSOR_RIGHT);
1209 EXPECT_EQ(start_edge, SelectionModel(0, CURSOR_BACKWARD)); 1211 EXPECT_EQ(start_edge, SelectionModel(0, CURSOR_BACKWARD));
1210 1212
1211 SelectionModel end_edge = 1213 SelectionModel end_edge =
1212 render_text->EdgeSelectionModel(ltr ? CURSOR_RIGHT : CURSOR_LEFT); 1214 render_text->EdgeSelectionModel(ltr ? CURSOR_RIGHT : CURSOR_LEFT);
1213 EXPECT_EQ(end_edge, SelectionModel(cases[i].text.length(), CURSOR_FORWARD)); 1215 EXPECT_EQ(end_edge, SelectionModel(cases[i].text.length(), CURSOR_FORWARD));
1214 } 1216 }
1215 } 1217 }
1216 1218
1217 TEST_F(RenderTextTest, SelectAll) { 1219 TEST_F(RenderTextTest, SelectAll) {
1218 const wchar_t* const cases[] = 1220 const wchar_t* const cases[] =
1219 { kWeak, kLtr, kLtrRtl, kLtrRtlLtr, kRtl, kRtlLtr, kRtlLtrRtl }; 1221 { kWeak, kLtr, kLtrRtl, kLtrRtlLtr, kRtl, kRtlLtr, kRtlLtrRtl };
1220 1222
1221 // Ensure that SelectAll respects the |reversed| argument regardless of 1223 // Ensure that SelectAll respects the |reversed| argument regardless of
1222 // application locale and text content directionality. 1224 // application locale and text content directionality.
1223 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1225 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1224 const SelectionModel expected_reversed(Range(3, 0), CURSOR_FORWARD); 1226 const SelectionModel expected_reversed(Range(3, 0), CURSOR_FORWARD);
1225 const SelectionModel expected_forwards(Range(0, 3), CURSOR_BACKWARD); 1227 const SelectionModel expected_forwards(Range(0, 3), CURSOR_BACKWARD);
1226 const bool was_rtl = base::i18n::IsRTL(); 1228 const bool was_rtl = base::i18n::IsRTL();
1227 1229
1228 for (size_t i = 0; i < 2; ++i) { 1230 for (size_t i = 0; i < 2; ++i) {
1229 SetRTL(!base::i18n::IsRTL()); 1231 SetRTL(!base::i18n::IsRTL());
1230 // Test that an empty string produces an empty selection model. 1232 // Test that an empty string produces an empty selection model.
1231 render_text->SetText(base::string16()); 1233 render_text->SetText(base::string16());
1232 EXPECT_EQ(render_text->selection_model(), SelectionModel()); 1234 EXPECT_EQ(render_text->selection_model(), SelectionModel());
1233 1235
1234 // Test the weak, LTR, RTL, and Bidi string cases. 1236 // Test the weak, LTR, RTL, and Bidi string cases.
1235 for (size_t j = 0; j < arraysize(cases); j++) { 1237 for (size_t j = 0; j < arraysize(cases); j++) {
1236 render_text->SetText(WideToUTF16(cases[j])); 1238 render_text->SetText(WideToUTF16(cases[j]));
1237 render_text->SelectAll(false); 1239 render_text->SelectAll(false);
1238 EXPECT_EQ(render_text->selection_model(), expected_forwards); 1240 EXPECT_EQ(render_text->selection_model(), expected_forwards);
1239 render_text->SelectAll(true); 1241 render_text->SelectAll(true);
1240 EXPECT_EQ(render_text->selection_model(), expected_reversed); 1242 EXPECT_EQ(render_text->selection_model(), expected_reversed);
1241 } 1243 }
1242 } 1244 }
1243 1245
1244 EXPECT_EQ(was_rtl, base::i18n::IsRTL()); 1246 EXPECT_EQ(was_rtl, base::i18n::IsRTL());
1245 } 1247 }
1246 1248
1247 // TODO(asvitkine): RenderTextMac cursor movements. http://crbug.com/131618 1249 // TODO(asvitkine): RenderTextMac cursor movements. http://crbug.com/131618
1248 #if !defined(OS_MACOSX) 1250 #if !defined(OS_MACOSX)
1249 TEST_F(RenderTextTest, MoveCursorLeftRightWithSelection) { 1251 TEST_F(RenderTextTest, MoveCursorLeftRightWithSelection) {
1250 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1252 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1251 render_text->SetText(WideToUTF16(L"abc\x05d0\x05d1\x05d2")); 1253 render_text->SetText(WideToUTF16(L"abc\x05d0\x05d1\x05d2"));
1252 // Left arrow on select ranging (6, 4). 1254 // Left arrow on select ranging (6, 4).
1253 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false); 1255 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false);
1254 EXPECT_EQ(Range(6), render_text->selection()); 1256 EXPECT_EQ(Range(6), render_text->selection());
1255 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); 1257 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false);
1256 EXPECT_EQ(Range(4), render_text->selection()); 1258 EXPECT_EQ(Range(4), render_text->selection());
1257 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); 1259 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false);
1258 EXPECT_EQ(Range(5), render_text->selection()); 1260 EXPECT_EQ(Range(5), render_text->selection());
1259 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); 1261 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false);
1260 EXPECT_EQ(Range(6), render_text->selection()); 1262 EXPECT_EQ(Range(6), render_text->selection());
(...skipping 20 matching lines...) Expand all
1281 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, true); 1283 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, true);
1282 EXPECT_EQ(Range(4, 5), render_text->selection()); 1284 EXPECT_EQ(Range(4, 5), render_text->selection());
1283 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, true); 1285 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, true);
1284 EXPECT_EQ(Range(4, 6), render_text->selection()); 1286 EXPECT_EQ(Range(4, 6), render_text->selection());
1285 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); 1287 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false);
1286 EXPECT_EQ(Range(4), render_text->selection()); 1288 EXPECT_EQ(Range(4), render_text->selection());
1287 } 1289 }
1288 #endif // !defined(OS_MACOSX) 1290 #endif // !defined(OS_MACOSX)
1289 1291
1290 TEST_F(RenderTextTest, CenteredDisplayOffset) { 1292 TEST_F(RenderTextTest, CenteredDisplayOffset) {
1291 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1293 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1292 render_text->SetText(ASCIIToUTF16("abcdefghij")); 1294 render_text->SetText(ASCIIToUTF16("abcdefghij"));
1293 render_text->SetHorizontalAlignment(ALIGN_CENTER); 1295 render_text->SetHorizontalAlignment(ALIGN_CENTER);
1294 1296
1295 const int kEnlargement = 10; 1297 const int kEnlargement = 10;
1296 const int content_width = render_text->GetContentWidth(); 1298 const int content_width = render_text->GetContentWidth();
1297 Rect display_rect(0, 0, content_width / 2, 1299 Rect display_rect(0, 0, content_width / 2,
1298 render_text->font_list().GetHeight()); 1300 render_text->font_list().GetHeight());
1299 render_text->SetDisplayRect(display_rect); 1301 render_text->SetDisplayRect(display_rect);
1300 1302
1301 // Move the cursor to the beginning of the text and, by checking the cursor 1303 // Move the cursor to the beginning of the text and, by checking the cursor
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
1386 EXPECT_EQ(end, render_text->selection_model()); 1388 EXPECT_EQ(end, render_text->selection_model());
1387 } 1389 }
1388 } 1390 }
1389 } 1391 }
1390 1392
1391 // TODO(asvitkine): RenderTextMac cursor movements. http://crbug.com/131618 1393 // TODO(asvitkine): RenderTextMac cursor movements. http://crbug.com/131618
1392 #if !defined(OS_MACOSX) 1394 #if !defined(OS_MACOSX)
1393 // TODO(msw): Make these work on Windows. 1395 // TODO(msw): Make these work on Windows.
1394 #if !defined(OS_WIN) 1396 #if !defined(OS_WIN)
1395 TEST_F(RenderTextTest, MoveLeftRightByWordInBidiText) { 1397 TEST_F(RenderTextTest, MoveLeftRightByWordInBidiText) {
1396 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1398 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1397 1399
1398 // For testing simplicity, each word is a 3-character word. 1400 // For testing simplicity, each word is a 3-character word.
1399 std::vector<const wchar_t*> test; 1401 std::vector<const wchar_t*> test;
1400 test.push_back(L"abc"); 1402 test.push_back(L"abc");
1401 test.push_back(L"abc def"); 1403 test.push_back(L"abc def");
1402 test.push_back(L"\x05E1\x05E2\x05E3"); 1404 test.push_back(L"\x05E1\x05E2\x05E3");
1403 test.push_back(L"\x05E1\x05E2\x05E3 \x05E4\x05E5\x05E6"); 1405 test.push_back(L"\x05E1\x05E2\x05E3 \x05E4\x05E5\x05E6");
1404 test.push_back(L"abc \x05E1\x05E2\x05E3"); 1406 test.push_back(L"abc \x05E1\x05E2\x05E3");
1405 test.push_back(L"abc def \x05E1\x05E2\x05E3 \x05E4\x05E5\x05E6"); 1407 test.push_back(L"abc def \x05E1\x05E2\x05E3 \x05E4\x05E5\x05E6");
1406 test.push_back(L"abc def hij \x05E1\x05E2\x05E3 \x05E4\x05E5\x05E6" 1408 test.push_back(L"abc def hij \x05E1\x05E2\x05E3 \x05E4\x05E5\x05E6"
(...skipping 14 matching lines...) Expand all
1421 L" \x05E1\x05E2\x05E3 \x05E4\x05E5\x05E6"); 1423 L" \x05E1\x05E2\x05E3 \x05E4\x05E5\x05E6");
1422 test.push_back(L"\x05D1\x05D2\x05D3 \x05D4\x05D5\x05D6 \x05D7\x05D8\x05D9" 1424 test.push_back(L"\x05D1\x05D2\x05D3 \x05D4\x05D5\x05D6 \x05D7\x05D8\x05D9"
1423 L" abc def hij \x05E1\x05E2\x05E3 \x05E4\x05E5\x05E6" 1425 L" abc def hij \x05E1\x05E2\x05E3 \x05E4\x05E5\x05E6"
1424 L" \x05E7\x05E8\x05E9"); 1426 L" \x05E7\x05E8\x05E9");
1425 1427
1426 for (size_t i = 0; i < test.size(); ++i) 1428 for (size_t i = 0; i < test.size(); ++i)
1427 MoveLeftRightByWordVerifier(render_text.get(), test[i]); 1429 MoveLeftRightByWordVerifier(render_text.get(), test[i]);
1428 } 1430 }
1429 1431
1430 TEST_F(RenderTextTest, MoveLeftRightByWordInBidiText_TestEndOfText) { 1432 TEST_F(RenderTextTest, MoveLeftRightByWordInBidiText_TestEndOfText) {
1431 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1433 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1432 1434
1433 render_text->SetText(WideToUTF16(L"ab\x05E1")); 1435 render_text->SetText(WideToUTF16(L"ab\x05E1"));
1434 // Moving the cursor by word from "abC|" to the left should return "|abC". 1436 // Moving the cursor by word from "abC|" to the left should return "|abC".
1435 // But since end of text is always treated as a word break, it returns 1437 // But since end of text is always treated as a word break, it returns
1436 // position "ab|C". 1438 // position "ab|C".
1437 // TODO(xji): Need to make it work as expected. 1439 // TODO(xji): Need to make it work as expected.
1438 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false); 1440 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false);
1439 render_text->MoveCursor(WORD_BREAK, CURSOR_LEFT, false); 1441 render_text->MoveCursor(WORD_BREAK, CURSOR_LEFT, false);
1440 // EXPECT_EQ(SelectionModel(), render_text->selection_model()); 1442 // EXPECT_EQ(SelectionModel(), render_text->selection_model());
1441 1443
(...skipping 12 matching lines...) Expand all
1454 // Moving the cursor by word from "|aCB" to the right should return "aCB|". 1456 // Moving the cursor by word from "|aCB" to the right should return "aCB|".
1455 // But since end of text is always treated as a word break, it returns 1457 // But since end of text is always treated as a word break, it returns
1456 // position "a|CB". 1458 // position "a|CB".
1457 // TODO(xji): Need to make it work as expected. 1459 // TODO(xji): Need to make it work as expected.
1458 render_text->MoveCursor(LINE_BREAK, CURSOR_LEFT, false); 1460 render_text->MoveCursor(LINE_BREAK, CURSOR_LEFT, false);
1459 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false); 1461 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false);
1460 // EXPECT_EQ(SelectionModel(), render_text->selection_model()); 1462 // EXPECT_EQ(SelectionModel(), render_text->selection_model());
1461 } 1463 }
1462 1464
1463 TEST_F(RenderTextTest, MoveLeftRightByWordInTextWithMultiSpaces) { 1465 TEST_F(RenderTextTest, MoveLeftRightByWordInTextWithMultiSpaces) {
1464 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1466 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1465 render_text->SetText(WideToUTF16(L"abc def")); 1467 render_text->SetText(WideToUTF16(L"abc def"));
1466 render_text->MoveCursorTo(SelectionModel(5, CURSOR_FORWARD)); 1468 render_text->MoveCursorTo(SelectionModel(5, CURSOR_FORWARD));
1467 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false); 1469 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false);
1468 EXPECT_EQ(11U, render_text->cursor_position()); 1470 EXPECT_EQ(11U, render_text->cursor_position());
1469 1471
1470 render_text->MoveCursorTo(SelectionModel(5, CURSOR_FORWARD)); 1472 render_text->MoveCursorTo(SelectionModel(5, CURSOR_FORWARD));
1471 render_text->MoveCursor(WORD_BREAK, CURSOR_LEFT, false); 1473 render_text->MoveCursor(WORD_BREAK, CURSOR_LEFT, false);
1472 EXPECT_EQ(0U, render_text->cursor_position()); 1474 EXPECT_EQ(0U, render_text->cursor_position());
1473 } 1475 }
1474 #endif // !defined(OS_WIN) 1476 #endif // !defined(OS_WIN)
1475 1477
1476 TEST_F(RenderTextTest, MoveLeftRightByWordInChineseText) { 1478 TEST_F(RenderTextTest, MoveLeftRightByWordInChineseText) {
1477 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1479 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1478 render_text->SetText(WideToUTF16(L"\x6211\x4EEC\x53BB\x516C\x56ED\x73A9")); 1480 render_text->SetText(WideToUTF16(L"\x6211\x4EEC\x53BB\x516C\x56ED\x73A9"));
1479 render_text->MoveCursor(LINE_BREAK, CURSOR_LEFT, false); 1481 render_text->MoveCursor(LINE_BREAK, CURSOR_LEFT, false);
1480 EXPECT_EQ(0U, render_text->cursor_position()); 1482 EXPECT_EQ(0U, render_text->cursor_position());
1481 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false); 1483 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false);
1482 EXPECT_EQ(2U, render_text->cursor_position()); 1484 EXPECT_EQ(2U, render_text->cursor_position());
1483 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false); 1485 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false);
1484 EXPECT_EQ(3U, render_text->cursor_position()); 1486 EXPECT_EQ(3U, render_text->cursor_position());
1485 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false); 1487 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false);
1486 EXPECT_EQ(5U, render_text->cursor_position()); 1488 EXPECT_EQ(5U, render_text->cursor_position());
1487 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false); 1489 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false);
1488 EXPECT_EQ(6U, render_text->cursor_position()); 1490 EXPECT_EQ(6U, render_text->cursor_position());
1489 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false); 1491 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false);
1490 EXPECT_EQ(6U, render_text->cursor_position()); 1492 EXPECT_EQ(6U, render_text->cursor_position());
1491 } 1493 }
1492 #endif // !defined(OS_MACOSX) 1494 #endif // !defined(OS_MACOSX)
1493 1495
1494 TEST_F(RenderTextTest, StringSizeSanity) { 1496 TEST_F(RenderTextTest, StringSizeSanity) {
1495 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1497 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1496 render_text->SetText(UTF8ToUTF16("Hello World")); 1498 render_text->SetText(UTF8ToUTF16("Hello World"));
1497 const Size string_size = render_text->GetStringSize(); 1499 const Size string_size = render_text->GetStringSize();
1498 EXPECT_GT(string_size.width(), 0); 1500 EXPECT_GT(string_size.width(), 0);
1499 EXPECT_GT(string_size.height(), 0); 1501 EXPECT_GT(string_size.height(), 0);
1500 } 1502 }
1501 1503
1502 TEST_F(RenderTextTest, StringSizeLongStrings) { 1504 TEST_F(RenderTextTest, StringSizeLongStrings) {
1503 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1505 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1504 Size previous_string_size; 1506 Size previous_string_size;
1505 for (size_t length = 10; length < 1000000; length *= 10) { 1507 for (size_t length = 10; length < 1000000; length *= 10) {
1506 render_text->SetText(base::string16(length, 'a')); 1508 render_text->SetText(base::string16(length, 'a'));
1507 const Size string_size = render_text->GetStringSize(); 1509 const Size string_size = render_text->GetStringSize();
1508 EXPECT_GT(string_size.width(), previous_string_size.width()); 1510 EXPECT_GT(string_size.width(), previous_string_size.width());
1509 EXPECT_GT(string_size.height(), 0); 1511 EXPECT_GT(string_size.height(), 0);
1510 previous_string_size = string_size; 1512 previous_string_size = string_size;
1511 } 1513 }
1512 } 1514 }
1513 1515
1514 // TODO(asvitkine): This test fails because PlatformFontMac uses point font 1516 // TODO(asvitkine): This test fails because PlatformFontMac uses point font
1515 // sizes instead of pixel sizes like other implementations. 1517 // sizes instead of pixel sizes like other implementations.
1516 #if !defined(OS_MACOSX) 1518 #if !defined(OS_MACOSX)
1517 TEST_F(RenderTextTest, StringSizeEmptyString) { 1519 TEST_F(RenderTextTest, StringSizeEmptyString) {
1518 // Ascent and descent of Arial and Symbol are different on most platforms. 1520 // Ascent and descent of Arial and Symbol are different on most platforms.
1519 const FontList font_list("Arial,Symbol, 16px"); 1521 const FontList font_list("Arial,Symbol, 16px");
1520 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1522 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1521 render_text->SetFontList(font_list); 1523 render_text->SetFontList(font_list);
1522 render_text->SetDisplayRect(Rect(0, 0, 0, font_list.GetHeight())); 1524 render_text->SetDisplayRect(Rect(0, 0, 0, font_list.GetHeight()));
1523 1525
1524 // The empty string respects FontList metrics for non-zero height 1526 // The empty string respects FontList metrics for non-zero height
1525 // and baseline. 1527 // and baseline.
1526 render_text->SetText(base::string16()); 1528 render_text->SetText(base::string16());
1527 EXPECT_EQ(font_list.GetHeight(), render_text->GetStringSize().height()); 1529 EXPECT_EQ(font_list.GetHeight(), render_text->GetStringSize().height());
1528 EXPECT_EQ(0, render_text->GetStringSize().width()); 1530 EXPECT_EQ(0, render_text->GetStringSize().width());
1529 EXPECT_EQ(font_list.GetBaseline(), render_text->GetBaseline()); 1531 EXPECT_EQ(font_list.GetBaseline(), render_text->GetBaseline());
1530 1532
(...skipping 25 matching lines...) Expand all
1556 const char* larger_font_text = symbol_font_text; 1558 const char* larger_font_text = symbol_font_text;
1557 if (symbol_font.GetHeight() < arial_font.GetHeight() && 1559 if (symbol_font.GetHeight() < arial_font.GetHeight() &&
1558 symbol_font.GetBaseline() < arial_font.GetBaseline()) { 1560 symbol_font.GetBaseline() < arial_font.GetBaseline()) {
1559 std::swap(smaller_font, larger_font); 1561 std::swap(smaller_font, larger_font);
1560 std::swap(smaller_font_text, larger_font_text); 1562 std::swap(smaller_font_text, larger_font_text);
1561 } 1563 }
1562 ASSERT_LT(smaller_font.GetHeight(), larger_font.GetHeight()); 1564 ASSERT_LT(smaller_font.GetHeight(), larger_font.GetHeight());
1563 ASSERT_LT(smaller_font.GetBaseline(), larger_font.GetBaseline()); 1565 ASSERT_LT(smaller_font.GetBaseline(), larger_font.GetBaseline());
1564 1566
1565 // Check |smaller_font_text| is rendered with the smaller font. 1567 // Check |smaller_font_text| is rendered with the smaller font.
1566 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1568 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1567 render_text->SetText(UTF8ToUTF16(smaller_font_text)); 1569 render_text->SetText(UTF8ToUTF16(smaller_font_text));
1568 render_text->SetFontList(FontList(smaller_font)); 1570 render_text->SetFontList(FontList(smaller_font));
1569 render_text->SetDisplayRect(Rect(0, 0, 0, 1571 render_text->SetDisplayRect(Rect(0, 0, 0,
1570 render_text->font_list().GetHeight())); 1572 render_text->font_list().GetHeight()));
1571 EXPECT_EQ(smaller_font.GetHeight(), render_text->GetStringSize().height()); 1573 EXPECT_EQ(smaller_font.GetHeight(), render_text->GetStringSize().height());
1572 EXPECT_EQ(smaller_font.GetBaseline(), render_text->GetBaseline()); 1574 EXPECT_EQ(smaller_font.GetBaseline(), render_text->GetBaseline());
1573 1575
1574 // Layout the same text with mixed fonts. The text should be rendered with 1576 // Layout the same text with mixed fonts. The text should be rendered with
1575 // the smaller font, but the height and baseline are determined with the 1577 // the smaller font, but the height and baseline are determined with the
1576 // metrics of the font list, which is equal to the larger font. 1578 // metrics of the font list, which is equal to the larger font.
1577 std::vector<Font> fonts; 1579 std::vector<Font> fonts;
1578 fonts.push_back(smaller_font); // The primary font is the smaller font. 1580 fonts.push_back(smaller_font); // The primary font is the smaller font.
1579 fonts.push_back(larger_font); 1581 fonts.push_back(larger_font);
1580 const FontList font_list(fonts); 1582 const FontList font_list(fonts);
1581 render_text->SetFontList(font_list); 1583 render_text->SetFontList(font_list);
1582 render_text->SetDisplayRect(Rect(0, 0, 0, 1584 render_text->SetDisplayRect(Rect(0, 0, 0,
1583 render_text->font_list().GetHeight())); 1585 render_text->font_list().GetHeight()));
1584 EXPECT_LT(smaller_font.GetHeight(), render_text->GetStringSize().height()); 1586 EXPECT_LT(smaller_font.GetHeight(), render_text->GetStringSize().height());
1585 EXPECT_LT(smaller_font.GetBaseline(), render_text->GetBaseline()); 1587 EXPECT_LT(smaller_font.GetBaseline(), render_text->GetBaseline());
1586 EXPECT_EQ(font_list.GetHeight(), render_text->GetStringSize().height()); 1588 EXPECT_EQ(font_list.GetHeight(), render_text->GetStringSize().height());
1587 EXPECT_EQ(font_list.GetBaseline(), render_text->GetBaseline()); 1589 EXPECT_EQ(font_list.GetBaseline(), render_text->GetBaseline());
1588 } 1590 }
1589 1591
1590 TEST_F(RenderTextTest, MinLineHeight) { 1592 TEST_F(RenderTextTest, MinLineHeight) {
1591 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1593 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1592 1594
1593 render_text->SetText(ASCIIToUTF16("Hello!")); 1595 render_text->SetText(ASCIIToUTF16("Hello!"));
1594 SizeF default_size = render_text->GetStringSizeF(); 1596 SizeF default_size = render_text->GetStringSizeF();
1595 ASSERT_NE(0, default_size.height()); 1597 ASSERT_NE(0, default_size.height());
1596 ASSERT_NE(0, default_size.width()); 1598 ASSERT_NE(0, default_size.width());
1597 1599
1598 render_text->SetMinLineHeight(default_size.height() / 2); 1600 render_text->SetMinLineHeight(default_size.height() / 2);
1599 EXPECT_EQ(default_size.ToString(), render_text->GetStringSizeF().ToString()); 1601 EXPECT_EQ(default_size.ToString(), render_text->GetStringSizeF().ToString());
1600 1602
1601 render_text->SetMinLineHeight(default_size.height() * 2); 1603 render_text->SetMinLineHeight(default_size.height() * 2);
1602 SizeF taller_size = render_text->GetStringSizeF(); 1604 SizeF taller_size = render_text->GetStringSizeF();
1603 EXPECT_EQ(default_size.height() * 2, taller_size.height()); 1605 EXPECT_EQ(default_size.height() * 2, taller_size.height());
1604 EXPECT_EQ(default_size.width(), taller_size.width()); 1606 EXPECT_EQ(default_size.width(), taller_size.width());
1605 } 1607 }
1606 1608
1607 TEST_F(RenderTextTest, SetFontList) { 1609 TEST_F(RenderTextTest, SetFontList) {
1608 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1610 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1609 render_text->SetFontList(FontList("Arial,Symbol, 13px")); 1611 render_text->SetFontList(FontList("Arial,Symbol, 13px"));
1610 const std::vector<Font>& fonts = render_text->font_list().GetFonts(); 1612 const std::vector<Font>& fonts = render_text->font_list().GetFonts();
1611 ASSERT_EQ(2U, fonts.size()); 1613 ASSERT_EQ(2U, fonts.size());
1612 EXPECT_EQ("Arial", fonts[0].GetFontName()); 1614 EXPECT_EQ("Arial", fonts[0].GetFontName());
1613 EXPECT_EQ("Symbol", fonts[1].GetFontName()); 1615 EXPECT_EQ("Symbol", fonts[1].GetFontName());
1614 EXPECT_EQ(13, render_text->font_list().GetFontSize()); 1616 EXPECT_EQ(13, render_text->font_list().GetFontSize());
1615 } 1617 }
1616 1618
1617 TEST_F(RenderTextTest, StringSizeBoldWidth) { 1619 TEST_F(RenderTextTest, StringSizeBoldWidth) {
1618 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1620 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1619 render_text->SetText(UTF8ToUTF16("Hello World")); 1621 render_text->SetText(UTF8ToUTF16("Hello World"));
1620 1622
1621 const int plain_width = render_text->GetStringSize().width(); 1623 const int plain_width = render_text->GetStringSize().width();
1622 EXPECT_GT(plain_width, 0); 1624 EXPECT_GT(plain_width, 0);
1623 1625
1624 // Apply a bold style and check that the new width is greater. 1626 // Apply a bold style and check that the new width is greater.
1625 render_text->SetStyle(BOLD, true); 1627 render_text->SetStyle(BOLD, true);
1626 const int bold_width = render_text->GetStringSize().width(); 1628 const int bold_width = render_text->GetStringSize().width();
1627 EXPECT_GT(bold_width, plain_width); 1629 EXPECT_GT(bold_width, plain_width);
1628 1630
(...skipping 10 matching lines...) Expand all
1639 WideToUTF16(L"\x6328\x62f6"), // Japanese 1641 WideToUTF16(L"\x6328\x62f6"), // Japanese
1640 WideToUTF16(L"\x0915\x093f"), // Hindi 1642 WideToUTF16(L"\x0915\x093f"), // Hindi
1641 WideToUTF16(L"\x05e0\x05b8"), // Hebrew 1643 WideToUTF16(L"\x05e0\x05b8"), // Hebrew
1642 }; 1644 };
1643 1645
1644 const FontList default_font_list; 1646 const FontList default_font_list;
1645 const FontList& larger_font_list = default_font_list.DeriveWithSizeDelta(24); 1647 const FontList& larger_font_list = default_font_list.DeriveWithSizeDelta(24);
1646 EXPECT_GT(larger_font_list.GetHeight(), default_font_list.GetHeight()); 1648 EXPECT_GT(larger_font_list.GetHeight(), default_font_list.GetHeight());
1647 1649
1648 for (size_t i = 0; i < arraysize(cases); i++) { 1650 for (size_t i = 0; i < arraysize(cases); i++) {
1649 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1651 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1650 render_text->SetFontList(default_font_list); 1652 render_text->SetFontList(default_font_list);
1651 render_text->SetText(cases[i]); 1653 render_text->SetText(cases[i]);
1652 1654
1653 const int height1 = render_text->GetStringSize().height(); 1655 const int height1 = render_text->GetStringSize().height();
1654 EXPECT_GT(height1, 0); 1656 EXPECT_GT(height1, 0);
1655 1657
1656 // Check that setting the larger font increases the height. 1658 // Check that setting the larger font increases the height.
1657 render_text->SetFontList(larger_font_list); 1659 render_text->SetFontList(larger_font_list);
1658 const int height2 = render_text->GetStringSize().height(); 1660 const int height2 = render_text->GetStringSize().height();
1659 EXPECT_GT(height2, height1); 1661 EXPECT_GT(height2, height1);
1660 } 1662 }
1661 } 1663 }
1662 1664
1663 TEST_F(RenderTextTest, GetBaselineSanity) { 1665 TEST_F(RenderTextTest, GetBaselineSanity) {
1664 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1666 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1665 render_text->SetText(UTF8ToUTF16("Hello World")); 1667 render_text->SetText(UTF8ToUTF16("Hello World"));
1666 const int baseline = render_text->GetBaseline(); 1668 const int baseline = render_text->GetBaseline();
1667 EXPECT_GT(baseline, 0); 1669 EXPECT_GT(baseline, 0);
1668 } 1670 }
1669 1671
1670 TEST_F(RenderTextTest, CursorBoundsInReplacementMode) { 1672 TEST_F(RenderTextTest, CursorBoundsInReplacementMode) {
1671 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1673 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1672 render_text->SetText(ASCIIToUTF16("abcdefg")); 1674 render_text->SetText(ASCIIToUTF16("abcdefg"));
1673 render_text->SetDisplayRect(Rect(100, 17)); 1675 render_text->SetDisplayRect(Rect(100, 17));
1674 SelectionModel sel_b(1, CURSOR_FORWARD); 1676 SelectionModel sel_b(1, CURSOR_FORWARD);
1675 SelectionModel sel_c(2, CURSOR_FORWARD); 1677 SelectionModel sel_c(2, CURSOR_FORWARD);
1676 Rect cursor_around_b = render_text->GetCursorBounds(sel_b, false); 1678 Rect cursor_around_b = render_text->GetCursorBounds(sel_b, false);
1677 Rect cursor_before_b = render_text->GetCursorBounds(sel_b, true); 1679 Rect cursor_before_b = render_text->GetCursorBounds(sel_b, true);
1678 Rect cursor_before_c = render_text->GetCursorBounds(sel_c, true); 1680 Rect cursor_before_c = render_text->GetCursorBounds(sel_c, true);
1679 EXPECT_EQ(cursor_around_b.x(), cursor_before_b.x()); 1681 EXPECT_EQ(cursor_around_b.x(), cursor_before_b.x());
1680 EXPECT_EQ(cursor_around_b.right(), cursor_before_c.x()); 1682 EXPECT_EQ(cursor_around_b.right(), cursor_before_c.x());
1681 } 1683 }
1682 1684
1683 TEST_F(RenderTextTest, GetTextOffset) { 1685 TEST_F(RenderTextTest, GetTextOffset) {
1684 // The default horizontal text offset differs for LTR and RTL, and is only set 1686 // The default horizontal text offset differs for LTR and RTL, and is only set
1685 // when the RenderText object is created. This test will check the default in 1687 // when the RenderText object is created. This test will check the default in
1686 // LTR mode, and the next test will check the RTL default. 1688 // LTR mode, and the next test will check the RTL default.
1687 const bool was_rtl = base::i18n::IsRTL(); 1689 const bool was_rtl = base::i18n::IsRTL();
1688 SetRTL(false); 1690 SetRTL(false);
1689 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1691 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1690 render_text->SetText(ASCIIToUTF16("abcdefg")); 1692 render_text->SetText(ASCIIToUTF16("abcdefg"));
1691 render_text->SetFontList(FontList("Arial, 13px")); 1693 render_text->SetFontList(FontList("Arial, 13px"));
1692 1694
1693 // Set display area's size equal to the font size. 1695 // Set display area's size equal to the font size.
1694 const Size font_size(render_text->GetContentWidth(), 1696 const Size font_size(render_text->GetContentWidth(),
1695 render_text->font_list().GetHeight()); 1697 render_text->font_list().GetHeight());
1696 Rect display_rect(font_size); 1698 Rect display_rect(font_size);
1697 render_text->SetDisplayRect(display_rect); 1699 render_text->SetDisplayRect(display_rect);
1698 1700
1699 Vector2d offset = render_text->GetLineOffset(0); 1701 Vector2d offset = render_text->GetLineOffset(0);
(...skipping 29 matching lines...) Expand all
1729 EXPECT_EQ(prev_offset.y() + kEnlargementY, offset.y()); 1731 EXPECT_EQ(prev_offset.y() + kEnlargementY, offset.y());
1730 1732
1731 SetRTL(was_rtl); 1733 SetRTL(was_rtl);
1732 } 1734 }
1733 1735
1734 TEST_F(RenderTextTest, GetTextOffsetHorizontalDefaultInRTL) { 1736 TEST_F(RenderTextTest, GetTextOffsetHorizontalDefaultInRTL) {
1735 // This only checks the default horizontal alignment in RTL mode; all other 1737 // This only checks the default horizontal alignment in RTL mode; all other
1736 // GetLineOffset(0) attributes are checked by the test above. 1738 // GetLineOffset(0) attributes are checked by the test above.
1737 const bool was_rtl = base::i18n::IsRTL(); 1739 const bool was_rtl = base::i18n::IsRTL();
1738 SetRTL(true); 1740 SetRTL(true);
1739 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1741 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1740 render_text->SetText(ASCIIToUTF16("abcdefg")); 1742 render_text->SetText(ASCIIToUTF16("abcdefg"));
1741 render_text->SetFontList(FontList("Arial, 13px")); 1743 render_text->SetFontList(FontList("Arial, 13px"));
1742 const int kEnlargement = 2; 1744 const int kEnlargement = 2;
1743 const Size font_size(render_text->GetContentWidth() + kEnlargement, 1745 const Size font_size(render_text->GetContentWidth() + kEnlargement,
1744 render_text->GetStringSize().height()); 1746 render_text->GetStringSize().height());
1745 Rect display_rect(font_size); 1747 Rect display_rect(font_size);
1746 render_text->SetDisplayRect(display_rect); 1748 render_text->SetDisplayRect(display_rect);
1747 Vector2d offset = render_text->GetLineOffset(0); 1749 Vector2d offset = render_text->GetLineOffset(0);
1748 EXPECT_EQ(kEnlargement, offset.x()); 1750 EXPECT_EQ(kEnlargement, offset.x());
1749 SetRTL(was_rtl); 1751 SetRTL(was_rtl);
1750 } 1752 }
1751 1753
1752 TEST_F(RenderTextTest, SetDisplayOffset) { 1754 TEST_F(RenderTextTest, SetDisplayOffset) {
1753 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1755 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1754 render_text->SetText(ASCIIToUTF16("abcdefg")); 1756 render_text->SetText(ASCIIToUTF16("abcdefg"));
1755 render_text->SetFontList(FontList("Arial, 13px")); 1757 render_text->SetFontList(FontList("Arial, 13px"));
1756 1758
1757 const Size font_size(render_text->GetContentWidth(), 1759 const Size font_size(render_text->GetContentWidth(),
1758 render_text->font_list().GetHeight()); 1760 render_text->font_list().GetHeight());
1759 const int kEnlargement = 10; 1761 const int kEnlargement = 10;
1760 1762
1761 // Set display width |kEnlargement| pixels greater than content width and test 1763 // Set display width |kEnlargement| pixels greater than content width and test
1762 // different possible situations. In this case the only possible display 1764 // different possible situations. In this case the only possible display
1763 // offset is zero. 1765 // offset is zero.
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
1855 { WideToUTF16(L"Hello World(\x0915\x093f)Hello World") }, 1857 { WideToUTF16(L"Hello World(\x0915\x093f)Hello World") },
1856 1858
1857 // Hebrew(English) 1859 // Hebrew(English)
1858 { WideToUTF16(L"\x05e0\x05b8(a)") }, 1860 { WideToUTF16(L"\x05e0\x05b8(a)") },
1859 // Hebrew(English)Hebrew 1861 // Hebrew(English)Hebrew
1860 { WideToUTF16(L"\x05e0\x05b8(a)\x05e0\x05b8") }, 1862 { WideToUTF16(L"\x05e0\x05b8(a)\x05e0\x05b8") },
1861 // English(Hebrew)English 1863 // English(Hebrew)English
1862 { WideToUTF16(L"Hello World(\x05e0\x05b8)Hello World") }, 1864 { WideToUTF16(L"Hello World(\x05e0\x05b8)Hello World") },
1863 }; 1865 };
1864 1866
1865 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1867 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1866 for (size_t i = 0; i < arraysize(cases); ++i) { 1868 for (size_t i = 0; i < arraysize(cases); ++i) {
1867 base::string16 text = cases[i].text; 1869 base::string16 text = cases[i].text;
1868 const size_t start_paren_char_index = text.find('('); 1870 const size_t start_paren_char_index = text.find('(');
1869 ASSERT_NE(base::string16::npos, start_paren_char_index); 1871 ASSERT_NE(base::string16::npos, start_paren_char_index);
1870 const size_t end_paren_char_index = text.find(')'); 1872 const size_t end_paren_char_index = text.find(')');
1871 ASSERT_NE(base::string16::npos, end_paren_char_index); 1873 ASSERT_NE(base::string16::npos, end_paren_char_index);
1872 1874
1873 for (size_t j = 0; j < arraysize(punctuation_pairs); ++j) { 1875 for (size_t j = 0; j < arraysize(punctuation_pairs); ++j) {
1874 text[start_paren_char_index] = punctuation_pairs[j].left_char; 1876 text[start_paren_char_index] = punctuation_pairs[j].left_char;
1875 text[end_paren_char_index] = punctuation_pairs[j].right_char; 1877 text[end_paren_char_index] = punctuation_pairs[j].right_char;
(...skipping 18 matching lines...) Expand all
1894 EXPECT_EQ(start_font.GetFontName(), end_font.GetFontName()); 1896 EXPECT_EQ(start_font.GetFontName(), end_font.GetFontName());
1895 EXPECT_EQ(start_font.GetFontSize(), end_font.GetFontSize()); 1897 EXPECT_EQ(start_font.GetFontSize(), end_font.GetFontSize());
1896 EXPECT_EQ(start_font.GetStyle(), end_font.GetStyle()); 1898 EXPECT_EQ(start_font.GetStyle(), end_font.GetStyle());
1897 } 1899 }
1898 } 1900 }
1899 } 1901 }
1900 1902
1901 // Make sure the caret width is always >=1 so that the correct 1903 // Make sure the caret width is always >=1 so that the correct
1902 // caret is drawn at high DPI. crbug.com/164100. 1904 // caret is drawn at high DPI. crbug.com/164100.
1903 TEST_F(RenderTextTest, CaretWidth) { 1905 TEST_F(RenderTextTest, CaretWidth) {
1904 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1906 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1905 render_text->SetText(ASCIIToUTF16("abcdefg")); 1907 render_text->SetText(ASCIIToUTF16("abcdefg"));
1906 EXPECT_GE(render_text->GetUpdatedCursorBounds().width(), 1); 1908 EXPECT_GE(render_text->GetUpdatedCursorBounds().width(), 1);
1907 } 1909 }
1908 1910
1909 TEST_F(RenderTextTest, SelectWord) { 1911 TEST_F(RenderTextTest, SelectWord) {
1910 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1912 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1911 render_text->SetText(ASCIIToUTF16(" foo a.bc.d bar")); 1913 render_text->SetText(ASCIIToUTF16(" foo a.bc.d bar"));
1912 1914
1913 struct { 1915 struct {
1914 size_t cursor; 1916 size_t cursor;
1915 size_t selection_start; 1917 size_t selection_start;
1916 size_t selection_end; 1918 size_t selection_end;
1917 } cases[] = { 1919 } cases[] = {
1918 { 0, 0, 1 }, 1920 { 0, 0, 1 },
1919 { 1, 1, 4 }, 1921 { 1, 1, 4 },
1920 { 2, 1, 4 }, 1922 { 2, 1, 4 },
(...skipping 19 matching lines...) Expand all
1940 EXPECT_EQ(Range(cases[i].selection_start, cases[i].selection_end), 1942 EXPECT_EQ(Range(cases[i].selection_start, cases[i].selection_end),
1941 render_text->selection()); 1943 render_text->selection());
1942 } 1944 }
1943 } 1945 }
1944 1946
1945 // Make sure the last word is selected when the cursor is at text.length(). 1947 // Make sure the last word is selected when the cursor is at text.length().
1946 TEST_F(RenderTextTest, LastWordSelected) { 1948 TEST_F(RenderTextTest, LastWordSelected) {
1947 const std::string kTestURL1 = "http://www.google.com"; 1949 const std::string kTestURL1 = "http://www.google.com";
1948 const std::string kTestURL2 = "http://www.google.com/something/"; 1950 const std::string kTestURL2 = "http://www.google.com/something/";
1949 1951
1950 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1952 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1951 1953
1952 render_text->SetText(ASCIIToUTF16(kTestURL1)); 1954 render_text->SetText(ASCIIToUTF16(kTestURL1));
1953 render_text->SetCursorPosition(kTestURL1.length()); 1955 render_text->SetCursorPosition(kTestURL1.length());
1954 render_text->SelectWord(); 1956 render_text->SelectWord();
1955 EXPECT_EQ(ASCIIToUTF16("com"), GetSelectedText(render_text.get())); 1957 EXPECT_EQ(ASCIIToUTF16("com"), GetSelectedText(render_text.get()));
1956 EXPECT_FALSE(render_text->selection().is_reversed()); 1958 EXPECT_FALSE(render_text->selection().is_reversed());
1957 1959
1958 render_text->SetText(ASCIIToUTF16(kTestURL2)); 1960 render_text->SetText(ASCIIToUTF16(kTestURL2));
1959 render_text->SetCursorPosition(kTestURL2.length()); 1961 render_text->SetCursorPosition(kTestURL2.length());
1960 render_text->SelectWord(); 1962 render_text->SelectWord();
1961 EXPECT_EQ(ASCIIToUTF16("/"), GetSelectedText(render_text.get())); 1963 EXPECT_EQ(ASCIIToUTF16("/"), GetSelectedText(render_text.get()));
1962 EXPECT_FALSE(render_text->selection().is_reversed()); 1964 EXPECT_FALSE(render_text->selection().is_reversed());
1963 } 1965 }
1964 1966
1965 // When given a non-empty selection, SelectWord should expand the selection to 1967 // When given a non-empty selection, SelectWord should expand the selection to
1966 // nearest word boundaries. 1968 // nearest word boundaries.
1967 TEST_F(RenderTextTest, SelectMultipleWords) { 1969 TEST_F(RenderTextTest, SelectMultipleWords) {
1968 const std::string kTestURL = "http://www.google.com"; 1970 const std::string kTestURL = "http://www.google.com";
1969 1971
1970 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1972 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1971 1973
1972 render_text->SetText(ASCIIToUTF16(kTestURL)); 1974 render_text->SetText(ASCIIToUTF16(kTestURL));
1973 render_text->SelectRange(Range(16, 20)); 1975 render_text->SelectRange(Range(16, 20));
1974 render_text->SelectWord(); 1976 render_text->SelectWord();
1975 EXPECT_EQ(ASCIIToUTF16("google.com"), GetSelectedText(render_text.get())); 1977 EXPECT_EQ(ASCIIToUTF16("google.com"), GetSelectedText(render_text.get()));
1976 EXPECT_FALSE(render_text->selection().is_reversed()); 1978 EXPECT_FALSE(render_text->selection().is_reversed());
1977 1979
1978 // SelectWord should preserve the selection direction. 1980 // SelectWord should preserve the selection direction.
1979 render_text->SelectRange(Range(20, 16)); 1981 render_text->SelectRange(Range(20, 16));
1980 render_text->SelectWord(); 1982 render_text->SelectWord();
1981 EXPECT_EQ(ASCIIToUTF16("google.com"), GetSelectedText(render_text.get())); 1983 EXPECT_EQ(ASCIIToUTF16("google.com"), GetSelectedText(render_text.get()));
1982 EXPECT_TRUE(render_text->selection().is_reversed()); 1984 EXPECT_TRUE(render_text->selection().is_reversed());
1983 } 1985 }
1984 1986
1985 // TODO(asvitkine): RenderTextMac cursor movements. http://crbug.com/131618 1987 // TODO(asvitkine): RenderTextMac cursor movements. http://crbug.com/131618
1986 #if !defined(OS_MACOSX) 1988 #if !defined(OS_MACOSX)
1987 TEST_F(RenderTextTest, DisplayRectShowsCursorLTR) { 1989 TEST_F(RenderTextTest, DisplayRectShowsCursorLTR) {
1988 ASSERT_FALSE(base::i18n::IsRTL()); 1990 ASSERT_FALSE(base::i18n::IsRTL());
1989 ASSERT_FALSE(base::i18n::ICUIsRTL()); 1991 ASSERT_FALSE(base::i18n::ICUIsRTL());
1990 1992
1991 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1993 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
1992 render_text->SetText(WideToUTF16(L"abcdefghijklmnopqrstuvwxzyabcdefg")); 1994 render_text->SetText(WideToUTF16(L"abcdefghijklmnopqrstuvwxzyabcdefg"));
1993 render_text->MoveCursorTo(SelectionModel(render_text->text().length(), 1995 render_text->MoveCursorTo(SelectionModel(render_text->text().length(),
1994 CURSOR_FORWARD)); 1996 CURSOR_FORWARD));
1995 int width = render_text->GetStringSize().width(); 1997 int width = render_text->GetStringSize().width();
1996 ASSERT_GT(width, 10); 1998 ASSERT_GT(width, 10);
1997 1999
1998 // Ensure that the cursor is placed at the width of its preceding text. 2000 // Ensure that the cursor is placed at the width of its preceding text.
1999 render_text->SetDisplayRect(Rect(width + 10, 1)); 2001 render_text->SetDisplayRect(Rect(width + 10, 1));
2000 EXPECT_EQ(width, render_text->GetUpdatedCursorBounds().x()); 2002 EXPECT_EQ(width, render_text->GetUpdatedCursorBounds().x());
2001 2003
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2038 render_text->SetDisplayRect(Rect(width + 10, 1)); 2040 render_text->SetDisplayRect(Rect(width + 10, 1));
2039 EXPECT_EQ(width, render_text->GetUpdatedCursorBounds().x()); 2041 EXPECT_EQ(width, render_text->GetUpdatedCursorBounds().x());
2040 } 2042 }
2041 #endif // !defined(OS_MACOSX) 2043 #endif // !defined(OS_MACOSX)
2042 2044
2043 TEST_F(RenderTextTest, DisplayRectShowsCursorRTL) { 2045 TEST_F(RenderTextTest, DisplayRectShowsCursorRTL) {
2044 // Set the application default text direction to RTL. 2046 // Set the application default text direction to RTL.
2045 const bool was_rtl = base::i18n::IsRTL(); 2047 const bool was_rtl = base::i18n::IsRTL();
2046 SetRTL(true); 2048 SetRTL(true);
2047 2049
2048 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 2050 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
2049 render_text->SetText(WideToUTF16(L"abcdefghijklmnopqrstuvwxzyabcdefg")); 2051 render_text->SetText(WideToUTF16(L"abcdefghijklmnopqrstuvwxzyabcdefg"));
2050 render_text->MoveCursorTo(SelectionModel(0, CURSOR_FORWARD)); 2052 render_text->MoveCursorTo(SelectionModel(0, CURSOR_FORWARD));
2051 int width = render_text->GetStringSize().width(); 2053 int width = render_text->GetStringSize().width();
2052 ASSERT_GT(width, 10); 2054 ASSERT_GT(width, 10);
2053 2055
2054 // Ensure that the cursor is placed at the width of its preceding text. 2056 // Ensure that the cursor is placed at the width of its preceding text.
2055 render_text->SetDisplayRect(Rect(width + 10, 1)); 2057 render_text->SetDisplayRect(Rect(width + 10, 1));
2056 EXPECT_EQ(render_text->display_rect().width() - width - 1, 2058 EXPECT_EQ(render_text->display_rect().width() - width - 1,
2057 render_text->GetUpdatedCursorBounds().x()); 2059 render_text->GetUpdatedCursorBounds().x());
2058 2060
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
2096 render_text->GetUpdatedCursorBounds().x()); 2098 render_text->GetUpdatedCursorBounds().x());
2097 2099
2098 // Reset the application default text direction to LTR. 2100 // Reset the application default text direction to LTR.
2099 SetRTL(was_rtl); 2101 SetRTL(was_rtl);
2100 EXPECT_EQ(was_rtl, base::i18n::IsRTL()); 2102 EXPECT_EQ(was_rtl, base::i18n::IsRTL());
2101 } 2103 }
2102 2104
2103 // Changing colors between or inside ligated glyphs should not break shaping. 2105 // Changing colors between or inside ligated glyphs should not break shaping.
2104 TEST_F(RenderTextTest, SelectionKeepsLigatures) { 2106 TEST_F(RenderTextTest, SelectionKeepsLigatures) {
2105 const wchar_t* kTestStrings[] = { L"\x644\x623", L"\x633\x627" }; 2107 const wchar_t* kTestStrings[] = { L"\x644\x623", L"\x633\x627" };
2106 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 2108 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
2107 render_text->set_selection_color(SK_ColorRED); 2109 render_text->set_selection_color(SK_ColorRED);
2108 Canvas canvas; 2110 Canvas canvas;
2109 2111
2110 for (size_t i = 0; i < arraysize(kTestStrings); ++i) { 2112 for (size_t i = 0; i < arraysize(kTestStrings); ++i) {
2111 render_text->SetText(WideToUTF16(kTestStrings[i])); 2113 render_text->SetText(WideToUTF16(kTestStrings[i]));
2112 const int expected_width = render_text->GetStringSize().width(); 2114 const int expected_width = render_text->GetStringSize().width();
2113 render_text->MoveCursorTo(SelectionModel(Range(0, 1), CURSOR_FORWARD)); 2115 render_text->MoveCursorTo(SelectionModel(Range(0, 1), CURSOR_FORWARD));
2114 EXPECT_EQ(expected_width, render_text->GetStringSize().width()); 2116 EXPECT_EQ(expected_width, render_text->GetStringSize().width());
2115 // Drawing the text should not DCHECK or crash; see http://crbug.com/262119 2117 // Drawing the text should not DCHECK or crash; see http://crbug.com/262119
2116 render_text->Draw(&canvas); 2118 render_text->Draw(&canvas);
(...skipping 617 matching lines...) Expand 10 before | Expand all | Expand 10 after
2734 }; 2736 };
2735 2737
2736 internal::TextRunHarfBuzz run; 2738 internal::TextRunHarfBuzz run;
2737 run.range = Range(0, 4); 2739 run.range = Range(0, 4);
2738 run.glyph_count = 2; 2740 run.glyph_count = 2;
2739 run.glyph_to_char.resize(2); 2741 run.glyph_to_char.resize(2);
2740 run.positions.reset(new SkPoint[4]); 2742 run.positions.reset(new SkPoint[4]);
2741 run.width = 20; 2743 run.width = 20;
2742 2744
2743 const base::string16 kString = ASCIIToUTF16("abcd"); 2745 const base::string16 kString = ASCIIToUTF16("abcd");
2744 scoped_ptr<base::i18n::BreakIterator> iter(new base::i18n::BreakIterator( 2746 std::unique_ptr<base::i18n::BreakIterator> iter(new base::i18n::BreakIterator(
2745 kString, base::i18n::BreakIterator::BREAK_CHARACTER)); 2747 kString, base::i18n::BreakIterator::BREAK_CHARACTER));
2746 ASSERT_TRUE(iter->Init()); 2748 ASSERT_TRUE(iter->Init());
2747 2749
2748 for (size_t i = 0; i < arraysize(cases); ++i) { 2750 for (size_t i = 0; i < arraysize(cases); ++i) {
2749 std::copy(cases[i].glyph_to_char, cases[i].glyph_to_char + 2, 2751 std::copy(cases[i].glyph_to_char, cases[i].glyph_to_char + 2,
2750 run.glyph_to_char.begin()); 2752 run.glyph_to_char.begin());
2751 run.is_rtl = cases[i].is_rtl; 2753 run.is_rtl = cases[i].is_rtl;
2752 for (int j = 0; j < 2; ++j) 2754 for (int j = 0; j < 2; ++j)
2753 run.positions[j].set(j * 10, 0); 2755 run.positions[j].set(j * 10, 0);
2754 2756
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
2851 ASSERT_EQ(2U, run_list->size()); 2853 ASSERT_EQ(2U, run_list->size());
2852 // U+1F431 is represented as a surrogate pair in UTF16. 2854 // U+1F431 is represented as a surrogate pair in UTF16.
2853 EXPECT_EQ(Range(0, 2), run_list->runs()[0]->range); 2855 EXPECT_EQ(Range(0, 2), run_list->runs()[0]->range);
2854 EXPECT_EQ(Range(2, 3), run_list->runs()[1]->range); 2856 EXPECT_EQ(Range(2, 3), run_list->runs()[1]->range);
2855 } 2857 }
2856 2858
2857 TEST_F(RenderTextTest, GlyphBounds) { 2859 TEST_F(RenderTextTest, GlyphBounds) {
2858 const wchar_t* kTestStrings[] = { 2860 const wchar_t* kTestStrings[] = {
2859 L"asdf 1234 qwer", L"\x0647\x0654", L"\x0645\x0631\x062D\x0628\x0627" 2861 L"asdf 1234 qwer", L"\x0647\x0654", L"\x0645\x0631\x062D\x0628\x0627"
2860 }; 2862 };
2861 scoped_ptr<RenderText> render_text(new RenderTextHarfBuzz); 2863 std::unique_ptr<RenderText> render_text(new RenderTextHarfBuzz);
2862 2864
2863 for (size_t i = 0; i < arraysize(kTestStrings); ++i) { 2865 for (size_t i = 0; i < arraysize(kTestStrings); ++i) {
2864 render_text->SetText(WideToUTF16(kTestStrings[i])); 2866 render_text->SetText(WideToUTF16(kTestStrings[i]));
2865 render_text->EnsureLayout(); 2867 render_text->EnsureLayout();
2866 2868
2867 for (size_t j = 0; j < render_text->text().length(); ++j) 2869 for (size_t j = 0; j < render_text->text().length(); ++j)
2868 EXPECT_FALSE(render_text->GetGlyphBounds(j).is_empty()); 2870 EXPECT_FALSE(render_text->GetGlyphBounds(j).is_empty());
2869 } 2871 }
2870 } 2872 }
2871 2873
2872 // Ensure that shaping with a non-existent font does not cause a crash. 2874 // Ensure that shaping with a non-existent font does not cause a crash.
2873 TEST_F(RenderTextTest, HarfBuzz_NonExistentFont) { 2875 TEST_F(RenderTextTest, HarfBuzz_NonExistentFont) {
2874 RenderTextHarfBuzz render_text; 2876 RenderTextHarfBuzz render_text;
2875 render_text.SetText(ASCIIToUTF16("test")); 2877 render_text.SetText(ASCIIToUTF16("test"));
2876 render_text.EnsureLayout(); 2878 render_text.EnsureLayout();
2877 internal::TextRunList* run_list = render_text.GetRunList(); 2879 internal::TextRunList* run_list = render_text.GetRunList();
2878 ASSERT_EQ(1U, run_list->size()); 2880 ASSERT_EQ(1U, run_list->size());
2879 internal::TextRunHarfBuzz* run = run_list->runs()[0]; 2881 internal::TextRunHarfBuzz* run = run_list->runs()[0];
2880 render_text.ShapeRunWithFont(render_text.text(), 2882 render_text.ShapeRunWithFont(render_text.text(),
2881 Font("TheFontThatDoesntExist", 13), 2883 Font("TheFontThatDoesntExist", 13),
2882 FontRenderParams(), run); 2884 FontRenderParams(), run);
2883 } 2885 }
2884 2886
2885 // Ensure an empty run returns sane values to queries. 2887 // Ensure an empty run returns sane values to queries.
2886 TEST_F(RenderTextTest, HarfBuzz_EmptyRun) { 2888 TEST_F(RenderTextTest, HarfBuzz_EmptyRun) {
2887 internal::TextRunHarfBuzz run; 2889 internal::TextRunHarfBuzz run;
2888 const base::string16 kString = ASCIIToUTF16("abcdefgh"); 2890 const base::string16 kString = ASCIIToUTF16("abcdefgh");
2889 scoped_ptr<base::i18n::BreakIterator> iter(new base::i18n::BreakIterator( 2891 std::unique_ptr<base::i18n::BreakIterator> iter(new base::i18n::BreakIterator(
2890 kString, base::i18n::BreakIterator::BREAK_CHARACTER)); 2892 kString, base::i18n::BreakIterator::BREAK_CHARACTER));
2891 ASSERT_TRUE(iter->Init()); 2893 ASSERT_TRUE(iter->Init());
2892 2894
2893 run.range = Range(3, 8); 2895 run.range = Range(3, 8);
2894 run.glyph_count = 0; 2896 run.glyph_count = 0;
2895 EXPECT_EQ(Range(0, 0), run.CharRangeToGlyphRange(Range(4, 5))); 2897 EXPECT_EQ(Range(0, 0), run.CharRangeToGlyphRange(Range(4, 5)));
2896 EXPECT_EQ(Range(0, 0), run.GetGraphemeBounds(iter.get(), 4).Round()); 2898 EXPECT_EQ(Range(0, 0), run.GetGraphemeBounds(iter.get(), 4).Round());
2897 Range chars; 2899 Range chars;
2898 Range glyphs; 2900 Range glyphs;
2899 run.GetClusterAt(4, &chars, &glyphs); 2901 run.GetClusterAt(4, &chars, &glyphs);
(...skipping 13 matching lines...) Expand all
2913 render_text.SetMultiline(true); 2915 render_text.SetMultiline(true);
2914 EXPECT_EQ(text_size.width() * 2, render_text.GetStringSizeF().width()); 2916 EXPECT_EQ(text_size.width() * 2, render_text.GetStringSizeF().width());
2915 EXPECT_EQ(text_size.height(), render_text.GetStringSizeF().height()); 2917 EXPECT_EQ(text_size.height(), render_text.GetStringSizeF().height());
2916 render_text.SetDisplayRect(gfx::Rect(0, 0, std::ceil(text_size.width()), 0)); 2918 render_text.SetDisplayRect(gfx::Rect(0, 0, std::ceil(text_size.width()), 0));
2917 EXPECT_NEAR(text_size.width(), render_text.GetStringSizeF().width(), 1.0f); 2919 EXPECT_NEAR(text_size.width(), render_text.GetStringSizeF().width(), 1.0f);
2918 EXPECT_EQ(text_size.height() * 2, render_text.GetStringSizeF().height()); 2920 EXPECT_EQ(text_size.height() * 2, render_text.GetStringSizeF().height());
2919 } 2921 }
2920 2922
2921 // Ensure a string fits in a display rect with a width equal to the string's. 2923 // Ensure a string fits in a display rect with a width equal to the string's.
2922 TEST_F(RenderTextTest, StringFitsOwnWidth) { 2924 TEST_F(RenderTextTest, StringFitsOwnWidth) {
2923 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 2925 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
2924 const base::string16 kString = ASCIIToUTF16("www.example.com"); 2926 const base::string16 kString = ASCIIToUTF16("www.example.com");
2925 2927
2926 render_text->SetText(kString); 2928 render_text->SetText(kString);
2927 render_text->ApplyStyle(BOLD, true, Range(0, 3)); 2929 render_text->ApplyStyle(BOLD, true, Range(0, 3));
2928 render_text->SetElideBehavior(ELIDE_TAIL); 2930 render_text->SetElideBehavior(ELIDE_TAIL);
2929 2931
2930 render_text->SetDisplayRect(Rect(0, 0, 500, 100)); 2932 render_text->SetDisplayRect(Rect(0, 0, 500, 100));
2931 EXPECT_EQ(kString, render_text->GetDisplayText()); 2933 EXPECT_EQ(kString, render_text->GetDisplayText());
2932 render_text->SetDisplayRect(Rect(0, 0, render_text->GetContentWidth(), 100)); 2934 render_text->SetDisplayRect(Rect(0, 0, render_text->GetContentWidth(), 100));
2933 EXPECT_EQ(kString, render_text->GetDisplayText()); 2935 EXPECT_EQ(kString, render_text->GetDisplayText());
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
3013 // TODO(dschuyler): A-Ring draws outside GetStringSize; crbug.com/459812. 3015 // TODO(dschuyler): A-Ring draws outside GetStringSize; crbug.com/459812.
3014 // L"g\x00C5X\x00C5X\x00C5X\x00C5X\x00C5X\x00C5X\x00C5", 3016 // L"g\x00C5X\x00C5X\x00C5X\x00C5X\x00C5X\x00C5X\x00C5",
3015 L"\x0647\x0654\x0647\x0654\x0647\x0654\x0647\x0654\x0645\x0631\x062D" 3017 L"\x0647\x0654\x0647\x0654\x0647\x0654\x0647\x0654\x0645\x0631\x062D"
3016 L"\x0628\x0627"}; 3018 L"\x0628\x0627"};
3017 const Size kCanvasSize(300, 50); 3019 const Size kCanvasSize(300, 50);
3018 const int kTestSize = 10; 3020 const int kTestSize = 10;
3019 3021
3020 sk_sp<SkSurface> surface = 3022 sk_sp<SkSurface> surface =
3021 SkSurface::MakeRasterN32Premul(kCanvasSize.width(), kCanvasSize.height()); 3023 SkSurface::MakeRasterN32Premul(kCanvasSize.width(), kCanvasSize.height());
3022 Canvas canvas(skia::SharePtr(surface->getCanvas()), 1.0f); 3024 Canvas canvas(skia::SharePtr(surface->getCanvas()), 1.0f);
3023 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 3025 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
3024 render_text->SetHorizontalAlignment(ALIGN_LEFT); 3026 render_text->SetHorizontalAlignment(ALIGN_LEFT);
3025 render_text->SetColor(SK_ColorBLACK); 3027 render_text->SetColor(SK_ColorBLACK);
3026 3028
3027 for (auto string : kTestStrings) { 3029 for (auto string : kTestStrings) {
3028 surface->getCanvas()->clear(SK_ColorWHITE); 3030 surface->getCanvas()->clear(SK_ColorWHITE);
3029 render_text->SetText(WideToUTF16(string)); 3031 render_text->SetText(WideToUTF16(string));
3030 const Size string_size = render_text->GetStringSize(); 3032 const Size string_size = render_text->GetStringSize();
3031 render_text->ApplyBaselineStyle(SUPERSCRIPT, Range(1, 2)); 3033 render_text->ApplyBaselineStyle(SUPERSCRIPT, Range(1, 2));
3032 render_text->ApplyBaselineStyle(SUPERIOR, Range(3, 4)); 3034 render_text->ApplyBaselineStyle(SUPERIOR, Range(3, 4));
3033 render_text->ApplyBaselineStyle(INFERIOR, Range(5, 6)); 3035 render_text->ApplyBaselineStyle(INFERIOR, Range(5, 6));
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
3104 // Ensure that the text will clip to the display rect. Draws to a canvas and 3106 // Ensure that the text will clip to the display rect. Draws to a canvas and
3105 // checks whether any pixel beyond the bounding rectangle is colored. 3107 // checks whether any pixel beyond the bounding rectangle is colored.
3106 TEST_F(RenderTextTest, TextDoesClip) { 3108 TEST_F(RenderTextTest, TextDoesClip) {
3107 const wchar_t* kTestStrings[] = {L"TEST", L"W", L"WWWW", L"gAXAXWWWW"}; 3109 const wchar_t* kTestStrings[] = {L"TEST", L"W", L"WWWW", L"gAXAXWWWW"};
3108 const Size kCanvasSize(300, 50); 3110 const Size kCanvasSize(300, 50);
3109 const int kTestSize = 10; 3111 const int kTestSize = 10;
3110 3112
3111 sk_sp<SkSurface> surface = 3113 sk_sp<SkSurface> surface =
3112 SkSurface::MakeRasterN32Premul(kCanvasSize.width(), kCanvasSize.height()); 3114 SkSurface::MakeRasterN32Premul(kCanvasSize.width(), kCanvasSize.height());
3113 Canvas canvas(skia::SharePtr(surface->getCanvas()), 1.0f); 3115 Canvas canvas(skia::SharePtr(surface->getCanvas()), 1.0f);
3114 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 3116 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance());
3115 render_text->SetHorizontalAlignment(ALIGN_LEFT); 3117 render_text->SetHorizontalAlignment(ALIGN_LEFT);
3116 render_text->SetColor(SK_ColorBLACK); 3118 render_text->SetColor(SK_ColorBLACK);
3117 3119
3118 for (auto string : kTestStrings) { 3120 for (auto string : kTestStrings) {
3119 surface->getCanvas()->clear(SK_ColorWHITE); 3121 surface->getCanvas()->clear(SK_ColorWHITE);
3120 render_text->SetText(WideToUTF16(string)); 3122 render_text->SetText(WideToUTF16(string));
3121 const Size string_size = render_text->GetStringSize(); 3123 const Size string_size = render_text->GetStringSize();
3122 int fake_width = string_size.width() / 2; 3124 int fake_width = string_size.width() / 2;
3123 int fake_height = string_size.height() / 2; 3125 int fake_height = string_size.height() / 2;
3124 render_text->SetDisplayRect( 3126 render_text->SetDisplayRect(
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
3209 backend[i]->SetColor(SK_ColorRED); 3211 backend[i]->SetColor(SK_ColorRED);
3210 test_api.DrawVisualText(&renderer); 3212 test_api.DrawVisualText(&renderer);
3211 3213
3212 renderer.GetTextLogAndReset(&text_log); 3214 renderer.GetTextLogAndReset(&text_log);
3213 EXPECT_EQ(1u, text_log.size()); 3215 EXPECT_EQ(1u, text_log.size());
3214 EXPECT_EQ(SK_ColorRED, text_log[0].color); 3216 EXPECT_EQ(SK_ColorRED, text_log[0].color);
3215 } 3217 }
3216 } 3218 }
3217 3219
3218 } // namespace gfx 3220 } // namespace gfx
OLDNEW
« no previous file with comments | « ui/gfx/render_text_mac.mm ('k') | ui/gfx/screen_mac.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698