| 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>(
|
|
|