| 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/views/controls/label.h" | 5 #include "ui/views/controls/label.h" |
| 6 | 6 |
| 7 #include "base/i18n/rtl.h" | 7 #include "base/i18n/rtl.h" |
| 8 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" |
| 9 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
| 10 #include "ui/accessibility/ax_view_state.h" | 10 #include "ui/accessibility/ax_view_state.h" |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 | 70 |
| 71 Label label; | 71 Label label; |
| 72 for (size_t i = 0; i < 2; ++i) { | 72 for (size_t i = 0; i < 2; ++i) { |
| 73 // Toggle the application default text direction (to try each direction). | 73 // Toggle the application default text direction (to try each direction). |
| 74 SetRTL(!base::i18n::IsRTL()); | 74 SetRTL(!base::i18n::IsRTL()); |
| 75 bool reverse_alignment = base::i18n::IsRTL(); | 75 bool reverse_alignment = base::i18n::IsRTL(); |
| 76 | 76 |
| 77 // The alignment should be flipped in RTL UI. | 77 // The alignment should be flipped in RTL UI. |
| 78 label.SetHorizontalAlignment(gfx::ALIGN_RIGHT); | 78 label.SetHorizontalAlignment(gfx::ALIGN_RIGHT); |
| 79 EXPECT_EQ(reverse_alignment ? gfx::ALIGN_LEFT : gfx::ALIGN_RIGHT, | 79 EXPECT_EQ(reverse_alignment ? gfx::ALIGN_LEFT : gfx::ALIGN_RIGHT, |
| 80 label.GetHorizontalAlignment()); | 80 label.horizontal_alignment()); |
| 81 label.SetHorizontalAlignment(gfx::ALIGN_LEFT); | 81 label.SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| 82 EXPECT_EQ(reverse_alignment ? gfx::ALIGN_RIGHT : gfx::ALIGN_LEFT, | 82 EXPECT_EQ(reverse_alignment ? gfx::ALIGN_RIGHT : gfx::ALIGN_LEFT, |
| 83 label.GetHorizontalAlignment()); | 83 label.horizontal_alignment()); |
| 84 label.SetHorizontalAlignment(gfx::ALIGN_CENTER); | 84 label.SetHorizontalAlignment(gfx::ALIGN_CENTER); |
| 85 EXPECT_EQ(gfx::ALIGN_CENTER, label.GetHorizontalAlignment()); | 85 EXPECT_EQ(gfx::ALIGN_CENTER, label.horizontal_alignment()); |
| 86 | 86 |
| 87 for (size_t j = 0; j < 2; ++j) { | 87 for (size_t j = 0; j < 2; ++j) { |
| 88 label.SetHorizontalAlignment(gfx::ALIGN_TO_HEAD); | 88 label.SetHorizontalAlignment(gfx::ALIGN_TO_HEAD); |
| 89 const bool rtl = j == 0; | 89 const bool rtl = j == 0; |
| 90 label.SetText(rtl ? base::WideToUTF16(L"\x5d0") : ASCIIToUTF16("A")); | 90 label.SetText(rtl ? base::WideToUTF16(L"\x5d0") : ASCIIToUTF16("A")); |
| 91 EXPECT_EQ(rtl ? gfx::ALIGN_RIGHT : gfx::ALIGN_LEFT, | 91 EXPECT_EQ(gfx::ALIGN_TO_HEAD, label.horizontal_alignment()); |
| 92 label.GetHorizontalAlignment()); | |
| 93 } | 92 } |
| 94 } | 93 } |
| 95 | 94 |
| 96 EXPECT_EQ(was_rtl, base::i18n::IsRTL()); | 95 EXPECT_EQ(was_rtl, base::i18n::IsRTL()); |
| 97 } | 96 } |
| 98 | 97 |
| 98 TEST_F(LabelTest, ElideBehavior) { |
| 99 Label label; |
| 100 base::string16 text(ASCIIToUTF16("This is example text.")); |
| 101 label.SetText(text); |
| 102 EXPECT_EQ(gfx::ELIDE_TAIL, label.elide_behavior()); |
| 103 gfx::Size size = label.GetPreferredSize(); |
| 104 label.SetBoundsRect(gfx::Rect(size)); |
| 105 EXPECT_EQ(text, label.GetDisplayTextForTesting()); |
| 106 |
| 107 size.set_width(size.width() / 2); |
| 108 label.SetBoundsRect(gfx::Rect(size)); |
| 109 EXPECT_GT(text.size(), label.GetDisplayTextForTesting().size()); |
| 110 |
| 111 label.SetElideBehavior(gfx::NO_ELIDE); |
| 112 EXPECT_EQ(text, label.GetDisplayTextForTesting()); |
| 113 } |
| 114 |
| 99 TEST_F(LabelTest, MultiLineProperty) { | 115 TEST_F(LabelTest, MultiLineProperty) { |
| 100 Label label; | 116 Label label; |
| 101 EXPECT_FALSE(label.multi_line()); | 117 EXPECT_FALSE(label.multi_line()); |
| 102 label.SetMultiLine(true); | 118 label.SetMultiLine(true); |
| 103 EXPECT_TRUE(label.multi_line()); | 119 EXPECT_TRUE(label.multi_line()); |
| 104 label.SetMultiLine(false); | 120 label.SetMultiLine(false); |
| 105 EXPECT_FALSE(label.multi_line()); | 121 EXPECT_FALSE(label.multi_line()); |
| 106 } | 122 } |
| 107 | 123 |
| 108 TEST_F(LabelTest, ObscuredProperty) { | 124 TEST_F(LabelTest, ObscuredProperty) { |
| 109 Label label; | 125 Label label; |
| 110 base::string16 test_text(ASCIIToUTF16("Password!")); | 126 base::string16 test_text(ASCIIToUTF16("Password!")); |
| 111 label.SetText(test_text); | 127 label.SetText(test_text); |
| 128 label.SizeToPreferredSize(); |
| 112 | 129 |
| 113 // The text should be unobscured by default. | 130 // The text should be unobscured by default. |
| 114 EXPECT_FALSE(label.obscured()); | 131 EXPECT_FALSE(label.obscured()); |
| 115 EXPECT_EQ(test_text, label.GetLayoutTextForTesting()); | 132 EXPECT_EQ(test_text, label.GetDisplayTextForTesting()); |
| 116 EXPECT_EQ(test_text, label.text()); | 133 EXPECT_EQ(test_text, label.text()); |
| 117 | 134 |
| 118 label.SetObscured(true); | 135 label.SetObscured(true); |
| 136 label.SizeToPreferredSize(); |
| 119 EXPECT_TRUE(label.obscured()); | 137 EXPECT_TRUE(label.obscured()); |
| 120 EXPECT_EQ(ASCIIToUTF16("*********"), label.GetLayoutTextForTesting()); | 138 EXPECT_EQ(ASCIIToUTF16("*********"), label.GetDisplayTextForTesting()); |
| 121 EXPECT_EQ(test_text, label.text()); | 139 EXPECT_EQ(test_text, label.text()); |
| 122 | 140 |
| 123 label.SetText(test_text + test_text); | 141 label.SetText(test_text + test_text); |
| 142 label.SizeToPreferredSize(); |
| 124 EXPECT_EQ(ASCIIToUTF16("******************"), | 143 EXPECT_EQ(ASCIIToUTF16("******************"), |
| 125 label.GetLayoutTextForTesting()); | 144 label.GetDisplayTextForTesting()); |
| 126 EXPECT_EQ(test_text + test_text, label.text()); | 145 EXPECT_EQ(test_text + test_text, label.text()); |
| 127 | 146 |
| 128 label.SetObscured(false); | 147 label.SetObscured(false); |
| 148 label.SizeToPreferredSize(); |
| 129 EXPECT_FALSE(label.obscured()); | 149 EXPECT_FALSE(label.obscured()); |
| 130 EXPECT_EQ(test_text + test_text, label.GetLayoutTextForTesting()); | 150 EXPECT_EQ(test_text + test_text, label.GetDisplayTextForTesting()); |
| 131 EXPECT_EQ(test_text + test_text, label.text()); | 151 EXPECT_EQ(test_text + test_text, label.text()); |
| 132 } | 152 } |
| 133 | 153 |
| 134 TEST_F(LabelTest, ObscuredSurrogatePair) { | 154 TEST_F(LabelTest, ObscuredSurrogatePair) { |
| 135 // 'MUSICAL SYMBOL G CLEF': represented in UTF-16 as two characters | 155 // 'MUSICAL SYMBOL G CLEF': represented in UTF-16 as two characters |
| 136 // forming the surrogate pair 0x0001D11E. | 156 // forming the surrogate pair 0x0001D11E. |
| 137 Label label; | 157 Label label; |
| 138 base::string16 test_text = base::UTF8ToUTF16("\xF0\x9D\x84\x9E"); | 158 base::string16 test_text = base::UTF8ToUTF16("\xF0\x9D\x84\x9E"); |
| 139 label.SetText(test_text); | 159 label.SetText(test_text); |
| 160 label.SizeToPreferredSize(); |
| 140 | 161 |
| 141 label.SetObscured(true); | 162 label.SetObscured(true); |
| 142 EXPECT_EQ(ASCIIToUTF16("*"), label.GetLayoutTextForTesting()); | 163 EXPECT_EQ(ASCIIToUTF16("*"), label.GetDisplayTextForTesting()); |
| 143 EXPECT_EQ(test_text, label.text()); | 164 EXPECT_EQ(test_text, label.text()); |
| 144 } | 165 } |
| 145 | 166 |
| 146 TEST_F(LabelTest, TooltipProperty) { | 167 TEST_F(LabelTest, TooltipProperty) { |
| 147 Label label; | 168 Label label; |
| 148 label.SetText(ASCIIToUTF16("My cool string.")); | 169 label.SetText(ASCIIToUTF16("My cool string.")); |
| 149 | 170 |
| 150 // Initially, label has no bounds, its text does not fit, and therefore its | 171 // Initially, label has no bounds, its text does not fit, and therefore its |
| 151 // text should be returned as the tooltip text. | 172 // text should be returned as the tooltip text. |
| 152 base::string16 tooltip; | 173 base::string16 tooltip; |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 350 | 371 |
| 351 // GetPreferredSize and borders. | 372 // GetPreferredSize and borders. |
| 352 label.SetBounds(0, 0, 0, 0); | 373 label.SetBounds(0, 0, 0, 0); |
| 353 gfx::Size required_size_with_border = label.GetPreferredSize(); | 374 gfx::Size required_size_with_border = label.GetPreferredSize(); |
| 354 EXPECT_EQ(required_size_with_border.height(), | 375 EXPECT_EQ(required_size_with_border.height(), |
| 355 required_size.height() + border.height()); | 376 required_size.height() + border.height()); |
| 356 EXPECT_EQ(required_size_with_border.width(), | 377 EXPECT_EQ(required_size_with_border.width(), |
| 357 required_size.width() + border.width()); | 378 required_size.width() + border.width()); |
| 358 } | 379 } |
| 359 | 380 |
| 360 TEST_F(LabelTest, DrawSingleLineString) { | 381 // Verifies if the combination of text eliding and multiline doesn't cause |
| 382 // any side effects of size / layout calculation. |
| 383 TEST_F(LabelTest, MultiLineSizingWithElide) { |
| 384 const base::string16 text = |
| 385 ASCIIToUTF16("A random string\nwith multiple lines\nand returns!"); |
| 361 Label label; | 386 Label label; |
| 362 label.SetFocusable(false); | 387 label.SetFocusable(false); |
| 388 label.SetText(text); |
| 389 label.SetMultiLine(true); |
| 363 | 390 |
| 364 label.SetText(ASCIIToUTF16("Here's a string with no returns.")); | 391 gfx::Size required_size = label.GetPreferredSize(); |
| 365 gfx::Size required_size(label.GetPreferredSize()); | 392 EXPECT_GT(required_size.height(), kMinTextDimension); |
| 366 gfx::Size extra(22, 8); | 393 EXPECT_GT(required_size.width(), kMinTextDimension); |
| 367 label.SetBounds(0, 0, required_size.width() + extra.width(), | 394 label.SetBoundsRect(gfx::Rect(required_size)); |
| 368 required_size.height() + extra.height()); | |
| 369 | 395 |
| 370 // Do some basic verifications for all three alignments. | 396 label.SetElideBehavior(gfx::ELIDE_TAIL); |
| 371 // Centered text. | 397 EXPECT_EQ(required_size.ToString(), label.GetPreferredSize().ToString()); |
| 372 const Label::DrawStringParams* params = label.CalculateDrawStringParams(); | 398 EXPECT_EQ(text, label.GetDisplayTextForTesting()); |
| 373 EXPECT_EQ(label.text(), params->text); | |
| 374 // The text should be centered horizontally and vertically. | |
| 375 EXPECT_EQ(extra.width() / 2, params->bounds.x()); | |
| 376 EXPECT_EQ(0, params->bounds.y()); | |
| 377 EXPECT_EQ(required_size.width(), params->bounds.width()); | |
| 378 EXPECT_EQ(label.height(), params->bounds.height()); | |
| 379 EXPECT_EQ(gfx::Canvas::TEXT_ALIGN_CENTER, | |
| 380 params->flags & (gfx::Canvas::TEXT_ALIGN_LEFT | | |
| 381 gfx::Canvas::TEXT_ALIGN_CENTER | | |
| 382 gfx::Canvas::TEXT_ALIGN_RIGHT)); | |
| 383 | 399 |
| 384 // Left aligned text. | 400 label.SizeToFit(required_size.width() - 1); |
| 385 label.SetHorizontalAlignment(gfx::ALIGN_LEFT); | 401 gfx::Size narrow_size = label.GetPreferredSize(); |
| 386 label.ResetLayoutCache(); | 402 EXPECT_GT(required_size.width(), narrow_size.width()); |
| 387 params = label.CalculateDrawStringParams(); | 403 EXPECT_LT(required_size.height(), narrow_size.height()); |
| 388 EXPECT_EQ(label.text(), params->text); | |
| 389 // The text should be left aligned horizontally and centered vertically. | |
| 390 EXPECT_EQ(0, params->bounds.x()); | |
| 391 EXPECT_EQ(0, params->bounds.y()); | |
| 392 EXPECT_EQ(required_size.width(), params->bounds.width()); | |
| 393 EXPECT_EQ(label.height(), params->bounds.height()); | |
| 394 EXPECT_EQ(gfx::Canvas::TEXT_ALIGN_LEFT, | |
| 395 params->flags & (gfx::Canvas::TEXT_ALIGN_LEFT | | |
| 396 gfx::Canvas::TEXT_ALIGN_CENTER | | |
| 397 gfx::Canvas::TEXT_ALIGN_RIGHT)); | |
| 398 | 404 |
| 399 // Right aligned text. | 405 // SetBounds() doesn't change the preferred size. |
| 400 label.SetHorizontalAlignment(gfx::ALIGN_RIGHT); | 406 label.SetBounds(0, 0, narrow_size.width() - 1, narrow_size.height()); |
| 401 label.ResetLayoutCache(); | 407 EXPECT_EQ(narrow_size.ToString(), label.GetPreferredSize().ToString()); |
| 402 params = label.CalculateDrawStringParams(); | |
| 403 EXPECT_EQ(label.text(), params->text); | |
| 404 // The text should be right aligned horizontally and centered vertically. | |
| 405 EXPECT_EQ(extra.width(), params->bounds.x()); | |
| 406 EXPECT_EQ(0, params->bounds.y()); | |
| 407 EXPECT_EQ(required_size.width(), params->bounds.width()); | |
| 408 EXPECT_EQ(label.height(), params->bounds.height()); | |
| 409 EXPECT_EQ(gfx::Canvas::TEXT_ALIGN_RIGHT, | |
| 410 params->flags & (gfx::Canvas::TEXT_ALIGN_LEFT | | |
| 411 gfx::Canvas::TEXT_ALIGN_CENTER | | |
| 412 gfx::Canvas::TEXT_ALIGN_RIGHT)); | |
| 413 | 408 |
| 414 // Test single line drawing with a border. | 409 // Paint() doesn't change the preferred size. |
| 415 gfx::Insets border(39, 34, 8, 96); | 410 gfx::Canvas canvas; |
| 416 label.SetBorder(Border::CreateEmptyBorder( | 411 label.Paint(&canvas, CullSet()); |
| 417 border.top(), border.left(), border.bottom(), border.right())); | 412 EXPECT_EQ(narrow_size.ToString(), label.GetPreferredSize().ToString()); |
| 418 | |
| 419 gfx::Size required_size_with_border(label.GetPreferredSize()); | |
| 420 EXPECT_EQ(required_size.width() + border.width(), | |
| 421 required_size_with_border.width()); | |
| 422 EXPECT_EQ(required_size.height() + border.height(), | |
| 423 required_size_with_border.height()); | |
| 424 label.SetBounds(0, 0, required_size_with_border.width() + extra.width(), | |
| 425 required_size_with_border.height() + extra.height()); | |
| 426 | |
| 427 // Centered text with border. | |
| 428 label.SetHorizontalAlignment(gfx::ALIGN_CENTER); | |
| 429 label.ResetLayoutCache(); | |
| 430 params = label.CalculateDrawStringParams(); | |
| 431 EXPECT_EQ(label.text(), params->text); | |
| 432 // The text should be centered horizontally and vertically within the border. | |
| 433 EXPECT_EQ(border.left() + extra.width() / 2, params->bounds.x()); | |
| 434 EXPECT_EQ(border.top(), params->bounds.y()); | |
| 435 EXPECT_EQ(required_size.width(), params->bounds.width()); | |
| 436 EXPECT_EQ(label.GetContentsBounds().height(), params->bounds.height()); | |
| 437 EXPECT_EQ(gfx::Canvas::TEXT_ALIGN_CENTER, | |
| 438 params->flags & (gfx::Canvas::TEXT_ALIGN_LEFT | | |
| 439 gfx::Canvas::TEXT_ALIGN_CENTER | | |
| 440 gfx::Canvas::TEXT_ALIGN_RIGHT)); | |
| 441 | |
| 442 // Left aligned text with border. | |
| 443 label.SetHorizontalAlignment(gfx::ALIGN_LEFT); | |
| 444 label.ResetLayoutCache(); | |
| 445 params = label.CalculateDrawStringParams(); | |
| 446 EXPECT_EQ(label.text(), params->text); | |
| 447 // The text should be left aligned horizontally and centered vertically. | |
| 448 EXPECT_EQ(border.left(), params->bounds.x()); | |
| 449 EXPECT_EQ(border.top(), params->bounds.y()); | |
| 450 EXPECT_EQ(required_size.width(), params->bounds.width()); | |
| 451 EXPECT_EQ(label.GetContentsBounds().height(), params->bounds.height()); | |
| 452 EXPECT_EQ(gfx::Canvas::TEXT_ALIGN_LEFT, | |
| 453 params->flags & (gfx::Canvas::TEXT_ALIGN_LEFT | | |
| 454 gfx::Canvas::TEXT_ALIGN_CENTER | | |
| 455 gfx::Canvas::TEXT_ALIGN_RIGHT)); | |
| 456 | |
| 457 // Right aligned text with border. | |
| 458 label.SetHorizontalAlignment(gfx::ALIGN_RIGHT); | |
| 459 label.ResetLayoutCache(); | |
| 460 params = label.CalculateDrawStringParams(); | |
| 461 EXPECT_EQ(label.text(), params->text); | |
| 462 // The text should be right aligned horizontally and centered vertically. | |
| 463 EXPECT_EQ(border.left() + extra.width(), params->bounds.x()); | |
| 464 EXPECT_EQ(border.top(), params->bounds.y()); | |
| 465 EXPECT_EQ(required_size.width(), params->bounds.width()); | |
| 466 EXPECT_EQ(label.GetContentsBounds().height(), params->bounds.height()); | |
| 467 EXPECT_EQ(gfx::Canvas::TEXT_ALIGN_RIGHT, | |
| 468 params->flags & (gfx::Canvas::TEXT_ALIGN_LEFT | | |
| 469 gfx::Canvas::TEXT_ALIGN_CENTER | | |
| 470 gfx::Canvas::TEXT_ALIGN_RIGHT)); | |
| 471 } | |
| 472 | |
| 473 // Pango needs a max height to elide multiline text; that is not supported here. | |
| 474 TEST_F(LabelTest, DrawMultiLineString) { | |
| 475 Label label; | |
| 476 label.SetFocusable(false); | |
| 477 // Set a background color to prevent gfx::Canvas::NO_SUBPIXEL_RENDERING flags. | |
| 478 label.SetBackgroundColor(SK_ColorWHITE); | |
| 479 | |
| 480 label.SetText(ASCIIToUTF16("Another string\nwith returns\n\n!")); | |
| 481 label.SetMultiLine(true); | |
| 482 label.SizeToFit(0); | |
| 483 gfx::Size extra(50, 10); | |
| 484 label.SetBounds(label.x(), label.y(), | |
| 485 label.width() + extra.width(), | |
| 486 label.height() + extra.height()); | |
| 487 | |
| 488 // Do some basic verifications for all three alignments. | |
| 489 const Label::DrawStringParams* params = label.CalculateDrawStringParams(); | |
| 490 EXPECT_EQ(label.text(), params->text); | |
| 491 EXPECT_EQ(extra.width() / 2, params->bounds.x()); | |
| 492 EXPECT_EQ(extra.height() / 2, params->bounds.y()); | |
| 493 EXPECT_GT(params->bounds.width(), kMinTextDimension); | |
| 494 EXPECT_GT(params->bounds.height(), kMinTextDimension); | |
| 495 int expected_flags = gfx::Canvas::MULTI_LINE | | |
| 496 gfx::Canvas::TEXT_ALIGN_CENTER; | |
| 497 #if !defined(OS_WIN) | |
| 498 expected_flags |= gfx::Canvas::NO_ELLIPSIS; | |
| 499 #endif | |
| 500 EXPECT_EQ(expected_flags, expected_flags); | |
| 501 gfx::Rect center_bounds(params->bounds); | |
| 502 | |
| 503 label.SetHorizontalAlignment(gfx::ALIGN_LEFT); | |
| 504 label.ResetLayoutCache(); | |
| 505 params = label.CalculateDrawStringParams(); | |
| 506 EXPECT_EQ(label.text(), params->text); | |
| 507 EXPECT_EQ(0, params->bounds.x()); | |
| 508 EXPECT_EQ(extra.height() / 2, params->bounds.y()); | |
| 509 EXPECT_GT(params->bounds.width(), kMinTextDimension); | |
| 510 EXPECT_GT(params->bounds.height(), kMinTextDimension); | |
| 511 expected_flags = gfx::Canvas::MULTI_LINE | | |
| 512 gfx::Canvas::TEXT_ALIGN_LEFT; | |
| 513 #if !defined(OS_WIN) | |
| 514 expected_flags |= gfx::Canvas::NO_ELLIPSIS; | |
| 515 #endif | |
| 516 EXPECT_EQ(expected_flags, expected_flags); | |
| 517 | |
| 518 label.SetHorizontalAlignment(gfx::ALIGN_RIGHT); | |
| 519 label.ResetLayoutCache(); | |
| 520 params = label.CalculateDrawStringParams(); | |
| 521 EXPECT_EQ(label.text(), params->text); | |
| 522 EXPECT_EQ(extra.width(), params->bounds.x()); | |
| 523 EXPECT_EQ(extra.height() / 2, params->bounds.y()); | |
| 524 EXPECT_GT(params->bounds.width(), kMinTextDimension); | |
| 525 EXPECT_GT(params->bounds.height(), kMinTextDimension); | |
| 526 expected_flags = gfx::Canvas::MULTI_LINE | | |
| 527 gfx::Canvas::TEXT_ALIGN_RIGHT; | |
| 528 #if !defined(OS_WIN) | |
| 529 expected_flags |= gfx::Canvas::NO_ELLIPSIS; | |
| 530 #endif | |
| 531 EXPECT_EQ(expected_flags, expected_flags); | |
| 532 | |
| 533 // Test multiline drawing with a border. | |
| 534 gfx::Insets border(19, 92, 23, 2); | |
| 535 label.SetBorder(Border::CreateEmptyBorder( | |
| 536 border.top(), border.left(), border.bottom(), border.right())); | |
| 537 label.SizeToFit(0); | |
| 538 label.SetBounds(label.x(), label.y(), | |
| 539 label.width() + extra.width(), | |
| 540 label.height() + extra.height()); | |
| 541 | |
| 542 label.SetHorizontalAlignment(gfx::ALIGN_CENTER); | |
| 543 label.ResetLayoutCache(); | |
| 544 params = label.CalculateDrawStringParams(); | |
| 545 EXPECT_EQ(label.text(), params->text); | |
| 546 EXPECT_EQ(border.left() + extra.width() / 2, params->bounds.x()); | |
| 547 EXPECT_EQ(border.top() + extra.height() / 2, params->bounds.y()); | |
| 548 EXPECT_EQ(center_bounds.width(), params->bounds.width()); | |
| 549 EXPECT_EQ(center_bounds.height(), params->bounds.height()); | |
| 550 expected_flags = gfx::Canvas::MULTI_LINE | | |
| 551 gfx::Canvas::TEXT_ALIGN_CENTER; | |
| 552 #if !defined(OS_WIN) | |
| 553 expected_flags |= gfx::Canvas::NO_ELLIPSIS; | |
| 554 #endif | |
| 555 EXPECT_EQ(expected_flags, expected_flags); | |
| 556 | |
| 557 label.SetHorizontalAlignment(gfx::ALIGN_LEFT); | |
| 558 label.ResetLayoutCache(); | |
| 559 params = label.CalculateDrawStringParams(); | |
| 560 EXPECT_EQ(label.text(), params->text); | |
| 561 EXPECT_EQ(border.left(), params->bounds.x()); | |
| 562 EXPECT_EQ(border.top() + extra.height() / 2, params->bounds.y()); | |
| 563 EXPECT_EQ(center_bounds.width(), params->bounds.width()); | |
| 564 EXPECT_EQ(center_bounds.height(), params->bounds.height()); | |
| 565 expected_flags = gfx::Canvas::MULTI_LINE | | |
| 566 gfx::Canvas::TEXT_ALIGN_LEFT; | |
| 567 #if !defined(OS_WIN) | |
| 568 expected_flags |= gfx::Canvas::NO_ELLIPSIS; | |
| 569 #endif | |
| 570 EXPECT_EQ(expected_flags, expected_flags); | |
| 571 | |
| 572 label.SetHorizontalAlignment(gfx::ALIGN_RIGHT); | |
| 573 label.ResetLayoutCache(); | |
| 574 params = label.CalculateDrawStringParams(); | |
| 575 EXPECT_EQ(label.text(), params->text); | |
| 576 EXPECT_EQ(extra.width() + border.left(), params->bounds.x()); | |
| 577 EXPECT_EQ(border.top() + extra.height() / 2, params->bounds.y()); | |
| 578 EXPECT_EQ(center_bounds.width(), params->bounds.width()); | |
| 579 EXPECT_EQ(center_bounds.height(), params->bounds.height()); | |
| 580 expected_flags = gfx::Canvas::MULTI_LINE | | |
| 581 gfx::Canvas::TEXT_ALIGN_RIGHT; | |
| 582 #if !defined(OS_WIN) | |
| 583 expected_flags |= gfx::Canvas::NO_ELLIPSIS; | |
| 584 #endif | |
| 585 EXPECT_EQ(expected_flags, expected_flags); | |
| 586 } | |
| 587 | |
| 588 TEST_F(LabelTest, DrawSingleLineStringInRTL) { | |
| 589 Label label; | |
| 590 label.SetFocusable(false); | |
| 591 | |
| 592 std::string locale = l10n_util::GetApplicationLocale(""); | |
| 593 base::i18n::SetICUDefaultLocale("he"); | |
| 594 | |
| 595 label.SetText(ASCIIToUTF16("Here's a string with no returns.")); | |
| 596 gfx::Size required_size(label.GetPreferredSize()); | |
| 597 gfx::Size extra(22, 8); | |
| 598 label.SetBounds(0, 0, required_size.width() + extra.width(), | |
| 599 required_size.height() + extra.height()); | |
| 600 | |
| 601 // Do some basic verifications for all three alignments. | |
| 602 // Centered text. | |
| 603 const Label::DrawStringParams* params = label.CalculateDrawStringParams(); | |
| 604 EXPECT_EQ(label.text(), params->text); | |
| 605 // The text should be centered horizontally and vertically. | |
| 606 EXPECT_EQ(extra.width() / 2, params->bounds.x()); | |
| 607 EXPECT_EQ(0, params->bounds.y()); | |
| 608 EXPECT_EQ(required_size.width(), params->bounds.width()); | |
| 609 EXPECT_EQ(label.height(), params->bounds.height()); | |
| 610 EXPECT_EQ(gfx::Canvas::TEXT_ALIGN_CENTER, | |
| 611 params->flags & (gfx::Canvas::TEXT_ALIGN_LEFT | | |
| 612 gfx::Canvas::TEXT_ALIGN_CENTER | | |
| 613 gfx::Canvas::TEXT_ALIGN_RIGHT)); | |
| 614 | |
| 615 // ALIGN_LEFT label. | |
| 616 label.SetHorizontalAlignment(gfx::ALIGN_LEFT); | |
| 617 label.ResetLayoutCache(); | |
| 618 params = label.CalculateDrawStringParams(); | |
| 619 EXPECT_EQ(label.text(), params->text); | |
| 620 // The text should be right aligned horizontally and centered vertically. | |
| 621 EXPECT_EQ(extra.width(), params->bounds.x()); | |
| 622 EXPECT_EQ(0, params->bounds.y()); | |
| 623 EXPECT_EQ(required_size.width(), params->bounds.width()); | |
| 624 EXPECT_EQ(label.height(), params->bounds.height()); | |
| 625 EXPECT_EQ(gfx::Canvas::TEXT_ALIGN_RIGHT, | |
| 626 params->flags & (gfx::Canvas::TEXT_ALIGN_LEFT | | |
| 627 gfx::Canvas::TEXT_ALIGN_CENTER | | |
| 628 gfx::Canvas::TEXT_ALIGN_RIGHT)); | |
| 629 | |
| 630 // ALIGN_RIGHT label. | |
| 631 label.SetHorizontalAlignment(gfx::ALIGN_RIGHT); | |
| 632 label.ResetLayoutCache(); | |
| 633 params = label.CalculateDrawStringParams(); | |
| 634 EXPECT_EQ(label.text(), params->text); | |
| 635 // The text should be left aligned horizontally and centered vertically. | |
| 636 EXPECT_EQ(0, params->bounds.x()); | |
| 637 EXPECT_EQ(0, params->bounds.y()); | |
| 638 EXPECT_EQ(required_size.width(), params->bounds.width()); | |
| 639 EXPECT_EQ(label.height(), params->bounds.height()); | |
| 640 EXPECT_EQ(gfx::Canvas::TEXT_ALIGN_LEFT, | |
| 641 params->flags & (gfx::Canvas::TEXT_ALIGN_LEFT | | |
| 642 gfx::Canvas::TEXT_ALIGN_CENTER | | |
| 643 gfx::Canvas::TEXT_ALIGN_RIGHT)); | |
| 644 | |
| 645 | |
| 646 // Test single line drawing with a border. | |
| 647 gfx::Insets border(39, 34, 8, 96); | |
| 648 label.SetBorder(Border::CreateEmptyBorder( | |
| 649 border.top(), border.left(), border.bottom(), border.right())); | |
| 650 | |
| 651 gfx::Size required_size_with_border(label.GetPreferredSize()); | |
| 652 EXPECT_EQ(required_size.width() + border.width(), | |
| 653 required_size_with_border.width()); | |
| 654 EXPECT_EQ(required_size.height() + border.height(), | |
| 655 required_size_with_border.height()); | |
| 656 label.SetBounds(0, 0, required_size_with_border.width() + extra.width(), | |
| 657 required_size_with_border.height() + extra.height()); | |
| 658 | |
| 659 // Centered text with border. | |
| 660 label.SetHorizontalAlignment(gfx::ALIGN_CENTER); | |
| 661 label.ResetLayoutCache(); | |
| 662 params = label.CalculateDrawStringParams(); | |
| 663 EXPECT_EQ(label.text(), params->text); | |
| 664 // The text should be centered horizontally and vertically within the border. | |
| 665 EXPECT_EQ(border.left() + extra.width() / 2, params->bounds.x()); | |
| 666 EXPECT_EQ(border.top(), params->bounds.y()); | |
| 667 EXPECT_EQ(required_size.width(), params->bounds.width()); | |
| 668 EXPECT_EQ(label.GetContentsBounds().height(), params->bounds.height()); | |
| 669 EXPECT_EQ(gfx::Canvas::TEXT_ALIGN_CENTER, | |
| 670 params->flags & (gfx::Canvas::TEXT_ALIGN_LEFT | | |
| 671 gfx::Canvas::TEXT_ALIGN_CENTER | | |
| 672 gfx::Canvas::TEXT_ALIGN_RIGHT)); | |
| 673 | |
| 674 // ALIGN_LEFT text with border. | |
| 675 label.SetHorizontalAlignment(gfx::ALIGN_LEFT); | |
| 676 label.ResetLayoutCache(); | |
| 677 params = label.CalculateDrawStringParams(); | |
| 678 EXPECT_EQ(label.text(), params->text); | |
| 679 // The text should be right aligned horizontally and centered vertically. | |
| 680 EXPECT_EQ(border.left() + extra.width(), params->bounds.x()); | |
| 681 EXPECT_EQ(border.top(), params->bounds.y()); | |
| 682 EXPECT_EQ(required_size.width(), params->bounds.width()); | |
| 683 EXPECT_EQ(label.GetContentsBounds().height(), params->bounds.height()); | |
| 684 EXPECT_EQ(gfx::Canvas::TEXT_ALIGN_RIGHT, | |
| 685 params->flags & (gfx::Canvas::TEXT_ALIGN_LEFT | | |
| 686 gfx::Canvas::TEXT_ALIGN_CENTER | | |
| 687 gfx::Canvas::TEXT_ALIGN_RIGHT)); | |
| 688 | |
| 689 // ALIGN_RIGHT text. | |
| 690 label.SetHorizontalAlignment(gfx::ALIGN_RIGHT); | |
| 691 label.ResetLayoutCache(); | |
| 692 params = label.CalculateDrawStringParams(); | |
| 693 EXPECT_EQ(label.text(), params->text); | |
| 694 // The text should be left aligned horizontally and centered vertically. | |
| 695 EXPECT_EQ(border.left(), params->bounds.x()); | |
| 696 EXPECT_EQ(border.top(), params->bounds.y()); | |
| 697 EXPECT_EQ(required_size.width(), params->bounds.width()); | |
| 698 EXPECT_EQ(label.GetContentsBounds().height(), params->bounds.height()); | |
| 699 EXPECT_EQ(gfx::Canvas::TEXT_ALIGN_LEFT, | |
| 700 params->flags & (gfx::Canvas::TEXT_ALIGN_LEFT | | |
| 701 gfx::Canvas::TEXT_ALIGN_CENTER | | |
| 702 gfx::Canvas::TEXT_ALIGN_RIGHT)); | |
| 703 | |
| 704 // Reset locale. | |
| 705 base::i18n::SetICUDefaultLocale(locale); | |
| 706 } | |
| 707 | |
| 708 // On Linux the underlying pango routines require a max height in order to | |
| 709 // ellide multiline text. So until that can be resolved, we set all | |
| 710 // multiline lables to not ellide in Linux only. | |
| 711 TEST_F(LabelTest, DrawMultiLineStringInRTL) { | |
| 712 Label label; | |
| 713 label.SetFocusable(false); | |
| 714 | |
| 715 // Test for RTL. | |
| 716 std::string locale = l10n_util::GetApplicationLocale(""); | |
| 717 base::i18n::SetICUDefaultLocale("he"); | |
| 718 | |
| 719 label.SetText(ASCIIToUTF16("Another string\nwith returns\n\n!")); | |
| 720 label.SetMultiLine(true); | |
| 721 label.SizeToFit(0); | |
| 722 gfx::Size extra(50, 10); | |
| 723 label.SetBounds(label.x(), label.y(), | |
| 724 label.width() + extra.width(), | |
| 725 label.height() + extra.height()); | |
| 726 | |
| 727 // Do some basic verifications for all three alignments. | |
| 728 const Label::DrawStringParams* params = label.CalculateDrawStringParams(); | |
| 729 EXPECT_EQ(label.text(), params->text); | |
| 730 EXPECT_EQ(extra.width() / 2, params->bounds.x()); | |
| 731 EXPECT_EQ(extra.height() / 2, params->bounds.y()); | |
| 732 EXPECT_GT(params->bounds.width(), kMinTextDimension); | |
| 733 EXPECT_GT(params->bounds.height(), kMinTextDimension); | |
| 734 EXPECT_TRUE(gfx::Canvas::MULTI_LINE & params->flags); | |
| 735 EXPECT_TRUE(gfx::Canvas::TEXT_ALIGN_CENTER & params->flags); | |
| 736 #if !defined(OS_WIN) | |
| 737 EXPECT_TRUE(gfx::Canvas::NO_ELLIPSIS & params->flags); | |
| 738 #endif | |
| 739 gfx::Rect center_bounds(params->bounds); | |
| 740 | |
| 741 label.SetHorizontalAlignment(gfx::ALIGN_LEFT); | |
| 742 label.ResetLayoutCache(); | |
| 743 params = label.CalculateDrawStringParams(); | |
| 744 EXPECT_EQ(label.text(), params->text); | |
| 745 EXPECT_EQ(extra.width(), params->bounds.x()); | |
| 746 EXPECT_EQ(extra.height() / 2, params->bounds.y()); | |
| 747 EXPECT_GT(params->bounds.width(), kMinTextDimension); | |
| 748 EXPECT_GT(params->bounds.height(), kMinTextDimension); | |
| 749 EXPECT_TRUE(gfx::Canvas::MULTI_LINE & params->flags); | |
| 750 EXPECT_TRUE(gfx::Canvas::TEXT_ALIGN_RIGHT & params->flags); | |
| 751 #if !defined(OS_WIN) | |
| 752 EXPECT_TRUE(gfx::Canvas::NO_ELLIPSIS & params->flags); | |
| 753 #endif | |
| 754 | |
| 755 label.SetHorizontalAlignment(gfx::ALIGN_RIGHT); | |
| 756 label.ResetLayoutCache(); | |
| 757 params = label.CalculateDrawStringParams(); | |
| 758 EXPECT_EQ(label.text(), params->text); | |
| 759 EXPECT_EQ(0, params->bounds.x()); | |
| 760 EXPECT_EQ(extra.height() / 2, params->bounds.y()); | |
| 761 EXPECT_GT(params->bounds.width(), kMinTextDimension); | |
| 762 EXPECT_GT(params->bounds.height(), kMinTextDimension); | |
| 763 EXPECT_TRUE(gfx::Canvas::MULTI_LINE & params->flags); | |
| 764 EXPECT_TRUE(gfx::Canvas::TEXT_ALIGN_LEFT & params->flags); | |
| 765 #if !defined(OS_WIN) | |
| 766 EXPECT_TRUE(gfx::Canvas::NO_ELLIPSIS & params->flags); | |
| 767 #endif | |
| 768 | |
| 769 // Test multiline drawing with a border. | |
| 770 gfx::Insets border(19, 92, 23, 2); | |
| 771 label.SetBorder(Border::CreateEmptyBorder( | |
| 772 border.top(), border.left(), border.bottom(), border.right())); | |
| 773 label.SizeToFit(0); | |
| 774 label.SetBounds(label.x(), label.y(), | |
| 775 label.width() + extra.width(), | |
| 776 label.height() + extra.height()); | |
| 777 | |
| 778 label.SetHorizontalAlignment(gfx::ALIGN_CENTER); | |
| 779 label.ResetLayoutCache(); | |
| 780 params = label.CalculateDrawStringParams(); | |
| 781 EXPECT_EQ(label.text(), params->text); | |
| 782 EXPECT_EQ(border.left() + extra.width() / 2, params->bounds.x()); | |
| 783 EXPECT_EQ(border.top() + extra.height() / 2, params->bounds.y()); | |
| 784 EXPECT_EQ(center_bounds.width(), params->bounds.width()); | |
| 785 EXPECT_EQ(center_bounds.height(), params->bounds.height()); | |
| 786 EXPECT_TRUE(gfx::Canvas::MULTI_LINE & params->flags); | |
| 787 EXPECT_TRUE(gfx::Canvas::TEXT_ALIGN_CENTER & params->flags); | |
| 788 #if !defined(OS_WIN) | |
| 789 EXPECT_TRUE(gfx::Canvas::NO_ELLIPSIS & params->flags); | |
| 790 #endif | |
| 791 | |
| 792 label.SetHorizontalAlignment(gfx::ALIGN_LEFT); | |
| 793 label.ResetLayoutCache(); | |
| 794 params = label.CalculateDrawStringParams(); | |
| 795 EXPECT_EQ(label.text(), params->text); | |
| 796 EXPECT_EQ(border.left() + extra.width(), params->bounds.x()); | |
| 797 EXPECT_EQ(border.top() + extra.height() / 2, params->bounds.y()); | |
| 798 EXPECT_EQ(center_bounds.width(), params->bounds.width()); | |
| 799 EXPECT_EQ(center_bounds.height(), params->bounds.height()); | |
| 800 EXPECT_TRUE(gfx::Canvas::MULTI_LINE & params->flags); | |
| 801 EXPECT_TRUE(gfx::Canvas::TEXT_ALIGN_RIGHT & params->flags); | |
| 802 #if !defined(OS_WIN) | |
| 803 EXPECT_TRUE(gfx::Canvas::NO_ELLIPSIS & params->flags); | |
| 804 #endif | |
| 805 | |
| 806 label.SetHorizontalAlignment(gfx::ALIGN_RIGHT); | |
| 807 label.ResetLayoutCache(); | |
| 808 params = label.CalculateDrawStringParams(); | |
| 809 EXPECT_EQ(label.text(), params->text); | |
| 810 EXPECT_EQ(border.left(), params->bounds.x()); | |
| 811 EXPECT_EQ(border.top() + extra.height() / 2, params->bounds.y()); | |
| 812 EXPECT_EQ(center_bounds.width(), params->bounds.width()); | |
| 813 EXPECT_EQ(center_bounds.height(), params->bounds.height()); | |
| 814 EXPECT_TRUE(gfx::Canvas::MULTI_LINE & params->flags); | |
| 815 EXPECT_TRUE(gfx::Canvas::TEXT_ALIGN_LEFT & params->flags); | |
| 816 #if !defined(OS_WIN) | |
| 817 EXPECT_TRUE(gfx::Canvas::NO_ELLIPSIS & params->flags); | |
| 818 #endif | |
| 819 | |
| 820 // Reset Locale | |
| 821 base::i18n::SetICUDefaultLocale(locale); | |
| 822 } | |
| 823 | |
| 824 // Ensure the subpixel rendering flag and background color alpha are respected. | |
| 825 TEST_F(LabelTest, DisableSubpixelRendering) { | |
| 826 Label label; | |
| 827 label.SetBackgroundColor(SK_ColorWHITE); | |
| 828 const int flag = gfx::Canvas::NO_SUBPIXEL_RENDERING; | |
| 829 EXPECT_EQ(0, label.ComputeDrawStringFlags() & flag); | |
| 830 label.SetSubpixelRenderingEnabled(false); | |
| 831 EXPECT_EQ(flag, label.ComputeDrawStringFlags() & flag); | |
| 832 label.SetSubpixelRenderingEnabled(true); | |
| 833 EXPECT_EQ(0, label.ComputeDrawStringFlags() & flag); | |
| 834 // Text cannot be drawn with subpixel rendering on transparent backgrounds. | |
| 835 label.SetBackgroundColor(SkColorSetARGB(64, 255, 255, 255)); | |
| 836 EXPECT_EQ(flag, label.ComputeDrawStringFlags() & flag); | |
| 837 } | 413 } |
| 838 | 414 |
| 839 // Check that labels support GetTooltipHandlerForPoint. | 415 // Check that labels support GetTooltipHandlerForPoint. |
| 840 TEST_F(LabelTest, GetTooltipHandlerForPoint) { | 416 TEST_F(LabelTest, GetTooltipHandlerForPoint) { |
| 841 // A root view must be defined for this test because the hit-testing | 417 // A root view must be defined for this test because the hit-testing |
| 842 // behaviour used by GetTooltipHandlerForPoint() is defined by | 418 // behaviour used by GetTooltipHandlerForPoint() is defined by |
| 843 // the ViewTargeter installed on the root view. | 419 // the ViewTargeter installed on the root view. |
| 844 Widget widget; | 420 Widget widget; |
| 845 Widget::InitParams init_params = | 421 Widget::InitParams init_params = |
| 846 CreateParams(Widget::InitParams::TYPE_POPUP); | 422 CreateParams(Widget::InitParams::TYPE_POPUP); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 887 EXPECT_FALSE(label.GetTooltipHandlerForPoint(gfx::Point(2, 51))); | 463 EXPECT_FALSE(label.GetTooltipHandlerForPoint(gfx::Point(2, 51))); |
| 888 EXPECT_FALSE(label.GetTooltipHandlerForPoint(gfx::Point(-1, 20))); | 464 EXPECT_FALSE(label.GetTooltipHandlerForPoint(gfx::Point(-1, 20))); |
| 889 label.SetHandlesTooltips(true); | 465 label.SetHandlesTooltips(true); |
| 890 | 466 |
| 891 // GetTooltipHandlerForPoint works should work in child bounds. | 467 // GetTooltipHandlerForPoint works should work in child bounds. |
| 892 label.SetBounds(2, 2, 10, 10); | 468 label.SetBounds(2, 2, 10, 10); |
| 893 EXPECT_EQ(&label, label.GetTooltipHandlerForPoint(gfx::Point(1, 5))); | 469 EXPECT_EQ(&label, label.GetTooltipHandlerForPoint(gfx::Point(1, 5))); |
| 894 EXPECT_FALSE(label.GetTooltipHandlerForPoint(gfx::Point(3, 11))); | 470 EXPECT_FALSE(label.GetTooltipHandlerForPoint(gfx::Point(3, 11))); |
| 895 } | 471 } |
| 896 | 472 |
| 473 // Check that label releases its internal layout data when it's unnecessary. |
| 474 TEST_F(LabelTest, ResetRenderTextData) { |
| 475 Label label; |
| 476 label.SetText(ASCIIToUTF16("Example")); |
| 477 label.SizeToPreferredSize(); |
| 478 gfx::Size preferred_size = label.GetPreferredSize(); |
| 479 |
| 480 EXPECT_NE(gfx::Size().ToString(), preferred_size.ToString()); |
| 481 EXPECT_EQ(0u, label.lines_.size()); |
| 482 |
| 483 gfx::Canvas canvas(preferred_size, 1.0f, true); |
| 484 label.Paint(&canvas, CullSet()); |
| 485 EXPECT_EQ(1u, label.lines_.size()); |
| 486 |
| 487 // Label should recreate its RenderText object when it's invisible, to release |
| 488 // the layout structures and data. |
| 489 label.SetVisible(false); |
| 490 EXPECT_EQ(0u, label.lines_.size()); |
| 491 |
| 492 // Querying fields or size information should not recompute the layout |
| 493 // unnecessarily. |
| 494 EXPECT_EQ(ASCIIToUTF16("Example"), label.text()); |
| 495 EXPECT_EQ(0u, label.lines_.size()); |
| 496 |
| 497 EXPECT_EQ(preferred_size.ToString(), label.GetPreferredSize().ToString()); |
| 498 EXPECT_EQ(0u, label.lines_.size()); |
| 499 |
| 500 // RenderText data should be back when it's necessary. |
| 501 label.SetVisible(true); |
| 502 EXPECT_EQ(0u, label.lines_.size()); |
| 503 |
| 504 label.Paint(&canvas, CullSet()); |
| 505 EXPECT_EQ(1u, label.lines_.size()); |
| 506 |
| 507 // Changing layout just resets |lines_|. It'll recover next time it's drawn. |
| 508 label.SetBounds(0, 0, 10, 10); |
| 509 EXPECT_EQ(0u, label.lines_.size()); |
| 510 |
| 511 label.Paint(&canvas, CullSet()); |
| 512 EXPECT_EQ(1u, label.lines_.size()); |
| 513 } |
| 514 |
| 515 #if !defined(OS_MACOSX) |
| 516 TEST_F(LabelTest, MultilineSupportedRenderText) { |
| 517 scoped_ptr<gfx::RenderText> render_text(gfx::RenderText::CreateInstance()); |
| 518 ASSERT_TRUE(render_text->MultilineSupported()); |
| 519 |
| 520 Label label; |
| 521 label.SetText(ASCIIToUTF16("Example of\nmultilined label")); |
| 522 label.SetMultiLine(true); |
| 523 label.SizeToPreferredSize(); |
| 524 |
| 525 gfx::Canvas canvas(label.GetPreferredSize(), 1.0f, true); |
| 526 label.Paint(&canvas, CullSet()); |
| 527 |
| 528 // There's only one 'line', RenderText itself supports multiple lines. |
| 529 EXPECT_EQ(1u, label.lines_.size()); |
| 530 } |
| 531 #endif |
| 532 |
| 897 } // namespace views | 533 } // namespace views |
| OLD | NEW |