| Index: ui/views/controls/styled_label_unittest.cc
 | 
| diff --git a/ui/views/controls/styled_label_unittest.cc b/ui/views/controls/styled_label_unittest.cc
 | 
| index e3462b2fb97434e6b61aa41d76b434f6197f04ca..fa86675f94b198a7af6cde7cc8e41fd0d674de86 100644
 | 
| --- a/ui/views/controls/styled_label_unittest.cc
 | 
| +++ b/ui/views/controls/styled_label_unittest.cc
 | 
| @@ -49,6 +49,51 @@ TEST_F(StyledLabelTest, NoWrapping) {
 | 
|              StyledLabelContentHeightForWidth(label_preferred_size.width() * 2));
 | 
|  }
 | 
|  
 | 
| +TEST_F(StyledLabelTest, TrailingWhitespaceiIgnored) {
 | 
| +  const std::string text("This is a test block of text   ");
 | 
| +  InitStyledLabel(text);
 | 
| +
 | 
| +  styled()->SetBounds(0, 0, 1000, 1000);
 | 
| +  styled()->Layout();
 | 
| +
 | 
| +  ASSERT_EQ(1, styled()->child_count());
 | 
| +  ASSERT_EQ(std::string(Label::kViewClassName),
 | 
| +            styled()->child_at(0)->GetClassName());
 | 
| +  EXPECT_EQ(ASCIIToUTF16("This is a test block of text"),
 | 
| +            static_cast<Label*>(styled()->child_at(0))->text());
 | 
| +}
 | 
| +
 | 
| +TEST_F(StyledLabelTest, RespectLeadingWhitespace) {
 | 
| +  const std::string text("   This is a test block of text");
 | 
| +  InitStyledLabel(text);
 | 
| +
 | 
| +  styled()->SetBounds(0, 0, 1000, 1000);
 | 
| +  styled()->Layout();
 | 
| +
 | 
| +  ASSERT_EQ(1, styled()->child_count());
 | 
| +  ASSERT_EQ(std::string(Label::kViewClassName),
 | 
| +            styled()->child_at(0)->GetClassName());
 | 
| +  EXPECT_EQ(ASCIIToUTF16("   This is a test block of text"),
 | 
| +            static_cast<Label*>(styled()->child_at(0))->text());
 | 
| +}
 | 
| +
 | 
| +TEST_F(StyledLabelTest, FirstLineNotEmptyWhenLeadingWhitespaceTooLong) {
 | 
| +  const std::string text("                                     a");
 | 
| +  InitStyledLabel(text);
 | 
| +
 | 
| +  Label label(ASCIIToUTF16(text));
 | 
| +  gfx::Size label_preferred_size = label.GetPreferredSize();
 | 
| +
 | 
| +  styled()->SetBounds(0, 0, label_preferred_size.width() / 2, 1000);
 | 
| +  styled()->Layout();
 | 
| +
 | 
| +  ASSERT_EQ(1, styled()->child_count());
 | 
| +  ASSERT_EQ(std::string(Label::kViewClassName),
 | 
| +            styled()->child_at(0)->GetClassName());
 | 
| +  EXPECT_EQ(ASCIIToUTF16("a"),
 | 
| +            static_cast<Label*>(styled()->child_at(0))->text());
 | 
| +}
 | 
| +
 | 
