Index: third_party/WebKit/Source/core/editing/VisibleUnits.cpp |
diff --git a/third_party/WebKit/Source/core/editing/VisibleUnits.cpp b/third_party/WebKit/Source/core/editing/VisibleUnits.cpp |
index 57dbb38ee7f74be217967fe113e58c6c2b01d9e5..7c2809e35f846f231247e184aebc15646c26fb92 100644 |
--- a/third_party/WebKit/Source/core/editing/VisibleUnits.cpp |
+++ b/third_party/WebKit/Source/core/editing/VisibleUnits.cpp |
@@ -2552,12 +2552,44 @@ LayoutRect localCaretRectOfPositionTemplate( |
boxPosition.offsetInBox); |
} |
+// This function was added because the selection rect is different from the |
+// caret rect. |
+template <typename Strategy> |
+LayoutRect localSelectionRectOfPositionTemplate( |
+ const PositionWithAffinityTemplate<Strategy>& position, |
+ LayoutObject*& layoutObject) { |
+ LayoutRect rect = localCaretRectOfPositionTemplate(position, layoutObject); |
+ |
+ if (rect.isEmpty()) |
+ return rect; |
+ |
+ InlineBoxPosition boxPosition = |
+ computeInlineBoxPosition(position.position(), position.affinity()); |
+ |
+ InlineTextBox* box = toInlineTextBox(boxPosition.inlineBox); |
+ if (layoutObject->style()->isHorizontalWritingMode()) { |
+ rect.setY(box->root().selectionTop()); |
+ rect.setHeight(box->root().selectionHeight()); |
+ } else { |
+ rect.setX(box->root().selectionTop()); |
+ rect.setWidth(box->root().selectionHeight()); |
+ } |
+ |
+ return rect; |
+} |
+ |
LayoutRect localCaretRectOfPosition(const PositionWithAffinity& position, |
LayoutObject*& layoutObject) { |
return localCaretRectOfPositionTemplate<EditingStrategy>(position, |
layoutObject); |
} |
+LayoutRect localSelectionRectOfPosition(const PositionWithAffinity& position, |
+ LayoutObject*& layoutObject) { |
+ return localSelectionRectOfPositionTemplate<EditingStrategy>(position, |
+ layoutObject); |
+} |
+ |
LayoutRect localCaretRectOfPosition( |
const PositionInFlatTreeWithAffinity& position, |
LayoutObject*& layoutObject) { |
@@ -3231,6 +3263,24 @@ IntRect absoluteCaretBoundsOf(const VisiblePosition& visiblePosition) { |
return absoluteCaretBoundsOfAlgorithm<EditingStrategy>(visiblePosition); |
} |
+template <typename Strategy> |
+static IntRect absoluteSelectionBoundsOfAlgorithm( |
+ const VisiblePositionTemplate<Strategy>& visiblePosition) { |
+ DCHECK(visiblePosition.isValid()) << visiblePosition; |
+ LayoutObject* layoutObject; |
+ LayoutRect localRect = localSelectionRectOfPosition( |
+ visiblePosition.toPositionWithAffinity(), layoutObject); |
+ if (localRect.isEmpty() || !layoutObject) |
+ return IntRect(); |
+ |
+ return layoutObject->localToAbsoluteQuad(FloatRect(localRect)) |
+ .enclosingBoundingBox(); |
+} |
+ |
+IntRect absoluteSelectionBoundsOf(const VisiblePosition& visiblePosition) { |
+ return absoluteSelectionBoundsOfAlgorithm<EditingStrategy>(visiblePosition); |
+} |
+ |
IntRect absoluteCaretBoundsOf( |
const VisiblePositionInFlatTree& visiblePosition) { |
return absoluteCaretBoundsOfAlgorithm<EditingInFlatTreeStrategy>( |