| Index: third_party/WebKit/Source/core/editing/RenderedPosition.cpp
|
| diff --git a/third_party/WebKit/Source/core/editing/RenderedPosition.cpp b/third_party/WebKit/Source/core/editing/RenderedPosition.cpp
|
| index bf29056c014f909003ea9974eee3937a840c95c0..09e517259239d49d1e35181bda7445da5230395b 100644
|
| --- a/third_party/WebKit/Source/core/editing/RenderedPosition.cpp
|
| +++ b/third_party/WebKit/Source/core/editing/RenderedPosition.cpp
|
| @@ -265,6 +265,41 @@ IntRect RenderedPosition::absoluteRect(
|
| .enclosingBoundingBox();
|
| }
|
|
|
| +// Convert a local point into the coordinate system of backing coordinates.
|
| +// Also returns the backing layer if needed.
|
| +FloatPoint RenderedPosition::localToInvalidationBackingPoint(
|
| + const LayoutPoint& localPoint,
|
| + GraphicsLayer** graphicsLayerBacking) const {
|
| + const LayoutBoxModelObject& paintInvalidationContainer =
|
| + m_layoutObject->containerForPaintInvalidation();
|
| + DCHECK(paintInvalidationContainer.layer());
|
| +
|
| + FloatPoint containerPoint = m_layoutObject->localToAncestorPoint(
|
| + FloatPoint(localPoint), &paintInvalidationContainer,
|
| + TraverseDocumentBoundaries);
|
| +
|
| + // A layoutObject can have no invalidation backing if it is from a detached
|
| + // frame, or when forced compositing is disabled.
|
| + if (paintInvalidationContainer.layer()->compositingState() == NotComposited)
|
| + return containerPoint;
|
| +
|
| + PaintLayer::mapPointInPaintInvalidationContainerToBacking(
|
| + paintInvalidationContainer, containerPoint);
|
| +
|
| + // Must not use the scrolling contents layer, so pass
|
| + // |paintInvalidationContainer|.
|
| + if (GraphicsLayer* graphicsLayer =
|
| + paintInvalidationContainer.layer()->graphicsLayerBacking(
|
| + &paintInvalidationContainer)) {
|
| + if (graphicsLayerBacking)
|
| + *graphicsLayerBacking = graphicsLayer;
|
| +
|
| + containerPoint.move(-graphicsLayer->offsetFromLayoutObject());
|
| + }
|
| +
|
| + return containerPoint;
|
| +}
|
| +
|
| void RenderedPosition::positionInGraphicsLayerBacking(
|
| CompositedSelectionBound& bound,
|
| bool selectionStart) const {
|
| @@ -275,17 +310,16 @@ void RenderedPosition::positionInGraphicsLayerBacking(
|
| return;
|
|
|
| LayoutRect rect = m_layoutObject->localCaretRect(m_inlineBox, m_offset);
|
| - PaintLayer* layer = nullptr;
|
| if (m_layoutObject->style()->isHorizontalWritingMode()) {
|
| - bound.edgeTopInLayer = m_layoutObject->localToInvalidationBackingPoint(
|
| - rect.minXMinYCorner(), &layer);
|
| - bound.edgeBottomInLayer = m_layoutObject->localToInvalidationBackingPoint(
|
| - rect.minXMaxYCorner(), nullptr);
|
| + bound.edgeTopInLayer =
|
| + localToInvalidationBackingPoint(rect.minXMinYCorner(), &bound.layer);
|
| + bound.edgeBottomInLayer =
|
| + localToInvalidationBackingPoint(rect.minXMaxYCorner(), nullptr);
|
| } else {
|
| - bound.edgeTopInLayer = m_layoutObject->localToInvalidationBackingPoint(
|
| - rect.minXMinYCorner(), &layer);
|
| - bound.edgeBottomInLayer = m_layoutObject->localToInvalidationBackingPoint(
|
| - rect.maxXMinYCorner(), nullptr);
|
| + bound.edgeTopInLayer =
|
| + localToInvalidationBackingPoint(rect.minXMinYCorner(), &bound.layer);
|
| + bound.edgeBottomInLayer =
|
| + localToInvalidationBackingPoint(rect.maxXMinYCorner(), nullptr);
|
|
|
| // When text is vertical, it looks better for the start handle baseline to
|
| // be at the starting edge, to enclose the selection fully between the
|
| @@ -299,8 +333,6 @@ void RenderedPosition::positionInGraphicsLayerBacking(
|
| // Flipped blocks writing mode is not only vertical but also right to left.
|
| bound.isTextDirectionRTL = m_layoutObject->hasFlippedBlocksWritingMode();
|
| }
|
| -
|
| - bound.layer = layer ? layer->graphicsLayerBacking() : nullptr;
|
| }
|
|
|
| bool layoutObjectContainsPosition(LayoutObject* target,
|
|
|