| Index: ui/views/controls/label_unittest.cc
|
| diff --git a/ui/views/controls/label_unittest.cc b/ui/views/controls/label_unittest.cc
|
| index e8fa4f95826e023d4e6d235e6fba9b914a11d2cb..094c3365a739fed6ea7abdc1901c3b6e081450ff 100644
|
| --- a/ui/views/controls/label_unittest.cc
|
| +++ b/ui/views/controls/label_unittest.cc
|
| @@ -28,6 +28,7 @@
|
| #include "ui/views/widget/widget.h"
|
|
|
| using base::ASCIIToUTF16;
|
| +using base::WideToUTF16;
|
|
|
| #define EXPECT_STR_EQ(ascii, utf16) EXPECT_EQ(ASCIIToUTF16(ascii), utf16)
|
|
|
| @@ -179,12 +180,30 @@ class LabelSelectionTest : public LabelTest {
|
| label()->OnMouseDragged(drag);
|
| }
|
|
|
| - gfx::Point GetCursorPoint(int cursor_pos) {
|
| - return label()
|
| - ->GetRenderTextForSelectionController()
|
| - ->GetCursorBounds(gfx::SelectionModel(cursor_pos, gfx::CURSOR_FORWARD),
|
| - false)
|
| - .origin();
|
| + // Used to force layout on the underlying RenderText instance.
|
| + void SimulatePaint() {
|
| + gfx::Canvas canvas;
|
| + label()->OnPaint(&canvas);
|
| + }
|
| +
|
| + gfx::Point GetCursorPoint(int index) {
|
| + SimulatePaint();
|
| + gfx::RenderText* render_text =
|
| + label()->GetRenderTextForSelectionController();
|
| + const std::vector<gfx::Rect> bounds =
|
| + render_text->GetSubstringBoundsForTesting(gfx::Range(index, index + 1));
|
| + DCHECK_EQ(1u, bounds.size());
|
| +
|
| + const bool rtl =
|
| + render_text->GetDisplayTextDirection() == base::i18n::RIGHT_TO_LEFT;
|
| + // Return Point corresponding to the leading edge of the character.
|
| + return gfx::Point(rtl ? bounds[0].right() - 1 : bounds[0].x() + 1,
|
| + bounds[0].y() + bounds[0].height() / 2);
|
| + }
|
| +
|
| + size_t GetLineCount() {
|
| + SimulatePaint();
|
| + return label()->GetRenderTextForSelectionController()->GetNumLines();
|
| }
|
|
|
| base::string16 GetSelectedText() { return label()->GetSelectedText(); }
|
| @@ -820,13 +839,9 @@ TEST_F(LabelSelectionTest, Selectable) {
|
| ASSERT_TRUE(label()->SetSelectable(true));
|
| EXPECT_TRUE(label()->selectable());
|
|
|
| - // Verify that making a label multiline causes the label to not support text
|
| + // Verify that making a label multiline still causes the label to support text
|
| // selection.
|
| label()->SetMultiLine(true);
|
| - EXPECT_FALSE(label()->selectable());
|
| -
|
| - label()->SetMultiLine(false);
|
| - ASSERT_TRUE(label()->SetSelectable(true));
|
| EXPECT_TRUE(label()->selectable());
|
|
|
| // Verify that obscuring the label text causes the label to not support text
|
| @@ -886,19 +901,19 @@ TEST_F(LabelSelectionTest, DoubleTripleClick) {
|
| label()->SizeToPreferredSize();
|
| ASSERT_TRUE(label()->SetSelectable(true));
|
|
|
| - PerformClick(gfx::Point());
|
| + PerformClick(GetCursorPoint(0));
|
| EXPECT_TRUE(GetSelectedText().empty());
|
|
|
| // Double clicking should select the word under cursor.
|
| - PerformClick(gfx::Point(), ui::EF_IS_DOUBLE_CLICK);
|
| + PerformClick(GetCursorPoint(0), ui::EF_IS_DOUBLE_CLICK);
|
| EXPECT_STR_EQ("Label", GetSelectedText());
|
|
|
| // Triple clicking should select all the text.
|
| - PerformClick(gfx::Point());
|
| + PerformClick(GetCursorPoint(0));
|
| EXPECT_EQ(label()->text(), GetSelectedText());
|
|
|
| // Clicking again should alternate to double click.
|
| - PerformClick(gfx::Point());
|
| + PerformClick(GetCursorPoint(0));
|
| EXPECT_STR_EQ("Label", GetSelectedText());
|
|
|
| // Clicking at another location should clear the selection.
|
| @@ -915,20 +930,83 @@ TEST_F(LabelSelectionTest, MouseDrag) {
|
| ASSERT_TRUE(label()->SetSelectable(true));
|
|
|
| PerformMousePress(GetCursorPoint(5));
|
| - PerformMouseDragTo(gfx::Point());
|
| + PerformMouseDragTo(GetCursorPoint(0));
|
| EXPECT_STR_EQ("Label", GetSelectedText());
|
|
|
| PerformMouseDragTo(GetCursorPoint(8));
|
| EXPECT_STR_EQ(" mo", GetSelectedText());
|
|
|
| - PerformMouseDragTo(gfx::Point(200, 0));
|
| - PerformMouseRelease(gfx::Point(200, 0));
|
| + PerformMouseDragTo(gfx::Point(200, GetCursorPoint(0).y()));
|
| + PerformMouseRelease(gfx::Point(200, GetCursorPoint(0).y()));
|
| EXPECT_STR_EQ(" mouse drag", GetSelectedText());
|
|
|
| event_generator()->PressKey(ui::VKEY_C, kControlCommandModifier);
|
| EXPECT_STR_EQ(" mouse drag", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE));
|
| }
|
|
|
| +TEST_F(LabelSelectionTest, MouseDragMultilineLTR) {
|
| + label()->SetMultiLine(true);
|
| + label()->SetText(ASCIIToUTF16("abcd\nefgh"));
|
| + label()->SizeToPreferredSize();
|
| + ASSERT_TRUE(label()->SetSelectable(true));
|
| + ASSERT_EQ(2u, GetLineCount());
|
| +
|
| + PerformMousePress(GetCursorPoint(2));
|
| + PerformMouseDragTo(GetCursorPoint(0));
|
| + EXPECT_STR_EQ("ab", GetSelectedText());
|
| +
|
| + PerformMouseDragTo(GetCursorPoint(7));
|
| + EXPECT_STR_EQ("cd\nef", GetSelectedText());
|
| +
|
| + PerformMouseDragTo(gfx::Point(-5, GetCursorPoint(6).y()));
|
| + EXPECT_STR_EQ("cd\n", GetSelectedText());
|
| +
|
| + 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());
|
| +
|
| + PerformMouseDragTo(gfx::Point(GetCursorPoint(7).x(), 100));
|
| + EXPECT_STR_EQ(gfx::RenderText::kDragToEndIfOutsideVerticalBounds ? "cd\nefgh"
|
| + : "cd\nef",
|
| + GetSelectedText());
|
| +}
|
| +
|
| +TEST_F(LabelSelectionTest, MouseDragMultilineRTL) {
|
| + label()->SetMultiLine(true);
|
| + label()->SetText(WideToUTF16(L"\x5d0\x5d1\x5d2\n\x5d3\x5d4\x5d5"));
|
| + label()->SizeToPreferredSize();
|
| + ASSERT_TRUE(label()->SetSelectable(true));
|
| + ASSERT_EQ(2u, GetLineCount());
|
| +
|
| + PerformMousePress(GetCursorPoint(1));
|
| + PerformMouseDragTo(GetCursorPoint(0));
|
| + EXPECT_EQ(WideToUTF16(L"\x5d0"), GetSelectedText());
|
| +
|
| + PerformMouseDragTo(GetCursorPoint(6));
|
| + EXPECT_EQ(WideToUTF16(L"\x5d1\x5d2\n\x5d3\x5d4"), GetSelectedText());
|
| +
|
| + PerformMouseDragTo(gfx::Point(-5, GetCursorPoint(6).y()));
|
| + EXPECT_EQ(WideToUTF16(L"\x5d1\x5d2\n\x5d3\x5d4\x5d5"), 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());
|
| +}
|
| +
|
| // Verify the initially selected word on a double click, remains selected on
|
| // mouse dragging.
|
| TEST_F(LabelSelectionTest, MouseDragWord) {
|
| @@ -940,11 +1018,11 @@ TEST_F(LabelSelectionTest, MouseDragWord) {
|
| PerformMousePress(GetCursorPoint(8), ui::EF_IS_DOUBLE_CLICK);
|
| EXPECT_STR_EQ("drag", GetSelectedText());
|
|
|
| - PerformMouseDragTo(gfx::Point());
|
| + PerformMouseDragTo(GetCursorPoint(0));
|
| EXPECT_STR_EQ("Label drag", GetSelectedText());
|
|
|
| - PerformMouseDragTo(gfx::Point(200, 0));
|
| - PerformMouseRelease(gfx::Point(200, 0));
|
| + PerformMouseDragTo(gfx::Point(200, GetCursorPoint(0).y()));
|
| + PerformMouseRelease(gfx::Point(200, GetCursorPoint(0).y()));
|
| EXPECT_STR_EQ("drag word", GetSelectedText());
|
| }
|
|
|
| @@ -963,8 +1041,8 @@ TEST_F(LabelSelectionTest, SelectionClipboard) {
|
|
|
| // Verify text selection using the mouse updates the selection clipboard.
|
| PerformMousePress(GetCursorPoint(5));
|
| - PerformMouseDragTo(gfx::Point());
|
| - PerformMouseRelease(gfx::Point());
|
| + PerformMouseDragTo(GetCursorPoint(0));
|
| + PerformMouseRelease(GetCursorPoint(0));
|
| EXPECT_STR_EQ("Label", GetSelectedText());
|
| EXPECT_STR_EQ("Label", GetClipboardText(ui::CLIPBOARD_TYPE_SELECTION));
|
| }
|
|
|