Commit a38ed2e9 authored by Yoshifumi Inoue's avatar Yoshifumi Inoue Committed by Commit Bot

Move code for adjusting selection start to avoid crossing editing boundaries to a function

This patch introduces |AdjustSelectionStartToAvoidCrossingEditingBoundaries()|
for moving code for adjusting selection end code from
|AdjustSelectionToAvoidCrossingEditingBoundaries()| to simplify it for improving
code readability.

This patch is a preparation of the patch[1] and similar to the patch[2].

[1] http://crrev.com/c/575297: Refactor
VisibleSelectionTemplate::AdjustSelectionToAvoidCrossingEditingBoundaries()
[2] http://crrev.com/577338: Move code for adjusting selection end to avoid
crossing editing boundaries to a function

Bug: 230267
Change-Id: I25e020af333983e0e797c21eff2d934d6a03a589
Reviewed-on: https://chromium-review.googlesource.com/576606Reviewed-by: default avatarYoichi Osato <yoichio@chromium.org>
Commit-Queue: Yoshifumi Inoue <yosin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#488105}
parent 42569737
...@@ -608,6 +608,40 @@ PositionTemplate<Strategy> AdjustSelectionEndToAvoidCrossingEditingBoundaries( ...@@ -608,6 +608,40 @@ PositionTemplate<Strategy> AdjustSelectionEndToAvoidCrossingEditingBoundaries(
return end; return end;
} }
// The selection starts in editable content or non-editable content inside a
// different editable ancestor, move forward until non-editable content inside
// the same lowest editable ancestor is reached.
template <typename Strategy>
PositionTemplate<Strategy> AdjustSelectionStartToAvoidCrossingEditingBoundaries(
const PositionTemplate<Strategy>& start,
ContainerNode* start_root,
Element* base_editable_ancestor) {
Element* const start_editable_ancestor =
LowestEditableAncestor(start.ComputeContainerNode());
if (start_root || start_editable_ancestor != base_editable_ancestor) {
PositionTemplate<Strategy> position = NextVisuallyDistinctCandidate(start);
Element* shadow_ancestor =
start_root ? start_root->OwnerShadowHost() : nullptr;
if (position.IsNull() && shadow_ancestor)
position = PositionTemplate<Strategy>::BeforeNode(*shadow_ancestor);
while (position.IsNotNull() &&
!(LowestEditableAncestor(position.ComputeContainerNode()) ==
base_editable_ancestor &&
!IsEditablePosition(position))) {
Element* root = RootEditableElementOf(position);
shadow_ancestor = root ? root->OwnerShadowHost() : nullptr;
position = IsAtomicNode(position.ComputeContainerNode())
? PositionTemplate<Strategy>::InParentAfterNode(
*position.ComputeContainerNode())
: NextVisuallyDistinctCandidate(position);
if (position.IsNull() && shadow_ancestor)
position = PositionTemplate<Strategy>::BeforeNode(*shadow_ancestor);
}
return CreateVisiblePosition(position).DeepEquivalent();
}
return start;
}
template <typename Strategy> template <typename Strategy>
void VisibleSelectionTemplate< void VisibleSelectionTemplate<
Strategy>::AdjustSelectionToAvoidCrossingEditingBoundaries() { Strategy>::AdjustSelectionToAvoidCrossingEditingBoundaries() {
...@@ -667,40 +701,14 @@ void VisibleSelectionTemplate< ...@@ -667,40 +701,14 @@ void VisibleSelectionTemplate<
return; return;
} }
// The selection starts in editable content or non-editable content inside a start_ = AdjustSelectionStartToAvoidCrossingEditingBoundaries(
// different editable ancestor, move forward until non-editable content start_, start_root, base_editable_ancestor);
// inside the same lowest editable ancestor is reached. if (start_.IsNull()) {
Element* start_editable_ancestor = // The selection crosses an Editing boundary. This is a
LowestEditableAncestor(start_.ComputeContainerNode()); // programmer error in the editing code. Happy debugging!
if (start_root || start_editable_ancestor != base_editable_ancestor) { NOTREACHED();
PositionTemplate<Strategy> p = NextVisuallyDistinctCandidate(start_); *this = VisibleSelectionTemplate<Strategy>();
Element* shadow_ancestor = return;
start_root ? start_root->OwnerShadowHost() : nullptr;
if (p.IsNull() && shadow_ancestor)
p = PositionTemplate<Strategy>::BeforeNode(*shadow_ancestor);
while (p.IsNotNull() &&
!(LowestEditableAncestor(p.ComputeContainerNode()) ==
base_editable_ancestor &&
!IsEditablePosition(p))) {
Element* root = RootEditableElementOf(p);
shadow_ancestor = root ? root->OwnerShadowHost() : nullptr;
p = IsAtomicNode(p.ComputeContainerNode())
? PositionTemplate<Strategy>::InParentAfterNode(
*p.ComputeContainerNode())
: NextVisuallyDistinctCandidate(p);
if (p.IsNull() && shadow_ancestor)
p = PositionTemplate<Strategy>::BeforeNode(*shadow_ancestor);
}
const VisiblePositionTemplate<Strategy> next = CreateVisiblePosition(p);
if (next.IsNull()) {
// The selection crosses an Editing boundary. This is a
// programmer error in the editing code. Happy debugging!
NOTREACHED();
*this = VisibleSelectionTemplate<Strategy>();
return;
}
start_ = next.DeepEquivalent();
} }
} }
} }
......
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