| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |