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 }; |