| 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 3b671d8d42b3358bd8d550c09b3042365177e79c..d673e7fcaa3e2c9d03513f105841d0e1f73988d7 100644
|
| --- a/third_party/WebKit/Source/core/layout/LayoutBox.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
|
| @@ -939,20 +939,28 @@ IntSize LayoutBox::scrolledContentOffset() const
|
| return flooredIntSize(layer()->scrollableArea()->scrollOffset());
|
| }
|
|
|
| +void LayoutBox::applyCachedScrollOffsetForPaintInvalidation(LayoutRect& paintRect) const
|
| +{
|
| + ASSERT(hasLayer());
|
| + ASSERT(hasOverflowClip());
|
| +
|
| + LayoutSize offset = LayoutSize(-scrolledContentOffset());
|
| + if (UNLIKELY(hasFlippedBlocksWritingMode())) {
|
| + if (isHorizontalWritingMode())
|
| + offset.setHeight(-offset.height());
|
| + else
|
| + offset.setWidth(-offset.width());
|
| + }
|
| + paintRect.move(offset);
|
| +}
|
| +
|
| void LayoutBox::applyCachedClipAndScrollOffsetForPaintInvalidation(LayoutRect& paintRect) const
|
| {
|
| ASSERT(hasLayer());
|
| ASSERT(hasOverflowClip());
|
|
|
| + applyCachedScrollOffsetForPaintInvalidation(paintRect);
|
| flipForWritingMode(paintRect);
|
| - paintRect.move(-scrolledContentOffset()); // For overflow:auto/scroll/hidden.
|
| -
|
| - // Do not clip scroll layer contents because the compositor expects the whole layer
|
| - // to be always invalidated in-time.
|
| - if (usesCompositedScrolling()) {
|
| - flipForWritingMode(paintRect);
|
| - return;
|
| - }
|
|
|
| // 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
|
| @@ -1426,7 +1434,7 @@ bool LayoutBox::intersectsVisibleViewport()
|
| LayoutView* layoutView = view();
|
| while (layoutView->frame()->ownerLayoutObject())
|
| layoutView = layoutView->frame()->ownerLayoutObject()->view();
|
| - mapRectToPaintInvalidationBacking(layoutView, rect, 0);
|
| + mapToVisibleRectInContainerSpace(layoutView, rect, 0);
|
| return rect.intersects(LayoutRect(layoutView->frameView()->scrollableArea()->visibleContentRectDouble()));
|
| }
|
|
|
| @@ -1856,11 +1864,11 @@ LayoutRect LayoutBox::clippedOverflowRectForPaintInvalidation(const LayoutBoxMod
|
| }
|
|
|
| LayoutRect r = visualOverflowRect();
|
| - mapRectToPaintInvalidationBacking(paintInvalidationContainer, r, paintInvalidationState);
|
| + mapToVisibleRectInContainerSpace(paintInvalidationContainer, r, paintInvalidationState);
|
| return r;
|
| }
|
|
|
| -void LayoutBox::mapRectToPaintInvalidationBacking(const LayoutBoxModelObject* paintInvalidationContainer, LayoutRect& rect, const PaintInvalidationState* paintInvalidationState) const
|
| +void LayoutBox::mapToVisibleRectInContainerSpace(const LayoutBoxModelObject* paintInvalidationContainer, 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
|
| @@ -1934,7 +1942,10 @@ void LayoutBox::mapRectToPaintInvalidationBacking(const LayoutBoxModelObject* pa
|
| rect.setLocation(topLeft);
|
| if (o->hasOverflowClip()) {
|
| LayoutBox* containerBox = toLayoutBox(o);
|
| - containerBox->applyCachedClipAndScrollOffsetForPaintInvalidation(rect);
|
| + if (o == paintInvalidationContainer)
|
| + containerBox->applyCachedScrollOffsetForPaintInvalidation(rect);
|
| + else
|
| + containerBox->applyCachedClipAndScrollOffsetForPaintInvalidation(rect);
|
| if (rect.isEmpty())
|
| return;
|
| }
|
| @@ -1950,9 +1961,9 @@ void LayoutBox::mapRectToPaintInvalidationBacking(const LayoutBoxModelObject* pa
|
| }
|
|
|
| if (o->isLayoutView())
|
| - toLayoutView(o)->mapRectToPaintInvalidationBacking(paintInvalidationContainer, rect, LayoutView::viewportConstrainedPosition(position), paintInvalidationState);
|
| + toLayoutView(o)->mapToVisibleRectInContainerSpace(paintInvalidationContainer, rect, LayoutView::viewportConstrainedPosition(position), paintInvalidationState);
|
| else
|
| - o->mapRectToPaintInvalidationBacking(paintInvalidationContainer, rect, paintInvalidationState);
|
| + o->mapToVisibleRectInContainerSpace(paintInvalidationContainer, rect, paintInvalidationState);
|
| }
|
|
|
| void LayoutBox::inflatePaintInvalidationRectForReflectionAndFilter(LayoutRect& paintInvalidationRect) const
|
|
|