| 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 3df11c66b8083506f415e7e19e116f8394a40fe9..9618e838ce9afebb4e52f45d8218de0b31048a2e 100644
|
| --- a/third_party/WebKit/Source/core/layout/LayoutBox.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
|
| @@ -973,7 +973,7 @@ void LayoutBox::mapScrollingContentsRectToBoxSpace(LayoutRect& rect) const
|
| rect.move(offset);
|
| }
|
|
|
| -void LayoutBox::applyOverflowClip(LayoutRect& rect) const
|
| +bool LayoutBox::applyOverflowClip(LayoutRect& rect, VisibleRectFlags visibleRectFlags) const
|
| {
|
| ASSERT(hasLayer());
|
| ASSERT(hasOverflowClip());
|
| @@ -984,8 +984,16 @@ void LayoutBox::applyOverflowClip(LayoutRect& rect) const
|
| // 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()));
|
| - rect = intersection(rect, clipRect);
|
| - flipForWritingMode(rect);
|
| + bool doesIntersect;
|
| + if (visibleRectFlags & EdgeInclusive) {
|
| + doesIntersect = rect.inclusiveIntersect(clipRect);
|
| + } else {
|
| + rect.intersect(clipRect);
|
| + doesIntersect = !rect.isEmpty();
|
| + }
|
| + if (doesIntersect)
|
| + flipForWritingMode(rect);
|
| + return doesIntersect;
|
| }
|
|
|
| void LayoutBox::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const
|
| @@ -1929,7 +1937,7 @@ LayoutRect LayoutBox::clippedOverflowRectForPaintInvalidation(const LayoutBoxMod
|
| return r;
|
| }
|
|
|
| -void LayoutBox::mapToVisibleRectInAncestorSpace(const LayoutBoxModelObject* ancestor, LayoutRect& rect, const PaintInvalidationState* paintInvalidationState) const
|
| +bool LayoutBox::mapToVisibleRectInAncestorSpace(const LayoutBoxModelObject* ancestor, LayoutRect& rect, const PaintInvalidationState* paintInvalidationState, VisibleRectFlags visibleRectFlags) 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
|
| @@ -1949,20 +1957,19 @@ void LayoutBox::mapToVisibleRectInAncestorSpace(const LayoutBoxModelObject* ance
|
| inflatePaintInvalidationRectForReflectionAndFilter(rect);
|
|
|
| if (paintInvalidationState && paintInvalidationState->canMapToAncestor(ancestor) && position != FixedPosition) {
|
| - paintInvalidationState->mapObjectRectToAncestor(*this, ancestor, rect);
|
| - return;
|
| + return paintInvalidationState->mapObjectRectToAncestor(*this, ancestor, rect, visibleRectFlags);
|
| }
|
|
|
| if (ancestor == this) {
|
| if (ancestor->style()->isFlippedBlocksWritingMode())
|
| flipForWritingMode(rect);
|
| - return;
|
| + return true;
|
| }
|
|
|
| bool containerSkipped;
|
| LayoutObject* container = this->container(ancestor, &containerSkipped);
|
| if (!container)
|
| - return;
|
| + return true;
|
|
|
| if (isWritingModeRoot())
|
| flipForWritingMode(rect);
|
| @@ -1994,10 +2001,8 @@ void LayoutBox::mapToVisibleRectInAncestorSpace(const LayoutBoxModelObject* ance
|
| if (container->hasOverflowClip()) {
|
| LayoutBox* containerBox = toLayoutBox(container);
|
| containerBox->mapScrollingContentsRectToBoxSpace(rect);
|
| - if (container != ancestor)
|
| - containerBox->applyOverflowClip(rect);
|
| - if (rect.isEmpty())
|
| - return;
|
| + if (container != ancestor && !containerBox->applyOverflowClip(rect, visibleRectFlags))
|
| + return false;
|
| }
|
|
|
| if (containerSkipped) {
|
| @@ -2007,13 +2012,13 @@ void LayoutBox::mapToVisibleRectInAncestorSpace(const LayoutBoxModelObject* ance
|
| // If the paintInvalidationContainer is fixed, then the rect is already in its coordinates so doesn't need viewport-adjusting.
|
| if (ancestor->style()->position() != FixedPosition && container->isLayoutView())
|
| toLayoutView(container)->adjustViewportConstrainedOffset(rect, LayoutView::toViewportConstrainedPosition(position));
|
| - return;
|
| + return true;
|
| }
|
|
|
| if (container->isLayoutView())
|
| - toLayoutView(container)->mapToVisibleRectInAncestorSpace(ancestor, rect, LayoutView::toViewportConstrainedPosition(position), nullptr);
|
| + return toLayoutView(container)->mapToVisibleRectInAncestorSpace(ancestor, rect, LayoutView::toViewportConstrainedPosition(position), nullptr, visibleRectFlags);
|
| else
|
| - container->mapToVisibleRectInAncestorSpace(ancestor, rect, nullptr);
|
| + return container->mapToVisibleRectInAncestorSpace(ancestor, rect, nullptr, visibleRectFlags);
|
| }
|
|
|
| void LayoutBox::inflatePaintInvalidationRectForReflectionAndFilter(LayoutRect& paintInvalidationRect) const
|
|
|