| 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
|
|
|