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

Side by Side Diff: ui/views/controls/label_unittest.cc

Issue 867003002: Cache gfx::RenderText instances in views::Label. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ui/views/controls/label.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/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
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
99 TEST_F(LabelTest, MultiLineProperty) { 98 TEST_F(LabelTest, MultiLineProperty) {
100 Label label; 99 Label label;
101 EXPECT_FALSE(label.multi_line()); 100 EXPECT_FALSE(label.multi_line());
102 label.SetMultiLine(true); 101 label.SetMultiLine(true);
103 EXPECT_TRUE(label.multi_line()); 102 EXPECT_TRUE(label.multi_line());
104 label.SetMultiLine(false); 103 label.SetMultiLine(false);
105 EXPECT_FALSE(label.multi_line()); 104 EXPECT_FALSE(label.multi_line());
106 } 105 }
107 106
108 TEST_F(LabelTest, ObscuredProperty) { 107 TEST_F(LabelTest, ObscuredProperty) {
109 Label label; 108 Label label;
110 base::string16 test_text(ASCIIToUTF16("Password!")); 109 base::string16 test_text(ASCIIToUTF16("Password!"));
111 label.SetText(test_text); 110 label.SetText(test_text);
112 111
113 // The text should be unobscured by default. 112 // The text should be unobscured by default.
114 EXPECT_FALSE(label.obscured()); 113 EXPECT_FALSE(label.obscured());
115 EXPECT_EQ(test_text, label.GetLayoutTextForTesting()); 114 EXPECT_EQ(test_text, label.GetDisplayTextForTesting());
116 EXPECT_EQ(test_text, label.text()); 115 EXPECT_EQ(test_text, label.text());
117 116
118 label.SetObscured(true); 117 label.SetObscured(true);
119 EXPECT_TRUE(label.obscured()); 118 EXPECT_TRUE(label.obscured());
120 EXPECT_EQ(ASCIIToUTF16("*********"), label.GetLayoutTextForTesting()); 119 EXPECT_EQ(ASCIIToUTF16("*********"), label.GetDisplayTextForTesting());
121 EXPECT_EQ(test_text, label.text()); 120 EXPECT_EQ(test_text, label.text());
122 121
123 label.SetText(test_text + test_text); 122 label.SetText(test_text + test_text);
124 EXPECT_EQ(ASCIIToUTF16("******************"), 123 EXPECT_EQ(ASCIIToUTF16("******************"),
125 label.GetLayoutTextForTesting()); 124 label.GetDisplayTextForTesting());
126 EXPECT_EQ(test_text + test_text, label.text()); 125 EXPECT_EQ(test_text + test_text, label.text());
127 126
128 label.SetObscured(false); 127 label.SetObscured(false);
129 EXPECT_FALSE(label.obscured()); 128 EXPECT_FALSE(label.obscured());
130 EXPECT_EQ(test_text + test_text, label.GetLayoutTextForTesting()); 129 EXPECT_EQ(test_text + test_text, label.GetDisplayTextForTesting());
131 EXPECT_EQ(test_text + test_text, label.text()); 130 EXPECT_EQ(test_text + test_text, label.text());
132 } 131 }
133 132
134 TEST_F(LabelTest, ObscuredSurrogatePair) { 133 TEST_F(LabelTest, ObscuredSurrogatePair) {
135 // 'MUSICAL SYMBOL G CLEF': represented in UTF-16 as two characters 134 // 'MUSICAL SYMBOL G CLEF': represented in UTF-16 as two characters
136 // forming the surrogate pair 0x0001D11E. 135 // forming the surrogate pair 0x0001D11E.
137 Label label; 136 Label label;
138 base::string16 test_text = base::UTF8ToUTF16("\xF0\x9D\x84\x9E"); 137 base::string16 test_text = base::UTF8ToUTF16("\xF0\x9D\x84\x9E");
139 label.SetText(test_text); 138 label.SetText(test_text);
140 139
141 label.SetObscured(true); 140 label.SetObscured(true);
142 EXPECT_EQ(ASCIIToUTF16("*"), label.GetLayoutTextForTesting()); 141 EXPECT_EQ(ASCIIToUTF16("*"), label.GetDisplayTextForTesting());
143 EXPECT_EQ(test_text, label.text()); 142 EXPECT_EQ(test_text, label.text());
144 } 143 }
145 144
146 TEST_F(LabelTest, TooltipProperty) { 145 TEST_F(LabelTest, TooltipProperty) {
147 Label label; 146 Label label;
148 label.SetText(ASCIIToUTF16("My cool string.")); 147 label.SetText(ASCIIToUTF16("My cool string."));
149 148
150 // Initially, label has no bounds, its text does not fit, and therefore its 149 // Initially, label has no bounds, its text does not fit, and therefore its
151 // text should be returned as the tooltip text. 150 // text should be returned as the tooltip text.
152 base::string16 tooltip; 151 base::string16 tooltip;
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 349
351 // GetPreferredSize and borders. 350 // GetPreferredSize and borders.
352 label.SetBounds(0, 0, 0, 0); 351 label.SetBounds(0, 0, 0, 0);
353 gfx::Size required_size_with_border = label.GetPreferredSize(); 352 gfx::Size required_size_with_border = label.GetPreferredSize();
354 EXPECT_EQ(required_size_with_border.height(), 353 EXPECT_EQ(required_size_with_border.height(),
355 required_size.height() + border.height()); 354 required_size.height() + border.height());
356 EXPECT_EQ(required_size_with_border.width(), 355 EXPECT_EQ(required_size_with_border.width(),
357 required_size.width() + border.width()); 356 required_size.width() + border.width());
358 } 357 }
359 358
360 TEST_F(LabelTest, DirectionalityFromText) { 359 // Verifies if the combination of text eliding and multiline doesn't cause
361 Label label; 360 // any side effects of size / layout calculation.
362 label.SetBounds(0, 0, 1000, 1000); 361 TEST_F(LabelTest, MultiLineSizingWithElide) {
363 362 const base::string16 text =
364 // Test text starts with RTL character. 363 ASCIIToUTF16("A random string\nwith multiple lines\nand returns!");
365 label.SetText(base::WideToUTF16(L" \x5d0\x5d1\x5d2 abc"));
366 const Label::DrawStringParams* params = label.CalculateDrawStringParams();
367 EXPECT_EQ(gfx::Canvas::FORCE_RTL_DIRECTIONALITY,
368 params->flags & (gfx::Canvas::FORCE_RTL_DIRECTIONALITY |
369 gfx::Canvas::FORCE_LTR_DIRECTIONALITY));
370
371 // Test text starts with LTR character.
372 label.SetText(base::WideToUTF16(L"ltr \x5d0\x5d1\x5d2 abc"));
373 params = label.CalculateDrawStringParams();
374 EXPECT_EQ(gfx::Canvas::FORCE_LTR_DIRECTIONALITY,
375 params->flags & (gfx::Canvas::FORCE_RTL_DIRECTIONALITY |
376 gfx::Canvas::FORCE_LTR_DIRECTIONALITY));
377 }
378
379 TEST_F(LabelTest, DrawSingleLineString) {
380 Label label; 364 Label label;
381 label.SetFocusable(false); 365 label.SetFocusable(false);
366 label.SetText(text);
367 label.SetMultiLine(true);
382 368
383 label.SetText(ASCIIToUTF16("Here's a string with no returns.")); 369 gfx::Size required_size = label.GetPreferredSize();
384 gfx::Size required_size(label.GetPreferredSize()); 370 EXPECT_GT(required_size.height(), kMinTextDimension);
385 gfx::Size extra(22, 8); 371 EXPECT_GT(required_size.width(), kMinTextDimension);
386 label.SetBounds(0, 0, required_size.width() + extra.width(),
387 required_size.height() + extra.height());
388 372
389 // Do some basic verifications for all three alignments. 373 label.SetElideBehavior(gfx::ELIDE_TAIL);
390 // Centered text. 374 EXPECT_EQ(required_size.ToString(), label.GetPreferredSize().ToString());
391 const Label::DrawStringParams* params = label.CalculateDrawStringParams(); 375 EXPECT_EQ(text, label.GetDisplayTextForTesting());
392 EXPECT_EQ(label.text(), params->text);
393 // The text should be centered horizontally and vertically.
394 EXPECT_EQ(extra.width() / 2, params->bounds.x());
395 EXPECT_EQ(0, params->bounds.y());
396 EXPECT_EQ(required_size.width(), params->bounds.width());
397 EXPECT_EQ(label.height(), params->bounds.height());
398 EXPECT_EQ(gfx::Canvas::TEXT_ALIGN_CENTER,
399 params->flags & (gfx::Canvas::TEXT_ALIGN_LEFT |
400 gfx::Canvas::TEXT_ALIGN_CENTER |
401 gfx::Canvas::TEXT_ALIGN_RIGHT));
402 376
403 // Left aligned text. 377 label.SizeToFit(required_size.width() - 1);
404 label.SetHorizontalAlignment(gfx::ALIGN_LEFT); 378 gfx::Size narrow_size = label.GetPreferredSize();
405 label.ResetLayoutCache(); 379 EXPECT_GT(required_size.width(), narrow_size.width());
406 params = label.CalculateDrawStringParams(); 380 EXPECT_LT(required_size.height(), narrow_size.height());
407 EXPECT_EQ(label.text(), params->text); 381 EXPECT_EQ(text, label.GetDisplayTextForTesting());
408 // The text should be left aligned horizontally and centered vertically.
409 EXPECT_EQ(0, params->bounds.x());
410 EXPECT_EQ(0, params->bounds.y());
411 EXPECT_EQ(required_size.width(), params->bounds.width());
412 EXPECT_EQ(label.height(), params->bounds.height());
413 EXPECT_EQ(gfx::Canvas::TEXT_ALIGN_LEFT,
414 params->flags & (gfx::Canvas::TEXT_ALIGN_LEFT |
415 gfx::Canvas::TEXT_ALIGN_CENTER |
416 gfx::Canvas::TEXT_ALIGN_RIGHT));
417 382
418 // Right aligned text. 383 // SetBounds() doesn't change the preferred size.
419 label.SetHorizontalAlignment(gfx::ALIGN_RIGHT); 384 label.SetBounds(0, 0, narrow_size.width() - 1, narrow_size.height());
420 label.ResetLayoutCache(); 385 EXPECT_EQ(narrow_size.ToString(), label.GetPreferredSize().ToString());
421 params = label.CalculateDrawStringParams(); 386 EXPECT_EQ(text, label.GetDisplayTextForTesting());
422 EXPECT_EQ(label.text(), params->text);
423 // The text should be right aligned horizontally and centered vertically.
424 EXPECT_EQ(extra.width(), params->bounds.x());
425 EXPECT_EQ(0, params->bounds.y());
426 EXPECT_EQ(required_size.width(), params->bounds.width());
427 EXPECT_EQ(label.height(), params->bounds.height());
428 EXPECT_EQ(gfx::Canvas::TEXT_ALIGN_RIGHT,
429 params->flags & (gfx::Canvas::TEXT_ALIGN_LEFT |
430 gfx::Canvas::TEXT_ALIGN_CENTER |
431 gfx::Canvas::TEXT_ALIGN_RIGHT));
432 387
433 // Test single line drawing with a border. 388 // Paint() doesn't change the preferred size.
434 gfx::Insets border(39, 34, 8, 96); 389 gfx::Canvas canvas;
435 label.SetBorder(Border::CreateEmptyBorder( 390 label.Paint(&canvas, CullSet());
436 border.top(), border.left(), border.bottom(), border.right())); 391 EXPECT_EQ(narrow_size.ToString(), label.GetPreferredSize().ToString());
437 392 EXPECT_EQ(text, label.GetDisplayTextForTesting());
438 gfx::Size required_size_with_border(label.GetPreferredSize());
439 EXPECT_EQ(required_size.width() + border.width(),
440 required_size_with_border.width());
441 EXPECT_EQ(required_size.height() + border.height(),
442 required_size_with_border.height());
443 label.SetBounds(0, 0, required_size_with_border.width() + extra.width(),
444 required_size_with_border.height() + extra.height());
445
446 // Centered text with border.
447 label.SetHorizontalAlignment(gfx::ALIGN_CENTER);
448 label.ResetLayoutCache();
449 params = label.CalculateDrawStringParams();
450 EXPECT_EQ(label.text(), params->text);
451 // The text should be centered horizontally and vertically within the border.
452 EXPECT_EQ(border.left() + extra.width() / 2, params->bounds.x());
453 EXPECT_EQ(border.top(), params->bounds.y());
454 EXPECT_EQ(required_size.width(), params->bounds.width());
455 EXPECT_EQ(label.GetContentsBounds().height(), params->bounds.height());
456 EXPECT_EQ(gfx::Canvas::TEXT_ALIGN_CENTER,
457 params->flags & (gfx::Canvas::TEXT_ALIGN_LEFT |
458 gfx::Canvas::TEXT_ALIGN_CENTER |
459 gfx::Canvas::TEXT_ALIGN_RIGHT));
460
461 // Left aligned text with border.
462 label.SetHorizontalAlignment(gfx::ALIGN_LEFT);
463 label.ResetLayoutCache();
464 params = label.CalculateDrawStringParams();
465 EXPECT_EQ(label.text(), params->text);
466 // The text should be left aligned horizontally and centered vertically.
467 EXPECT_EQ(border.left(), params->bounds.x());
468 EXPECT_EQ(border.top(), params->bounds.y());
469 EXPECT_EQ(required_size.width(), params->bounds.width());
470 EXPECT_EQ(label.GetContentsBounds().height(), params->bounds.height());
471 EXPECT_EQ(gfx::Canvas::TEXT_ALIGN_LEFT,
472 params->flags & (gfx::Canvas::TEXT_ALIGN_LEFT |
473 gfx::Canvas::TEXT_ALIGN_CENTER |
474 gfx::Canvas::TEXT_ALIGN_RIGHT));
475
476 // Right aligned text with border.
477 label.SetHorizontalAlignment(gfx::ALIGN_RIGHT);
478 label.ResetLayoutCache();
479 params = label.CalculateDrawStringParams();
480 EXPECT_EQ(label.text(), params->text);
481 // The text should be right aligned horizontally and centered vertically.
482 EXPECT_EQ(border.left() + extra.width(), params->bounds.x());
483 EXPECT_EQ(border.top(), params->bounds.y());
484 EXPECT_EQ(required_size.width(), params->bounds.width());
485 EXPECT_EQ(label.GetContentsBounds().height(), params->bounds.height());
486 EXPECT_EQ(gfx::Canvas::TEXT_ALIGN_RIGHT,
487 params->flags & (gfx::Canvas::TEXT_ALIGN_LEFT |
488 gfx::Canvas::TEXT_ALIGN_CENTER |
489 gfx::Canvas::TEXT_ALIGN_RIGHT));
490 }
491
492 // Pango needs a max height to elide multiline text; that is not supported here.
493 TEST_F(LabelTest, DrawMultiLineString) {
494 Label label;
495 label.SetFocusable(false);
496 // Set a background color to prevent gfx::Canvas::NO_SUBPIXEL_RENDERING flags.
497 label.SetBackgroundColor(SK_ColorWHITE);
498
499 label.SetText(ASCIIToUTF16("Another string\nwith returns\n\n!"));
500 label.SetMultiLine(true);
501 label.SizeToFit(0);
502 gfx::Size extra(50, 10);
503 label.SetBounds(label.x(), label.y(),
504 label.width() + extra.width(),
505 label.height() + extra.height());
506
507 // Do some basic verifications for all three alignments.
508 const Label::DrawStringParams* params = label.CalculateDrawStringParams();
509 EXPECT_EQ(label.text(), params->text);
510 EXPECT_EQ(extra.width() / 2, params->bounds.x());
511 EXPECT_EQ(extra.height() / 2, params->bounds.y());
512 EXPECT_GT(params->bounds.width(), kMinTextDimension);
513 EXPECT_GT(params->bounds.height(), kMinTextDimension);
514 int expected_flags = gfx::Canvas::MULTI_LINE |
515 gfx::Canvas::TEXT_ALIGN_CENTER |
516 gfx::Canvas::FORCE_LTR_DIRECTIONALITY;
517 #if !defined(OS_WIN)
518 expected_flags |= gfx::Canvas::NO_ELLIPSIS;
519 #endif
520 EXPECT_EQ(expected_flags, expected_flags);
521 gfx::Rect center_bounds(params->bounds);
522
523 label.SetHorizontalAlignment(gfx::ALIGN_LEFT);
524 label.ResetLayoutCache();
525 params = label.CalculateDrawStringParams();
526 EXPECT_EQ(label.text(), params->text);
527 EXPECT_EQ(0, params->bounds.x());
528 EXPECT_EQ(extra.height() / 2, params->bounds.y());
529 EXPECT_GT(params->bounds.width(), kMinTextDimension);
530 EXPECT_GT(params->bounds.height(), kMinTextDimension);
531 expected_flags = gfx::Canvas::MULTI_LINE |
532 gfx::Canvas::TEXT_ALIGN_LEFT |
533 gfx::Canvas::FORCE_LTR_DIRECTIONALITY;
534 #if !defined(OS_WIN)
535 expected_flags |= gfx::Canvas::NO_ELLIPSIS;
536 #endif
537 EXPECT_EQ(expected_flags, expected_flags);
538
539 label.SetHorizontalAlignment(gfx::ALIGN_RIGHT);
540 label.ResetLayoutCache();
541 params = label.CalculateDrawStringParams();
542 EXPECT_EQ(label.text(), params->text);
543 EXPECT_EQ(extra.width(), params->bounds.x());
544 EXPECT_EQ(extra.height() / 2, params->bounds.y());
545 EXPECT_GT(params->bounds.width(), kMinTextDimension);
546 EXPECT_GT(params->bounds.height(), kMinTextDimension);
547 expected_flags = gfx::Canvas::MULTI_LINE |
548 gfx::Canvas::TEXT_ALIGN_RIGHT |
549 gfx::Canvas::FORCE_LTR_DIRECTIONALITY;
550 #if !defined(OS_WIN)
551 expected_flags |= gfx::Canvas::NO_ELLIPSIS;
552 #endif
553 EXPECT_EQ(expected_flags, expected_flags);
554
555 // Test multiline drawing with a border.
556 gfx::Insets border(19, 92, 23, 2);
557 label.SetBorder(Border::CreateEmptyBorder(
558 border.top(), border.left(), border.bottom(), border.right()));
559 label.SizeToFit(0);
560 label.SetBounds(label.x(), label.y(),
561 label.width() + extra.width(),
562 label.height() + extra.height());
563
564 label.SetHorizontalAlignment(gfx::ALIGN_CENTER);
565 label.ResetLayoutCache();
566 params = label.CalculateDrawStringParams();
567 EXPECT_EQ(label.text(), params->text);
568 EXPECT_EQ(border.left() + extra.width() / 2, params->bounds.x());
569 EXPECT_EQ(border.top() + extra.height() / 2, params->bounds.y());
570 EXPECT_EQ(center_bounds.width(), params->bounds.width());
571 EXPECT_EQ(center_bounds.height(), params->bounds.height());
572 expected_flags = gfx::Canvas::MULTI_LINE |
573 gfx::Canvas::TEXT_ALIGN_CENTER |
574 gfx::Canvas::FORCE_LTR_DIRECTIONALITY;
575 #if !defined(OS_WIN)
576 expected_flags |= gfx::Canvas::NO_ELLIPSIS;
577 #endif
578 EXPECT_EQ(expected_flags, expected_flags);
579
580 label.SetHorizontalAlignment(gfx::ALIGN_LEFT);
581 label.ResetLayoutCache();
582 params = label.CalculateDrawStringParams();
583 EXPECT_EQ(label.text(), params->text);
584 EXPECT_EQ(border.left(), params->bounds.x());
585 EXPECT_EQ(border.top() + extra.height() / 2, params->bounds.y());
586 EXPECT_EQ(center_bounds.width(), params->bounds.width());
587 EXPECT_EQ(center_bounds.height(), params->bounds.height());
588 expected_flags = gfx::Canvas::MULTI_LINE |
589 gfx::Canvas::TEXT_ALIGN_LEFT |
590 gfx::Canvas::FORCE_LTR_DIRECTIONALITY;
591 #if !defined(OS_WIN)
592 expected_flags |= gfx::Canvas::NO_ELLIPSIS;
593 #endif
594 EXPECT_EQ(expected_flags, expected_flags);
595
596 label.SetHorizontalAlignment(gfx::ALIGN_RIGHT);
597 label.ResetLayoutCache();
598 params = label.CalculateDrawStringParams();
599 EXPECT_EQ(label.text(), params->text);
600 EXPECT_EQ(extra.width() + border.left(), params->bounds.x());
601 EXPECT_EQ(border.top() + extra.height() / 2, params->bounds.y());
602 EXPECT_EQ(center_bounds.width(), params->bounds.width());
603 EXPECT_EQ(center_bounds.height(), params->bounds.height());
604 expected_flags = gfx::Canvas::MULTI_LINE |
605 gfx::Canvas::TEXT_ALIGN_RIGHT |
606 gfx::Canvas::FORCE_LTR_DIRECTIONALITY;
607 #if !defined(OS_WIN)
608 expected_flags |= gfx::Canvas::NO_ELLIPSIS;
609 #endif
610 EXPECT_EQ(expected_flags, expected_flags);
611 }
612
613 TEST_F(LabelTest, DrawSingleLineStringInRTL) {
614 Label label;
615 label.SetFocusable(false);
616
617 std::string locale = l10n_util::GetApplicationLocale("");
618 base::i18n::SetICUDefaultLocale("he");
619
620 label.SetText(ASCIIToUTF16("Here's a string with no returns."));
621 gfx::Size required_size(label.GetPreferredSize());
622 gfx::Size extra(22, 8);
623 label.SetBounds(0, 0, required_size.width() + extra.width(),
624 required_size.height() + extra.height());
625
626 // Do some basic verifications for all three alignments.
627 // Centered text.
628 const Label::DrawStringParams* params = label.CalculateDrawStringParams();
629 EXPECT_EQ(label.text(), params->text);
630 // The text should be centered horizontally and vertically.
631 EXPECT_EQ(extra.width() / 2, params->bounds.x());
632 EXPECT_EQ(0, params->bounds.y());
633 EXPECT_EQ(required_size.width(), params->bounds.width());
634 EXPECT_EQ(label.height(), params->bounds.height());
635 EXPECT_EQ(gfx::Canvas::TEXT_ALIGN_CENTER,
636 params->flags & (gfx::Canvas::TEXT_ALIGN_LEFT |
637 gfx::Canvas::TEXT_ALIGN_CENTER |
638 gfx::Canvas::TEXT_ALIGN_RIGHT));
639
640 // ALIGN_LEFT label.
641 label.SetHorizontalAlignment(gfx::ALIGN_LEFT);
642 label.ResetLayoutCache();
643 params = label.CalculateDrawStringParams();
644 EXPECT_EQ(label.text(), params->text);
645 // The text should be right aligned horizontally and centered vertically.
646 EXPECT_EQ(extra.width(), params->bounds.x());
647 EXPECT_EQ(0, params->bounds.y());
648 EXPECT_EQ(required_size.width(), params->bounds.width());
649 EXPECT_EQ(label.height(), params->bounds.height());
650 EXPECT_EQ(gfx::Canvas::TEXT_ALIGN_RIGHT,
651 params->flags & (gfx::Canvas::TEXT_ALIGN_LEFT |
652 gfx::Canvas::TEXT_ALIGN_CENTER |
653 gfx::Canvas::TEXT_ALIGN_RIGHT));
654
655 // ALIGN_RIGHT label.
656 label.SetHorizontalAlignment(gfx::ALIGN_RIGHT);
657 label.ResetLayoutCache();
658 params = label.CalculateDrawStringParams();
659 EXPECT_EQ(label.text(), params->text);
660 // The text should be left aligned horizontally and centered vertically.
661 EXPECT_EQ(0, params->bounds.x());
662 EXPECT_EQ(0, params->bounds.y());
663 EXPECT_EQ(required_size.width(), params->bounds.width());
664 EXPECT_EQ(label.height(), params->bounds.height());
665 EXPECT_EQ(gfx::Canvas::TEXT_ALIGN_LEFT,
666 params->flags & (gfx::Canvas::TEXT_ALIGN_LEFT |
667 gfx::Canvas::TEXT_ALIGN_CENTER |
668 gfx::Canvas::TEXT_ALIGN_RIGHT));
669
670
671 // Test single line drawing with a border.
672 gfx::Insets border(39, 34, 8, 96);
673 label.SetBorder(Border::CreateEmptyBorder(
674 border.top(), border.left(), border.bottom(), border.right()));
675
676 gfx::Size required_size_with_border(label.GetPreferredSize());
677 EXPECT_EQ(required_size.width() + border.width(),
678 required_size_with_border.width());
679 EXPECT_EQ(required_size.height() + border.height(),
680 required_size_with_border.height());
681 label.SetBounds(0, 0, required_size_with_border.width() + extra.width(),
682 required_size_with_border.height() + extra.height());
683
684 // Centered text with border.
685 label.SetHorizontalAlignment(gfx::ALIGN_CENTER);
686 label.ResetLayoutCache();
687 params = label.CalculateDrawStringParams();
688 EXPECT_EQ(label.text(), params->text);
689 // The text should be centered horizontally and vertically within the border.
690 EXPECT_EQ(border.left() + extra.width() / 2, params->bounds.x());
691 EXPECT_EQ(border.top(), params->bounds.y());
692 EXPECT_EQ(required_size.width(), params->bounds.width());
693 EXPECT_EQ(label.GetContentsBounds().height(), params->bounds.height());
694 EXPECT_EQ(gfx::Canvas::TEXT_ALIGN_CENTER,
695 params->flags & (gfx::Canvas::TEXT_ALIGN_LEFT |
696 gfx::Canvas::TEXT_ALIGN_CENTER |
697 gfx::Canvas::TEXT_ALIGN_RIGHT));
698
699 // ALIGN_LEFT text with border.
700 label.SetHorizontalAlignment(gfx::ALIGN_LEFT);
701 label.ResetLayoutCache();
702 params = label.CalculateDrawStringParams();
703 EXPECT_EQ(label.text(), params->text);
704 // The text should be right aligned horizontally and centered vertically.
705 EXPECT_EQ(border.left() + extra.width(), params->bounds.x());
706 EXPECT_EQ(border.top(), params->bounds.y());
707 EXPECT_EQ(required_size.width(), params->bounds.width());
708 EXPECT_EQ(label.GetContentsBounds().height(), params->bounds.height());
709 EXPECT_EQ(gfx::Canvas::TEXT_ALIGN_RIGHT,
710 params->flags & (gfx::Canvas::TEXT_ALIGN_LEFT |
711 gfx::Canvas::TEXT_ALIGN_CENTER |
712 gfx::Canvas::TEXT_ALIGN_RIGHT));
713
714 // ALIGN_RIGHT text.
715 label.SetHorizontalAlignment(gfx::ALIGN_RIGHT);
716 label.ResetLayoutCache();
717 params = label.CalculateDrawStringParams();
718 EXPECT_EQ(label.text(), params->text);
719 // The text should be left aligned horizontally and centered vertically.
720 EXPECT_EQ(border.left(), params->bounds.x());
721 EXPECT_EQ(border.top(), params->bounds.y());
722 EXPECT_EQ(required_size.width(), params->bounds.width());
723 EXPECT_EQ(label.GetContentsBounds().height(), params->bounds.height());
724 EXPECT_EQ(gfx::Canvas::TEXT_ALIGN_LEFT,
725 params->flags & (gfx::Canvas::TEXT_ALIGN_LEFT |
726 gfx::Canvas::TEXT_ALIGN_CENTER |
727 gfx::Canvas::TEXT_ALIGN_RIGHT));
728
729 // Reset locale.
730 base::i18n::SetICUDefaultLocale(locale);
731 }
732
733 // On Linux the underlying pango routines require a max height in order to
734 // ellide multiline text. So until that can be resolved, we set all
735 // multiline lables to not ellide in Linux only.
736 TEST_F(LabelTest, DrawMultiLineStringInRTL) {
737 Label label;
738 label.SetFocusable(false);
739
740 // Test for RTL.
741 std::string locale = l10n_util::GetApplicationLocale("");
742 base::i18n::SetICUDefaultLocale("he");
743
744 label.SetText(ASCIIToUTF16("Another string\nwith returns\n\n!"));
745 label.SetMultiLine(true);
746 label.SizeToFit(0);
747 gfx::Size extra(50, 10);
748 label.SetBounds(label.x(), label.y(),
749 label.width() + extra.width(),
750 label.height() + extra.height());
751
752 // Do some basic verifications for all three alignments.
753 const Label::DrawStringParams* params = label.CalculateDrawStringParams();
754 EXPECT_EQ(label.text(), params->text);
755 EXPECT_EQ(extra.width() / 2, params->bounds.x());
756 EXPECT_EQ(extra.height() / 2, params->bounds.y());
757 EXPECT_GT(params->bounds.width(), kMinTextDimension);
758 EXPECT_GT(params->bounds.height(), kMinTextDimension);
759 EXPECT_TRUE(gfx::Canvas::MULTI_LINE & params->flags);
760 EXPECT_TRUE(gfx::Canvas::TEXT_ALIGN_CENTER & params->flags);
761 #if !defined(OS_WIN)
762 EXPECT_TRUE(gfx::Canvas::NO_ELLIPSIS & params->flags);
763 #endif
764 gfx::Rect center_bounds(params->bounds);
765
766 label.SetHorizontalAlignment(gfx::ALIGN_LEFT);
767 label.ResetLayoutCache();
768 params = label.CalculateDrawStringParams();
769 EXPECT_EQ(label.text(), params->text);
770 EXPECT_EQ(extra.width(), params->bounds.x());
771 EXPECT_EQ(extra.height() / 2, params->bounds.y());
772 EXPECT_GT(params->bounds.width(), kMinTextDimension);
773 EXPECT_GT(params->bounds.height(), kMinTextDimension);
774 EXPECT_TRUE(gfx::Canvas::MULTI_LINE & params->flags);
775 EXPECT_TRUE(gfx::Canvas::TEXT_ALIGN_RIGHT & params->flags);
776 #if !defined(OS_WIN)
777 EXPECT_TRUE(gfx::Canvas::NO_ELLIPSIS & params->flags);
778 #endif
779
780 label.SetHorizontalAlignment(gfx::ALIGN_RIGHT);
781 label.ResetLayoutCache();
782 params = label.CalculateDrawStringParams();
783 EXPECT_EQ(label.text(), params->text);
784 EXPECT_EQ(0, params->bounds.x());
785 EXPECT_EQ(extra.height() / 2, params->bounds.y());
786 EXPECT_GT(params->bounds.width(), kMinTextDimension);
787 EXPECT_GT(params->bounds.height(), kMinTextDimension);
788 EXPECT_TRUE(gfx::Canvas::MULTI_LINE & params->flags);
789 EXPECT_TRUE(gfx::Canvas::TEXT_ALIGN_LEFT & params->flags);
790 #if !defined(OS_WIN)
791 EXPECT_TRUE(gfx::Canvas::NO_ELLIPSIS & params->flags);
792 #endif
793
794 // Test multiline drawing with a border.
795 gfx::Insets border(19, 92, 23, 2);
796 label.SetBorder(Border::CreateEmptyBorder(
797 border.top(), border.left(), border.bottom(), border.right()));
798 label.SizeToFit(0);
799 label.SetBounds(label.x(), label.y(),
800 label.width() + extra.width(),
801 label.height() + extra.height());
802
803 label.SetHorizontalAlignment(gfx::ALIGN_CENTER);
804 label.ResetLayoutCache();
805 params = label.CalculateDrawStringParams();
806 EXPECT_EQ(label.text(), params->text);
807 EXPECT_EQ(border.left() + extra.width() / 2, params->bounds.x());
808 EXPECT_EQ(border.top() + extra.height() / 2, params->bounds.y());
809 EXPECT_EQ(center_bounds.width(), params->bounds.width());
810 EXPECT_EQ(center_bounds.height(), params->bounds.height());
811 EXPECT_TRUE(gfx::Canvas::MULTI_LINE & params->flags);
812 EXPECT_TRUE(gfx::Canvas::TEXT_ALIGN_CENTER & params->flags);
813 #if !defined(OS_WIN)
814 EXPECT_TRUE(gfx::Canvas::NO_ELLIPSIS & params->flags);
815 #endif
816
817 label.SetHorizontalAlignment(gfx::ALIGN_LEFT);
818 label.ResetLayoutCache();
819 params = label.CalculateDrawStringParams();
820 EXPECT_EQ(label.text(), params->text);
821 EXPECT_EQ(border.left() + extra.width(), params->bounds.x());
822 EXPECT_EQ(border.top() + extra.height() / 2, params->bounds.y());
823 EXPECT_EQ(center_bounds.width(), params->bounds.width());
824 EXPECT_EQ(center_bounds.height(), params->bounds.height());
825 EXPECT_TRUE(gfx::Canvas::MULTI_LINE & params->flags);
826 EXPECT_TRUE(gfx::Canvas::TEXT_ALIGN_RIGHT & params->flags);
827 #if !defined(OS_WIN)
828 EXPECT_TRUE(gfx::Canvas::NO_ELLIPSIS & params->flags);
829 #endif
830
831 label.SetHorizontalAlignment(gfx::ALIGN_RIGHT);
832 label.ResetLayoutCache();
833 params = label.CalculateDrawStringParams();
834 EXPECT_EQ(label.text(), params->text);
835 EXPECT_EQ(border.left(), params->bounds.x());
836 EXPECT_EQ(border.top() + extra.height() / 2, params->bounds.y());
837 EXPECT_EQ(center_bounds.width(), params->bounds.width());
838 EXPECT_EQ(center_bounds.height(), params->bounds.height());
839 EXPECT_TRUE(gfx::Canvas::MULTI_LINE & params->flags);
840 EXPECT_TRUE(gfx::Canvas::TEXT_ALIGN_LEFT & params->flags);
841 #if !defined(OS_WIN)
842 EXPECT_TRUE(gfx::Canvas::NO_ELLIPSIS & params->flags);
843 #endif
844
845 // Reset Locale
846 base::i18n::SetICUDefaultLocale(locale);
847 }
848
849 // Ensure the subpixel rendering flag and background color alpha are respected.
850 TEST_F(LabelTest, DisableSubpixelRendering) {
851 Label label;
852 label.SetBackgroundColor(SK_ColorWHITE);
853 const int flag = gfx::Canvas::NO_SUBPIXEL_RENDERING;
854 EXPECT_EQ(0, label.ComputeDrawStringFlags() & flag);
855 label.SetSubpixelRenderingEnabled(false);
856 EXPECT_EQ(flag, label.ComputeDrawStringFlags() & flag);
857 label.SetSubpixelRenderingEnabled(true);
858 EXPECT_EQ(0, label.ComputeDrawStringFlags() & flag);
859 // Text cannot be drawn with subpixel rendering on transparent backgrounds.
860 label.SetBackgroundColor(SkColorSetARGB(64, 255, 255, 255));
861 EXPECT_EQ(flag, label.ComputeDrawStringFlags() & flag);
862 } 393 }
863 394
864 // Check that labels support GetTooltipHandlerForPoint. 395 // Check that labels support GetTooltipHandlerForPoint.
865 TEST_F(LabelTest, GetTooltipHandlerForPoint) { 396 TEST_F(LabelTest, GetTooltipHandlerForPoint) {
866 // A root view must be defined for this test because the hit-testing 397 // A root view must be defined for this test because the hit-testing
867 // behaviour used by GetTooltipHandlerForPoint() is defined by 398 // behaviour used by GetTooltipHandlerForPoint() is defined by
868 // the ViewTargeter installed on the root view. 399 // the ViewTargeter installed on the root view.
869 Widget widget; 400 Widget widget;
870 Widget::InitParams init_params = 401 Widget::InitParams init_params =
871 CreateParams(Widget::InitParams::TYPE_POPUP); 402 CreateParams(Widget::InitParams::TYPE_POPUP);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
912 EXPECT_FALSE(label.GetTooltipHandlerForPoint(gfx::Point(2, 51))); 443 EXPECT_FALSE(label.GetTooltipHandlerForPoint(gfx::Point(2, 51)));
913 EXPECT_FALSE(label.GetTooltipHandlerForPoint(gfx::Point(-1, 20))); 444 EXPECT_FALSE(label.GetTooltipHandlerForPoint(gfx::Point(-1, 20)));
914 label.SetHandlesTooltips(true); 445 label.SetHandlesTooltips(true);
915 446
916 // GetTooltipHandlerForPoint works should work in child bounds. 447 // GetTooltipHandlerForPoint works should work in child bounds.
917 label.SetBounds(2, 2, 10, 10); 448 label.SetBounds(2, 2, 10, 10);
918 EXPECT_EQ(&label, label.GetTooltipHandlerForPoint(gfx::Point(1, 5))); 449 EXPECT_EQ(&label, label.GetTooltipHandlerForPoint(gfx::Point(1, 5)));
919 EXPECT_FALSE(label.GetTooltipHandlerForPoint(gfx::Point(3, 11))); 450 EXPECT_FALSE(label.GetTooltipHandlerForPoint(gfx::Point(3, 11)));
920 } 451 }
921 452
453 // Check that label releases its internal layout data when it's unnecessary.
454 TEST_F(LabelTest, ResetRenderTextData) {
455 Label label;
456 label.SetText(ASCIIToUTF16("Example"));
457 label.SizeToPreferredSize();
458 gfx::Size preferred_size = label.GetPreferredSize();
459
460 EXPECT_NE(gfx::Size().ToString(), preferred_size.ToString());
461 EXPECT_EQ(0u, label.lines_.size());
462
463 gfx::Canvas canvas(preferred_size, 1.0f, true);
464 label.Paint(&canvas, CullSet());
465 EXPECT_EQ(1u, label.lines_.size());
466
467 // Label should recreate its RenderText object when it's invisible, to release
468 // the layout structures and data.
469 label.SetVisible(false);
470 EXPECT_EQ(0u, label.lines_.size());
471
472 // Querying fields or size information should not recompute the layout
473 // unnecessarily.
474 EXPECT_EQ(ASCIIToUTF16("Example"), label.text());
475 EXPECT_EQ(0u, label.lines_.size());
476
477 EXPECT_EQ(preferred_size.ToString(), label.GetPreferredSize().ToString());
478 EXPECT_EQ(0u, label.lines_.size());
479
480 // RenderText data should be back when it's necessary.
481 label.SetVisible(true);
482 EXPECT_EQ(0u, label.lines_.size());
483
484 label.Paint(&canvas, CullSet());
485 EXPECT_EQ(1u, label.lines_.size());
486
487 // Changing layout just resets |lines_|. It'll recover next time it's drawn.
488 label.SetBounds(0, 0, 10, 10);
489 EXPECT_EQ(0u, label.lines_.size());
490
491 label.Paint(&canvas, CullSet());
492 EXPECT_EQ(1u, label.lines_.size());
493 }
494
495 #if !defined(OS_MACOSX)
tapted 2015/02/27 01:21:00 Note that since SetMultiline now calls render_text
Jun Mukai 2015/02/27 02:06:47 Thanks for the followup. I haven't noticed oshima
496 TEST_F(LabelTest, MultilineSupportedRenderText) {
497 scoped_ptr<gfx::RenderText> render_text(gfx::RenderText::CreateInstance());
498 ASSERT_TRUE(render_text->MultilineSupported());
499
500 Label label;
501 label.SetText(ASCIIToUTF16("Example of\nmultilined label"));
502 label.SetMultiLine(true);
503 label.SizeToPreferredSize();
504
505 gfx::Canvas canvas(label.GetPreferredSize(), 1.0f, true);
506 label.Paint(&canvas, CullSet());
507
508 // There's only one 'line', RenderText itself supports multiple lines.
509 EXPECT_EQ(1u, label.lines_.size());
510 }
511 #endif
512
922 } // namespace views 513 } // namespace views
OLDNEW
« no previous file with comments | « ui/views/controls/label.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698