Index: Source/core/editing/FrameSelection.cpp |
diff --git a/Source/core/editing/FrameSelection.cpp b/Source/core/editing/FrameSelection.cpp |
index 7ec1edf67b601b83597f1cda6c78d0a412076d1c..74042571fa006b4096e13791eaf7629890203c2f 100644 |
--- a/Source/core/editing/FrameSelection.cpp |
+++ b/Source/core/editing/FrameSelection.cpp |
@@ -1180,6 +1180,28 @@ bool FrameSelection::modify(EAlteration alter, unsigned verticalDistance, Vertic |
return true; |
} |
+// Abs x/y position of the caret ignoring transforms. |
+// TODO(yosin) navigation with transforms should be smarter. |
+static int lineDirectionPointForBlockDirectionNavigationOf(const VisiblePosition& visiblePosition) |
+{ |
+ if (visiblePosition.isNull()) |
+ return 0; |
+ |
+ LayoutObject* layoutObject; |
+ LayoutRect localRect = localCaretRectOfPosition(visiblePosition.toPositionWithAffinity(), layoutObject); |
+ if (localRect.isEmpty() || !layoutObject) |
+ return 0; |
+ |
+ // This ignores transforms on purpose, for now. Vertical navigation is done |
+ // without consulting transforms, so that 'up' in transformed text is 'up' |
+ // relative to the text, not absolute 'up'. |
+ FloatPoint caretPoint = layoutObject->localToAbsolute(FloatPoint(localRect.location())); |
+ LayoutObject* containingBlock = layoutObject->containingBlock(); |
+ if (!containingBlock) |
+ containingBlock = layoutObject; // Just use ourselves to determine the writing mode if we have no containing block. |
+ return containingBlock->isHorizontalWritingMode() ? caretPoint.x() : caretPoint.y(); |
+} |
+ |
LayoutUnit FrameSelection::lineDirectionPointForBlockDirectionNavigation(EPositionType type) |
{ |
LayoutUnit x = 0; |