summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xfa/fde/cfde_texteditengine.cpp14
-rw-r--r--xfa/fde/cfde_texteditengine_unittest.cpp11
2 files changed, 22 insertions, 3 deletions
diff --git a/xfa/fde/cfde_texteditengine.cpp b/xfa/fde/cfde_texteditengine.cpp
index fd5b10119b..1b6e29de08 100644
--- a/xfa/fde/cfde_texteditengine.cpp
+++ b/xfa/fde/cfde_texteditengine.cpp
@@ -937,8 +937,18 @@ size_t CFDE_TextEditEngine::GetIndexForPoint(const CFX_PointF& point) {
// afterwards. Return the position after the the last character.
// The last line has nCount equal to the number of characters + 1 (sentinel
// character maybe?). Restrict to the text_length_ to account for that.
- return std::min(static_cast<size_t>(start_it->nStart + start_it->nCount),
- text_length_);
+ size_t pos = std::min(
+ static_cast<size_t>(start_it->nStart + start_it->nCount), text_length_);
+
+ // The line is not the last one and it was broken right after a space, the
+ // cursor should not be placed after the space, but before it. If the
+ // cursor is moved after the space, it goes to the beginning of the next
+ // line.
+ bool is_last_line = (std::next(start_it) == text_piece_info_.end());
+ if (!is_last_line && pos > 0 && GetChar(pos - 1) == L' ')
+ --pos;
+
+ return pos;
}
if (start_it == text_piece_info_.end())
diff --git a/xfa/fde/cfde_texteditengine_unittest.cpp b/xfa/fde/cfde_texteditengine_unittest.cpp
index 7ae001af91..bd74868438 100644
--- a/xfa/fde/cfde_texteditengine_unittest.cpp
+++ b/xfa/fde/cfde_texteditengine_unittest.cpp
@@ -427,11 +427,20 @@ TEST_F(CFDE_TextEditEngineTest, GetIndexForPointMultiline) {
L"getting indexes on multi-line edits.");
EXPECT_EQ(0U, engine()->GetIndexForPoint({0.0f, 0.0f}));
EXPECT_EQ(87U, engine()->GetIndexForPoint({999999.0f, 9999999.0f}));
- EXPECT_EQ(12U, engine()->GetIndexForPoint({999999.0f, 0.0f}));
+ EXPECT_EQ(11U, engine()->GetIndexForPoint({999999.0f, 0.0f}));
+ EXPECT_EQ(12U, engine()->GetIndexForPoint({1.0f, 10.0f}));
EXPECT_EQ(1U, engine()->GetIndexForPoint({5.0f, 5.0f}));
EXPECT_EQ(2U, engine()->GetIndexForPoint({10.0f, 5.0f}));
}
+TEST_F(CFDE_TextEditEngineTest, GetIndexForPointSpaceAtEnd) {
+ engine()->SetFontSize(10.0f);
+ engine()->Insert(0, L"Hello World ");
+ EXPECT_EQ(0U, engine()->GetIndexForPoint({0.0f, 0.0f}));
+ EXPECT_EQ(12U, engine()->GetIndexForPoint({999999.0f, 9999999.0f}));
+ EXPECT_EQ(12U, engine()->GetIndexForPoint({999999.0f, 0.0f}));
+}
+
TEST_F(CFDE_TextEditEngineTest, BoundsForWordAt) {
size_t start_idx;
size_t count;