Chromium Code Reviews| 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 fed747b5e5655ad90f9eaebdeff489d04402e052..7771d9408941f0b390f5dcd8fdfa347c6daf0e01 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, bool edgeInclusive) 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 (edgeInclusive) { |
| + doesIntersect = rect.inclusiveIntersect(clipRect); |
| + } else { |
| + rect.intersect(clipRect); |
| + doesIntersect = !rect.isEmpty(); |
|
eae
2016/03/22 00:13:50
LayoutRect::intersects will only ever return true
szager1
2016/03/22 00:55:48
That's not true:
bool LayoutRect::intersects(cons
eae
2016/03/22 17:54:15
Oh, my bad. You're right. Never mind!
|
| + } |
| + if (doesIntersect) |
| + flipForWritingMode(rect); |
| + return doesIntersect; |
| } |
| void LayoutBox::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const |
| @@ -1474,7 +1482,7 @@ bool LayoutBox::intersectsVisibleViewport() |
| LayoutView* layoutView = view(); |
| while (layoutView->frame()->ownerLayoutObject()) |
| layoutView = layoutView->frame()->ownerLayoutObject()->view(); |
| - mapToVisibleRectInAncestorSpace(layoutView, rect, nullptr); |
| + mapToVisibleRectInAncestorSpace(layoutView, rect, nullptr, false); |
| return rect.intersects(LayoutRect(layoutView->frameView()->getScrollableArea()->visibleContentRectDouble())); |
| } |
| @@ -1925,11 +1933,11 @@ LayoutRect LayoutBox::clippedOverflowRectForPaintInvalidation(const LayoutBoxMod |
| } |
| LayoutRect r = visualOverflowRect(); |
| - mapToVisibleRectInAncestorSpace(paintInvalidationContainer, r, paintInvalidationState); |
| + mapToVisibleRectInAncestorSpace(paintInvalidationContainer, r, paintInvalidationState, false); |
| 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, bool edgeInclusive) 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, edgeInclusive); |
| } |
| 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, edgeInclusive)) |
| + 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), paintInvalidationState); |
| + return toLayoutView(container)->mapToVisibleRectInAncestorSpace(ancestor, rect, LayoutView::toViewportConstrainedPosition(position), paintInvalidationState, edgeInclusive); |
| else |
| - container->mapToVisibleRectInAncestorSpace(ancestor, rect, paintInvalidationState); |
| + return container->mapToVisibleRectInAncestorSpace(ancestor, rect, paintInvalidationState, edgeInclusive); |
| } |
| void LayoutBox::inflatePaintInvalidationRectForReflectionAndFilter(LayoutRect& paintInvalidationRect) const |