Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(137)

Side by Side Diff: ui/gfx/render_text_unittest.cc

Issue 2439693002: MacViews: Use bullets for displaying obscured text. (Closed)
Patch Set: Make kPasswordReplacementChar constexpr. Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 <limits.h> 7 #include <limits.h>
8 #include <stddef.h> 8 #include <stddef.h>
9 #include <stdint.h> 9 #include <stdint.h>
10 10
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 EXPECT_EQ(expected_attr->diagonal_strike, actual_attr->diagonal_strike); 276 EXPECT_EQ(expected_attr->diagonal_strike, actual_attr->diagonal_strike);
277 EXPECT_EQ(expected_attr->font.GetFontName(), 277 EXPECT_EQ(expected_attr->font.GetFontName(),
278 actual_attr->font.GetFontName()); 278 actual_attr->font.GetFontName());
279 EXPECT_EQ(expected_attr->font.GetFontSize(), 279 EXPECT_EQ(expected_attr->font.GetFontSize(),
280 actual_attr->font.GetFontSize()); 280 actual_attr->font.GetFontSize());
281 EXPECT_EQ(expected_attr->font.GetWeight(), actual_attr->font.GetWeight()); 281 EXPECT_EQ(expected_attr->font.GetWeight(), actual_attr->font.GetWeight());
282 EXPECT_EQ(expected_attr->font.GetStyle(), actual_attr->font.GetStyle()); 282 EXPECT_EQ(expected_attr->font.GetStyle(), actual_attr->font.GetStyle());
283 } 283 }
284 } 284 }
285 285
286 // Helper method to return an obscured string of the given |length|, with the
287 // |reveal_index| filled with |reveal_char|.
288 base::string16 GetObscuredString(size_t length,
289 size_t reveal_index,
290 base::char16 reveal_char) {
291 std::vector<base::char16> arr(length, RenderText::kPasswordReplacementChar);
292 arr[reveal_index] = reveal_char;
293 return base::string16(arr.begin(), arr.end());
294 }
295
296 // Helper method to return an obscured string of the given |length|.
297 base::string16 GetObscuredString(size_t length) {
298 return base::string16(length, RenderText::kPasswordReplacementChar);
299 }
300
286 // The class which records the drawing operations so that the test case can 301 // The class which records the drawing operations so that the test case can
287 // verify where exactly the glyphs are drawn. 302 // verify where exactly the glyphs are drawn.
288 class TestSkiaTextRenderer : public internal::SkiaTextRenderer { 303 class TestSkiaTextRenderer : public internal::SkiaTextRenderer {
289 public: 304 public:
290 struct TextLog { 305 struct TextLog {
291 TextLog() : glyph_count(0u), color(SK_ColorTRANSPARENT) {} 306 TextLog() : glyph_count(0u), color(SK_ColorTRANSPARENT) {}
292 PointF origin; 307 PointF origin;
293 size_t glyph_count; 308 size_t glyph_count;
294 SkColor color; 309 SkColor color;
295 }; 310 };
(...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after
728 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, selection_behavior); 743 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, selection_behavior);
729 EXPECT_EQ(SelectionModel(Range(select ? 0 : len, len), CURSOR_FORWARD), 744 EXPECT_EQ(SelectionModel(Range(select ? 0 : len, len), CURSOR_FORWARD),
730 render_text->selection_model()); 745 render_text->selection_model());
731 render_text->MoveCursor(WORD_BREAK, CURSOR_LEFT, selection_behavior); 746 render_text->MoveCursor(WORD_BREAK, CURSOR_LEFT, selection_behavior);
732 EXPECT_EQ(SelectionModel(0, CURSOR_BACKWARD), render_text->selection_model()); 747 EXPECT_EQ(SelectionModel(0, CURSOR_BACKWARD), render_text->selection_model());
733 } 748 }
734 749
735 // TODO(asvitkine): RenderTextMac cursor movements. http://crbug.com/131618 750 // TODO(asvitkine): RenderTextMac cursor movements. http://crbug.com/131618
736 TEST_P(RenderTextHarfBuzzTest, ObscuredText) { 751 TEST_P(RenderTextHarfBuzzTest, ObscuredText) {
737 const base::string16 seuss = ASCIIToUTF16("hop on pop"); 752 const base::string16 seuss = ASCIIToUTF16("hop on pop");
738 const base::string16 no_seuss = ASCIIToUTF16("**********"); 753 const base::string16 no_seuss = GetObscuredString(seuss.length());
739 RenderText* render_text = GetRenderText(); 754 RenderText* render_text = GetRenderText();
740 755
741 // GetLayoutText() returns asterisks when the obscured bit is set. 756 // GetDisplayText() returns a string filled with
757 // RenderText::kPasswordReplacementChar when the obscured bit is set.
742 render_text->SetText(seuss); 758 render_text->SetText(seuss);
743 render_text->SetObscured(true); 759 render_text->SetObscured(true);
744 EXPECT_EQ(seuss, render_text->text()); 760 EXPECT_EQ(seuss, render_text->text());
745 EXPECT_EQ(no_seuss, render_text->GetDisplayText()); 761 EXPECT_EQ(no_seuss, render_text->GetDisplayText());
746 render_text->SetObscured(false); 762 render_text->SetObscured(false);
747 EXPECT_EQ(seuss, render_text->text()); 763 EXPECT_EQ(seuss, render_text->text());
748 EXPECT_EQ(seuss, render_text->GetDisplayText()); 764 EXPECT_EQ(seuss, render_text->GetDisplayText());
749 765
750 render_text->SetObscured(true); 766 render_text->SetObscured(true);
751 767
752 // Surrogate pairs are counted as one code point. 768 // Surrogate pairs are counted as one code point.
753 const base::char16 invalid_surrogates[] = {0xDC00, 0xD800, 0}; 769 const base::char16 invalid_surrogates[] = {0xDC00, 0xD800, 0};
754 render_text->SetText(invalid_surrogates); 770 render_text->SetText(invalid_surrogates);
755 EXPECT_EQ(ASCIIToUTF16("**"), render_text->GetDisplayText()); 771 EXPECT_EQ(GetObscuredString(2), render_text->GetDisplayText());
756 const base::char16 valid_surrogates[] = {0xD800, 0xDC00, 0}; 772 const base::char16 valid_surrogates[] = {0xD800, 0xDC00, 0};
757 render_text->SetText(valid_surrogates); 773 render_text->SetText(valid_surrogates);
758 EXPECT_EQ(ASCIIToUTF16("*"), render_text->GetDisplayText()); 774 EXPECT_EQ(GetObscuredString(1), render_text->GetDisplayText());
759 EXPECT_EQ(0U, render_text->cursor_position()); 775 EXPECT_EQ(0U, render_text->cursor_position());
760 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, SELECTION_NONE); 776 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, SELECTION_NONE);
761 EXPECT_EQ(2U, render_text->cursor_position()); 777 EXPECT_EQ(2U, render_text->cursor_position());
762 778
763 // Test index conversion and cursor validity with a valid surrogate pair. 779 // Test index conversion and cursor validity with a valid surrogate pair.
764 EXPECT_EQ(0U, test_api()->TextIndexToDisplayIndex(0U)); 780 EXPECT_EQ(0U, test_api()->TextIndexToDisplayIndex(0U));
765 EXPECT_EQ(1U, test_api()->TextIndexToDisplayIndex(1U)); 781 EXPECT_EQ(1U, test_api()->TextIndexToDisplayIndex(1U));
766 EXPECT_EQ(1U, test_api()->TextIndexToDisplayIndex(2U)); 782 EXPECT_EQ(1U, test_api()->TextIndexToDisplayIndex(2U));
767 EXPECT_EQ(0U, test_api()->DisplayIndexToTextIndex(0U)); 783 EXPECT_EQ(0U, test_api()->DisplayIndexToTextIndex(0U));
768 EXPECT_EQ(2U, test_api()->DisplayIndexToTextIndex(1U)); 784 EXPECT_EQ(2U, test_api()->DisplayIndexToTextIndex(1U));
(...skipping 22 matching lines...) Expand all
791 }; 807 };
792 for (size_t i = 0; i < arraysize(texts); ++i) { 808 for (size_t i = 0; i < arraysize(texts); ++i) {
793 base::string16 text = WideToUTF16(texts[i]); 809 base::string16 text = WideToUTF16(texts[i]);
794 TestVisualCursorMotionInObscuredField(render_text, text, SELECTION_NONE); 810 TestVisualCursorMotionInObscuredField(render_text, text, SELECTION_NONE);
795 TestVisualCursorMotionInObscuredField(render_text, text, SELECTION_RETAIN); 811 TestVisualCursorMotionInObscuredField(render_text, text, SELECTION_RETAIN);
796 } 812 }
797 } 813 }
798 814
799 TEST_P(RenderTextTest, RevealObscuredText) { 815 TEST_P(RenderTextTest, RevealObscuredText) {
800 const base::string16 seuss = ASCIIToUTF16("hop on pop"); 816 const base::string16 seuss = ASCIIToUTF16("hop on pop");
801 const base::string16 no_seuss = ASCIIToUTF16("**********"); 817 const base::string16 no_seuss = GetObscuredString(seuss.length());
802 RenderText* render_text = GetRenderText(); 818 RenderText* render_text = GetRenderText();
803 819
804 render_text->SetText(seuss); 820 render_text->SetText(seuss);
805 render_text->SetObscured(true); 821 render_text->SetObscured(true);
806 EXPECT_EQ(seuss, render_text->text()); 822 EXPECT_EQ(seuss, render_text->text());
807 EXPECT_EQ(no_seuss, render_text->GetDisplayText()); 823 EXPECT_EQ(no_seuss, render_text->GetDisplayText());
808 824
809 // Valid reveal index and new revealed index clears previous one. 825 // Valid reveal index and new revealed index clears previous one.
810 render_text->RenderText::SetObscuredRevealIndex(0); 826 render_text->RenderText::SetObscuredRevealIndex(0);
811 EXPECT_EQ(ASCIIToUTF16("h*********"), render_text->GetDisplayText()); 827 EXPECT_EQ(GetObscuredString(seuss.length(), 0, 'h'),
828 render_text->GetDisplayText());
812 render_text->RenderText::SetObscuredRevealIndex(1); 829 render_text->RenderText::SetObscuredRevealIndex(1);
813 EXPECT_EQ(ASCIIToUTF16("*o********"), render_text->GetDisplayText()); 830 EXPECT_EQ(GetObscuredString(seuss.length(), 1, 'o'),
831 render_text->GetDisplayText());
814 render_text->RenderText::SetObscuredRevealIndex(2); 832 render_text->RenderText::SetObscuredRevealIndex(2);
815 EXPECT_EQ(ASCIIToUTF16("**p*******"), render_text->GetDisplayText()); 833 EXPECT_EQ(GetObscuredString(seuss.length(), 2, 'p'),
834 render_text->GetDisplayText());
816 835
817 // Invalid reveal index. 836 // Invalid reveal index.
818 render_text->RenderText::SetObscuredRevealIndex(-1); 837 render_text->RenderText::SetObscuredRevealIndex(-1);
819 EXPECT_EQ(no_seuss, render_text->GetDisplayText()); 838 EXPECT_EQ(no_seuss, render_text->GetDisplayText());
820 render_text->RenderText::SetObscuredRevealIndex(seuss.length() + 1); 839 render_text->RenderText::SetObscuredRevealIndex(seuss.length() + 1);
821 EXPECT_EQ(no_seuss, render_text->GetDisplayText()); 840 EXPECT_EQ(no_seuss, render_text->GetDisplayText());
822 841
823 // SetObscured clears the revealed index. 842 // SetObscured clears the revealed index.
824 render_text->RenderText::SetObscuredRevealIndex(0); 843 render_text->RenderText::SetObscuredRevealIndex(0);
825 EXPECT_EQ(ASCIIToUTF16("h*********"), render_text->GetDisplayText()); 844 EXPECT_EQ(GetObscuredString(seuss.length(), 0, 'h'),
845 render_text->GetDisplayText());
826 render_text->SetObscured(false); 846 render_text->SetObscured(false);
827 EXPECT_EQ(seuss, render_text->GetDisplayText()); 847 EXPECT_EQ(seuss, render_text->GetDisplayText());
828 render_text->SetObscured(true); 848 render_text->SetObscured(true);
829 EXPECT_EQ(no_seuss, render_text->GetDisplayText()); 849 EXPECT_EQ(no_seuss, render_text->GetDisplayText());
830 850
831 // SetText clears the revealed index. 851 // SetText clears the revealed index.
832 render_text->SetText(ASCIIToUTF16("new")); 852 render_text->SetText(ASCIIToUTF16("new"));
833 EXPECT_EQ(ASCIIToUTF16("***"), render_text->GetDisplayText()); 853 EXPECT_EQ(GetObscuredString(3), render_text->GetDisplayText());
834 render_text->RenderText::SetObscuredRevealIndex(2); 854 render_text->RenderText::SetObscuredRevealIndex(2);
835 EXPECT_EQ(ASCIIToUTF16("**w"), render_text->GetDisplayText()); 855 EXPECT_EQ(GetObscuredString(3, 2, 'w'), render_text->GetDisplayText());
836 render_text->SetText(ASCIIToUTF16("new longer")); 856 render_text->SetText(ASCIIToUTF16("new longer"));
837 EXPECT_EQ(ASCIIToUTF16("**********"), render_text->GetDisplayText()); 857 EXPECT_EQ(GetObscuredString(10), render_text->GetDisplayText());
838 858
839 // Text with invalid surrogates. 859 // Text with invalid surrogates.
840 const base::char16 invalid_surrogates[] = {0xDC00, 0xD800, 'h', 'o', 'p', 0}; 860 const base::char16 invalid_surrogates[] = {0xDC00, 0xD800, 'h', 'o', 'p', 0};
841 render_text->SetText(invalid_surrogates); 861 render_text->SetText(invalid_surrogates);
842 EXPECT_EQ(ASCIIToUTF16("*****"), render_text->GetDisplayText()); 862 EXPECT_EQ(GetObscuredString(5), render_text->GetDisplayText());
843 render_text->RenderText::SetObscuredRevealIndex(0); 863 render_text->RenderText::SetObscuredRevealIndex(0);
844 const base::char16 invalid_expect_0[] = {0xDC00, '*', '*', '*', '*', 0}; 864 EXPECT_EQ(GetObscuredString(5, 0, 0xDC00), render_text->GetDisplayText());
845 EXPECT_EQ(invalid_expect_0, render_text->GetDisplayText());
846 render_text->RenderText::SetObscuredRevealIndex(1); 865 render_text->RenderText::SetObscuredRevealIndex(1);
847 const base::char16 invalid_expect_1[] = {'*', 0xD800, '*', '*', '*', 0}; 866 EXPECT_EQ(GetObscuredString(5, 1, 0xD800), render_text->GetDisplayText());
848 EXPECT_EQ(invalid_expect_1, render_text->GetDisplayText());
849 render_text->RenderText::SetObscuredRevealIndex(2); 867 render_text->RenderText::SetObscuredRevealIndex(2);
850 EXPECT_EQ(ASCIIToUTF16("**h**"), render_text->GetDisplayText()); 868 EXPECT_EQ(GetObscuredString(5, 2, 'h'), render_text->GetDisplayText());
851 869
852 // Text with valid surrogates before and after the reveal index. 870 // Text with valid surrogates before and after the reveal index.
853 const base::char16 valid_surrogates[] = 871 const base::char16 valid_surrogates[] =
854 {0xD800, 0xDC00, 'h', 'o', 'p', 0xD800, 0xDC00, 0}; 872 {0xD800, 0xDC00, 'h', 'o', 'p', 0xD800, 0xDC00, 0};
855 render_text->SetText(valid_surrogates); 873 render_text->SetText(valid_surrogates);
856 EXPECT_EQ(ASCIIToUTF16("*****"), render_text->GetDisplayText()); 874 EXPECT_EQ(GetObscuredString(5), render_text->GetDisplayText());
857 render_text->RenderText::SetObscuredRevealIndex(0); 875 render_text->RenderText::SetObscuredRevealIndex(0);
858 const base::char16 valid_expect_0_and_1[] = 876 const base::char16 valid_expect_0_and_1[] = {
859 {0xD800, 0xDC00, '*', '*', '*', '*', 0}; 877 0xD800,
878 0xDC00,
879 RenderText::kPasswordReplacementChar,
880 RenderText::kPasswordReplacementChar,
881 RenderText::kPasswordReplacementChar,
882 RenderText::kPasswordReplacementChar,
883 0};
860 EXPECT_EQ(valid_expect_0_and_1, render_text->GetDisplayText()); 884 EXPECT_EQ(valid_expect_0_and_1, render_text->GetDisplayText());
861 render_text->RenderText::SetObscuredRevealIndex(1); 885 render_text->RenderText::SetObscuredRevealIndex(1);
862 EXPECT_EQ(valid_expect_0_and_1, render_text->GetDisplayText()); 886 EXPECT_EQ(valid_expect_0_and_1, render_text->GetDisplayText());
863 render_text->RenderText::SetObscuredRevealIndex(2); 887 render_text->RenderText::SetObscuredRevealIndex(2);
864 EXPECT_EQ(ASCIIToUTF16("*h***"), render_text->GetDisplayText()); 888 EXPECT_EQ(GetObscuredString(5, 1, 'h'), render_text->GetDisplayText());
865 render_text->RenderText::SetObscuredRevealIndex(5); 889 render_text->RenderText::SetObscuredRevealIndex(5);
866 const base::char16 valid_expect_5_and_6[] = 890 const base::char16 valid_expect_5_and_6[] = {
867 {'*', '*', '*', '*', 0xD800, 0xDC00, 0}; 891 RenderText::kPasswordReplacementChar,
892 RenderText::kPasswordReplacementChar,
893 RenderText::kPasswordReplacementChar,
894 RenderText::kPasswordReplacementChar,
895 0xD800,
896 0xDC00,
897 0};
868 EXPECT_EQ(valid_expect_5_and_6, render_text->GetDisplayText()); 898 EXPECT_EQ(valid_expect_5_and_6, render_text->GetDisplayText());
869 render_text->RenderText::SetObscuredRevealIndex(6); 899 render_text->RenderText::SetObscuredRevealIndex(6);
870 EXPECT_EQ(valid_expect_5_and_6, render_text->GetDisplayText()); 900 EXPECT_EQ(valid_expect_5_and_6, render_text->GetDisplayText());
871 } 901 }
872 902
873 TEST_P(RenderTextTest, ObscuredEmoji) { 903 TEST_P(RenderTextTest, ObscuredEmoji) {
874 // Ensures text itemization doesn't crash on obscured multi-char glyphs. 904 // Ensures text itemization doesn't crash on obscured multi-char glyphs.
875 RenderText* render_text = GetRenderText(); 905 RenderText* render_text = GetRenderText();
876 render_text->SetObscured(true); 906 render_text->SetObscured(true);
877 // Test the "Grinning face with smiling eyes" character followed by 'y'. 907 // Test the "Grinning face with smiling eyes" character followed by 'y'.
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
1096 << "For case " << i << ": " << cases[i].text; 1126 << "For case " << i << ": " << cases[i].text;
1097 } 1127 }
1098 } 1128 }
1099 1129
1100 TEST_P(RenderTextTest, TruncatedObscuredText) { 1130 TEST_P(RenderTextTest, TruncatedObscuredText) {
1101 RenderText* render_text = GetRenderText(); 1131 RenderText* render_text = GetRenderText();
1102 render_text->set_truncate_length(3); 1132 render_text->set_truncate_length(3);
1103 render_text->SetObscured(true); 1133 render_text->SetObscured(true);
1104 render_text->SetText(WideToUTF16(L"abcdef")); 1134 render_text->SetText(WideToUTF16(L"abcdef"));
1105 EXPECT_EQ(WideToUTF16(L"abcdef"), render_text->text()); 1135 EXPECT_EQ(WideToUTF16(L"abcdef"), render_text->text());
1106 EXPECT_EQ(WideToUTF16(L"**\x2026"), render_text->GetDisplayText()); 1136 EXPECT_EQ(GetObscuredString(3, 2, 0x2026), render_text->GetDisplayText());
1107 } 1137 }
1108 1138
1109 // TODO(asvitkine): RenderTextMac cursor movements. http://crbug.com/131618 1139 // TODO(asvitkine): RenderTextMac cursor movements. http://crbug.com/131618
1110 TEST_P(RenderTextHarfBuzzTest, TruncatedCursorMovementLTR) { 1140 TEST_P(RenderTextHarfBuzzTest, TruncatedCursorMovementLTR) {
1111 RenderText* render_text = GetRenderText(); 1141 RenderText* render_text = GetRenderText();
1112 render_text->set_truncate_length(2); 1142 render_text->set_truncate_length(2);
1113 render_text->SetText(WideToUTF16(L"abcd")); 1143 render_text->SetText(WideToUTF16(L"abcd"));
1114 1144
1115 EXPECT_EQ(SelectionModel(0, CURSOR_BACKWARD), render_text->selection_model()); 1145 EXPECT_EQ(SelectionModel(0, CURSOR_BACKWARD), render_text->selection_model());
1116 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, SELECTION_NONE); 1146 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, SELECTION_NONE);
(...skipping 2947 matching lines...) Expand 10 before | Expand all | Expand 10 after
4064 ::testing::Values(RENDER_TEXT_HARFBUZZ), 4094 ::testing::Values(RENDER_TEXT_HARFBUZZ),
4065 PrintRenderTextBackend()); 4095 PrintRenderTextBackend());
4066 #endif 4096 #endif
4067 4097
4068 INSTANTIATE_TEST_CASE_P(, 4098 INSTANTIATE_TEST_CASE_P(,
4069 RenderTextHarfBuzzTest, 4099 RenderTextHarfBuzzTest,
4070 ::testing::Values(RENDER_TEXT_HARFBUZZ), 4100 ::testing::Values(RENDER_TEXT_HARFBUZZ),
4071 PrintRenderTextBackend()); 4101 PrintRenderTextBackend());
4072 4102
4073 } // namespace gfx 4103 } // namespace gfx
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698