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 80c7de4745b6e5ccc483acaf4bcc33de4f2a9ce3..c2464543b3ab9518d900671862dcfd1dfa5be0ca 100644 |
--- a/third_party/WebKit/Source/core/layout/LayoutBox.cpp |
+++ b/third_party/WebKit/Source/core/layout/LayoutBox.cpp |
@@ -1429,7 +1429,7 @@ |
return rect.intersects(LayoutRect(layoutView->frameView()->scrollableArea()->visibleContentRectDouble())); |
} |
-PaintInvalidationReason LayoutBox::invalidatePaintIfNeeded(PaintInvalidationState& paintInvalidationState, const LayoutBoxModelObject& paintInvalidationContainer) |
+PaintInvalidationReason LayoutBox::invalidatePaintIfNeeded(PaintInvalidationState& paintInvalidationState, const LayoutBoxModelObject& newPaintInvalidationContainer) |
{ |
PaintInvalidationReason fullInvalidationReason = fullPaintInvalidationReason(); |
// If the current paint invalidation reason is PaintInvalidationDelayedFull, then this paint invalidation can delayed if the |
@@ -1443,18 +1443,53 @@ |
setShouldDoFullPaintInvalidation(PaintInvalidationFull); |
} |
- PaintInvalidationReason reason = LayoutBoxModelObject::invalidatePaintIfNeeded(paintInvalidationState, paintInvalidationContainer); |
- |
- if (!view()->doingFullPaintInvalidation() && !isFullPaintInvalidationReason(reason)) |
+ PaintInvalidationReason reason = LayoutBoxModelObject::invalidatePaintIfNeeded(paintInvalidationState, newPaintInvalidationContainer); |
+ |
+ bool willDoFullInvalidation = view()->doingFullPaintInvalidation() || isFullPaintInvalidationReason(reason); |
+ if (!willDoFullInvalidation) |
invalidatePaintForOverflowIfNeeded(); |
- if (PaintLayerScrollableArea* area = scrollableArea()) |
- area->invalidatePaintOfScrollControlsIfNeeded(paintInvalidationState, paintInvalidationContainer); |
+ // Issue paint invalidations for any scrollbars if there is a scrollable area for this layoutObject. |
+ if (ScrollableArea* area = scrollableArea()) { |
+ if (area->hasVerticalBarDamage()) { |
+ if (!willDoFullInvalidation) |
+ invalidatePaintRectangleNotInvalidatingDisplayItemClients(LayoutRect(area->verticalBarDamage())); |
+ // TODO(wangxianzhu): Pass current bounds of the scrollbar to PaintController. crbug.com/547119. |
+ if (Scrollbar* verticalScrollbar = area->verticalScrollbar()) |
+ invalidateDisplayItemClient(*verticalScrollbar); |
+ } |
+ if (area->hasHorizontalBarDamage()) { |
+ if (!willDoFullInvalidation) |
+ invalidatePaintRectangleNotInvalidatingDisplayItemClients(LayoutRect(area->horizontalBarDamage())); |
+ // TODO(wangxianzhu): Pass current bounds of the scrollbar to PaintController. crbug.com/547119. |
+ if (Scrollbar* horizontalScrollbar = area->horizontalScrollbar()) |
+ invalidateDisplayItemClient(*horizontalScrollbar); |
+ } |
+ } |
// This is for the next invalidatePaintIfNeeded so must be at the end. |
savePreviousBoxSizesIfNeeded(); |
return reason; |
} |
+ |
+void LayoutBox::clearPaintInvalidationState(const PaintInvalidationState& paintInvalidationState) |
+{ |
+ LayoutBoxModelObject::clearPaintInvalidationState(paintInvalidationState); |
+ |
+ if (ScrollableArea* area = scrollableArea()) |
+ area->resetScrollbarDamage(); |
+} |
+ |
+#if ENABLE(ASSERT) |
+bool LayoutBox::paintInvalidationStateIsDirty() const |
+{ |
+ if (ScrollableArea* area = scrollableArea()) { |
+ if (area->hasVerticalBarDamage() || area->hasHorizontalBarDamage()) |
+ return true; |
+ } |
+ return LayoutBoxModelObject::paintInvalidationStateIsDirty(); |
+} |
+#endif |
LayoutRect LayoutBox::overflowClipRect(const LayoutPoint& location, OverlayScrollbarSizeRelevancy relevancy) const |
{ |