Chromium Code Reviews| Index: Source/core/rendering/RenderObject.cpp |
| diff --git a/Source/core/rendering/RenderObject.cpp b/Source/core/rendering/RenderObject.cpp |
| index 9e72e470370fa9960797db03a40b95aec44e7459..24b2766dd754a427a99576d70f130d6ae607b61c 100644 |
| --- a/Source/core/rendering/RenderObject.cpp |
| +++ b/Source/core/rendering/RenderObject.cpp |
| @@ -1598,7 +1598,7 @@ void RenderObject::invalidateTreeIfNeeded(const PaintInvalidationState& paintInv |
| { |
| // If we didn't need paint invalidation then our children don't need as well. |
| // Skip walking down the tree as everything should be fine below us. |
| - if (!shouldCheckForPaintInvalidation()) |
| + if (!shouldCheckForSelfOrChildPaintInvalidation()) |
| return; |
| clearPaintInvalidationState(); |
| @@ -2055,15 +2055,17 @@ void RenderObject::setStyle(PassRefPtr<RenderStyle> style) |
| container->setNeedsOverflowRecalcAfterStyleChange(); |
| } |
| - if (updatedDiff.needsRepaint()) { |
| - // Invalidate paints with the new style, e.g., for example if we go from not having |
| - // an outline to having an outline. |
| - |
| - // The paintInvalidationForWholeRenderer() call is needed for non-layout changes to style. See the corresponding |
| - // comment in RenderObject::styleWillChange for why. |
| - if (needsLayout()) |
| + // FIXME: Should invalidate whole layer if updatedDiff.needsRepaintLayer(). crbug.com/394050. |
| + if (diff.needsRepaintObject() || updatedDiff.needsRepaint()) { |
| + // FIXME: For objects that don't save previousPaintInvalidationRect, we still need |
| + // to invalidate now because their invalidateTreeIfNeeded won't invalidate themselves. |
| + // crbug.com/394133. |
| + // FIXME: Test of parentTransformDidChange in RenderSVGModelObject::invalidateTreeIfNeeded() |
| + // prevents SVG objects from using unified invalidation for repaint-only style change. |
| + // crbug.com/394619. |
| + if (needsLayout() || (canSelfInvalidateDuringTreeInvalidation() && !isSVG())) |
| setShouldDoFullPaintInvalidation(true); |
| - else if (!selfNeedsLayout()) |
| + else |
| paintInvalidationForWholeRenderer(); |
| } |
| } |
| @@ -2099,12 +2101,14 @@ void RenderObject::styleWillChange(StyleDifference diff, const RenderStyle& newS |
| } |
| } |
| - // For style-only changes that need paint invalidation, we currently need to issue a paint invalidation before and after the style |
| - // change. The paint invalidation before style change is accomplished here. The paint invalidation after style change is accomplished |
| - // in RenderObject::setStyle. |
| if (m_parent && diff.needsRepaintObject()) { |
| - if (!diff.needsLayout() && !needsLayout()) |
| - paintInvalidationForWholeRenderer(); |
| + if (!diff.needsLayout() && !needsLayout()) { |
| + // Invalidate before style change. |
| + // FIXME: See FIXMEs in setStyle() before calling paintInvalidationForWholeRenderer |
| + // for the reason of this paintInvalidationForWholeRenderer. |
| + if (!canSelfInvalidateDuringTreeInvalidation() || isSVG()) |
| + paintInvalidationForWholeRenderer(); |
| + } |
| } |
| if (isFloating() && (m_style->floating() != newStyle.floating())) |
| @@ -3394,6 +3398,17 @@ bool RenderObject::isRelayoutBoundaryForInspector() const |
| return objectIsRelayoutBoundary(this); |
| } |
| +void RenderObject::setShouldDoFullPaintInvalidation(bool b) |
|
Julien - ping for review
2014/07/18 18:49:44
I really think we should split the setting from th
|
| +{ |
| + m_bitfields.setShouldDoFullPaintInvalidation(b); |
| + if (!b) |
| + return; |
| + |
| + // Make sure our parent is marked so that the next invalidateTreeIfNeeded can reach this object. |
| + for (RenderObject* p = parent(); p && !p->shouldCheckForSelfOrChildPaintInvalidation(); p = p->parent()) |
|
Julien - ping for review
2014/07/18 18:49:44
This is wrong for 2 reasons:
- We shouldn't walk t
|
| + p->setChildNeedsPaintInvalidation(true); |
| +} |
| + |
| void RenderObject::clearPaintInvalidationState() |
| { |
| setShouldDoFullPaintInvalidation(false); |
| @@ -3403,6 +3418,7 @@ void RenderObject::clearPaintInvalidationState() |
| setShouldInvalidateOverflowForPaint(false); |
| setLayoutDidGetCalled(false); |
| setMayNeedPaintInvalidation(false); |
| + setChildNeedsPaintInvalidation(false); |
| } |
| bool RenderObject::isAllowedToModifyRenderTreeStructure(Document& document) |