Chromium Code Reviews| Index: ui/gfx/render_text_unittest.cc |
| diff --git a/ui/gfx/render_text_unittest.cc b/ui/gfx/render_text_unittest.cc |
| index 5f48fd431d437bc637a336f4d6ee4cf4ed1efc6b..fc7b1c9c32cefb7471683df13a608dbda55738c0 100644 |
| --- a/ui/gfx/render_text_unittest.cc |
| +++ b/ui/gfx/render_text_unittest.cc |
| @@ -281,6 +281,77 @@ TEST_F(RenderTextTest, StyleRangesAdjust) { |
| EXPECT_EQ(ui::Range(0, 1), render_text->style_ranges()[0].range); |
| } |
| +void TestVisualCursorMotionInObscuredField(RenderText* render_text, |
| + const string16& text, |
| + bool select) { |
| + render_text->SetText(text); |
| + int len = text.length(); |
| + render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, select); |
| + EXPECT_TRUE(render_text->selection_model().Equals(SelectionModel( |
| + select ? 0 : len, len, len - 1, SelectionModel::TRAILING))); |
| + render_text->MoveCursor(LINE_BREAK, CURSOR_LEFT, select); |
| + EXPECT_TRUE(render_text->selection_model().Equals(SelectionModel( |
| + 0, 0, SelectionModel::LEADING))); |
| + for (int j = 1; j <= len; ++j) { |
| + render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, select); |
| + EXPECT_TRUE(render_text->selection_model().Equals(SelectionModel( |
| + select ? 0 : j, j, j - 1, SelectionModel::TRAILING))); |
| + } |
| + for (int j = len - 1; j >= 0; --j) { |
| + render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, select); |
| + EXPECT_TRUE(render_text->selection_model().Equals(SelectionModel( |
| + select ? 0 : j, j, j, SelectionModel::LEADING))); |
| + } |
| + render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, select); |
| + EXPECT_TRUE(render_text->selection_model().Equals(SelectionModel( |
| + select ? 0 : len, len, len - 1, SelectionModel::TRAILING))); |
| + render_text->MoveCursor(WORD_BREAK, CURSOR_LEFT, select); |
| + EXPECT_TRUE(render_text->selection_model().Equals(SelectionModel( |
| + 0, 0, SelectionModel::LEADING))); |
| +} |
| + |
| +TEST_F(RenderTextTest, PasswordCensorship) { |
|
msw
2012/03/01 22:48:54
Awesome test cases!
|
| + const string16 seuss = ASCIIToUTF16("hop on pop"); |
| + const string16 no_seuss = ASCIIToUTF16("**********"); |
| + scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); |
| + |
| + // GetObscuredText returns asterisks when the obscured bit is set. |
| + render_text->SetText(seuss); |
| + render_text->SetObscured(true); |
| + EXPECT_EQ(seuss, render_text->text()); |
| + EXPECT_EQ(no_seuss, render_text->GetDisplayText()); |
| + render_text->SetObscured(false); |
| + EXPECT_EQ(seuss, render_text->text()); |
| + EXPECT_EQ(seuss, render_text->GetDisplayText()); |
| + |
| + render_text->SetObscured(true); |
| + |
| + // Surrogate pairs are counted as one code point. |
| + const char16 invalid_surrogates[] = {0xDC00, 0xD800, 0}; |
| + render_text->SetText(invalid_surrogates); |
| + EXPECT_EQ(ASCIIToUTF16("**"), render_text->GetDisplayText()); |
| + const char16 valid_surrogates[] = {0xD800, 0xDC00, 0}; |
| + render_text->SetText(valid_surrogates); |
| + EXPECT_EQ(ASCIIToUTF16("*"), render_text->GetDisplayText()); |
| + EXPECT_EQ(0U, render_text->GetCursorPosition()); |
| + render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); |
| + EXPECT_EQ(2U, render_text->GetCursorPosition()); |
| + |
| + // Cursoring is independent of the underlying characters when the text is |
| + // obscured. |
| + const wchar_t* const texts[] = { |
| + L"hop on pop", // word boundaries |
| + L"ab \x5D0\x5D1" L"12", // bidi embedding level of 2 |
| + L"\x5D0\x5D1" L"12", // RTL paragraph direction on Linux |
| + L"\x5D0\x5D1" // pure RTL |
| + }; |
| + for (size_t i = 0; i < ARRAYSIZE_UNSAFE(texts); ++i) { |
| + string16 text = WideToUTF16(texts[i]); |
| + TestVisualCursorMotionInObscuredField(render_text.get(), text, false); |
| + TestVisualCursorMotionInObscuredField(render_text.get(), text, true); |
| + } |
| +} |
| + |
| void RunMoveCursorLeftRightTest(RenderText* render_text, |
| const std::vector<SelectionModel>& expected, |
| bool move_right) { |