Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(594)

Unified Diff: third_party/WebKit/Source/core/layout/LayoutBox.cpp

Issue 1817693002: Support edge-inclusive intersections in mapToVisibleRectInAncestorSpace (Closed) Base URL: https://chromium.googlesource.com/chromium/src@intersection-observer-idle-callback
Patch Set: compiler warning fix Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698