Index: third_party/WebKit/Source/core/layout/LayoutObject.cpp |
diff --git a/third_party/WebKit/Source/core/layout/LayoutObject.cpp b/third_party/WebKit/Source/core/layout/LayoutObject.cpp |
index 2f058262c0a0d371c51b23bfe4bf2b2716997f83..f1a02b92ae994f4d8b3b39d222de81e8fa5572c3 100644 |
--- a/third_party/WebKit/Source/core/layout/LayoutObject.cpp |
+++ b/third_party/WebKit/Source/core/layout/LayoutObject.cpp |
@@ -1624,6 +1624,7 @@ void LayoutObject::markAncestorsForOverflowRecalcIfNeeded() { |
void LayoutObject::setNeedsOverflowRecalcAfterStyleChange() { |
bool neededRecalc = needsOverflowRecalcAfterStyleChange(); |
setSelfNeedsOverflowRecalcAfterStyleChange(); |
+ setMayNeedPaintInvalidation(); |
if (!neededRecalc) |
markAncestorsForOverflowRecalcIfNeeded(); |
} |
@@ -1723,11 +1724,17 @@ void LayoutObject::setStyle(PassRefPtr<ComputedStyle> style) { |
} |
if (diff.needsPaintInvalidationSubtree() || |
- updatedDiff.needsPaintInvalidationSubtree()) |
+ updatedDiff.needsPaintInvalidationSubtree()) { |
setShouldDoFullPaintInvalidationIncludingNonCompositingDescendants(); |
- else if (diff.needsPaintInvalidationObject() || |
- updatedDiff.needsPaintInvalidationObject()) |
- setShouldDoFullPaintInvalidation(); |
+ } else if (diff.needsPaintInvalidationObject() || |
+ updatedDiff.needsPaintInvalidationObject()) { |
+ // TODO(wangxianzhu): For now LayoutSVGRoot::localVisualRect() depends on |
+ // several styles. Refactor to avoid this special case. |
+ if (isSVGRoot()) |
+ setShouldDoFullPaintInvalidation(); |
+ else |
+ setShouldDoFullPaintInvalidationWithoutGeometryChange(); |
+ } |
// Text nodes share style with their parents but the paint properties don't |
// apply to them, hence the !isText() check. |
@@ -3409,14 +3416,24 @@ inline void LayoutObject::markAncestorsForPaintInvalidation() { |
for (LayoutObject* parent = this->paintInvalidationParent(); |
parent && !parent->shouldCheckForPaintInvalidation(); |
parent = parent->paintInvalidationParent()) |
- parent->m_bitfields.setChildShouldCheckForPaintInvalidation(true); |
+ parent->m_bitfields.setMayNeedPaintInvalidation(true); |
+} |
+ |
+inline void LayoutObject::setNeedsPaintOffsetAndVisualRectUpdate() { |
+ if (needsPaintOffsetAndVisualRectUpdate()) |
+ return; |
+ m_bitfields.setNeedsPaintOffsetAndVisualRectUpdate(true); |
+ for (LayoutObject* parent = paintInvalidationParent(); |
+ parent && !parent->needsPaintOffsetAndVisualRectUpdate(); |
+ parent = parent->paintInvalidationParent()) |
+ parent->m_bitfields.setNeedsPaintOffsetAndVisualRectUpdate(true); |
} |
void LayoutObject::setShouldInvalidateSelection() { |
if (!canUpdateSelectionOnRootLineBoxes()) |
return; |
m_bitfields.setShouldInvalidateSelection(true); |
- markAncestorsForPaintInvalidation(); |
+ setMayNeedPaintInvalidation(); |
frameView()->scheduleVisualUpdateForPaintInvalidationIfNeeded(); |
} |
@@ -3428,8 +3445,14 @@ bool LayoutObject::shouldCheckForPaintInvalidationWithPaintInvalidationState( |
void LayoutObject::setShouldDoFullPaintInvalidation( |
PaintInvalidationReason reason) { |
+ setNeedsPaintOffsetAndVisualRectUpdate(); |
+ setShouldDoFullPaintInvalidationWithoutGeometryChange(reason); |
+} |
+ |
+void LayoutObject::setShouldDoFullPaintInvalidationWithoutGeometryChange( |
+ PaintInvalidationReason reason) { |
// Only full invalidation reasons are allowed. |
- ASSERT(isFullPaintInvalidationReason(reason)); |
+ DCHECK(isFullPaintInvalidationReason(reason)); |
bool isUpgradingDelayedFullToFull = |
m_bitfields.fullPaintInvalidationReason() == |
@@ -3450,6 +3473,11 @@ void LayoutObject::setShouldDoFullPaintInvalidation( |
} |
void LayoutObject::setMayNeedPaintInvalidation() { |
+ setNeedsPaintOffsetAndVisualRectUpdate(); |
+ setMayNeedPaintInvalidationWithoutGeometryChange(); |
+} |
+ |
+void LayoutObject::setMayNeedPaintInvalidationWithoutGeometryChange() { |
if (mayNeedPaintInvalidation()) |
return; |
m_bitfields.setMayNeedPaintInvalidation(true); |
@@ -3468,7 +3496,7 @@ void LayoutObject::setMayNeedPaintInvalidationAnimatedBackgroundImage() { |
if (mayNeedPaintInvalidationAnimatedBackgroundImage()) |
return; |
m_bitfields.setMayNeedPaintInvalidationAnimatedBackgroundImage(true); |
- setMayNeedPaintInvalidation(); |
+ setMayNeedPaintInvalidationWithoutGeometryChange(); |
} |
void LayoutObject::clearPaintInvalidationFlags() { |
@@ -3478,10 +3506,10 @@ void LayoutObject::clearPaintInvalidationFlags() { |
DCHECK(!shouldCheckForPaintInvalidation() || paintInvalidationStateIsDirty()); |
#endif |
clearShouldDoFullPaintInvalidation(); |
- m_bitfields.setChildShouldCheckForPaintInvalidation(false); |
m_bitfields.setMayNeedPaintInvalidation(false); |
m_bitfields.setMayNeedPaintInvalidationSubtree(false); |
m_bitfields.setMayNeedPaintInvalidationAnimatedBackgroundImage(false); |
+ m_bitfields.setNeedsPaintOffsetAndVisualRectUpdate(false); |
m_bitfields.setShouldInvalidateSelection(false); |
m_bitfields.setBackgroundChangedSinceLastPaintInvalidation(false); |
} |