| Index: third_party/WebKit/Source/core/layout/PaintInvalidationState.cpp
|
| diff --git a/third_party/WebKit/Source/core/layout/PaintInvalidationState.cpp b/third_party/WebKit/Source/core/layout/PaintInvalidationState.cpp
|
| index 14c00546a8a292551c6347ed9a5fb84f5be9875a..38b038675cbb64788c7cefe6ccfa91911c56cc40 100644
|
| --- a/third_party/WebKit/Source/core/layout/PaintInvalidationState.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/PaintInvalidationState.cpp
|
| @@ -200,6 +200,11 @@ void PaintInvalidationState::updateForCurrentObject(const PaintInvalidationState
|
| }
|
| // Use slow path to get the offset of the fixed-position, and enable fast path for descendants.
|
| FloatPoint fixedOffset = m_currentObject.localToAncestorPoint(FloatPoint(), m_paintInvalidationContainer, TraverseDocumentBoundaries);
|
| + if (m_paintInvalidationContainer->isBox()) {
|
| + const LayoutBox* box = toLayoutBox(m_paintInvalidationContainer);
|
| + if (box->hasOverflowClip())
|
| + fixedOffset.move(box->scrolledContentOffset());
|
| + }
|
| m_paintOffset = LayoutSize(fixedOffset.x(), fixedOffset.y());
|
| // In the above way to get paint offset, we can't get accurate clip rect, so just assume no clip.
|
| // Clip on fixed-position is rare, in case that paintInvalidationContainer crosses frame boundary
|
| @@ -307,14 +312,14 @@ void PaintInvalidationState::updateForNormalChildren()
|
|
|
| const LayoutBox& box = toLayoutBox(m_currentObject);
|
|
|
| - // Do not clip scroll layer contents because the compositor expects the whole layer
|
| - // to be always invalidated in-time.
|
| - if (box == m_paintInvalidationContainer && box.scrollsOverflow())
|
| + // Do not clip or scroll for the paint invalidation container, if it scrolls overflow, because it will always use composited
|
| + // scrolling in this case.
|
| + if (box == m_paintInvalidationContainer && box.scrollsOverflow()) {
|
| ASSERT(!m_clipped); // The box establishes paint invalidation container, so no m_clipped inherited.
|
| - else
|
| + } else {
|
| addClipRectRelativeToPaintOffset(box.overflowClipRect(LayoutPoint()));
|
| -
|
| - m_paintOffset -= box.scrolledContentOffset();
|
| + m_paintOffset -= box.scrolledContentOffset();
|
| + }
|
|
|
| // FIXME: <http://bugs.webkit.org/show_bug.cgi?id=13443> Apply control clip if present.
|
| }
|
| @@ -323,7 +328,14 @@ static FloatPoint slowLocalToAncestorPoint(const LayoutObject& object, const Lay
|
| {
|
| if (object.isLayoutView())
|
| return toLayoutView(object).localToAncestorPoint(point, &ancestor, TraverseDocumentBoundaries | InputIsInFrameCoordinates);
|
| - return object.localToAncestorPoint(point, &ancestor, TraverseDocumentBoundaries);
|
| + FloatPoint result = object.localToAncestorPoint(point, &ancestor, TraverseDocumentBoundaries);
|
| + // Paint invalidation does not include scroll of the ancestor.
|
| + if (ancestor.isBox()) {
|
| + const LayoutBox* box = toLayoutBox(&ancestor);
|
| + if (box->hasOverflowClip())
|
| + result.move(box->scrolledContentOffset());
|
| + }
|
| + return result;
|
| }
|
|
|
| LayoutPoint PaintInvalidationState::computePositionFromPaintInvalidationBacking() const
|
|
|