Skip to content

Commit

Permalink
[editing] Make PositionTemplate::LastPositionInOrAfterNode() not to m…
Browse files Browse the repository at this point in the history
…ake invalid position

This patch changes `PositionTemplate::LastPositionInOrAfterNode()`
not to call `PositionTemplate::AfterNode()` when specified `Node`
doesn't have parent `Node` which is invalid position.

Bug: 1248760
Change-Id: I5cab0b8a44975d51e32e42308acd717128713258
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3828389
Auto-Submit: Yoshifumi Inoue <yosin@chromium.org>
Commit-Queue: Kent Tamura <tkent@chromium.org>
Reviewed-by: Kent Tamura <tkent@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1034938}
  • Loading branch information
yosinch authored and Chromium LUCI CQ committed Aug 15, 2022
1 parent d5d9acb commit e3b5128
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 2 deletions.
5 changes: 3 additions & 2 deletions third_party/blink/renderer/core/editing/position.cc
Original file line number Diff line number Diff line change
Expand Up @@ -577,8 +577,9 @@ PositionTemplate<Strategy>::FirstPositionInOrBeforeNode(const Node& node) {
template <typename Strategy>
PositionTemplate<Strategy>
PositionTemplate<Strategy>::LastPositionInOrAfterNode(const Node& node) {
return EditingIgnoresContent(node) ? AfterNode(node)
: LastPositionInNode(node);
return EditingIgnoresContent(node) && Strategy::Parent(node)
? AfterNode(node)
: LastPositionInNode(node);
}

PositionInFlatTree ToPositionInFlatTree(const Position& pos) {
Expand Down
19 changes: 19 additions & 0 deletions third_party/blink/renderer/core/editing/position_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,25 @@ TEST_F(PositionTest, editingPositionOfWithEditingIgnoresContent) {
Position::EditingPositionOf(textarea, 3));
}

// http://crbug.com/1248760
TEST_F(PositionTest, LastPositionInOrAfterNodeNotInFlatTree) {
SetBodyContent("<option><select>A</select></option>");
const Element& document_element = *GetDocument().documentElement();
const Element& select = *GetDocument().QuerySelector("select");

EXPECT_EQ(Position::LastPositionInNode(document_element),
Position::LastPositionInOrAfterNode(document_element));
EXPECT_EQ(PositionInFlatTree::LastPositionInNode(document_element),
PositionInFlatTree::LastPositionInOrAfterNode(document_element));

// Note: <select> isn't appeared in flat tree, because <option> doesn't
// take it as valid child node.
EXPECT_EQ(Position::AfterNode(select),
Position::LastPositionInOrAfterNode(select));
EXPECT_EQ(PositionInFlatTree::LastPositionInNode(select),
PositionInFlatTree::LastPositionInOrAfterNode(select));
}

TEST_F(PositionTest, NodeAsRangeLastNode) {
const char* body_content =
"<p id='p1'>11</p><p id='p2'></p><p id='p3'>33</p>";
Expand Down

0 comments on commit e3b5128

Please sign in to comment.