Commit 2e19203e authored by Yoshifumi Inoue's avatar Yoshifumi Inoue Committed by Commit Bot

Make ComputePositionForNodeRemoval() to work correctly for after node/children position

This patch changes |ComputePositionForNodeRemoval()| to work correctly
for after node/children position to make |SelectionEditor| relocates
base and extent positions correctly.

Before this patch |ComputePositionForNodeRemoval()| returns position
after removed node as child index in parent, e.g. parent@child+1.
After this patch |ComputePositionForNodeRemoval()| returns parent@child.

Example:
<div><a></a><b></b></div>
remove <a>
<div><b></b></div>

When removing <a>, position after <a> should be relocated to <div>@0.

Bug: 1145595
Change-Id: Ibd5f30b52cb10ba066dfeca3fbf9f1d5bef6c77b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2558123
Auto-Submit: Yoshifumi Inoue <yosin@chromium.org>
Reviewed-by: default avatarKoji Ishii <kojii@chromium.org>
Commit-Queue: Koji Ishii <kojii@chromium.org>
Commit-Queue: Yoshifumi Inoue <yosin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#830898}
parent 6c6ce62e
...@@ -1405,7 +1405,7 @@ Position ComputePositionForNodeRemoval(const Position& position, ...@@ -1405,7 +1405,7 @@ Position ComputePositionForNodeRemoval(const Position& position,
!node.IsShadowIncludingInclusiveAncestorOf(*container_node)) { !node.IsShadowIncludingInclusiveAncestorOf(*container_node)) {
return position; return position;
} }
return Position::InParentAfterNode(node); return Position::InParentBeforeNode(node);
case PositionAnchorType::kOffsetInAnchor: case PositionAnchorType::kOffsetInAnchor:
container_node = position.ComputeContainerNode(); container_node = position.ComputeContainerNode();
if (container_node == node.parentNode() && if (container_node == node.parentNode() &&
...@@ -1423,7 +1423,7 @@ Position ComputePositionForNodeRemoval(const Position& position, ...@@ -1423,7 +1423,7 @@ Position ComputePositionForNodeRemoval(const Position& position,
if (!anchor_node || if (!anchor_node ||
!node.IsShadowIncludingInclusiveAncestorOf(*anchor_node)) !node.IsShadowIncludingInclusiveAncestorOf(*anchor_node))
return position; return position;
return Position::InParentAfterNode(node); return Position::InParentBeforeNode(node);
case PositionAnchorType::kBeforeAnchor: case PositionAnchorType::kBeforeAnchor:
anchor_node = position.AnchorNode(); anchor_node = position.AnchorNode();
if (!anchor_node || if (!anchor_node ||
......
...@@ -274,7 +274,8 @@ PositionWithAffinity PositionRespectingEditingBoundary( ...@@ -274,7 +274,8 @@ PositionWithAffinity PositionRespectingEditingBoundary(
// <editable>|<non-editable>abc</non-editable></editable> // <editable>|<non-editable>abc</non-editable></editable>
PositionWithAffinity AdjustForEditingBoundary(const PositionWithAffinity&); PositionWithAffinity AdjustForEditingBoundary(const PositionWithAffinity&);
Position ComputePositionForNodeRemoval(const Position&, const Node&); CORE_EXPORT Position ComputePositionForNodeRemoval(const Position&,
const Node&);
// TODO(editing-dev): These two functions should be eliminated. // TODO(editing-dev): These two functions should be eliminated.
CORE_EXPORT Position PositionBeforeNode(const Node&); CORE_EXPORT Position PositionBeforeNode(const Node&);
......
...@@ -12,6 +12,23 @@ namespace blink { ...@@ -12,6 +12,23 @@ namespace blink {
class EditingUtilitiesTest : public EditingTestBase {}; class EditingUtilitiesTest : public EditingTestBase {};
TEST_F(EditingUtilitiesTest, ComputePositionForNodeRemovalAfterChildren) {
SetBodyContent("<div id=a><p id=b><img id=c></p></div>");
const Position position = Position::LastPositionInNode(*GetElementById("c"));
// Simulate <p> will be removed.
EXPECT_EQ(Position(*GetElementById("a"), 0),
ComputePositionForNodeRemoval(position, *GetElementById("b")));
}
TEST_F(EditingUtilitiesTest, ComputePositionForNodeRemovalAfterNode) {
// "editing/deleting/delete-start-block.html" hits this case.
SetBodyContent("<div id=a><p id=b><img id=c></p></div>");
const Position position = Position::AfterNode(*GetElementById("c"));
// Simulate <p> will be removed.
EXPECT_EQ(Position(*GetElementById("a"), 0),
ComputePositionForNodeRemoval(position, *GetElementById("b")));
}
TEST_F(EditingUtilitiesTest, DirectionOfEnclosingBlockOf) { TEST_F(EditingUtilitiesTest, DirectionOfEnclosingBlockOf) {
const char* body_content = const char* body_content =
"<p id='host'><b id='one'></b><b id='two'>22</b></p>"; "<p id='host'><b id='one'></b><b id='two'>22</b></p>";
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment