| Index: Source/core/editing/VisibleUnits.cpp
|
| diff --git a/Source/core/editing/VisibleUnits.cpp b/Source/core/editing/VisibleUnits.cpp
|
| index 88b7d3ec67f5fd222c3ad2ac90b1032d6e3ee68b..db73057e3293e2946b78262100fa9b1062e156f5 100644
|
| --- a/Source/core/editing/VisibleUnits.cpp
|
| +++ b/Source/core/editing/VisibleUnits.cpp
|
| @@ -455,6 +455,30 @@ VisiblePosition rightWordPosition(const VisiblePosition& visiblePosition, bool s
|
| return rightWordBreak;
|
| }
|
|
|
| +template <typename Strategy>
|
| +static ContainerNode* nonShadowBoundaryParentNode(Node* node)
|
| +{
|
| + ContainerNode* parent = Strategy::parent(*node);
|
| + return parent && !parent->isShadowRoot() ? parent : nullptr;
|
| +}
|
| +
|
| +template <typename Strategy>
|
| +static Node* parentEditingBoundary(const PositionAlgorithm<Strategy>& position)
|
| +{
|
| + Node* const anchorNode = position.anchorNode();
|
| + if (!anchorNode)
|
| + return nullptr;
|
| +
|
| + Node* documentElement = anchorNode->document().documentElement();
|
| + if (!documentElement)
|
| + return nullptr;
|
| +
|
| + Node* boundary = position.computeContainerNode();
|
| + while (boundary != documentElement && nonShadowBoundaryParentNode<Strategy>(boundary) && anchorNode->hasEditableStyle() == Strategy::parent(*boundary)->hasEditableStyle())
|
| + boundary = nonShadowBoundaryParentNode<Strategy>(boundary);
|
| +
|
| + return boundary;
|
| +}
|
|
|
| enum BoundarySearchContextAvailability { DontHaveMoreContext, MayHaveMoreContext };
|
|
|
|
|