|  TEST_F(StyledLabelTest, BasicWrapping) {
 | 
|    const std::string text("This is a test block of text");
 | 
|    InitStyledLabel(text);
 | 
| @@ -75,10 +120,14 @@ TEST_F(StyledLabelTest, BasicWrapping) {
 | 
|  TEST_F(StyledLabelTest, CreateLinks) {
 | 
|    const std::string text("This is a test block of text.");
 | 
|    InitStyledLabel(text);
 | 
| -  styled()->AddLink(ui::Range(0, 1));
 | 
| -  styled()->AddLink(ui::Range(1, 2));
 | 
| -  styled()->AddLink(ui::Range(10, 11));
 | 
| -  styled()->AddLink(ui::Range(12, 13));
 | 
| +  styled()->AddStyleRange(ui::Range(0, 1),
 | 
| +                          StyledLabel::RangeStyleInfo::CreateForLink());
 | 
| +  styled()->AddStyleRange(ui::Range(1, 2),
 | 
| +                          StyledLabel::RangeStyleInfo::CreateForLink());
 | 
| +  styled()->AddStyleRange(ui::Range(10, 11),
 | 
| +                          StyledLabel::RangeStyleInfo::CreateForLink());
 | 
| +  styled()->AddStyleRange(ui::Range(12, 13),
 | 
| +                          StyledLabel::RangeStyleInfo::CreateForLink());
 | 
|  
 | 
|    styled()->SetBounds(0, 0, 1000, 1000);
 | 
|    styled()->Layout();
 | 
| @@ -89,7 +138,9 @@ TEST_F(StyledLabelTest, DontBreakLinks) {
 | 
|    const std::string text("This is a test block of text, ");
 | 
|    const std::string link_text("and this should be a link");
 | 
|    InitStyledLabel(text + link_text);
 | 
| -  styled()->AddLink(ui::Range(text.size(), text.size() + link_text.size()));
 | 
| +  styled()->AddStyleRange(
 | 
| +      ui::Range(text.size(), text.size() + link_text.size()),
 | 
| +      StyledLabel::RangeStyleInfo::CreateForLink());
 | 
|  
 | 
|    Label label(ASCIIToUTF16(text + link_text.substr(0, link_text.size() / 2)));
 | 
|    gfx::Size label_preferred_size = label.GetPreferredSize();
 | 
| @@ -104,6 +155,157 @@ TEST_F(StyledLabelTest, DontBreakLinks) {
 | 
|    EXPECT_EQ(0, styled()->child_at(1)->bounds().x());
 | 
|  }
 | 
|  
 | 
| +TEST_F(StyledLabelTest, StyledRangeWithDisabledLineWrapping) {
 | 
| +  const std::string text("This is a test block of text, ");
 | 
| +  const std::string unbreakable_text("and this should not be breaked");
 | 
| +  InitStyledLabel(text + unbreakable_text);
 | 
| +  StyledLabel::RangeStyleInfo style_info;
 | 
| +  style_info.disable_line_wrapping = true;
 | 
| +  styled()->AddStyleRange(
 | 
| +      ui::Range(text.size(), text.size() + unbreakable_text.size()),
 | 
| +      style_info);
 | 
| +
 | 
| +  Label label(ASCIIToUTF16(
 | 
| +      text + unbreakable_text.substr(0, unbreakable_text.size() / 2)));
 | 
| +  gfx::Size label_preferred_size = label.GetPreferredSize();
 | 
| +  int pref_height = styled()->GetHeightForWidth(label_preferred_size.width());
 | 
| +  EXPECT_EQ(label_preferred_size.height() * 2,
 | 
| +            pref_height - styled()->GetInsets().height());
 | 
| +
 | 
| +  styled()->SetBounds(0, 0, label_preferred_size.width(), pref_height);
 | 
| +  styled()->Layout();
 | 
| +  ASSERT_EQ(2, styled()->child_count());
 | 
| +  EXPECT_EQ(0, styled()->child_at(0)->bounds().x());
 | 
| +  EXPECT_EQ(0, styled()->child_at(1)->bounds().x());
 | 
| +}
 | 
| +
 | 
| +TEST_F(StyledLabelTest, StyledRangeUnderlined) {
 | 
| +  const std::string text("This is a test block of text, ");
 | 
| +  const std::string underlined_text("and this should be undelined");
 | 
| +  InitStyledLabel(text + underlined_text);
 | 
| +  StyledLabel::RangeStyleInfo style_info;
 | 
| +  style_info.font_style = gfx::Font::UNDERLINE;
 | 
| +  styled()->AddStyleRange(
 | 
| +      ui::Range(text.size(), text.size() + underlined_text.size()),
 | 
| +      style_info);
 | 
| +
 | 
| +  styled()->SetBounds(0, 0, 1000, 1000);
 | 
| +  styled()->Layout();
 | 
| +
 | 
| +  ASSERT_EQ(2, styled()->child_count());
 | 
| +  ASSERT_EQ(std::string(Label::kViewClassName),
 | 
| +            styled()->child_at(1)->GetClassName());
 | 
| +  EXPECT_EQ(gfx::Font::UNDERLINE,
 | 
| +            static_cast<Label*>(styled()->child_at(1))->font().GetStyle());
 | 
| +}
 | 
| +
 | 
| +TEST_F(StyledLabelTest, StyledRangeBold) {
 | 
| +  const std::string bold_text(
 | 
| +      "This is a block of text whose style will be set to BOLD in the test");
 | 
| +  const std::string text(" normal text");
 | 
| +  InitStyledLabel(bold_text + text);
 | 
| +
 | 
| +  StyledLabel::RangeStyleInfo style_info;
 | 
| +  style_info.font_style = gfx::Font::BOLD;
 | 
| +  styled()->AddStyleRange(ui::Range(0, bold_text.size()), style_info);
 | 
| +
 | 
| +  // Calculate the bold text width if it were a pure label view, both with bold
 | 
| +  // and normal style.
 | 
| +  Label label(ASCIIToUTF16(bold_text));
 | 
| +  const gfx::Size normal_label_size = label.GetPreferredSize();
 | 
| +  label.SetFont(label.font().DeriveFont(0, gfx::Font::BOLD));
 | 
| +  const gfx::Size bold_label_size = label.GetPreferredSize();
 | 
| +
 | 
| +  ASSERT_GE(bold_label_size.width(), normal_label_size.width());
 | 
| +
 | 
| +  // Set the width so |bold_text| doesn't fit on a single line with bold style,
 | 
| +  // but does with normal font style.
 | 
| +  int styled_width = (normal_label_size.width() + bold_label_size.width()) / 2;
 | 
| +  int pref_height = styled()->GetHeightForWidth(styled_width);
 | 
| +
 | 
| +  // Sanity check that |bold_text| with normal font style would fit on a single
 | 
| +  // line in a styled label with width |styled_width|.
 | 
| +  StyledLabel unstyled(ASCIIToUTF16(bold_text), this);
 | 
| +  unstyled.SetBounds(0, 0, styled_width, pref_height);
 | 
| +  unstyled.Layout();
 | 
| +  ASSERT_EQ(1, unstyled.child_count());
 | 
| +
 | 
| +  styled()->SetBounds(0, 0, styled_width, pref_height);
 | 
| +  styled()->Layout();
 | 
| +
 | 
| +  ASSERT_EQ(3, styled()->child_count());
 | 
| +
 | 
| +  // The bold text should be broken up into two parts.
 | 
| +  ASSERT_EQ(std::string(Label::kViewClassName),
 | 
| +            styled()->child_at(0)->GetClassName());
 | 
| +  EXPECT_EQ(gfx::Font::BOLD,
 | 
| +            static_cast<Label*>(styled()->child_at(0))->font().GetStyle());
 | 
| +  ASSERT_EQ(std::string(Label::kViewClassName),
 | 
| +            styled()->child_at(1)->GetClassName());
 | 
| +  EXPECT_EQ(gfx::Font::BOLD,
 | 
| +            static_cast<Label*>(styled()->child_at(1))->font().GetStyle());
 | 
| +  ASSERT_EQ(std::string(Label::kViewClassName),
 | 
| +            styled()->child_at(2)->GetClassName());
 | 
| +  EXPECT_EQ(gfx::Font::NORMAL,
 | 
| +            static_cast<Label*>(styled()->child_at(2))->font().GetStyle());
 | 
| +
 | 
| +  // The second bold part should start on a new line.
 | 
| +  EXPECT_EQ(0, styled()->child_at(0)->bounds().x());
 | 
| +  EXPECT_EQ(0, styled()->child_at(1)->bounds().x());
 | 
| +  EXPECT_EQ(styled()->child_at(1)->bounds().right() - 2,
 | 
| +            styled()->child_at(2)->bounds().x());
 | 
| +}
 | 
| +
 | 
| +TEST_F(StyledLabelTest, StyledRangeWithTooltip) {
 | 
| +  const std::string text("This is a test block of text, ");
 | 
| +  const std::string tooltip_text("this should have a tooltip,");
 | 
| +  const std::string normal_text(" this should not have a tooltip, ");
 | 
| +  const std::string link_text("and this should be a link");
 | 
| +
 | 
| +  const size_t tooltip_start = text.size();
 | 
| +  const size_t link_start =
 | 
| +      text.size() + tooltip_text.size() + normal_text.size();
 | 
| +
 | 
| +  InitStyledLabel(text + tooltip_text + normal_text + link_text);
 | 
| +  StyledLabel::RangeStyleInfo tooltip_style;
 | 
| +  tooltip_style.tooltip = ASCIIToUTF16("tooltip");
 | 
| +  styled()->AddStyleRange(
 | 
| +      ui::Range(tooltip_start, tooltip_start + tooltip_text.size()),
 | 
| +      tooltip_style);
 | 
| +  styled()->AddStyleRange(ui::Range(link_start, link_start + link_text.size()),
 | 
| +                          StyledLabel::RangeStyleInfo::CreateForLink());
 | 
| +
 | 
| +  // Break line inside the range with the tooltip.
 | 
| +  Label label(ASCIIToUTF16(
 | 
| +       text + tooltip_text.substr(0, tooltip_text.size() - 3)));
 | 
| +  gfx::Size label_preferred_size = label.GetPreferredSize();
 | 
| +  int pref_height = styled()->GetHeightForWidth(label_preferred_size.width());
 | 
| +  EXPECT_EQ(label_preferred_size.height() * 3,
 | 
| +            pref_height - styled()->GetInsets().height());
 | 
| +
 | 
| +  styled()->SetBounds(0, 0, label_preferred_size.width(), pref_height);
 | 
| +  styled()->Layout();
 | 
| +
 | 
| +  EXPECT_EQ(label_preferred_size.width(), styled()->width());
 | 
| +
 | 
| +  ASSERT_EQ(5, styled()->child_count());
 | 
| +  EXPECT_EQ(0, styled()->child_at(0)->bounds().x());
 | 
| +  EXPECT_EQ(styled()->child_at(0)->bounds().right() - 2,
 | 
| +            styled()->child_at(1)->bounds().x());
 | 
| +  EXPECT_EQ(0, styled()->child_at(2)->bounds().x());
 | 
| +  EXPECT_EQ(styled()->child_at(2)->bounds().right() - 2,
 | 
| +            styled()->child_at(3)->bounds().x());
 | 
| +  EXPECT_EQ(0, styled()->child_at(4)->bounds().x());
 | 
| +
 | 
| +  string16 tooltip;
 | 
| +  EXPECT_TRUE(
 | 
| +      styled()->child_at(1)->GetTooltipText(gfx::Point(1, 1), &tooltip));
 | 
| +  EXPECT_EQ(ASCIIToUTF16("tooltip"), tooltip);
 | 
| +  EXPECT_TRUE(
 | 
| +      styled()->child_at(2)->GetTooltipText(gfx::Point(1, 1), &tooltip));
 | 
| +  EXPECT_EQ(ASCIIToUTF16("tooltip"), tooltip);
 | 
| +}
 | 
| +
 | 
|  TEST_F(StyledLabelTest, HandleEmptyLayout) {
 | 
|    const std::string text("This is a test block of text, ");
 | 
|    InitStyledLabel(text);
 | 
| 
 |