| 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/gfx/render_text.h" | 5 #include "ui/gfx/render_text.h" |
| 6 | 6 |
| 7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "base/utf_string_conversions.h" | 8 #include "base/utf_string_conversions.h" |
| 9 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
| 10 #include "ui/gfx/text_constants.h" | 10 #include "ui/gfx/text_constants.h" |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 // Override the current locale/direction. | 43 // Override the current locale/direction. |
| 44 base::i18n::SetICUDefaultLocale(rtl ? "he" : "en"); | 44 base::i18n::SetICUDefaultLocale(rtl ? "he" : "en"); |
| 45 #if defined(TOOLKIT_GTK) | 45 #if defined(TOOLKIT_GTK) |
| 46 // Do the same for GTK, which does not rely on the ICU default locale. | 46 // Do the same for GTK, which does not rely on the ICU default locale. |
| 47 gtk_widget_set_default_direction(rtl ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR); | 47 gtk_widget_set_default_direction(rtl ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR); |
| 48 #endif | 48 #endif |
| 49 EXPECT_EQ(rtl, base::i18n::IsRTL()); | 49 EXPECT_EQ(rtl, base::i18n::IsRTL()); |
| 50 } | 50 } |
| 51 #endif | 51 #endif |
| 52 | 52 |
| 53 // Return true if there is only one break, and it has the supplied |value|. |
| 54 template<class T> |
| 55 bool BreakEquals(const std::vector<std::pair<size_t, T> >& breaks, T value) { |
| 56 return breaks.size() == 1 && breaks[0] == std::pair<size_t, T>(0, value); |
| 57 } |
| 58 |
| 59 // Return true if |breaks| matches |expected|. |
| 60 template<class T> |
| 61 bool BreaksEqual(const std::vector<std::pair<size_t, T> >& breaks, |
| 62 const std::vector<std::pair<size_t, T> >& expected) { |
| 63 if (breaks.size() != expected.size()) |
| 64 return false; |
| 65 for (size_t i = 0; i < breaks.size(); ++i) |
| 66 if (breaks[i] != expected[i]) |
| 67 return false; |
| 68 return true; |
| 69 } |
| 70 |
| 53 } // namespace | 71 } // namespace |
| 54 | 72 |
| 55 class RenderTextTest : public testing::Test { | 73 class RenderTextTest : public testing::Test { |
| 56 }; | 74 }; |
| 57 | 75 |
| 58 TEST_F(RenderTextTest, DefaultStyle) { | 76 TEST_F(RenderTextTest, DefaultStyle) { |
| 59 // Defaults to empty text with no styles. | 77 // Check the default styles applied to new instances and adjusted text. |
| 60 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); | 78 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); |
| 61 EXPECT_TRUE(render_text->text().empty()); | 79 EXPECT_TRUE(render_text->text().empty()); |
| 62 EXPECT_TRUE(render_text->style_ranges().empty()); | 80 const wchar_t* const cases[] = { kWeak, kLtr, L"Hello", kRtl, L"", L"" }; |
| 63 | 81 for (size_t i = 0; i < arraysize(cases); ++i) { |
| 64 // Test that the built-in default style is applied for new text. | 82 EXPECT_TRUE(BreakEquals(render_text->colors(), SK_ColorBLACK)); |
| 65 render_text->SetText(ASCIIToUTF16("abc")); | 83 for (size_t style = 0; style < NUM_TEXT_STYLES; ++style) { |
| 66 EXPECT_EQ(1U, render_text->style_ranges().size()); | 84 TextStyle value = static_cast<TextStyle>(style); |
| 67 StyleRange style; | 85 EXPECT_TRUE(BreakEquals(render_text->styles(value), false)); |
| 68 EXPECT_EQ(style.foreground, render_text->style_ranges()[0].foreground); | 86 } |
| 69 EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range); | 87 render_text->SetText(WideToUTF16(cases[i])); |
| 70 EXPECT_EQ(style.strike, render_text->style_ranges()[0].strike); | 88 } |
| 71 EXPECT_EQ(style.underline, render_text->style_ranges()[0].underline); | 89 } |
| 72 | 90 |
| 73 // Test that clearing the text also clears the styles. | 91 TEST_F(RenderTextTest, SetColorAndStyle) { |
| 74 render_text->SetText(string16()); | 92 // Ensure custom default styles persist across setting and clearing text. |
| 75 EXPECT_TRUE(render_text->text().empty()); | 93 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); |
| 76 EXPECT_TRUE(render_text->style_ranges().empty()); | 94 const SkColor color = SK_ColorRED; |
| 77 } | 95 render_text->SetColor(color); |
| 78 | 96 render_text->SetStyle(BOLD, true); |
| 79 TEST_F(RenderTextTest, CustomDefaultStyle) { | 97 render_text->SetStyle(UNDERLINE, false); |
| 80 // Test a custom default style. | 98 const wchar_t* const cases[] = { kWeak, kLtr, L"Hello", kRtl, L"", L"" }; |
| 81 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); | 99 for (size_t i = 0; i < arraysize(cases); ++i) { |
| 82 StyleRange color; | 100 EXPECT_TRUE(BreakEquals(render_text->colors(), color)); |
| 83 color.foreground = SK_ColorRED; | 101 EXPECT_TRUE(BreakEquals(render_text->styles(BOLD), true)); |
| 84 render_text->set_default_style(color); | 102 EXPECT_TRUE(BreakEquals(render_text->styles(UNDERLINE), false)); |
| 85 render_text->SetText(ASCIIToUTF16("abc")); | 103 render_text->SetText(WideToUTF16(cases[i])); |
| 86 EXPECT_EQ(1U, render_text->style_ranges().size()); | 104 |
| 87 EXPECT_EQ(color.foreground, render_text->style_ranges()[0].foreground); | 105 // Ensure custom default styles can be applied after text has been set. |
| 88 | 106 if (i == 1) |
| 89 // Test that the custom default style persists across clearing text. | 107 render_text->SetStyle(STRIKE, true); |
| 90 render_text->SetText(string16()); | 108 if (i >= 1) |
| 91 EXPECT_TRUE(render_text->style_ranges().empty()); | 109 EXPECT_TRUE(BreakEquals(render_text->styles(STRIKE), true)); |
| 92 render_text->SetText(ASCIIToUTF16("abc")); | 110 } |
| 93 EXPECT_EQ(1U, render_text->style_ranges().size()); | 111 } |
| 94 EXPECT_EQ(color.foreground, render_text->style_ranges()[0].foreground); | 112 |
| 95 | 113 TEST_F(RenderTextTest, ApplyInvalidOrEmptyRange) { |
| 96 // Test ApplyDefaultStyle after setting a new default. | 114 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); |
| 97 StyleRange strike; | 115 render_text->SetText(ASCIIToUTF16("012345678")); |
| 98 strike.strike = true; | 116 |
| 99 render_text->set_default_style(strike); | 117 // Ensure ApplyStyle and ApplyColor no-op on empty ranges. |
| 100 render_text->ApplyDefaultStyle(); | 118 ui::Range empty_range = ui::Range(1, 1); |
| 101 EXPECT_EQ(1U, render_text->style_ranges().size()); | 119 const SkColor color = SK_ColorBLACK; |
| 102 EXPECT_TRUE(render_text->style_ranges()[0].strike); | 120 render_text->ApplyColor(SK_ColorRED, empty_range); |
| 103 EXPECT_EQ(strike.foreground, render_text->style_ranges()[0].foreground); | 121 EXPECT_TRUE(BreakEquals(render_text->colors(), color)); |
| 104 } | 122 render_text->ApplyStyle(BOLD, true, empty_range); |
| 105 | 123 EXPECT_TRUE(BreakEquals(render_text->styles(BOLD), false)); |
| 106 TEST_F(RenderTextTest, ApplyStyleRange) { | 124 |
| 107 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); | 125 // Ensure ApplyStyle and ApplyColor no-op on invalid ranges. |
| 126 ui::Range invalid_range = ui::Range::InvalidRange(); |
| 127 render_text->ApplyColor(SK_ColorRED, invalid_range); |
| 128 EXPECT_TRUE(BreakEquals(render_text->colors(), color)); |
| 129 render_text->ApplyStyle(BOLD, true, invalid_range); |
| 130 EXPECT_TRUE(BreakEquals(render_text->styles(BOLD), false)); |
| 131 } |
| 132 |
| 133 TEST_F(RenderTextTest, ApplyStyle) { |
| 134 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); |
| 135 render_text->SetText(ASCIIToUTF16("012345678")); |
| 136 |
| 137 // Apply a style to a valid range, check breaks; repeating should be no-op. |
| 138 std::vector<StyleBreak> expected; |
| 139 expected.push_back(StyleBreak(0, false)); |
| 140 expected.push_back(StyleBreak(2, true)); |
| 141 expected.push_back(StyleBreak(3, false)); |
| 142 for (size_t i = 0; i < 2; ++i) { |
| 143 render_text->ApplyStyle(BOLD, true, ui::Range(2, 3)); |
| 144 EXPECT_TRUE(BreaksEqual(render_text->styles(BOLD), expected)); |
| 145 } |
| 146 |
| 147 // Ensure setting a style overrides the ranged style. |
| 148 render_text->SetStyle(BOLD, false); |
| 149 EXPECT_TRUE(BreakEquals(render_text->styles(BOLD), false)); |
| 150 |
| 151 // Ensure applying a style that is already applied has no effect. |
| 152 render_text->ApplyStyle(BOLD, false, ui::Range(0, 2)); |
| 153 render_text->ApplyStyle(BOLD, false, ui::Range(3, 6)); |
| 154 render_text->ApplyStyle(BOLD, false, ui::Range(7, 9)); |
| 155 EXPECT_TRUE(BreakEquals(render_text->styles(BOLD), false)); |
| 156 |
| 157 // Ensure applying an identical neighboring style merges the ranges. |
| 158 render_text->ApplyStyle(BOLD, true, ui::Range(0, 3)); |
| 159 render_text->ApplyStyle(BOLD, true, ui::Range(3, 6)); |
| 160 render_text->ApplyStyle(BOLD, true, ui::Range(6, 9)); |
| 161 EXPECT_TRUE(BreakEquals(render_text->styles(BOLD), true)); |
| 162 |
| 163 // Ensure applying a style with the same range overrides the ranged style. |
| 164 render_text->ApplyStyle(BOLD, false, ui::Range(2, 3)); |
| 165 render_text->ApplyStyle(BOLD, true, ui::Range(2, 3)); |
| 166 EXPECT_TRUE(BreakEquals(render_text->styles(BOLD), true)); |
| 167 |
| 168 // Ensure applying a style with a containing range overrides the ranged style. |
| 169 render_text->ApplyStyle(BOLD, false, ui::Range(0, 1)); |
| 170 render_text->ApplyStyle(BOLD, false, ui::Range(2, 3)); |
| 171 render_text->ApplyStyle(BOLD, true, ui::Range(0, 3)); |
| 172 EXPECT_TRUE(BreakEquals(render_text->styles(BOLD), true)); |
| 173 render_text->ApplyStyle(BOLD, false, ui::Range(4, 5)); |
| 174 render_text->ApplyStyle(BOLD, false, ui::Range(6, 7)); |
| 175 render_text->ApplyStyle(BOLD, false, ui::Range(8, 9)); |
| 176 render_text->ApplyStyle(BOLD, true, ui::Range(4, 9)); |
| 177 EXPECT_TRUE(BreakEquals(render_text->styles(BOLD), true)); |
| 178 |
| 179 // Ensure applying various overlapping styles yields the intended results. |
| 180 render_text->ApplyStyle(BOLD, false, ui::Range(1, 4)); |
| 181 render_text->ApplyStyle(BOLD, false, ui::Range(5, 8)); |
| 182 render_text->ApplyStyle(BOLD, true, ui::Range(0, 2)); |
| 183 render_text->ApplyStyle(BOLD, true, ui::Range(3, 6)); |
| 184 render_text->ApplyStyle(BOLD, true, ui::Range(7, 9)); |
| 185 std::vector<StyleBreak> overlap; |
| 186 overlap.push_back(StyleBreak(0, true)); |
| 187 overlap.push_back(StyleBreak(2, false)); |
| 188 overlap.push_back(StyleBreak(3, true)); |
| 189 overlap.push_back(StyleBreak(6, false)); |
| 190 overlap.push_back(StyleBreak(7, true)); |
| 191 EXPECT_TRUE(BreaksEqual(render_text->styles(BOLD), overlap)); |
| 192 } |
| 193 |
| 194 TEST_F(RenderTextTest, ResizeStyle) { |
| 195 // Ensure styles adjust to accomodate text length changes. |
| 196 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); |
| 197 render_text->SetText(ASCIIToUTF16("012345678")); |
| 198 render_text->ApplyStyle(BOLD, true, ui::Range(0, 2)); |
| 199 render_text->ApplyStyle(BOLD, true, ui::Range(3, 6)); |
| 200 render_text->ApplyStyle(BOLD, true, ui::Range(7, 9)); |
| 201 |
| 202 std::vector<StyleBreak> expected; |
| 203 expected.push_back(StyleBreak(0, true)); |
| 204 expected.push_back(StyleBreak(2, false)); |
| 205 expected.push_back(StyleBreak(3, true)); |
| 206 expected.push_back(StyleBreak(6, false)); |
| 207 expected.push_back(StyleBreak(7, true)); |
| 208 EXPECT_TRUE(BreaksEqual(render_text->styles(BOLD), expected)); |
| 209 |
| 210 // Truncating the text should trim any corresponding breaks. |
| 211 render_text->SetText(ASCIIToUTF16("0123456")); |
| 212 expected.resize(4); |
| 213 EXPECT_TRUE(BreaksEqual(render_text->styles(BOLD), expected)); |
| 108 render_text->SetText(ASCIIToUTF16("01234")); | 214 render_text->SetText(ASCIIToUTF16("01234")); |
| 109 EXPECT_EQ(1U, render_text->style_ranges().size()); | 215 expected.resize(3); |
| 110 | 216 EXPECT_TRUE(BreaksEqual(render_text->styles(BOLD), expected)); |
| 111 // Test ApplyStyleRange (no-op on empty range). | 217 |
| 112 StyleRange empty; | 218 // Appending text should extend the terminal styles without changing breaks. |
| 113 empty.range = ui::Range(1, 1); | 219 render_text->SetText(ASCIIToUTF16("012345678")); |
| 114 render_text->ApplyStyleRange(empty); | 220 EXPECT_TRUE(BreaksEqual(render_text->styles(BOLD), expected)); |
| 115 EXPECT_EQ(1U, render_text->style_ranges().size()); | 221 } |
| 116 | 222 |
| 117 // Test ApplyStyleRange (no-op on invalid range). | 223 TEST_F(RenderTextTest, ApplyColor) { |
| 118 StyleRange invalid; | 224 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); |
| 119 invalid.range = ui::Range::InvalidRange(); | 225 render_text->SetText(ASCIIToUTF16("012345678")); |
| 120 render_text->ApplyStyleRange(invalid); | 226 |
| 121 EXPECT_EQ(1U, render_text->style_ranges().size()); | 227 // Apply a color to a valid range, check breaks; repeating should be no-op. |
| 122 | 228 ui::Range valid_range = ui::Range(2, 3); |
| 123 // Apply a style with a range contained by an existing range. | 229 std::vector<ColorBreak> expected; |
| 124 StyleRange underline; | 230 expected.push_back(ColorBreak(0, SK_ColorBLACK)); |
| 125 underline.underline = true; | 231 expected.push_back(ColorBreak(2, SK_ColorRED)); |
| 126 underline.range = ui::Range(2, 3); | 232 expected.push_back(ColorBreak(3, SK_ColorBLACK)); |
| 127 render_text->ApplyStyleRange(underline); | 233 for (size_t i = 0; i < 2; ++i) { |
| 128 EXPECT_EQ(3U, render_text->style_ranges().size()); | 234 render_text->ApplyColor(SK_ColorRED, valid_range); |
| 129 EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range); | 235 EXPECT_TRUE(BreaksEqual(render_text->colors(), expected)); |
| 130 EXPECT_FALSE(render_text->style_ranges()[0].underline); | 236 } |
| 131 EXPECT_EQ(ui::Range(2, 3), render_text->style_ranges()[1].range); | 237 |
| 132 EXPECT_TRUE(render_text->style_ranges()[1].underline); | 238 // Ensure setting a color overrides the ranged color. |
| 133 EXPECT_EQ(ui::Range(3, 5), render_text->style_ranges()[2].range); | 239 render_text->SetColor(SK_ColorBLUE); |
| 134 EXPECT_FALSE(render_text->style_ranges()[2].underline); | 240 EXPECT_TRUE(BreakEquals(render_text->colors(), SK_ColorBLUE)); |
| 135 | 241 |
| 136 // Apply a style with a range equal to another range. | 242 // Ensure applying a color that is already applied has no effect. |
| 137 StyleRange color; | 243 render_text->ApplyColor(SK_ColorBLUE, ui::Range(0, 2)); |
| 138 color.foreground = SK_ColorWHITE; | 244 render_text->ApplyColor(SK_ColorBLUE, ui::Range(3, 6)); |
| 139 color.range = ui::Range(2, 3); | 245 render_text->ApplyColor( SK_ColorBLUE, ui::Range(7, 9)); |
| 140 render_text->ApplyStyleRange(color); | 246 EXPECT_TRUE(BreakEquals(render_text->colors(), SK_ColorBLUE)); |
| 141 EXPECT_EQ(3U, render_text->style_ranges().size()); | 247 |
| 142 EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range); | 248 // Ensure applying an identical neighboring color merges the ranges. |
| 143 EXPECT_NE(SK_ColorWHITE, render_text->style_ranges()[0].foreground); | 249 render_text->ApplyColor(SK_ColorRED, ui::Range(0, 3)); |
| 144 EXPECT_FALSE(render_text->style_ranges()[0].underline); | 250 render_text->ApplyColor(SK_ColorRED, ui::Range(3, 6)); |
| 145 EXPECT_EQ(ui::Range(2, 3), render_text->style_ranges()[1].range); | 251 render_text->ApplyColor(SK_ColorRED, ui::Range(6, 9)); |
| 146 EXPECT_EQ(SK_ColorWHITE, render_text->style_ranges()[1].foreground); | 252 EXPECT_TRUE(BreakEquals(render_text->colors(), SK_ColorRED)); |
| 147 EXPECT_FALSE(render_text->style_ranges()[1].underline); | 253 |
| 148 EXPECT_EQ(ui::Range(3, 5), render_text->style_ranges()[2].range); | 254 // Ensure applying a color with the same range overrides the ranged color. |
| 149 EXPECT_NE(SK_ColorWHITE, render_text->style_ranges()[2].foreground); | 255 render_text->ApplyColor(SK_ColorGREEN, ui::Range(2, 3)); |
| 150 EXPECT_FALSE(render_text->style_ranges()[2].underline); | 256 render_text->ApplyColor(SK_ColorRED, ui::Range(2, 3)); |
| 151 | 257 EXPECT_TRUE(BreakEquals(render_text->colors(), SK_ColorRED)); |
| 152 // Apply a style with a range containing an existing range. | 258 |
| 153 // This new style also overlaps portions of neighboring ranges. | 259 // Ensure applying a color with a containing range overrides the ranged color. |
| 154 StyleRange strike; | 260 render_text->ApplyColor(SK_ColorGREEN, ui::Range(0, 1)); |
| 155 strike.strike = true; | 261 render_text->ApplyColor(SK_ColorGREEN, ui::Range(2, 3)); |
| 156 strike.range = ui::Range(1, 4); | 262 render_text->ApplyColor(SK_ColorRED, ui::Range(0, 3)); |
| 157 render_text->ApplyStyleRange(strike); | 263 EXPECT_TRUE(BreakEquals(render_text->colors(), SK_ColorRED)); |
| 158 EXPECT_EQ(3U, render_text->style_ranges().size()); | 264 render_text->ApplyColor(SK_ColorGREEN, ui::Range(4, 5)); |
| 159 EXPECT_EQ(ui::Range(0, 1), render_text->style_ranges()[0].range); | 265 render_text->ApplyColor(SK_ColorGREEN, ui::Range(6, 7)); |
| 160 EXPECT_FALSE(render_text->style_ranges()[0].strike); | 266 render_text->ApplyColor(SK_ColorGREEN, ui::Range(8, 9)); |
| 161 EXPECT_EQ(ui::Range(1, 4), render_text->style_ranges()[1].range); | 267 render_text->ApplyColor(SK_ColorRED, ui::Range(4, 9)); |
| 162 EXPECT_TRUE(render_text->style_ranges()[1].strike); | 268 EXPECT_TRUE(BreakEquals(render_text->colors(), SK_ColorRED)); |
| 163 EXPECT_EQ(ui::Range(4, 5), render_text->style_ranges()[2].range); | 269 |
| 164 EXPECT_FALSE(render_text->style_ranges()[2].strike); | 270 // Ensure applying various overlapping colors yields the intended results. |
| 165 | 271 render_text->ApplyColor(SK_ColorGREEN, ui::Range(1, 4)); |
| 166 // Apply a style overlapping all ranges. | 272 render_text->ApplyColor(SK_ColorGREEN, ui::Range(5, 8)); |
| 167 StyleRange strike_underline; | 273 render_text->ApplyColor(SK_ColorBLUE, ui::Range(0, 2)); |
| 168 strike_underline.strike = true; | 274 render_text->ApplyColor(SK_ColorBLUE, ui::Range(3, 6)); |
| 169 strike_underline.underline = true; | 275 render_text->ApplyColor(SK_ColorBLUE, ui::Range(7, 9)); |
| 170 strike_underline.range = ui::Range(0, render_text->text().length()); | 276 std::vector<ColorBreak> overlap; |
| 171 render_text->ApplyStyleRange(strike_underline); | 277 overlap.push_back(ColorBreak(0, SK_ColorBLUE)); |
| 172 EXPECT_EQ(1U, render_text->style_ranges().size()); | 278 overlap.push_back(ColorBreak(2, SK_ColorGREEN)); |
| 173 EXPECT_EQ(ui::Range(0, 5), render_text->style_ranges()[0].range); | 279 overlap.push_back(ColorBreak(3, SK_ColorBLUE)); |
| 174 EXPECT_TRUE(render_text->style_ranges()[0].underline); | 280 overlap.push_back(ColorBreak(6, SK_ColorGREEN)); |
| 175 EXPECT_TRUE(render_text->style_ranges()[0].strike); | 281 overlap.push_back(ColorBreak(7, SK_ColorBLUE)); |
| 176 | 282 EXPECT_TRUE(BreaksEqual(render_text->colors(), overlap)); |
| 177 // Apply the default style. | |
| 178 render_text->ApplyDefaultStyle(); | |
| 179 EXPECT_EQ(1U, render_text->style_ranges().size()); | |
| 180 EXPECT_EQ(ui::Range(0, 5), render_text->style_ranges()[0].range); | |
| 181 EXPECT_FALSE(render_text->style_ranges()[0].underline); | |
| 182 EXPECT_FALSE(render_text->style_ranges()[0].strike); | |
| 183 | |
| 184 // Apply new style range that contains the 2nd last old style range. | |
| 185 render_text->SetText(ASCIIToUTF16("abcdefghi")); | |
| 186 underline.range = ui::Range(0, 3); | |
| 187 render_text->ApplyStyleRange(underline); | |
| 188 color.range = ui::Range(3, 6); | |
| 189 render_text->ApplyStyleRange(color); | |
| 190 strike.range = ui::Range(6, 9); | |
| 191 render_text->ApplyStyleRange(strike); | |
| 192 EXPECT_EQ(3U, render_text->style_ranges().size()); | |
| 193 | |
| 194 color.foreground = SK_ColorRED; | |
| 195 color.range = ui::Range(2, 8); | |
| 196 render_text->ApplyStyleRange(color); | |
| 197 EXPECT_EQ(3U, render_text->style_ranges().size()); | |
| 198 EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range); | |
| 199 EXPECT_TRUE(render_text->style_ranges()[0].underline); | |
| 200 EXPECT_EQ(ui::Range(2, 8), render_text->style_ranges()[1].range); | |
| 201 EXPECT_EQ(SK_ColorRED, render_text->style_ranges()[1].foreground); | |
| 202 EXPECT_EQ(ui::Range(8, 9), render_text->style_ranges()[2].range); | |
| 203 EXPECT_TRUE(render_text->style_ranges()[2].strike); | |
| 204 | |
| 205 // Apply new style range that contains multiple old style ranges. | |
| 206 render_text->SetText(ASCIIToUTF16("abcdefghiopq")); | |
| 207 underline.range = ui::Range(0, 3); | |
| 208 render_text->ApplyStyleRange(underline); | |
| 209 color.range = ui::Range(3, 6); | |
| 210 render_text->ApplyStyleRange(color); | |
| 211 strike.range = ui::Range(6, 9); | |
| 212 render_text->ApplyStyleRange(strike); | |
| 213 strike_underline.range = ui::Range(9, 12); | |
| 214 render_text->ApplyStyleRange(strike_underline); | |
| 215 EXPECT_EQ(4U, render_text->style_ranges().size()); | |
| 216 | |
| 217 color.foreground = SK_ColorRED; | |
| 218 color.range = ui::Range(2, 10); | |
| 219 render_text->ApplyStyleRange(color); | |
| 220 EXPECT_EQ(3U, render_text->style_ranges().size()); | |
| 221 EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range); | |
| 222 EXPECT_TRUE(render_text->style_ranges()[0].underline); | |
| 223 EXPECT_EQ(ui::Range(2, 10), render_text->style_ranges()[1].range); | |
| 224 EXPECT_EQ(SK_ColorRED, render_text->style_ranges()[1].foreground); | |
| 225 EXPECT_EQ(ui::Range(10, 12), render_text->style_ranges()[2].range); | |
| 226 EXPECT_TRUE(render_text->style_ranges()[2].underline); | |
| 227 EXPECT_TRUE(render_text->style_ranges()[2].strike); | |
| 228 } | |
| 229 | |
| 230 static void SetTextWith2ExtraStyles(RenderText* render_text) { | |
| 231 render_text->SetText(ASCIIToUTF16("abcdefghi")); | |
| 232 | |
| 233 StyleRange strike; | |
| 234 strike.strike = true; | |
| 235 strike.range = ui::Range(0, 3); | |
| 236 render_text->ApplyStyleRange(strike); | |
| 237 | |
| 238 StyleRange underline; | |
| 239 underline.underline = true; | |
| 240 underline.range = ui::Range(3, 6); | |
| 241 render_text->ApplyStyleRange(underline); | |
| 242 } | |
| 243 | |
| 244 TEST_F(RenderTextTest, StyleRangesAdjust) { | |
| 245 // Test that style ranges adjust to the text size. | |
| 246 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); | |
| 247 render_text->SetText(ASCIIToUTF16("abcdef")); | |
| 248 EXPECT_EQ(1U, render_text->style_ranges().size()); | |
| 249 EXPECT_EQ(ui::Range(0, 6), render_text->style_ranges()[0].range); | |
| 250 | |
| 251 // Test that the range is clipped to the length of shorter text. | |
| 252 render_text->SetText(ASCIIToUTF16("abc")); | |
| 253 EXPECT_EQ(1U, render_text->style_ranges().size()); | |
| 254 EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range); | |
| 255 | |
| 256 // Test that the last range extends to the length of longer text. | |
| 257 StyleRange strike; | |
| 258 strike.strike = true; | |
| 259 strike.range = ui::Range(2, 3); | |
| 260 render_text->ApplyStyleRange(strike); | |
| 261 render_text->SetText(ASCIIToUTF16("abcdefghi")); | |
| 262 EXPECT_EQ(2U, render_text->style_ranges().size()); | |
| 263 EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range); | |
| 264 EXPECT_EQ(ui::Range(2, 9), render_text->style_ranges()[1].range); | |
| 265 EXPECT_TRUE(render_text->style_ranges()[1].strike); | |
| 266 | |
| 267 // Test that ranges are removed if they're outside the range of shorter text. | |
| 268 render_text->SetText(ASCIIToUTF16("ab")); | |
| 269 EXPECT_EQ(1U, render_text->style_ranges().size()); | |
| 270 EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range); | |
| 271 EXPECT_FALSE(render_text->style_ranges()[0].strike); | |
| 272 | |
| 273 // Test that previously removed ranges don't return. | |
| 274 render_text->SetText(ASCIIToUTF16("abcdef")); | |
| 275 EXPECT_EQ(1U, render_text->style_ranges().size()); | |
| 276 EXPECT_EQ(ui::Range(0, 6), render_text->style_ranges()[0].range); | |
| 277 EXPECT_FALSE(render_text->style_ranges()[0].strike); | |
| 278 | |
| 279 // Test that ranges are removed correctly if they are outside the range of | |
| 280 // shorter text. | |
| 281 SetTextWith2ExtraStyles(render_text.get()); | |
| 282 EXPECT_EQ(3U, render_text->style_ranges().size()); | |
| 283 | |
| 284 render_text->SetText(ASCIIToUTF16("abcdefg")); | |
| 285 EXPECT_EQ(3U, render_text->style_ranges().size()); | |
| 286 EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range); | |
| 287 EXPECT_EQ(ui::Range(3, 6), render_text->style_ranges()[1].range); | |
| 288 EXPECT_EQ(ui::Range(6, 7), render_text->style_ranges()[2].range); | |
| 289 | |
| 290 SetTextWith2ExtraStyles(render_text.get()); | |
| 291 EXPECT_EQ(3U, render_text->style_ranges().size()); | |
| 292 | |
| 293 render_text->SetText(ASCIIToUTF16("abcdef")); | |
| 294 EXPECT_EQ(2U, render_text->style_ranges().size()); | |
| 295 EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range); | |
| 296 EXPECT_EQ(ui::Range(3, 6), render_text->style_ranges()[1].range); | |
| 297 | |
| 298 SetTextWith2ExtraStyles(render_text.get()); | |
| 299 EXPECT_EQ(3U, render_text->style_ranges().size()); | |
| 300 | |
| 301 render_text->SetText(ASCIIToUTF16("abcde")); | |
| 302 EXPECT_EQ(2U, render_text->style_ranges().size()); | |
| 303 EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range); | |
| 304 EXPECT_EQ(ui::Range(3, 5), render_text->style_ranges()[1].range); | |
| 305 | |
| 306 SetTextWith2ExtraStyles(render_text.get()); | |
| 307 EXPECT_EQ(3U, render_text->style_ranges().size()); | |
| 308 | |
| 309 render_text->SetText(ASCIIToUTF16("abc")); | |
| 310 EXPECT_EQ(1U, render_text->style_ranges().size()); | |
| 311 EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range); | |
| 312 | |
| 313 SetTextWith2ExtraStyles(render_text.get()); | |
| 314 EXPECT_EQ(3U, render_text->style_ranges().size()); | |
| 315 | |
| 316 render_text->SetText(ASCIIToUTF16("a")); | |
| 317 EXPECT_EQ(1U, render_text->style_ranges().size()); | |
| 318 EXPECT_EQ(ui::Range(0, 1), render_text->style_ranges()[0].range); | |
| 319 } | 283 } |
| 320 | 284 |
| 321 // TODO(asvitkine): Cursor movements tests disabled on Mac because RenderTextMac | 285 // TODO(asvitkine): Cursor movements tests disabled on Mac because RenderTextMac |
| 322 // does not implement this yet. http://crbug.com/131618 | 286 // does not implement this yet. http://crbug.com/131618 |
| 323 #if !defined(OS_MACOSX) | 287 #if !defined(OS_MACOSX) |
| 324 void TestVisualCursorMotionInObscuredField(RenderText* render_text, | 288 void TestVisualCursorMotionInObscuredField(RenderText* render_text, |
| 325 const string16& text, | 289 const string16& text, |
| 326 bool select) { | 290 bool select) { |
| 327 ASSERT_TRUE(render_text->obscured()); | 291 ASSERT_TRUE(render_text->obscured()); |
| 328 render_text->SetText(text); | 292 render_text->SetText(text); |
| (...skipping 715 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1044 } | 1008 } |
| 1045 | 1009 |
| 1046 TEST_F(RenderTextTest, StringSizeBoldWidth) { | 1010 TEST_F(RenderTextTest, StringSizeBoldWidth) { |
| 1047 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); | 1011 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); |
| 1048 render_text->SetText(UTF8ToUTF16("Hello World")); | 1012 render_text->SetText(UTF8ToUTF16("Hello World")); |
| 1049 | 1013 |
| 1050 const int plain_width = render_text->GetStringSize().width(); | 1014 const int plain_width = render_text->GetStringSize().width(); |
| 1051 EXPECT_GT(plain_width, 0); | 1015 EXPECT_GT(plain_width, 0); |
| 1052 | 1016 |
| 1053 // Apply a bold style and check that the new width is greater. | 1017 // Apply a bold style and check that the new width is greater. |
| 1054 StyleRange bold; | 1018 render_text->SetStyle(gfx::BOLD, true); |
| 1055 bold.font_style |= Font::BOLD; | |
| 1056 render_text->set_default_style(bold); | |
| 1057 render_text->ApplyDefaultStyle(); | |
| 1058 | |
| 1059 const int bold_width = render_text->GetStringSize().width(); | 1019 const int bold_width = render_text->GetStringSize().width(); |
| 1060 EXPECT_GT(bold_width, plain_width); | 1020 EXPECT_GT(bold_width, plain_width); |
| 1061 | 1021 |
| 1062 // Now, apply a plain style over the first word only. | 1022 // Now, apply a plain style over the first word only. |
| 1063 StyleRange plain; | 1023 render_text->ApplyStyle(gfx::BOLD, false, ui::Range(0, 5)); |
| 1064 plain.font_style = Font::NORMAL; | |
| 1065 plain.range = ui::Range(0, 5); | |
| 1066 render_text->ApplyStyleRange(plain); | |
| 1067 | |
| 1068 const int plain_bold_width = render_text->GetStringSize().width(); | 1024 const int plain_bold_width = render_text->GetStringSize().width(); |
| 1069 EXPECT_GT(plain_bold_width, plain_width); | 1025 EXPECT_GT(plain_bold_width, plain_width); |
| 1070 EXPECT_LT(plain_bold_width, bold_width); | 1026 EXPECT_LT(plain_bold_width, bold_width); |
| 1071 } | 1027 } |
| 1072 | 1028 |
| 1073 TEST_F(RenderTextTest, StringSizeHeight) { | 1029 TEST_F(RenderTextTest, StringSizeHeight) { |
| 1074 struct { | 1030 string16 cases[] = { |
| 1075 string16 text; | 1031 WideToUTF16(L"Hello World!"), // English |
| 1076 } cases[] = { | 1032 WideToUTF16(L"\x6328\x62f6"), // Japanese |
| 1077 { WideToUTF16(L"Hello World!") }, // English | 1033 WideToUTF16(L"\x0915\x093f"), // Hindi |
| 1078 { WideToUTF16(L"\x6328\x62f6") }, // Japanese | 1034 WideToUTF16(L"\x05e0\x05b8"), // Hebrew |
| 1079 { WideToUTF16(L"\x0915\x093f") }, // Hindi | |
| 1080 { WideToUTF16(L"\x05e0\x05b8") }, // Hebrew | |
| 1081 }; | 1035 }; |
| 1082 | 1036 |
| 1083 Font default_font; | 1037 Font default_font; |
| 1084 Font larger_font = default_font.DeriveFont(24, default_font.GetStyle()); | 1038 Font larger_font = default_font.DeriveFont(24, default_font.GetStyle()); |
| 1085 EXPECT_GT(larger_font.GetHeight(), default_font.GetHeight()); | 1039 EXPECT_GT(larger_font.GetHeight(), default_font.GetHeight()); |
| 1086 | 1040 |
| 1087 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) { | 1041 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) { |
| 1088 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); | 1042 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); |
| 1089 render_text->SetFont(default_font); | 1043 render_text->SetFont(default_font); |
| 1090 render_text->SetText(cases[i].text); | 1044 render_text->SetText(cases[i]); |
| 1091 | 1045 |
| 1092 const int height1 = render_text->GetStringSize().height(); | 1046 const int height1 = render_text->GetStringSize().height(); |
| 1093 EXPECT_GT(height1, 0); | 1047 EXPECT_GT(height1, 0); |
| 1094 | 1048 |
| 1095 // Check that setting the larger font increases the height. | 1049 // Check that setting the larger font increases the height. |
| 1096 render_text->SetFont(larger_font); | 1050 render_text->SetFont(larger_font); |
| 1097 const int height2 = render_text->GetStringSize().height(); | 1051 const int height2 = render_text->GetStringSize().height(); |
| 1098 EXPECT_GT(height2, height1); | 1052 EXPECT_GT(height2, height1); |
| 1099 } | 1053 } |
| 1100 } | 1054 } |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1345 EXPECT_EQ(render_text->display_rect().width() - width - 1, | 1299 EXPECT_EQ(render_text->display_rect().width() - width - 1, |
| 1346 render_text->GetUpdatedCursorBounds().x()); | 1300 render_text->GetUpdatedCursorBounds().x()); |
| 1347 | 1301 |
| 1348 // Reset the application default text direction to LTR. | 1302 // Reset the application default text direction to LTR. |
| 1349 SetRTL(was_rtl); | 1303 SetRTL(was_rtl); |
| 1350 EXPECT_EQ(was_rtl, base::i18n::IsRTL()); | 1304 EXPECT_EQ(was_rtl, base::i18n::IsRTL()); |
| 1351 } | 1305 } |
| 1352 #endif // !defined(OS_MACOSX) | 1306 #endif // !defined(OS_MACOSX) |
| 1353 | 1307 |
| 1354 } // namespace gfx | 1308 } // namespace gfx |
| OLD | NEW |