| Index: third_party/WebKit/Source/core/layout/LayoutBox.cpp
|
| diff --git a/third_party/WebKit/Source/core/layout/LayoutBox.cpp b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
|
| index e7dde710055129368066dc36d0f2f12cd54851cf..4c35437d705b1c589625252eb6a1ae9139385f3b 100644
|
| --- a/third_party/WebKit/Source/core/layout/LayoutBox.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
|
| @@ -938,7 +938,7 @@ IntSize LayoutBox::scrolledContentOffset() const
|
| return flooredIntSize(layer()->scrollableArea()->scrollOffset());
|
| }
|
|
|
| -void LayoutBox::applyCachedScrollOffsetForPaintInvalidation(LayoutRect& paintRect) const
|
| +void LayoutBox::mapScrollingContentsRectToBoxSpace(LayoutRect& rect) const
|
| {
|
| ASSERT(hasLayer());
|
| ASSERT(hasOverflowClip());
|
| @@ -950,23 +950,22 @@ void LayoutBox::applyCachedScrollOffsetForPaintInvalidation(LayoutRect& paintRec
|
| else
|
| offset.setWidth(-offset.width());
|
| }
|
| - paintRect.move(offset);
|
| + rect.move(offset);
|
| }
|
|
|
| -void LayoutBox::applyCachedClipAndScrollOffsetForPaintInvalidation(LayoutRect& paintRect) const
|
| +void LayoutBox::applyOverflowClip(LayoutRect& rect) const
|
| {
|
| ASSERT(hasLayer());
|
| ASSERT(hasOverflowClip());
|
|
|
| - applyCachedScrollOffsetForPaintInvalidation(paintRect);
|
| - flipForWritingMode(paintRect);
|
| + flipForWritingMode(rect);
|
|
|
| // size() is inaccurate if we're in the middle of a layout of this LayoutBox, so use the
|
| // layer's size instead. Even if the layer's size is wrong, the layer itself will issue paint invalidations
|
| // anyway if its size does change.
|
| LayoutRect clipRect(LayoutPoint(), LayoutSize(layer()->size()));
|
| - paintRect = intersection(paintRect, clipRect);
|
| - flipForWritingMode(paintRect);
|
| + rect = intersection(rect, clipRect);
|
| + flipForWritingMode(rect);
|
| }
|
|
|
| void LayoutBox::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const
|
| @@ -1453,7 +1452,7 @@ bool LayoutBox::intersectsVisibleViewport()
|
| LayoutView* layoutView = view();
|
| while (layoutView->frame()->ownerLayoutObject())
|
| layoutView = layoutView->frame()->ownerLayoutObject()->view();
|
| - mapToVisibleRectInContainerSpace(layoutView, rect, 0);
|
| + mapToVisibleRectInAncestorSpace(layoutView, rect, nullptr);
|
| return rect.intersects(LayoutRect(layoutView->frameView()->scrollableArea()->visibleContentRectDouble()));
|
| }
|
|
|
| @@ -1641,12 +1640,12 @@ LayoutUnit LayoutBox::perpendicularContainingBlockLogicalHeight() const
|
| return cb->adjustContentBoxLogicalHeightForBoxSizing(logicalHeightLength.value());
|
| }
|
|
|
| -void LayoutBox::mapLocalToContainer(const LayoutBoxModelObject* paintInvalidationContainer, TransformState& transformState, MapCoordinatesFlags mode, bool* wasFixed, const PaintInvalidationState* paintInvalidationState) const
|
| +void LayoutBox::mapLocalToAncestor(const LayoutBoxModelObject* ancestor, TransformState& transformState, MapCoordinatesFlags mode, bool* wasFixed, const PaintInvalidationState* paintInvalidationState) const
|
| {
|
| - if (paintInvalidationContainer == this)
|
| + if (ancestor == this)
|
| return;
|
|
|
| - if (paintInvalidationState && paintInvalidationState->canMapToContainer(paintInvalidationContainer)) {
|
| + if (paintInvalidationState && paintInvalidationState->canMapToContainer(ancestor)) {
|
| LayoutSize offset = paintInvalidationState->paintOffset() + locationOffset();
|
| if (style()->hasInFlowPosition() && layer())
|
| offset += layer()->offsetForInFlowPosition();
|
| @@ -1654,8 +1653,8 @@ void LayoutBox::mapLocalToContainer(const LayoutBoxModelObject* paintInvalidatio
|
| return;
|
| }
|
|
|
| - bool containerSkipped;
|
| - LayoutObject* o = container(paintInvalidationContainer, &containerSkipped);
|
| + bool ancestorSkipped;
|
| + LayoutObject* o = container(ancestor, &ancestorSkipped);
|
| if (!o)
|
| return;
|
|
|
| @@ -1682,17 +1681,17 @@ void LayoutBox::mapLocalToContainer(const LayoutBoxModelObject* paintInvalidatio
|
| transformState.move(containerOffset.width(), containerOffset.height(), preserve3D ? TransformState::AccumulateTransform : TransformState::FlattenTransform);
|
| }
|
|
|
| - if (containerSkipped) {
|
| + if (ancestorSkipped) {
|
| // There can't be a transform between paintInvalidationContainer and o, because transforms create containers, so it should be safe
|
| // to just subtract the delta between the paintInvalidationContainer and o.
|
| - LayoutSize containerOffset = paintInvalidationContainer->offsetFromAncestorContainer(o);
|
| + LayoutSize containerOffset = ancestor->offsetFromAncestorContainer(o);
|
| transformState.move(-containerOffset.width(), -containerOffset.height(), preserve3D ? TransformState::AccumulateTransform : TransformState::FlattenTransform);
|
| return;
|
| }
|
|
|
| mode &= ~ApplyContainerFlip;
|
|
|
| - o->mapLocalToContainer(paintInvalidationContainer, transformState, mode, wasFixed);
|
| + o->mapLocalToAncestor(ancestor, transformState, mode, wasFixed);
|
| }
|
|
|
| void LayoutBox::mapAbsoluteToLocalPoint(MapCoordinatesFlags mode, TransformState& transformState) const
|
| @@ -1883,11 +1882,11 @@ LayoutRect LayoutBox::clippedOverflowRectForPaintInvalidation(const LayoutBoxMod
|
| }
|
|
|
| LayoutRect r = visualOverflowRect();
|
| - mapToVisibleRectInContainerSpace(paintInvalidationContainer, r, paintInvalidationState);
|
| + mapToVisibleRectInAncestorSpace(paintInvalidationContainer, r, paintInvalidationState);
|
| return r;
|
| }
|
|
|
| -void LayoutBox::mapToVisibleRectInContainerSpace(const LayoutBoxModelObject* paintInvalidationContainer, LayoutRect& rect, const PaintInvalidationState* paintInvalidationState) const
|
| +void LayoutBox::mapToVisibleRectInAncestorSpace(const LayoutBoxModelObject* ancestor, LayoutRect& rect, const PaintInvalidationState* paintInvalidationState) const
|
| {
|
| // The rect we compute at each step is shifted by our x/y offset in the parent container's coordinate space.
|
| // Only when we cross a writing mode boundary will we have to possibly flipForWritingMode (to convert into a more appropriate
|
| @@ -1906,7 +1905,7 @@ void LayoutBox::mapToVisibleRectInContainerSpace(const LayoutBoxModelObject* pai
|
| // included into the visual overflow for repaint, we wouldn't have this issue.
|
| inflatePaintInvalidationRectForReflectionAndFilter(rect);
|
|
|
| - if (paintInvalidationState && paintInvalidationState->canMapToContainer(paintInvalidationContainer) && position != FixedPosition) {
|
| + if (paintInvalidationState && paintInvalidationState->canMapToContainer(ancestor) && position != FixedPosition) {
|
| if (layer() && layer()->transform())
|
| rect = LayoutRect(layer()->transform()->mapRect(pixelSnappedIntRect(rect)));
|
|
|
| @@ -1921,15 +1920,15 @@ void LayoutBox::mapToVisibleRectInContainerSpace(const LayoutBoxModelObject* pai
|
| return;
|
| }
|
|
|
| - if (paintInvalidationContainer == this) {
|
| - if (paintInvalidationContainer->style()->isFlippedBlocksWritingMode())
|
| + if (ancestor == this) {
|
| + if (ancestor->style()->isFlippedBlocksWritingMode())
|
| flipForWritingMode(rect);
|
| return;
|
| }
|
|
|
| bool containerSkipped;
|
| - LayoutObject* o = container(paintInvalidationContainer, &containerSkipped);
|
| - if (!o)
|
| + LayoutObject* container = this->container(ancestor, &containerSkipped);
|
| + if (!container)
|
| return;
|
|
|
| if (isWritingModeRoot())
|
| @@ -1946,8 +1945,8 @@ void LayoutBox::mapToVisibleRectInContainerSpace(const LayoutBoxModelObject* pai
|
| topLeft.move(locationOffset());
|
| }
|
|
|
| - if (position == AbsolutePosition && o->isInFlowPositioned() && o->isLayoutInline()) {
|
| - topLeft += toLayoutInline(o)->offsetForInFlowPositionedInline(*this);
|
| + if (position == AbsolutePosition && container->isInFlowPositioned() && container->isLayoutInline()) {
|
| + topLeft += toLayoutInline(container)->offsetForInFlowPositionedInline(*this);
|
| } else if (styleToUse.hasInFlowPosition() && layer()) {
|
| // Apply the relative position offset when invalidating a rectangle. The layer
|
| // is translated, but the layout box isn't, so we need to do this to get the
|
| @@ -1959,30 +1958,29 @@ void LayoutBox::mapToVisibleRectInContainerSpace(const LayoutBoxModelObject* pai
|
| // FIXME: We ignore the lightweight clipping rect that controls use, since if |o| is in mid-layout,
|
| // its controlClipRect will be wrong. For overflow clip we use the values cached by the layer.
|
| rect.setLocation(topLeft);
|
| - if (o->hasOverflowClip()) {
|
| - LayoutBox* containerBox = toLayoutBox(o);
|
| - if (o == paintInvalidationContainer)
|
| - containerBox->applyCachedScrollOffsetForPaintInvalidation(rect);
|
| - else
|
| - containerBox->applyCachedClipAndScrollOffsetForPaintInvalidation(rect);
|
| + if (container->hasOverflowClip()) {
|
| + LayoutBox* containerBox = toLayoutBox(container);
|
| + containerBox->mapScrollingContentsRectToBoxSpace(rect);
|
| + if (container != ancestor)
|
| + containerBox->applyOverflowClip(rect);
|
| if (rect.isEmpty())
|
| return;
|
| }
|
|
|
| if (containerSkipped) {
|
| // If the paintInvalidationContainer is below o, then we need to map the rect into paintInvalidationContainer's coordinates.
|
| - LayoutSize containerOffset = paintInvalidationContainer->offsetFromAncestorContainer(o);
|
| + LayoutSize containerOffset = ancestor->offsetFromAncestorContainer(container);
|
| rect.move(-containerOffset);
|
| // If the paintInvalidationContainer is fixed, then the rect is already in its coordinates so doesn't need viewport-adjusting.
|
| - if (paintInvalidationContainer->style()->position() != FixedPosition && o->isLayoutView())
|
| - toLayoutView(o)->adjustViewportConstrainedOffset(rect, LayoutView::viewportConstrainedPosition(position));
|
| + if (ancestor->style()->position() != FixedPosition && container->isLayoutView())
|
| + toLayoutView(container)->adjustViewportConstrainedOffset(rect, LayoutView::viewportConstrainedPosition(position));
|
| return;
|
| }
|
|
|
| - if (o->isLayoutView())
|
| - toLayoutView(o)->mapToVisibleRectInContainerSpace(paintInvalidationContainer, rect, LayoutView::viewportConstrainedPosition(position), paintInvalidationState);
|
| + if (container->isLayoutView())
|
| + toLayoutView(container)->mapToVisibleRectInAncestorSpace(ancestor, rect, LayoutView::viewportConstrainedPosition(position), paintInvalidationState);
|
| else
|
| - o->mapToVisibleRectInContainerSpace(paintInvalidationContainer, rect, paintInvalidationState);
|
| + container->mapToVisibleRectInAncestorSpace(ancestor, rect, paintInvalidationState);
|
| }
|
|
|
| void LayoutBox::inflatePaintInvalidationRectForReflectionAndFilter(LayoutRect& paintInvalidationRect) const
|
|
|