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

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, 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
« ui/views/controls/label.cc ('K') | « 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);
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 label.SetObscured(true); 204 label.SetObscured(true);
206 EXPECT_FALSE(label.GetTooltipText(gfx::Point(), &tooltip)); 205 EXPECT_FALSE(label.GetTooltipText(gfx::Point(), &tooltip));
207 206
208 // Obscuring the text shouldn't permanently clobber the tooltip. 207 // Obscuring the text shouldn't permanently clobber the tooltip.
209 label.SetObscured(false); 208 label.SetObscured(false);
210 EXPECT_TRUE(label.GetTooltipText(gfx::Point(), &tooltip)); 209 EXPECT_TRUE(label.GetTooltipText(gfx::Point(), &tooltip));
211 210
212 // Making the label multiline shouldn't eliminate the tooltip. 211 // Making the label multiline shouldn't eliminate the tooltip.
213 label.SetMultiLine(true); 212 label.SetMultiLine(true);
214 EXPECT_TRUE(label.GetTooltipText(gfx::Point(), &tooltip)); 213 EXPECT_TRUE(label.GetTooltipText(gfx::Point(), &tooltip));
214
215 // Expanding the multiline label bounds should eliminate the tooltip. 215 // Expanding the multiline label bounds should eliminate the tooltip.
216 label.SetBounds(0, 0, 1000, 1000); 216 label.SetBounds(0, 0, 1000, 1000);
217 EXPECT_FALSE(label.GetTooltipText(gfx::Point(), &tooltip)); 217 EXPECT_FALSE(label.GetTooltipText(gfx::Point(), &tooltip));
218 218
219 // Verify that setting the tooltip still shows it. 219 // Verify that setting the tooltip still shows it.
220 label.SetTooltipText(tooltip_text); 220 label.SetTooltipText(tooltip_text);
221 EXPECT_TRUE(label.GetTooltipText(gfx::Point(), &tooltip)); 221 EXPECT_TRUE(label.GetTooltipText(gfx::Point(), &tooltip));
222 EXPECT_EQ(tooltip_text, tooltip); 222 EXPECT_EQ(tooltip_text, tooltip);
223 // Clear out the tooltip. 223 // Clear out the tooltip.
224 label.SetTooltipText(base::string16()); 224 label.SetTooltipText(base::string16());
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 350
351 // GetPreferredSize and borders. 351 // GetPreferredSize and borders.
352 label.SetBounds(0, 0, 0, 0); 352 label.SetBounds(0, 0, 0, 0);
353 gfx::Size required_size_with_border = label.GetPreferredSize(); 353 gfx::Size required_size_with_border = label.GetPreferredSize();
354 EXPECT_EQ(required_size_with_border.height(), 354 EXPECT_EQ(required_size_with_border.height(),
355 required_size.height() + border.height()); 355 required_size.height() + border.height());
356 EXPECT_EQ(required_size_with_border.width(), 356 EXPECT_EQ(required_size_with_border.width(),
357 required_size.width() + border.width()); 357 required_size.width() + border.width());
358 } 358 }
359 359
360 TEST_F(LabelTest, DirectionalityFromText) {
361 Label label;
362 label.SetBounds(0, 0, 1000, 1000);
363
364 // Test text starts with RTL character.
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;
381 label.SetFocusable(false);
382
383 label.SetText(ASCIIToUTF16("Here's a string with no returns."));
384 gfx::Size required_size(label.GetPreferredSize());
385 gfx::Size extra(22, 8);
386 label.SetBounds(0, 0, required_size.width() + extra.width(),
387 required_size.height() + extra.height());
388
389 // Do some basic verifications for all three alignments.
390 // Centered text.
391 const Label::DrawStringParams* params = label.CalculateDrawStringParams();
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
403 // Left aligned text.
404 label.SetHorizontalAlignment(gfx::ALIGN_LEFT);
405 label.ResetLayoutCache();
406 params = label.CalculateDrawStringParams();
407 EXPECT_EQ(label.text(), params->text);
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
418 // Right aligned text.
419 label.SetHorizontalAlignment(gfx::ALIGN_RIGHT);
420 label.ResetLayoutCache();
421 params = label.CalculateDrawStringParams();
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
433 // Test single line drawing with a border.
434 gfx::Insets border(39, 34, 8, 96);
435 label.SetBorder(Border::CreateEmptyBorder(
436 border.top(), border.left(), border.bottom(), border.right()));
437
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 }
863
864 // Check that labels support GetTooltipHandlerForPoint. 360 // Check that labels support GetTooltipHandlerForPoint.
865 TEST_F(LabelTest, GetTooltipHandlerForPoint) { 361 TEST_F(LabelTest, GetTooltipHandlerForPoint) {
866 // A root view must be defined for this test because the hit-testing 362 // A root view must be defined for this test because the hit-testing
867 // behaviour used by GetTooltipHandlerForPoint() is defined by 363 // behaviour used by GetTooltipHandlerForPoint() is defined by
868 // the ViewTargeter installed on the root view. 364 // the ViewTargeter installed on the root view.
869 Widget widget; 365 Widget widget;
870 Widget::InitParams init_params = 366 Widget::InitParams init_params =
871 CreateParams(Widget::InitParams::TYPE_POPUP); 367 CreateParams(Widget::InitParams::TYPE_POPUP);
872 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 368 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
873 init_params.bounds = gfx::Rect(0, 0, 200, 200); 369 init_params.bounds = gfx::Rect(0, 0, 200, 200);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
913 EXPECT_FALSE(label.GetTooltipHandlerForPoint(gfx::Point(-1, 20))); 409 EXPECT_FALSE(label.GetTooltipHandlerForPoint(gfx::Point(-1, 20)));
914 label.SetHandlesTooltips(true); 410 label.SetHandlesTooltips(true);
915 411
916 // GetTooltipHandlerForPoint works should work in child bounds. 412 // GetTooltipHandlerForPoint works should work in child bounds.
917 label.SetBounds(2, 2, 10, 10); 413 label.SetBounds(2, 2, 10, 10);
918 EXPECT_EQ(&label, label.GetTooltipHandlerForPoint(gfx::Point(1, 5))); 414 EXPECT_EQ(&label, label.GetTooltipHandlerForPoint(gfx::Point(1, 5)));
919 EXPECT_FALSE(label.GetTooltipHandlerForPoint(gfx::Point(3, 11))); 415 EXPECT_FALSE(label.GetTooltipHandlerForPoint(gfx::Point(3, 11)));
920 } 416 }
921 417
922 } // namespace views 418 } // namespace views
OLDNEW
« ui/views/controls/label.cc ('K') | « ui/views/controls/label.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698