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

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: rebase Created 5 years, 9 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
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
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
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
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