Chromium Code Reviews| 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/base/l10n/l10n_util.h" | 10 #include "ui/base/l10n/l10n_util.h" |
| (...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 274 EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range); | 274 EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range); |
| 275 | 275 |
| 276 SetTextWith2ExtraStyles(render_text.get()); | 276 SetTextWith2ExtraStyles(render_text.get()); |
| 277 EXPECT_EQ(3U, render_text->style_ranges().size()); | 277 EXPECT_EQ(3U, render_text->style_ranges().size()); |
| 278 | 278 |
| 279 render_text->SetText(ASCIIToUTF16("a")); | 279 render_text->SetText(ASCIIToUTF16("a")); |
| 280 EXPECT_EQ(1U, render_text->style_ranges().size()); | 280 EXPECT_EQ(1U, render_text->style_ranges().size()); |
| 281 EXPECT_EQ(ui::Range(0, 1), render_text->style_ranges()[0].range); | 281 EXPECT_EQ(ui::Range(0, 1), render_text->style_ranges()[0].range); |
| 282 } | 282 } |
| 283 | 283 |
| 284 void TestVisualCursorMotionInObscuredField(RenderText* render_text, | |
| 285 const string16& text, | |
| 286 bool select) { | |
| 287 render_text->SetText(text); | |
| 288 int len = text.length(); | |
| 289 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, select); | |
| 290 EXPECT_TRUE(render_text->selection_model().Equals(SelectionModel( | |
| 291 select ? 0 : len, len, len - 1, SelectionModel::TRAILING))); | |
| 292 render_text->MoveCursor(LINE_BREAK, CURSOR_LEFT, select); | |
| 293 EXPECT_TRUE(render_text->selection_model().Equals(SelectionModel( | |
| 294 0, 0, SelectionModel::LEADING))); | |
| 295 for (int j = 1; j <= len; ++j) { | |
| 296 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, select); | |
| 297 EXPECT_TRUE(render_text->selection_model().Equals(SelectionModel( | |
| 298 select ? 0 : j, j, j - 1, SelectionModel::TRAILING))); | |
| 299 } | |
| 300 for (int j = len - 1; j >= 0; --j) { | |
| 301 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, select); | |
| 302 EXPECT_TRUE(render_text->selection_model().Equals(SelectionModel( | |
| 303 select ? 0 : j, j, j, SelectionModel::LEADING))); | |
| 304 } | |
| 305 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, select); | |
| 306 EXPECT_TRUE(render_text->selection_model().Equals(SelectionModel( | |
| 307 select ? 0 : len, len, len - 1, SelectionModel::TRAILING))); | |
| 308 render_text->MoveCursor(WORD_BREAK, CURSOR_LEFT, select); | |
| 309 EXPECT_TRUE(render_text->selection_model().Equals(SelectionModel( | |
| 310 0, 0, SelectionModel::LEADING))); | |
| 311 } | |
| 312 | |
| 313 TEST_F(RenderTextTest, PasswordCensorship) { | |
|
msw
2012/03/01 22:48:54
Awesome test cases!
| |
| 314 const string16 seuss = ASCIIToUTF16("hop on pop"); | |
| 315 const string16 no_seuss = ASCIIToUTF16("**********"); | |
| 316 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | |
| 317 | |
| 318 // GetObscuredText returns asterisks when the obscured bit is set. | |
| 319 render_text->SetText(seuss); | |
| 320 render_text->SetObscured(true); | |
| 321 EXPECT_EQ(seuss, render_text->text()); | |
| 322 EXPECT_EQ(no_seuss, render_text->GetDisplayText()); | |
| 323 render_text->SetObscured(false); | |
| 324 EXPECT_EQ(seuss, render_text->text()); | |
| 325 EXPECT_EQ(seuss, render_text->GetDisplayText()); | |
| 326 | |
| 327 render_text->SetObscured(true); | |
| 328 | |
| 329 // Surrogate pairs are counted as one code point. | |
| 330 const char16 invalid_surrogates[] = {0xDC00, 0xD800, 0}; | |
| 331 render_text->SetText(invalid_surrogates); | |
| 332 EXPECT_EQ(ASCIIToUTF16("**"), render_text->GetDisplayText()); | |
| 333 const char16 valid_surrogates[] = {0xD800, 0xDC00, 0}; | |
| 334 render_text->SetText(valid_surrogates); | |
| 335 EXPECT_EQ(ASCIIToUTF16("*"), render_text->GetDisplayText()); | |
| 336 EXPECT_EQ(0U, render_text->GetCursorPosition()); | |
| 337 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); | |
| 338 EXPECT_EQ(2U, render_text->GetCursorPosition()); | |
| 339 | |
| 340 // Cursoring is independent of the underlying characters when the text is | |
| 341 // obscured. | |
| 342 const wchar_t* const texts[] = { | |
| 343 L"hop on pop", // word boundaries | |
| 344 L"ab \x5D0\x5D1" L"12", // bidi embedding level of 2 | |
| 345 L"\x5D0\x5D1" L"12", // RTL paragraph direction on Linux | |
| 346 L"\x5D0\x5D1" // pure RTL | |
| 347 }; | |
| 348 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(texts); ++i) { | |
| 349 string16 text = WideToUTF16(texts[i]); | |
| 350 TestVisualCursorMotionInObscuredField(render_text.get(), text, false); | |
| 351 TestVisualCursorMotionInObscuredField(render_text.get(), text, true); | |
| 352 } | |
| 353 } | |
| 354 | |
| 284 void RunMoveCursorLeftRightTest(RenderText* render_text, | 355 void RunMoveCursorLeftRightTest(RenderText* render_text, |
| 285 const std::vector<SelectionModel>& expected, | 356 const std::vector<SelectionModel>& expected, |
| 286 bool move_right) { | 357 bool move_right) { |
| 287 for (int i = 0; i < static_cast<int>(expected.size()); ++i) { | 358 for (int i = 0; i < static_cast<int>(expected.size()); ++i) { |
| 288 SelectionModel sel = expected[i]; | 359 SelectionModel sel = expected[i]; |
| 289 EXPECT_TRUE(render_text->selection_model().Equals(sel)); | 360 EXPECT_TRUE(render_text->selection_model().Equals(sel)); |
| 290 if (move_right) | 361 if (move_right) |
| 291 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); | 362 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); |
| 292 else | 363 else |
| 293 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); | 364 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); |
| (...skipping 727 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1021 // Ensure that a sufficiently large display rectangle shows all the text. | 1092 // Ensure that a sufficiently large display rectangle shows all the text. |
| 1022 render_text->SetDisplayRect(Rect(width + 10, 1)); | 1093 render_text->SetDisplayRect(Rect(width + 10, 1)); |
| 1023 EXPECT_EQ(render_text->display_rect().width() - width - 1, | 1094 EXPECT_EQ(render_text->display_rect().width() - width - 1, |
| 1024 render_text->GetUpdatedCursorBounds().x()); | 1095 render_text->GetUpdatedCursorBounds().x()); |
| 1025 | 1096 |
| 1026 // Reset locale. | 1097 // Reset locale. |
| 1027 base::i18n::SetICUDefaultLocale(locale); | 1098 base::i18n::SetICUDefaultLocale(locale); |
| 1028 } | 1099 } |
| 1029 | 1100 |
| 1030 } // namespace gfx | 1101 } // namespace gfx |
| OLD | NEW |