| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/views/controls/label.h" | 5 #include "ui/views/controls/label.h" |
| 6 | 6 |
| 7 #include "base/i18n/rtl.h" | 7 #include "base/i18n/rtl.h" |
| 8 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" |
| 9 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
| 10 #include "ui/accessibility/ax_view_state.h" | 10 #include "ui/accessibility/ax_view_state.h" |
| 11 #include "ui/base/l10n/l10n_util.h" | 11 #include "ui/base/l10n/l10n_util.h" |
| 12 #include "ui/gfx/canvas.h" | 12 #include "ui/gfx/canvas.h" |
| 13 #include "ui/views/border.h" | 13 #include "ui/views/border.h" |
| 14 | 14 |
| 15 using base::ASCIIToUTF16; | 15 using base::ASCIIToUTF16; |
| 16 | 16 |
| 17 namespace views { | 17 namespace views { |
| 18 | 18 |
| 19 // All text sizing measurements (width and height) should be greater than this. | 19 // All text sizing measurements (width and height) should be greater than this. |
| 20 const int kMinTextDimension = 4; | 20 const int kMinTextDimension = 4; |
| 21 | 21 |
| 22 // A test utility function to set the application default text direction. |
| 23 void SetRTL(bool rtl) { |
| 24 // Override the current locale/direction. |
| 25 base::i18n::SetICUDefaultLocale(rtl ? "he" : "en"); |
| 26 EXPECT_EQ(rtl, base::i18n::IsRTL()); |
| 27 } |
| 28 |
| 22 TEST(LabelTest, FontPropertySymbol) { | 29 TEST(LabelTest, FontPropertySymbol) { |
| 23 Label label; | 30 Label label; |
| 24 std::string font_name("symbol"); | 31 std::string font_name("symbol"); |
| 25 gfx::Font font(font_name, 26); | 32 gfx::Font font(font_name, 26); |
| 26 label.SetFontList(gfx::FontList(font)); | 33 label.SetFontList(gfx::FontList(font)); |
| 27 gfx::Font font_used = label.font_list().GetPrimaryFont(); | 34 gfx::Font font_used = label.font_list().GetPrimaryFont(); |
| 28 EXPECT_EQ(font_name, font_used.GetFontName()); | 35 EXPECT_EQ(font_name, font_used.GetFontName()); |
| 29 EXPECT_EQ(26, font_used.GetFontSize()); | 36 EXPECT_EQ(26, font_used.GetFontSize()); |
| 30 } | 37 } |
| 31 | 38 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 48 | 55 |
| 49 TEST(LabelTest, ColorProperty) { | 56 TEST(LabelTest, ColorProperty) { |
| 50 Label label; | 57 Label label; |
| 51 SkColor color = SkColorSetARGB(20, 40, 10, 5); | 58 SkColor color = SkColorSetARGB(20, 40, 10, 5); |
| 52 label.SetAutoColorReadabilityEnabled(false); | 59 label.SetAutoColorReadabilityEnabled(false); |
| 53 label.SetEnabledColor(color); | 60 label.SetEnabledColor(color); |
| 54 EXPECT_EQ(color, label.enabled_color()); | 61 EXPECT_EQ(color, label.enabled_color()); |
| 55 } | 62 } |
| 56 | 63 |
| 57 TEST(LabelTest, AlignmentProperty) { | 64 TEST(LabelTest, AlignmentProperty) { |
| 65 const bool was_rtl = base::i18n::IsRTL(); |
| 66 |
| 58 Label label; | 67 Label label; |
| 59 bool reverse_alignment = base::i18n::IsRTL(); | 68 for (size_t i = 0; i < 2; ++i) { |
| 69 // Toggle the application default text direction (to try each direction). |
| 70 SetRTL(!base::i18n::IsRTL()); |
| 71 bool reverse_alignment = base::i18n::IsRTL(); |
| 60 | 72 |
| 61 label.SetHorizontalAlignment(gfx::ALIGN_RIGHT); | 73 // The alignment should be flipped in RTL UI. |
| 62 EXPECT_EQ(reverse_alignment ? gfx::ALIGN_LEFT : gfx::ALIGN_RIGHT, | 74 label.SetHorizontalAlignment(gfx::ALIGN_RIGHT); |
| 63 label.horizontal_alignment()); | 75 EXPECT_EQ(reverse_alignment ? gfx::ALIGN_LEFT : gfx::ALIGN_RIGHT, |
| 64 label.SetHorizontalAlignment(gfx::ALIGN_LEFT); | 76 label.GetHorizontalAlignment()); |
| 65 EXPECT_EQ(reverse_alignment ? gfx::ALIGN_RIGHT : gfx::ALIGN_LEFT, | 77 label.SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| 66 label.horizontal_alignment()); | 78 EXPECT_EQ(reverse_alignment ? gfx::ALIGN_RIGHT : gfx::ALIGN_LEFT, |
| 67 label.SetHorizontalAlignment(gfx::ALIGN_CENTER); | 79 label.GetHorizontalAlignment()); |
| 68 EXPECT_EQ(gfx::ALIGN_CENTER, label.horizontal_alignment()); | 80 label.SetHorizontalAlignment(gfx::ALIGN_CENTER); |
| 81 EXPECT_EQ(gfx::ALIGN_CENTER, label.GetHorizontalAlignment()); |
| 69 | 82 |
| 70 // The label's alignment should not be flipped if the directionality mode is | 83 for (size_t j = 0; j < 2; ++j) { |
| 71 // AUTO_DETECT_DIRECTIONALITY. | 84 label.SetHorizontalAlignment(gfx::ALIGN_TO_HEAD); |
| 72 label.set_directionality_mode(Label::AUTO_DETECT_DIRECTIONALITY); | 85 const bool rtl = j == 0; |
| 73 label.SetHorizontalAlignment(gfx::ALIGN_RIGHT); | 86 label.SetText(rtl ? base::WideToUTF16(L"\x5d0") : ASCIIToUTF16("A")); |
| 74 EXPECT_EQ(gfx::ALIGN_RIGHT, label.horizontal_alignment()); | 87 EXPECT_EQ(rtl ? gfx::ALIGN_RIGHT : gfx::ALIGN_LEFT, |
| 75 label.SetHorizontalAlignment(gfx::ALIGN_LEFT); | 88 label.GetHorizontalAlignment()); |
| 76 EXPECT_EQ(gfx::ALIGN_LEFT, label.horizontal_alignment()); | 89 } |
| 77 label.SetHorizontalAlignment(gfx::ALIGN_CENTER); | 90 } |
| 78 EXPECT_EQ(gfx::ALIGN_CENTER, label.horizontal_alignment()); | 91 |
| 92 EXPECT_EQ(was_rtl, base::i18n::IsRTL()); |
| 79 } | 93 } |
| 80 | 94 |
| 81 TEST(LabelTest, DirectionalityModeProperty) { | 95 TEST(LabelTest, DirectionalityModeProperty) { |
| 82 Label label; | 96 Label label; |
| 83 EXPECT_EQ(Label::USE_UI_DIRECTIONALITY, label.directionality_mode()); | 97 EXPECT_EQ(gfx::DIRECTIONALITY_FROM_UI, label.directionality_mode()); |
| 84 | 98 |
| 85 label.set_directionality_mode(Label::AUTO_DETECT_DIRECTIONALITY); | 99 label.set_directionality_mode(gfx::DIRECTIONALITY_FROM_TEXT); |
| 86 EXPECT_EQ(Label::AUTO_DETECT_DIRECTIONALITY, label.directionality_mode()); | 100 EXPECT_EQ(gfx::DIRECTIONALITY_FROM_TEXT, label.directionality_mode()); |
| 87 | 101 |
| 88 label.set_directionality_mode(Label::USE_UI_DIRECTIONALITY); | 102 label.set_directionality_mode(gfx::DIRECTIONALITY_FROM_UI); |
| 89 EXPECT_EQ(Label::USE_UI_DIRECTIONALITY, label.directionality_mode()); | 103 EXPECT_EQ(gfx::DIRECTIONALITY_FROM_UI, label.directionality_mode()); |
| 90 } | 104 } |
| 91 | 105 |
| 92 TEST(LabelTest, MultiLineProperty) { | 106 TEST(LabelTest, MultiLineProperty) { |
| 93 Label label; | 107 Label label; |
| 94 EXPECT_FALSE(label.is_multi_line()); | 108 EXPECT_FALSE(label.is_multi_line()); |
| 95 label.SetMultiLine(true); | 109 label.SetMultiLine(true); |
| 96 EXPECT_TRUE(label.is_multi_line()); | 110 EXPECT_TRUE(label.is_multi_line()); |
| 97 label.SetMultiLine(false); | 111 label.SetMultiLine(false); |
| 98 EXPECT_FALSE(label.is_multi_line()); | 112 EXPECT_FALSE(label.is_multi_line()); |
| 99 } | 113 } |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 310 | 324 |
| 311 // GetPreferredSize and borders. | 325 // GetPreferredSize and borders. |
| 312 label.SetBounds(0, 0, 0, 0); | 326 label.SetBounds(0, 0, 0, 0); |
| 313 gfx::Size required_size_with_border = label.GetPreferredSize(); | 327 gfx::Size required_size_with_border = label.GetPreferredSize(); |
| 314 EXPECT_EQ(required_size_with_border.height(), | 328 EXPECT_EQ(required_size_with_border.height(), |
| 315 required_size.height() + border.height()); | 329 required_size.height() + border.height()); |
| 316 EXPECT_EQ(required_size_with_border.width(), | 330 EXPECT_EQ(required_size_with_border.width(), |
| 317 required_size.width() + border.width()); | 331 required_size.width() + border.width()); |
| 318 } | 332 } |
| 319 | 333 |
| 320 TEST(LabelTest, AutoDetectDirectionality) { | 334 TEST(LabelTest, DirectionalityFromText) { |
| 321 Label label; | 335 Label label; |
| 322 label.set_directionality_mode(Label::AUTO_DETECT_DIRECTIONALITY); | 336 label.set_directionality_mode(gfx::DIRECTIONALITY_FROM_TEXT); |
| 337 label.SetBounds(0, 0, 1000, 1000); |
| 338 base::string16 paint_text; |
| 339 gfx::Rect text_bounds; |
| 340 int flags = -1; |
| 323 | 341 |
| 324 // Test text starts with RTL character. | 342 // Test text starts with RTL character. |
| 325 label.SetText(base::WideToUTF16(L" \x5d0\x5d1\x5d2 abc")); | 343 label.SetText(base::WideToUTF16(L" \x5d0\x5d1\x5d2 abc")); |
| 326 gfx::Size required_size(label.GetPreferredSize()); | |
| 327 gfx::Size extra(22, 8); | |
| 328 label.SetBounds(0, 0, required_size.width() + extra.width(), | |
| 329 required_size.height() + extra.height()); | |
| 330 | |
| 331 base::string16 paint_text; | |
| 332 gfx::Rect text_bounds; | |
| 333 int flags; | |
| 334 label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags); | 344 label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags); |
| 335 EXPECT_EQ(gfx::Canvas::FORCE_RTL_DIRECTIONALITY, | 345 EXPECT_EQ(gfx::Canvas::FORCE_RTL_DIRECTIONALITY, |
| 336 flags & (gfx::Canvas::FORCE_RTL_DIRECTIONALITY | | 346 flags & (gfx::Canvas::FORCE_RTL_DIRECTIONALITY | |
| 337 gfx::Canvas::FORCE_LTR_DIRECTIONALITY)); | 347 gfx::Canvas::FORCE_LTR_DIRECTIONALITY)); |
| 338 | 348 |
| 339 // Test text starts with LTR character. | 349 // Test text starts with LTR character. |
| 340 label.SetText(base::WideToUTF16(L"ltr \x5d0\x5d1\x5d2 abc")); | 350 label.SetText(base::WideToUTF16(L"ltr \x5d0\x5d1\x5d2 abc")); |
| 341 required_size = label.GetPreferredSize(); | |
| 342 label.SetBounds(0, 0, required_size.width() + extra.width(), | |
| 343 required_size.height() + extra.height()); | |
| 344 | |
| 345 label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags); | 351 label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags); |
| 346 EXPECT_EQ(gfx::Canvas::FORCE_LTR_DIRECTIONALITY, | 352 EXPECT_EQ(gfx::Canvas::FORCE_LTR_DIRECTIONALITY, |
| 347 flags & (gfx::Canvas::FORCE_RTL_DIRECTIONALITY | | 353 flags & (gfx::Canvas::FORCE_RTL_DIRECTIONALITY | |
| 348 gfx::Canvas::FORCE_LTR_DIRECTIONALITY)); | 354 gfx::Canvas::FORCE_LTR_DIRECTIONALITY)); |
| 349 } | 355 } |
| 350 | 356 |
| 351 TEST(LabelTest, DrawSingleLineString) { | 357 TEST(LabelTest, DrawSingleLineString) { |
| 352 Label label; | 358 Label label; |
| 353 label.SetFocusable(false); | 359 label.SetFocusable(false); |
| 354 | 360 // Force a directionality to simplify alignment value testing. |
| 355 // Turn off mirroring so that we don't need to figure out if | 361 label.set_directionality_mode(gfx::DIRECTIONALITY_FORCE_LTR); |
| 356 // align right really means align left. | |
| 357 label.set_directionality_mode(Label::AUTO_DETECT_DIRECTIONALITY); | |
| 358 | 362 |
| 359 label.SetText(ASCIIToUTF16("Here's a string with no returns.")); | 363 label.SetText(ASCIIToUTF16("Here's a string with no returns.")); |
| 360 gfx::Size required_size(label.GetPreferredSize()); | 364 gfx::Size required_size(label.GetPreferredSize()); |
| 361 gfx::Size extra(22, 8); | 365 gfx::Size extra(22, 8); |
| 362 label.SetBounds(0, 0, required_size.width() + extra.width(), | 366 label.SetBounds(0, 0, required_size.width() + extra.width(), |
| 363 required_size.height() + extra.height()); | 367 required_size.height() + extra.height()); |
| 364 | 368 |
| 365 // Do some basic verifications for all three alignments. | 369 // Do some basic verifications for all three alignments. |
| 366 base::string16 paint_text; | 370 base::string16 paint_text; |
| 367 gfx::Rect text_bounds; | 371 gfx::Rect text_bounds; |
| 368 int flags; | 372 int flags = -1; |
| 369 | 373 |
| 370 // Centered text. | 374 // Centered text. |
| 371 label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags); | 375 label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags); |
| 372 EXPECT_EQ(label.text(), paint_text); | 376 EXPECT_EQ(label.text(), paint_text); |
| 373 // The text should be centered horizontally and vertically. | 377 // The text should be centered horizontally and vertically. |
| 374 EXPECT_EQ(extra.width() / 2, text_bounds.x()); | 378 EXPECT_EQ(extra.width() / 2, text_bounds.x()); |
| 375 EXPECT_EQ(extra.height() / 2 , text_bounds.y()); | 379 EXPECT_EQ(extra.height() / 2 , text_bounds.y()); |
| 376 EXPECT_EQ(required_size.width(), text_bounds.width()); | 380 EXPECT_EQ(required_size.width(), text_bounds.width()); |
| 377 EXPECT_EQ(required_size.height(), text_bounds.height()); | 381 EXPECT_EQ(required_size.height(), text_bounds.height()); |
| 378 EXPECT_EQ(gfx::Canvas::TEXT_ALIGN_CENTER, | 382 EXPECT_EQ(gfx::Canvas::TEXT_ALIGN_CENTER, |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 467 EXPECT_EQ(border.left() + extra.width(), text_bounds.x()); | 471 EXPECT_EQ(border.left() + extra.width(), text_bounds.x()); |
| 468 EXPECT_EQ(border.top() + extra.height() / 2 , text_bounds.y()); | 472 EXPECT_EQ(border.top() + extra.height() / 2 , text_bounds.y()); |
| 469 EXPECT_EQ(required_size.width(), text_bounds.width()); | 473 EXPECT_EQ(required_size.width(), text_bounds.width()); |
| 470 EXPECT_EQ(required_size.height(), text_bounds.height()); | 474 EXPECT_EQ(required_size.height(), text_bounds.height()); |
| 471 EXPECT_EQ(gfx::Canvas::TEXT_ALIGN_RIGHT, | 475 EXPECT_EQ(gfx::Canvas::TEXT_ALIGN_RIGHT, |
| 472 flags & (gfx::Canvas::TEXT_ALIGN_LEFT | | 476 flags & (gfx::Canvas::TEXT_ALIGN_LEFT | |
| 473 gfx::Canvas::TEXT_ALIGN_CENTER | | 477 gfx::Canvas::TEXT_ALIGN_CENTER | |
| 474 gfx::Canvas::TEXT_ALIGN_RIGHT)); | 478 gfx::Canvas::TEXT_ALIGN_RIGHT)); |
| 475 } | 479 } |
| 476 | 480 |
| 477 // On Linux the underlying pango routines require a max height in order to | 481 // Pango needs a max height to elide multiline text; that is not supported here. |
| 478 // ellide multiline text. So until that can be resolved, we set all | |
| 479 // multiline lables to not ellide in Linux only. | |
| 480 TEST(LabelTest, DrawMultiLineString) { | 482 TEST(LabelTest, DrawMultiLineString) { |
| 481 Label label; | 483 Label label; |
| 482 label.SetFocusable(false); | 484 label.SetFocusable(false); |
| 483 | 485 // Force a directionality to simplify alignment value testing. |
| 484 // Turn off mirroring so that we don't need to figure out if | 486 label.set_directionality_mode(gfx::DIRECTIONALITY_FORCE_LTR); |
| 485 // align right really means align left. | 487 // Set a background color to prevent gfx::Canvas::NO_SUBPIXEL_RENDERING flags. |
| 486 label.set_directionality_mode(Label::AUTO_DETECT_DIRECTIONALITY); | 488 label.SetBackgroundColor(SK_ColorWHITE); |
| 487 | 489 |
| 488 label.SetText(ASCIIToUTF16("Another string\nwith returns\n\n!")); | 490 label.SetText(ASCIIToUTF16("Another string\nwith returns\n\n!")); |
| 489 label.SetMultiLine(true); | 491 label.SetMultiLine(true); |
| 490 label.SizeToFit(0); | 492 label.SizeToFit(0); |
| 491 gfx::Size extra(50, 10); | 493 gfx::Size extra(50, 10); |
| 492 label.SetBounds(label.x(), label.y(), | 494 label.SetBounds(label.x(), label.y(), |
| 493 label.width() + extra.width(), | 495 label.width() + extra.width(), |
| 494 label.height() + extra.height()); | 496 label.height() + extra.height()); |
| 495 | 497 |
| 496 // Do some basic verifications for all three alignments. | 498 // Do some basic verifications for all three alignments. |
| 497 base::string16 paint_text; | 499 base::string16 paint_text; |
| 498 gfx::Rect text_bounds; | 500 gfx::Rect text_bounds; |
| 499 int flags; | 501 int flags = -1; |
| 500 label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags); | 502 label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags); |
| 501 EXPECT_EQ(label.text(), paint_text); | 503 EXPECT_EQ(label.text(), paint_text); |
| 502 EXPECT_EQ(extra.width() / 2, text_bounds.x()); | 504 EXPECT_EQ(extra.width() / 2, text_bounds.x()); |
| 503 EXPECT_EQ(extra.height() / 2, text_bounds.y()); | 505 EXPECT_EQ(extra.height() / 2, text_bounds.y()); |
| 504 EXPECT_GT(text_bounds.width(), kMinTextDimension); | 506 EXPECT_GT(text_bounds.width(), kMinTextDimension); |
| 505 EXPECT_GT(text_bounds.height(), kMinTextDimension); | 507 EXPECT_GT(text_bounds.height(), kMinTextDimension); |
| 506 int expected_flags = gfx::Canvas::MULTI_LINE | | 508 int expected_flags = gfx::Canvas::MULTI_LINE | |
| 507 gfx::Canvas::TEXT_ALIGN_CENTER | | 509 gfx::Canvas::TEXT_ALIGN_CENTER | |
| 508 gfx::Canvas::FORCE_LTR_DIRECTIONALITY; | 510 gfx::Canvas::FORCE_LTR_DIRECTIONALITY; |
| 509 #if !defined(OS_WIN) | 511 #if !defined(OS_WIN) |
| 510 expected_flags |= gfx::Canvas::NO_ELLIPSIS; | 512 expected_flags |= gfx::Canvas::NO_ELLIPSIS; |
| 511 #endif | 513 #endif |
| 512 EXPECT_EQ(expected_flags, expected_flags & flags); | 514 EXPECT_EQ(expected_flags, expected_flags); |
| 513 gfx::Rect center_bounds(text_bounds); | 515 gfx::Rect center_bounds(text_bounds); |
| 514 | 516 |
| 515 label.SetHorizontalAlignment(gfx::ALIGN_LEFT); | 517 label.SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| 516 paint_text.clear(); | 518 paint_text.clear(); |
| 517 text_bounds.SetRect(0, 0, 0, 0); | 519 text_bounds.SetRect(0, 0, 0, 0); |
| 518 label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags); | 520 label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags); |
| 519 EXPECT_EQ(label.text(), paint_text); | 521 EXPECT_EQ(label.text(), paint_text); |
| 520 EXPECT_EQ(0, text_bounds.x()); | 522 EXPECT_EQ(0, text_bounds.x()); |
| 521 EXPECT_EQ(extra.height() / 2, text_bounds.y()); | 523 EXPECT_EQ(extra.height() / 2, text_bounds.y()); |
| 522 EXPECT_GT(text_bounds.width(), kMinTextDimension); | 524 EXPECT_GT(text_bounds.width(), kMinTextDimension); |
| 523 EXPECT_GT(text_bounds.height(), kMinTextDimension); | 525 EXPECT_GT(text_bounds.height(), kMinTextDimension); |
| 524 expected_flags = gfx::Canvas::MULTI_LINE | | 526 expected_flags = gfx::Canvas::MULTI_LINE | |
| 525 gfx::Canvas::TEXT_ALIGN_LEFT | | 527 gfx::Canvas::TEXT_ALIGN_LEFT | |
| 526 gfx::Canvas::FORCE_LTR_DIRECTIONALITY; | 528 gfx::Canvas::FORCE_LTR_DIRECTIONALITY; |
| 527 #if !defined(OS_WIN) | 529 #if !defined(OS_WIN) |
| 528 expected_flags |= gfx::Canvas::NO_ELLIPSIS; | 530 expected_flags |= gfx::Canvas::NO_ELLIPSIS; |
| 529 #endif | 531 #endif |
| 530 EXPECT_EQ(expected_flags, expected_flags & flags); | 532 EXPECT_EQ(expected_flags, expected_flags); |
| 531 | 533 |
| 532 label.SetHorizontalAlignment(gfx::ALIGN_RIGHT); | 534 label.SetHorizontalAlignment(gfx::ALIGN_RIGHT); |
| 533 paint_text.clear(); | 535 paint_text.clear(); |
| 534 text_bounds.SetRect(0, 0, 0, 0); | 536 text_bounds.SetRect(0, 0, 0, 0); |
| 535 label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags); | 537 label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags); |
| 536 EXPECT_EQ(label.text(), paint_text); | 538 EXPECT_EQ(label.text(), paint_text); |
| 537 EXPECT_EQ(extra.width(), text_bounds.x()); | 539 EXPECT_EQ(extra.width(), text_bounds.x()); |
| 538 EXPECT_EQ(extra.height() / 2, text_bounds.y()); | 540 EXPECT_EQ(extra.height() / 2, text_bounds.y()); |
| 539 EXPECT_GT(text_bounds.width(), kMinTextDimension); | 541 EXPECT_GT(text_bounds.width(), kMinTextDimension); |
| 540 EXPECT_GT(text_bounds.height(), kMinTextDimension); | 542 EXPECT_GT(text_bounds.height(), kMinTextDimension); |
| 541 expected_flags = gfx::Canvas::MULTI_LINE | | 543 expected_flags = gfx::Canvas::MULTI_LINE | |
| 542 gfx::Canvas::TEXT_ALIGN_RIGHT | | 544 gfx::Canvas::TEXT_ALIGN_RIGHT | |
| 543 gfx::Canvas::FORCE_LTR_DIRECTIONALITY; | 545 gfx::Canvas::FORCE_LTR_DIRECTIONALITY; |
| 544 #if !defined(OS_WIN) | 546 #if !defined(OS_WIN) |
| 545 expected_flags |= gfx::Canvas::NO_ELLIPSIS; | 547 expected_flags |= gfx::Canvas::NO_ELLIPSIS; |
| 546 #endif | 548 #endif |
| 547 EXPECT_EQ(expected_flags, expected_flags & flags); | 549 EXPECT_EQ(expected_flags, expected_flags); |
| 548 | 550 |
| 549 // Test multiline drawing with a border. | 551 // Test multiline drawing with a border. |
| 550 gfx::Insets border(19, 92, 23, 2); | 552 gfx::Insets border(19, 92, 23, 2); |
| 551 label.SetBorder(Border::CreateEmptyBorder( | 553 label.SetBorder(Border::CreateEmptyBorder( |
| 552 border.top(), border.left(), border.bottom(), border.right())); | 554 border.top(), border.left(), border.bottom(), border.right())); |
| 553 label.SizeToFit(0); | 555 label.SizeToFit(0); |
| 554 label.SetBounds(label.x(), label.y(), | 556 label.SetBounds(label.x(), label.y(), |
| 555 label.width() + extra.width(), | 557 label.width() + extra.width(), |
| 556 label.height() + extra.height()); | 558 label.height() + extra.height()); |
| 557 | 559 |
| 558 label.SetHorizontalAlignment(gfx::ALIGN_CENTER); | 560 label.SetHorizontalAlignment(gfx::ALIGN_CENTER); |
| 559 paint_text.clear(); | 561 paint_text.clear(); |
| 560 text_bounds.SetRect(0, 0, 0, 0); | 562 text_bounds.SetRect(0, 0, 0, 0); |
| 561 label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags); | 563 label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags); |
| 562 EXPECT_EQ(label.text(), paint_text); | 564 EXPECT_EQ(label.text(), paint_text); |
| 563 EXPECT_EQ(border.left() + extra.width() / 2, text_bounds.x()); | 565 EXPECT_EQ(border.left() + extra.width() / 2, text_bounds.x()); |
| 564 EXPECT_EQ(border.top() + extra.height() / 2, text_bounds.y()); | 566 EXPECT_EQ(border.top() + extra.height() / 2, text_bounds.y()); |
| 565 EXPECT_EQ(center_bounds.width(), text_bounds.width()); | 567 EXPECT_EQ(center_bounds.width(), text_bounds.width()); |
| 566 EXPECT_EQ(center_bounds.height(), text_bounds.height()); | 568 EXPECT_EQ(center_bounds.height(), text_bounds.height()); |
| 567 expected_flags = gfx::Canvas::MULTI_LINE | | 569 expected_flags = gfx::Canvas::MULTI_LINE | |
| 568 gfx::Canvas::TEXT_ALIGN_CENTER | | 570 gfx::Canvas::TEXT_ALIGN_CENTER | |
| 569 gfx::Canvas::FORCE_LTR_DIRECTIONALITY; | 571 gfx::Canvas::FORCE_LTR_DIRECTIONALITY; |
| 570 #if !defined(OS_WIN) | 572 #if !defined(OS_WIN) |
| 571 expected_flags |= gfx::Canvas::NO_ELLIPSIS; | 573 expected_flags |= gfx::Canvas::NO_ELLIPSIS; |
| 572 #endif | 574 #endif |
| 573 EXPECT_EQ(expected_flags, expected_flags & flags); | 575 EXPECT_EQ(expected_flags, expected_flags); |
| 574 | 576 |
| 575 label.SetHorizontalAlignment(gfx::ALIGN_LEFT); | 577 label.SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| 576 paint_text.clear(); | 578 paint_text.clear(); |
| 577 text_bounds.SetRect(0, 0, 0, 0); | 579 text_bounds.SetRect(0, 0, 0, 0); |
| 578 label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags); | 580 label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags); |
| 579 EXPECT_EQ(label.text(), paint_text); | 581 EXPECT_EQ(label.text(), paint_text); |
| 580 EXPECT_EQ(border.left(), text_bounds.x()); | 582 EXPECT_EQ(border.left(), text_bounds.x()); |
| 581 EXPECT_EQ(border.top() + extra.height() / 2, text_bounds.y()); | 583 EXPECT_EQ(border.top() + extra.height() / 2, text_bounds.y()); |
| 582 EXPECT_EQ(center_bounds.width(), text_bounds.width()); | 584 EXPECT_EQ(center_bounds.width(), text_bounds.width()); |
| 583 EXPECT_EQ(center_bounds.height(), text_bounds.height()); | 585 EXPECT_EQ(center_bounds.height(), text_bounds.height()); |
| 584 expected_flags = gfx::Canvas::MULTI_LINE | | 586 expected_flags = gfx::Canvas::MULTI_LINE | |
| 585 gfx::Canvas::TEXT_ALIGN_LEFT | | 587 gfx::Canvas::TEXT_ALIGN_LEFT | |
| 586 gfx::Canvas::FORCE_LTR_DIRECTIONALITY; | 588 gfx::Canvas::FORCE_LTR_DIRECTIONALITY; |
| 587 #if !defined(OS_WIN) | 589 #if !defined(OS_WIN) |
| 588 expected_flags |= gfx::Canvas::NO_ELLIPSIS; | 590 expected_flags |= gfx::Canvas::NO_ELLIPSIS; |
| 589 #endif | 591 #endif |
| 590 EXPECT_EQ(expected_flags, expected_flags & flags); | 592 EXPECT_EQ(expected_flags, expected_flags); |
| 591 | 593 |
| 592 label.SetHorizontalAlignment(gfx::ALIGN_RIGHT); | 594 label.SetHorizontalAlignment(gfx::ALIGN_RIGHT); |
| 593 paint_text.clear(); | 595 paint_text.clear(); |
| 594 text_bounds.SetRect(0, 0, 0, 0); | 596 text_bounds.SetRect(0, 0, 0, 0); |
| 595 label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags); | 597 label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags); |
| 596 EXPECT_EQ(label.text(), paint_text); | 598 EXPECT_EQ(label.text(), paint_text); |
| 597 EXPECT_EQ(extra.width() + border.left(), text_bounds.x()); | 599 EXPECT_EQ(extra.width() + border.left(), text_bounds.x()); |
| 598 EXPECT_EQ(border.top() + extra.height() / 2, text_bounds.y()); | 600 EXPECT_EQ(border.top() + extra.height() / 2, text_bounds.y()); |
| 599 EXPECT_EQ(center_bounds.width(), text_bounds.width()); | 601 EXPECT_EQ(center_bounds.width(), text_bounds.width()); |
| 600 EXPECT_EQ(center_bounds.height(), text_bounds.height()); | 602 EXPECT_EQ(center_bounds.height(), text_bounds.height()); |
| 601 expected_flags = gfx::Canvas::MULTI_LINE | | 603 expected_flags = gfx::Canvas::MULTI_LINE | |
| 602 gfx::Canvas::TEXT_ALIGN_RIGHT | | 604 gfx::Canvas::TEXT_ALIGN_RIGHT | |
| 603 gfx::Canvas::FORCE_LTR_DIRECTIONALITY; | 605 gfx::Canvas::FORCE_LTR_DIRECTIONALITY; |
| 604 #if !defined(OS_WIN) | 606 #if !defined(OS_WIN) |
| 605 expected_flags |= gfx::Canvas::NO_ELLIPSIS; | 607 expected_flags |= gfx::Canvas::NO_ELLIPSIS; |
| 606 #endif | 608 #endif |
| 607 EXPECT_EQ(expected_flags, expected_flags & flags); | 609 EXPECT_EQ(expected_flags, expected_flags); |
| 608 } | 610 } |
| 609 | 611 |
| 610 TEST(LabelTest, DrawSingleLineStringInRTL) { | 612 TEST(LabelTest, DrawSingleLineStringInRTL) { |
| 611 Label label; | 613 Label label; |
| 612 label.SetFocusable(false); | 614 label.SetFocusable(false); |
| 613 | 615 |
| 614 std::string locale = l10n_util::GetApplicationLocale(""); | 616 std::string locale = l10n_util::GetApplicationLocale(""); |
| 615 base::i18n::SetICUDefaultLocale("he"); | 617 base::i18n::SetICUDefaultLocale("he"); |
| 616 | 618 |
| 617 label.SetText(ASCIIToUTF16("Here's a string with no returns.")); | 619 label.SetText(ASCIIToUTF16("Here's a string with no returns.")); |
| 618 gfx::Size required_size(label.GetPreferredSize()); | 620 gfx::Size required_size(label.GetPreferredSize()); |
| 619 gfx::Size extra(22, 8); | 621 gfx::Size extra(22, 8); |
| 620 label.SetBounds(0, 0, required_size.width() + extra.width(), | 622 label.SetBounds(0, 0, required_size.width() + extra.width(), |
| 621 required_size.height() + extra.height()); | 623 required_size.height() + extra.height()); |
| 622 | 624 |
| 623 // Do some basic verifications for all three alignments. | 625 // Do some basic verifications for all three alignments. |
| 624 base::string16 paint_text; | 626 base::string16 paint_text; |
| 625 gfx::Rect text_bounds; | 627 gfx::Rect text_bounds; |
| 626 int flags; | 628 int flags = -1; |
| 627 | 629 |
| 628 // Centered text. | 630 // Centered text. |
| 629 label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags); | 631 label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags); |
| 630 EXPECT_EQ(label.text(), paint_text); | 632 EXPECT_EQ(label.text(), paint_text); |
| 631 // The text should be centered horizontally and vertically. | 633 // The text should be centered horizontally and vertically. |
| 632 EXPECT_EQ(extra.width() / 2, text_bounds.x()); | 634 EXPECT_EQ(extra.width() / 2, text_bounds.x()); |
| 633 EXPECT_EQ(extra.height() / 2 , text_bounds.y()); | 635 EXPECT_EQ(extra.height() / 2 , text_bounds.y()); |
| 634 EXPECT_EQ(required_size.width(), text_bounds.width()); | 636 EXPECT_EQ(required_size.width(), text_bounds.width()); |
| 635 EXPECT_EQ(required_size.height(), text_bounds.height()); | 637 EXPECT_EQ(required_size.height(), text_bounds.height()); |
| 636 EXPECT_EQ(gfx::Canvas::TEXT_ALIGN_CENTER, | 638 EXPECT_EQ(gfx::Canvas::TEXT_ALIGN_CENTER, |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 751 label.SetMultiLine(true); | 753 label.SetMultiLine(true); |
| 752 label.SizeToFit(0); | 754 label.SizeToFit(0); |
| 753 gfx::Size extra(50, 10); | 755 gfx::Size extra(50, 10); |
| 754 label.SetBounds(label.x(), label.y(), | 756 label.SetBounds(label.x(), label.y(), |
| 755 label.width() + extra.width(), | 757 label.width() + extra.width(), |
| 756 label.height() + extra.height()); | 758 label.height() + extra.height()); |
| 757 | 759 |
| 758 // Do some basic verifications for all three alignments. | 760 // Do some basic verifications for all three alignments. |
| 759 base::string16 paint_text; | 761 base::string16 paint_text; |
| 760 gfx::Rect text_bounds; | 762 gfx::Rect text_bounds; |
| 761 int flags; | 763 int flags = -1; |
| 762 label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags); | 764 label.CalculateDrawStringParams(&paint_text, &text_bounds, &flags); |
| 763 EXPECT_EQ(label.text(), paint_text); | 765 EXPECT_EQ(label.text(), paint_text); |
| 764 EXPECT_EQ(extra.width() / 2, text_bounds.x()); | 766 EXPECT_EQ(extra.width() / 2, text_bounds.x()); |
| 765 EXPECT_EQ(extra.height() / 2, text_bounds.y()); | 767 EXPECT_EQ(extra.height() / 2, text_bounds.y()); |
| 766 EXPECT_GT(text_bounds.width(), kMinTextDimension); | 768 EXPECT_GT(text_bounds.width(), kMinTextDimension); |
| 767 EXPECT_GT(text_bounds.height(), kMinTextDimension); | 769 EXPECT_GT(text_bounds.height(), kMinTextDimension); |
| 768 EXPECT_TRUE(gfx::Canvas::MULTI_LINE & flags); | 770 EXPECT_TRUE(gfx::Canvas::MULTI_LINE & flags); |
| 769 EXPECT_TRUE(gfx::Canvas::TEXT_ALIGN_CENTER & flags); | 771 EXPECT_TRUE(gfx::Canvas::TEXT_ALIGN_CENTER & flags); |
| 770 #if !defined(OS_WIN) | 772 #if !defined(OS_WIN) |
| 771 EXPECT_TRUE(gfx::Canvas::NO_ELLIPSIS & flags); | 773 EXPECT_TRUE(gfx::Canvas::NO_ELLIPSIS & flags); |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 897 EXPECT_FALSE(label.GetTooltipHandlerForPoint(gfx::Point(2, 51))); | 899 EXPECT_FALSE(label.GetTooltipHandlerForPoint(gfx::Point(2, 51))); |
| 898 EXPECT_FALSE(label.GetTooltipHandlerForPoint(gfx::Point(-1, 20))); | 900 EXPECT_FALSE(label.GetTooltipHandlerForPoint(gfx::Point(-1, 20))); |
| 899 | 901 |
| 900 // GetTooltipHandlerForPoint works should work in child bounds. | 902 // GetTooltipHandlerForPoint works should work in child bounds. |
| 901 label.SetBounds(2, 2, 10, 10); | 903 label.SetBounds(2, 2, 10, 10); |
| 902 EXPECT_EQ(&label, label.GetTooltipHandlerForPoint(gfx::Point(1, 5))); | 904 EXPECT_EQ(&label, label.GetTooltipHandlerForPoint(gfx::Point(1, 5))); |
| 903 EXPECT_FALSE(label.GetTooltipHandlerForPoint(gfx::Point(3, 11))); | 905 EXPECT_FALSE(label.GetTooltipHandlerForPoint(gfx::Point(3, 11))); |
| 904 } | 906 } |
| 905 | 907 |
| 906 } // namespace views | 908 } // namespace views |
| OLD | NEW |