| Index: third_party/WebKit/Source/core/layout/LayoutObject.cpp
|
| diff --git a/third_party/WebKit/Source/core/layout/LayoutObject.cpp b/third_party/WebKit/Source/core/layout/LayoutObject.cpp
|
| index 45d120210af6f69408f1b7a41c29b37b5cc6069c..8a811d86a8beb6b95221eb7f13bd1567ea5ce816 100644
|
| --- a/third_party/WebKit/Source/core/layout/LayoutObject.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/LayoutObject.cpp
|
| @@ -1192,12 +1192,6 @@ static PassOwnPtr<TracedValue> jsonObjectForPaintInvalidationInfo(const LayoutRe
|
| return value.release();
|
| }
|
|
|
| -LayoutRect LayoutObject::computePaintInvalidationRect(const LayoutBoxModelObject& paintInvalidationContainer, const PaintInvalidationState* paintInvalidationState) const
|
| -{
|
| - return clippedOverflowRectForPaintInvalidation(&paintInvalidationContainer, paintInvalidationState);
|
| -}
|
| -
|
| -
|
| static void invalidatePaintRectangleOnWindow(const LayoutBoxModelObject& paintInvalidationContainer, const IntRect& dirtyRect)
|
| {
|
| FrameView* frameView = paintInvalidationContainer.frameView();
|
| @@ -1295,11 +1289,6 @@ void LayoutObject::invalidateDisplayItemClientsWithPaintInvalidationState(const
|
| invalidateDisplayItemClients(paintInvalidationContainer, invalidationReason);
|
| }
|
|
|
| -LayoutRect LayoutObject::boundsRectForPaintInvalidation(const LayoutBoxModelObject& paintInvalidationContainer, const PaintInvalidationState* paintInvalidationState) const
|
| -{
|
| - return PaintLayer::computePaintInvalidationRect(*this, paintInvalidationContainer.layer(), paintInvalidationState);
|
| -}
|
| -
|
| const LayoutBoxModelObject* LayoutObject::invalidatePaintRectangleInternal(const LayoutRect& dirtyRect) const
|
| {
|
| RELEASE_ASSERT(isRooted());
|
| @@ -1312,7 +1301,7 @@ const LayoutBoxModelObject* LayoutObject::invalidatePaintRectangleInternal(const
|
|
|
| const LayoutBoxModelObject& paintInvalidationContainer = containerForPaintInvalidation();
|
| LayoutRect dirtyRectOnBacking = dirtyRect;
|
| - PaintLayer::mapRectToPaintInvalidationBacking(this, &paintInvalidationContainer, dirtyRectOnBacking);
|
| + PaintLayer::mapRectToPaintInvalidationBacking(*this, paintInvalidationContainer, dirtyRectOnBacking);
|
| invalidatePaintUsingContainer(paintInvalidationContainer, dirtyRectOnBacking, PaintInvalidationRectangle);
|
| return &paintInvalidationContainer;
|
| }
|
| @@ -1340,12 +1329,14 @@ void LayoutObject::invalidateTreeIfNeeded(const PaintInvalidationState& paintInv
|
| if (!shouldCheckForPaintInvalidation(paintInvalidationState))
|
| return;
|
|
|
| - PaintInvalidationReason reason = invalidatePaintIfNeeded(paintInvalidationState);
|
| - clearPaintInvalidationFlags(paintInvalidationState);
|
| + PaintInvalidationState newPaintInvalidationState(paintInvalidationState, *this);
|
| + PaintInvalidationReason reason = invalidatePaintIfNeeded(newPaintInvalidationState);
|
| + clearPaintInvalidationFlags(newPaintInvalidationState);
|
|
|
| if (reason == PaintInvalidationDelayedFull)
|
| - paintInvalidationState.pushDelayedPaintInvalidationTarget(*this);
|
| + newPaintInvalidationState.pushDelayedPaintInvalidationTarget(*this);
|
|
|
| + newPaintInvalidationState.updateForChildren();
|
| invalidatePaintOfSubtreesIfNeeded(paintInvalidationState);
|
| }
|
|
|
| @@ -1369,7 +1360,10 @@ static PassOwnPtr<TracedValue> jsonObjectForOldAndNewRects(const LayoutRect& old
|
|
|
| LayoutRect LayoutObject::selectionRectInViewCoordinates() const
|
| {
|
| - return selectionRectForPaintInvalidation(view());
|
| + LayoutRect selectionRect = localSelectionRect();
|
| + if (!selectionRect.isEmpty())
|
| + mapToVisibleRectInAncestorSpace(view(), selectionRect);
|
| + return selectionRect;
|
| }
|
|
|
| LayoutRect LayoutObject::previousSelectionRectForPaintInvalidation() const
|
| @@ -1404,13 +1398,16 @@ inline void LayoutObject::invalidateSelectionIfNeeded(const LayoutBoxModelObject
|
| return;
|
|
|
| LayoutRect oldSelectionRect = previousSelectionRectForPaintInvalidation();
|
| - LayoutRect newSelectionRect = selectionRectForPaintInvalidation(&paintInvalidationContainer);
|
| -
|
| - // Composited scrolling should not be included in the bounds and position tracking, because the graphics layer backing the scroller
|
| - // does not move on scroll.
|
| - if (paintInvalidationContainer.usesCompositedScrolling() && &paintInvalidationContainer != this) {
|
| - LayoutSize inverseOffset(toLayoutBox(&paintInvalidationContainer)->scrolledContentOffset());
|
| - newSelectionRect.move(inverseOffset);
|
| + LayoutRect newSelectionRect = localSelectionRect();
|
| + if (!newSelectionRect.isEmpty()) {
|
| + paintInvalidationState.mapLocalRectToPaintInvalidationBacking(newSelectionRect);
|
| +
|
| + // Composited scrolling should not be included in the bounds and position tracking, because the graphics layer backing the scroller
|
| + // does not move on scroll.
|
| + if (paintInvalidationContainer.usesCompositedScrolling() && &paintInvalidationContainer != this) {
|
| + LayoutSize inverseOffset(toLayoutBox(&paintInvalidationContainer)->scrolledContentOffset());
|
| + newSelectionRect.move(inverseOffset);
|
| + }
|
| }
|
|
|
| setPreviousSelectionRectForPaintInvalidation(newSelectionRect);
|
| @@ -1426,6 +1423,8 @@ inline void LayoutObject::invalidateSelectionIfNeeded(const LayoutBoxModelObject
|
|
|
| PaintInvalidationReason LayoutObject::invalidatePaintIfNeeded(const PaintInvalidationState& paintInvalidationState)
|
| {
|
| + ASSERT(&paintInvalidationState.currentObject() == this);
|
| +
|
| if (styleRef().hasOutline()) {
|
| PaintLayer& layer = paintInvalidationState.enclosingSelfPaintingLayer(*this);
|
| if (layer.layoutObject() != this)
|
| @@ -1442,8 +1441,8 @@ PaintInvalidationReason LayoutObject::invalidatePaintIfNeeded(const PaintInvalid
|
|
|
| const LayoutRect oldBounds = previousPaintInvalidationRect();
|
| const LayoutPoint oldLocation = RuntimeEnabledFeatures::slimmingPaintInvalidationEnabled() ? LayoutPoint() : previousPositionFromPaintInvalidationBacking();
|
| - LayoutRect newBounds = boundsRectForPaintInvalidation(paintInvalidationContainer, &paintInvalidationState);
|
| - LayoutPoint newLocation = RuntimeEnabledFeatures::slimmingPaintInvalidationEnabled() ? LayoutPoint() : PaintLayer::positionFromPaintInvalidationBacking(this, &paintInvalidationContainer, &paintInvalidationState);
|
| + LayoutRect newBounds = paintInvalidationState.computePaintInvalidationRectInBacking();
|
| + LayoutPoint newLocation = RuntimeEnabledFeatures::slimmingPaintInvalidationEnabled() ? LayoutPoint() : paintInvalidationState.computePositionFromPaintInvalidationBacking();
|
|
|
| // Composited scrolling should not be included in the bounds and position tracking, because the graphics layer backing the scroller
|
| // does not move on scroll.
|
| @@ -1629,25 +1628,22 @@ void LayoutObject::invalidatePaintForOverflowIfNeeded()
|
|
|
| LayoutRect LayoutObject::absoluteClippedOverflowRect() const
|
| {
|
| - return clippedOverflowRectForPaintInvalidation(view());
|
| + LayoutRect rect = localOverflowRectForPaintInvalidation();
|
| + mapToVisibleRectInAncestorSpace(view(), rect);
|
| + return rect;
|
| }
|
|
|
| -LayoutRect LayoutObject::clippedOverflowRectForPaintInvalidation(const LayoutBoxModelObject*, const PaintInvalidationState*) const
|
| +LayoutRect LayoutObject::localOverflowRectForPaintInvalidation() const
|
| {
|
| ASSERT_NOT_REACHED();
|
| return LayoutRect();
|
| }
|
|
|
| -void LayoutObject::mapToVisibleRectInAncestorSpace(const LayoutBoxModelObject* ancestor, LayoutRect& rect, const PaintInvalidationState* paintInvalidationState) const
|
| +void LayoutObject::mapToVisibleRectInAncestorSpace(const LayoutBoxModelObject* ancestor, LayoutRect& rect) const
|
| {
|
| if (ancestor == this)
|
| return;
|
|
|
| - if (paintInvalidationState && paintInvalidationState->canMapToAncestor(ancestor)) {
|
| - paintInvalidationState->mapObjectRectToAncestor(*this, ancestor, rect);
|
| - return;
|
| - }
|
| -
|
| if (LayoutObject* parent = this->parent()) {
|
| if (parent->hasOverflowClip()) {
|
| LayoutBox* parentBox = toLayoutBox(parent);
|
| @@ -1658,7 +1654,7 @@ void LayoutObject::mapToVisibleRectInAncestorSpace(const LayoutBoxModelObject* a
|
| return;
|
| }
|
|
|
| - parent->mapToVisibleRectInAncestorSpace(ancestor, rect, paintInvalidationState);
|
| + parent->mapToVisibleRectInAncestorSpace(ancestor, rect);
|
| }
|
| }
|
|
|
| @@ -2243,21 +2239,11 @@ FloatQuad LayoutObject::ancestorToLocalQuad(LayoutBoxModelObject* ancestor, cons
|
| return transformState.lastPlanarQuad();
|
| }
|
|
|
| -void LayoutObject::mapLocalToAncestor(const LayoutBoxModelObject* ancestor, TransformState& transformState, MapCoordinatesFlags mode, bool* wasFixed, const PaintInvalidationState* paintInvalidationState) const
|
| +void LayoutObject::mapLocalToAncestor(const LayoutBoxModelObject* ancestor, TransformState& transformState, MapCoordinatesFlags mode, bool* wasFixed) const
|
| {
|
| if (ancestor == this)
|
| return;
|
|
|
| - if (paintInvalidationState && paintInvalidationState->canMapToAncestor(ancestor)) {
|
| - LayoutSize offset = paintInvalidationState->paintOffset();
|
| - if (const LayoutBox* layoutBox = isBox() ? toLayoutBox(this) : nullptr)
|
| - offset += layoutBox->locationOffset();
|
| - if (const PaintLayer* layer = style()->hasInFlowPosition() && hasLayer() ? toLayoutBoxModelObject(this)->layer() : nullptr)
|
| - offset += layer->offsetForInFlowPosition();
|
| - transformState.move(offset);
|
| - return;
|
| - }
|
| -
|
| if (wasFixed)
|
| *wasFixed = mode & IsFixed;
|
|
|
| @@ -2304,7 +2290,7 @@ void LayoutObject::mapLocalToAncestor(const LayoutBoxModelObject* ancestor, Tran
|
| return;
|
| }
|
|
|
| - o->mapLocalToAncestor(ancestor, transformState, mode, wasFixed, paintInvalidationState);
|
| + o->mapLocalToAncestor(ancestor, transformState, mode, wasFixed);
|
| }
|
|
|
| const LayoutObject* LayoutObject::pushMappingToContainer(const LayoutBoxModelObject* ancestorToStopAt, LayoutGeometryMap& geometryMap) const
|
| @@ -2403,10 +2389,10 @@ FloatQuad LayoutObject::localToAncestorQuad(const FloatQuad& localQuad, const La
|
| return transformState.lastPlanarQuad();
|
| }
|
|
|
| -FloatPoint LayoutObject::localToAncestorPoint(const FloatPoint& localPoint, const LayoutBoxModelObject* ancestor, MapCoordinatesFlags mode, bool* wasFixed, const PaintInvalidationState* paintInvalidationState) const
|
| +FloatPoint LayoutObject::localToAncestorPoint(const FloatPoint& localPoint, const LayoutBoxModelObject* ancestor, MapCoordinatesFlags mode, bool* wasFixed) const
|
| {
|
| TransformState transformState(TransformState::ApplyTransformDirection, localPoint);
|
| - mapLocalToAncestor(ancestor, transformState, mode | ApplyContainerFlip | UseTransforms, wasFixed, paintInvalidationState);
|
| + mapLocalToAncestor(ancestor, transformState, mode | ApplyContainerFlip | UseTransforms, wasFixed);
|
| transformState.flatten();
|
|
|
| return transformState.lastPlanarPoint();
|
| @@ -2449,7 +2435,7 @@ FloatPoint LayoutObject::localToInvalidationBackingPoint(const LayoutPoint& loca
|
| if (paintInvalidationContainer.layer()->compositingState() == NotComposited)
|
| return containerPoint;
|
|
|
| - PaintLayer::mapPointToPaintBackingCoordinates(&paintInvalidationContainer, containerPoint);
|
| + PaintLayer::mapPointInPaintInvalidationContainerToBacking(paintInvalidationContainer, containerPoint);
|
| return containerPoint;
|
| }
|
|
|
|
|