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

Unified Diff: ui/views/controls/label_unittest.cc

Issue 2903193003: MacViews: Tweak kDragToEndIfOutsideVerticalBounds for single line fields. (Closed)
Patch Set: respond to comments Created 3 years, 7 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/gfx/render_text_harfbuzz.cc ('k') | ui/views/controls/textfield/textfield_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/views/controls/label_unittest.cc
diff --git a/ui/views/controls/label_unittest.cc b/ui/views/controls/label_unittest.cc
index 8fb2773e884b36b2a72592863d306c8ec8f3746b..6f6927a1d0b78f531721de1647b0ec4ba6586002 100644
--- a/ui/views/controls/label_unittest.cc
+++ b/ui/views/controls/label_unittest.cc
@@ -99,6 +99,18 @@ std::string SecondaryUiModeToString(
return info.param == SecondaryUiMode::MD ? "MD" : "NonMD";
}
+// Makes an RTL string by mapping 0..6 to [א,ב,ג,ד,ה,ו,ז].
+base::string16 ToRTL(const char* ascii) {
+ base::string16 rtl;
+ for (const char* c = ascii; *c; ++c) {
+ if (*c >= '0' && *c <= '6')
+ rtl += L'\x5d0' + (*c - '0');
+ else
+ rtl += static_cast<base::string16::value_type>(*c);
+ }
+ return rtl;
+}
+
} // namespace
class LabelTest : public ViewsTestBase {
@@ -149,6 +161,14 @@ class LabelTest : public ViewsTestBase {
// Test fixture for text selection related tests.
class LabelSelectionTest : public LabelTest {
public:
+ // Alias this long identifier for more readable tests.
+ static constexpr bool kExtends =
+ gfx::RenderText::kDragToEndIfOutsideVerticalBounds;
+
+ // Some tests use cardinal directions to index an array of points above and
+ // below the label in either visual direction.
+ enum { NW, NORTH, NE, SE, SOUTH, SW };
+
LabelSelectionTest() {}
// LabelTest overrides:
@@ -1034,47 +1054,147 @@ TEST_F(LabelSelectionTest, MouseDragMultilineLTR) {
PerformMouseDragTo(gfx::Point(100, GetCursorPoint(6).y()));
EXPECT_STR_EQ("cd\nefgh", GetSelectedText());
- PerformMouseDragTo(gfx::Point(GetCursorPoint(3).x(), -5));
- EXPECT_STR_EQ(gfx::RenderText::kDragToEndIfOutsideVerticalBounds ? "ab" : "c",
- GetSelectedText());
+ const gfx::Point points[] = {
+ {GetCursorPoint(1).x(), -5}, // NW.
+ {GetCursorPoint(2).x(), -5}, // NORTH.
+ {GetCursorPoint(3).x(), -5}, // NE.
+ {GetCursorPoint(8).x(), 100}, // SE.
+ {GetCursorPoint(7).x(), 100}, // SOUTH.
+ {GetCursorPoint(6).x(), 100}, // SW.
+ };
+ constexpr const char* kExtendLeft = "ab";
+ constexpr const char* kExtendRight = "cd\nefgh";
+
+ // For multiline, N* extends left, S* extends right.
+ PerformMouseDragTo(points[NW]);
+ EXPECT_STR_EQ(kExtends ? kExtendLeft : "b", GetSelectedText());
+ PerformMouseDragTo(points[NORTH]);
+ EXPECT_STR_EQ(kExtends ? kExtendLeft : "", GetSelectedText());
+ PerformMouseDragTo(points[NE]);
+ EXPECT_STR_EQ(kExtends ? kExtendLeft : "c", GetSelectedText());
+ PerformMouseDragTo(points[SE]);
+ EXPECT_STR_EQ(kExtends ? kExtendRight : "cd\nefg", GetSelectedText());
+ PerformMouseDragTo(points[SOUTH]);
+ EXPECT_STR_EQ(kExtends ? kExtendRight : "cd\nef", GetSelectedText());
+ PerformMouseDragTo(points[SW]);
+ EXPECT_STR_EQ(kExtends ? kExtendRight : "cd\ne", GetSelectedText());
+}
- PerformMouseDragTo(gfx::Point(GetCursorPoint(7).x(), 100));
- EXPECT_STR_EQ(gfx::RenderText::kDragToEndIfOutsideVerticalBounds ? "cd\nefgh"
- : "cd\nef",
- GetSelectedText());
+// Single line fields consider the x offset as well. Ties go to the right.
+TEST_F(LabelSelectionTest, MouseDragSingleLineLTR) {
+ label()->SetText(ASCIIToUTF16("abcdef"));
+ label()->SizeToPreferredSize();
+ ASSERT_TRUE(label()->SetSelectable(true));
+ PerformMousePress(GetCursorPoint(2));
+ const gfx::Point points[] = {
+ {GetCursorPoint(1).x(), -5}, // NW.
+ {GetCursorPoint(2).x(), -5}, // NORTH.
+ {GetCursorPoint(3).x(), -5}, // NE.
+ {GetCursorPoint(3).x(), 100}, // SE.
+ {GetCursorPoint(2).x(), 100}, // SOUTH.
+ {GetCursorPoint(1).x(), 100}, // SW.
+ };
+ constexpr const char* kExtendLeft = "ab";
+ constexpr const char* kExtendRight = "cdef";
+
+ // For single line, western directions extend left, all others extend right.
+ PerformMouseDragTo(points[NW]);
+ EXPECT_STR_EQ(kExtends ? kExtendLeft : "b", GetSelectedText());
+ PerformMouseDragTo(points[NORTH]);
+ EXPECT_STR_EQ(kExtends ? kExtendRight : "", GetSelectedText());
+ PerformMouseDragTo(points[NE]);
+ EXPECT_STR_EQ(kExtends ? kExtendRight : "c", GetSelectedText());
+ PerformMouseDragTo(points[SE]);
+ EXPECT_STR_EQ(kExtends ? kExtendRight : "c", GetSelectedText());
+ PerformMouseDragTo(points[SOUTH]);
+ EXPECT_STR_EQ(kExtends ? kExtendRight : "", GetSelectedText());
+ PerformMouseDragTo(points[SW]);
+ EXPECT_STR_EQ(kExtends ? kExtendLeft : "b", GetSelectedText());
}
TEST_F(LabelSelectionTest, MouseDragMultilineRTL) {
label()->SetMultiLine(true);
- label()->SetText(WideToUTF16(L"\x5d0\x5d1\x5d2\n\x5d3\x5d4\x5d5"));
+ label()->SetText(ToRTL("012\n345"));
+ // Sanity check.
+ EXPECT_EQ(WideToUTF16(L"\x5d0\x5d1\x5d2\n\x5d3\x5d4\x5d5"), label()->text());
+
label()->SizeToPreferredSize();
ASSERT_TRUE(label()->SetSelectable(true));
ASSERT_EQ(2u, GetLineCount());
- PerformMousePress(GetCursorPoint(1));
+ PerformMousePress(GetCursorPoint(1)); // Note: RTL drag starts at 1, not 2.
PerformMouseDragTo(GetCursorPoint(0));
- EXPECT_EQ(WideToUTF16(L"\x5d0"), GetSelectedText());
+ EXPECT_EQ(ToRTL("0"), GetSelectedText());
PerformMouseDragTo(GetCursorPoint(6));
- EXPECT_EQ(WideToUTF16(L"\x5d1\x5d2\n\x5d3\x5d4"), GetSelectedText());
+ EXPECT_EQ(ToRTL("12\n34"), GetSelectedText());
PerformMouseDragTo(gfx::Point(-5, GetCursorPoint(6).y()));
- EXPECT_EQ(WideToUTF16(L"\x5d1\x5d2\n\x5d3\x5d4\x5d5"), GetSelectedText());
+ EXPECT_EQ(ToRTL("12\n345"), GetSelectedText());
PerformMouseDragTo(gfx::Point(100, GetCursorPoint(6).y()));
- EXPECT_EQ(WideToUTF16(L"\x5d1\x5d2\n"), GetSelectedText());
-
- PerformMouseDragTo(gfx::Point(GetCursorPoint(2).x(), -5));
- EXPECT_EQ(gfx::RenderText::kDragToEndIfOutsideVerticalBounds
- ? WideToUTF16(L"\x5d0")
- : WideToUTF16(L"\x5d1"),
- GetSelectedText());
-
- PerformMouseDragTo(gfx::Point(GetCursorPoint(6).x(), 100));
- EXPECT_EQ(gfx::RenderText::kDragToEndIfOutsideVerticalBounds
- ? WideToUTF16(L"\x5d1\x5d2\n\x5d3\x5d4\x5d5")
- : WideToUTF16(L"\x5d1\x5d2\n\x5d3\x5d4"),
- GetSelectedText());
+ EXPECT_EQ(ToRTL("12\n"), GetSelectedText());
+
+ const gfx::Point points[] = {
+ {GetCursorPoint(2).x(), -5}, // NW: Now towards the end of the string.
+ {GetCursorPoint(1).x(), -5}, // NORTH,
+ {GetCursorPoint(0).x(), -5}, // NE: Towards the start.
+ {GetCursorPoint(4).x(), 100}, // SE.
+ {GetCursorPoint(5).x(), 100}, // SOUTH.
+ {GetCursorPoint(6).x(), 100}, // SW.
+ };
+
+ // Visual right, so to the beginning of the string for RTL.
+ const base::string16 extend_right = ToRTL("0");
+ const base::string16 extend_left = ToRTL("12\n345");
+
+ // For multiline, N* extends right, S* extends left.
+ PerformMouseDragTo(points[NW]);
+ EXPECT_EQ(kExtends ? extend_right : ToRTL("1"), GetSelectedText());
+ PerformMouseDragTo(points[NORTH]);
+ EXPECT_EQ(kExtends ? extend_right : ToRTL(""), GetSelectedText());
+ PerformMouseDragTo(points[NE]);
+ EXPECT_EQ(kExtends ? extend_right : ToRTL("0"), GetSelectedText());
+ PerformMouseDragTo(points[SE]);
+ EXPECT_EQ(kExtends ? extend_left : ToRTL("12\n"), GetSelectedText());
+ PerformMouseDragTo(points[SOUTH]);
+ EXPECT_EQ(kExtends ? extend_left : ToRTL("12\n3"), GetSelectedText());
+ PerformMouseDragTo(points[SW]);
+ EXPECT_EQ(kExtends ? extend_left : ToRTL("12\n34"), GetSelectedText());
+}
+
+TEST_F(LabelSelectionTest, MouseDragSingleLineRTL) {
+ label()->SetText(ToRTL("0123456"));
+ label()->SizeToPreferredSize();
+ ASSERT_TRUE(label()->SetSelectable(true));
+
+ PerformMousePress(GetCursorPoint(1));
+ const gfx::Point points[] = {
+ {GetCursorPoint(2).x(), -5}, // NW.
+ {GetCursorPoint(1).x(), -5}, // NORTH.
+ {GetCursorPoint(0).x(), -5}, // NE.
+ {GetCursorPoint(0).x(), 100}, // SE.
+ {GetCursorPoint(1).x(), 100}, // SOUTH.
+ {GetCursorPoint(2).x(), 100}, // SW.
+ };
+
+ // Visual right, so to the beginning of the string for RTL.
+ const base::string16 extend_right = ToRTL("0");
+ const base::string16 extend_left = ToRTL("123456");
+
+ // For single line, western directions extend left, all others extend right.
+ PerformMouseDragTo(points[NW]);
+ EXPECT_EQ(kExtends ? extend_left : ToRTL("1"), GetSelectedText());
+ PerformMouseDragTo(points[NORTH]);
+ EXPECT_EQ(kExtends ? extend_right : ToRTL(""), GetSelectedText());
+ PerformMouseDragTo(points[NE]);
+ EXPECT_EQ(kExtends ? extend_right : ToRTL("0"), GetSelectedText());
+ PerformMouseDragTo(points[SE]);
+ EXPECT_EQ(kExtends ? extend_right : ToRTL("0"), GetSelectedText());
+ PerformMouseDragTo(points[SOUTH]);
+ EXPECT_EQ(kExtends ? extend_right : ToRTL(""), GetSelectedText());
+ PerformMouseDragTo(points[SW]);
+ EXPECT_EQ(kExtends ? extend_left : ToRTL("1"), GetSelectedText());
}
// Verify the initially selected word on a double click, remains selected on
« no previous file with comments | « ui/gfx/render_text_harfbuzz.cc ('k') | ui/views/controls/textfield/textfield_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698