Index: Source/core/rendering/RenderObject.cpp |
diff --git a/Source/core/rendering/RenderObject.cpp b/Source/core/rendering/RenderObject.cpp |
index e710dc7c3fe1785aa206d528730dee1d9429b86f..c084df18940d034a45163e3fc8053183ad0f7aa4 100644 |
--- a/Source/core/rendering/RenderObject.cpp |
+++ b/Source/core/rendering/RenderObject.cpp |
@@ -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() || (invalidatesSelfDuringTreeInvalidation() && !isSVG())) |
setShouldDoFullPaintInvalidation(true); |
- else if (!selfNeedsLayout()) |
+ else |
paintInvalidationForWholeRenderer(); |
} |
} |
@@ -2099,14 +2101,6 @@ 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 (isFloating() && (m_style->floating() != newStyle.floating())) |
// For changes in float styles, we need to conceivably remove ourselves |
// from the floating objects list. |
@@ -3394,6 +3388,17 @@ bool RenderObject::isRelayoutBoundaryForInspector() const |
return objectIsRelayoutBoundary(this); |
} |
+void RenderObject::setShouldDoFullPaintInvalidation(bool b) |
+{ |
+ m_bitfields.setShouldDoFullPaintInvalidation(b); |
+ if (!b) |
+ return; |
+ |
+ // Make sure our parent is marked as child needing invalidation. |
dsinclair
2014/07/17 18:36:01
as child needing full paint invalidation
Xianzhu
2014/07/17 21:57:34
Updated.
|
+ for (RenderObject* p = parent(); p && !p->shouldCheckForPaintInvalidation(); p = p->parent()) |
+ p->setChildNeedsPaintInvalidation(true); |
+} |
+ |
void RenderObject::clearPaintInvalidationState() |
{ |
setShouldDoFullPaintInvalidation(false); |
@@ -3403,6 +3408,7 @@ void RenderObject::clearPaintInvalidationState() |
setShouldInvalidateOverflowForPaint(false); |
setLayoutDidGetCalled(false); |
setMayNeedPaintInvalidation(false); |
+ setChildNeedsPaintInvalidation(false); |
} |
bool RenderObject::isAllowedToModifyRenderTreeStructure(Document& document) |