Index: Source/core/rendering/style/RenderStyle.cpp |
diff --git a/Source/core/rendering/style/RenderStyle.cpp b/Source/core/rendering/style/RenderStyle.cpp |
index 8d1f8dadef7fba33d45c24e845fbea67acd9682f..aa3ced27f2848a0fa107dd61d62a92602ad7f94a 100644 |
--- a/Source/core/rendering/style/RenderStyle.cpp |
+++ b/Source/core/rendering/style/RenderStyle.cpp |
@@ -369,48 +369,69 @@ StyleDifference RenderStyle::diff(const RenderStyle* other, unsigned& changedCon |
{ |
changedContextSensitiveProperties = ContextSensitivePropertyNone; |
+ // Note, we use .get() on each DataRef below because DataRef::operator== will do a deep |
+ // compare, which is duplicate work when we're going to compare each property inside |
+ // this function anyway. |
+ |
StyleDifference svgChange = StyleDifferenceEqual; |
- if (m_svgStyle != other->m_svgStyle) { |
+ if (m_svgStyle.get() != other->m_svgStyle.get()) { |
svgChange = m_svgStyle->diff(other->m_svgStyle.get()); |
if (svgChange == StyleDifferenceLayout) |
return svgChange; |
} |
- if (m_box->width() != other->m_box->width() |
- || m_box->minWidth() != other->m_box->minWidth() |
- || m_box->maxWidth() != other->m_box->maxWidth() |
- || m_box->height() != other->m_box->height() |
- || m_box->minHeight() != other->m_box->minHeight() |
- || m_box->maxHeight() != other->m_box->maxHeight()) |
- return StyleDifferenceLayout; |
+ if (m_box.get() != other->m_box.get()) { |
+ if (m_box->width() != other->m_box->width() |
+ || m_box->minWidth() != other->m_box->minWidth() |
+ || m_box->maxWidth() != other->m_box->maxWidth() |
+ || m_box->height() != other->m_box->height() |
+ || m_box->minHeight() != other->m_box->minHeight() |
+ || m_box->maxHeight() != other->m_box->maxHeight()) |
+ return StyleDifferenceLayout; |
- if (m_box->verticalAlign() != other->m_box->verticalAlign() || noninherited_flags._vertical_align != other->noninherited_flags._vertical_align) |
- return StyleDifferenceLayout; |
+ if (m_box->verticalAlign() != other->m_box->verticalAlign()) |
+ return StyleDifferenceLayout; |
- if (m_box->boxSizing() != other->m_box->boxSizing()) |
- return StyleDifferenceLayout; |
+ if (m_box->boxSizing() != other->m_box->boxSizing()) |
+ return StyleDifferenceLayout; |
+ } |
- if (surround->margin != other->surround->margin) |
- return StyleDifferenceLayout; |
+ if (surround.get() != other->surround.get()) { |
+ if (surround->margin != other->surround->margin) |
+ return StyleDifferenceLayout; |
- if (surround->padding != other->surround->padding) |
- return StyleDifferenceLayout; |
+ if (surround->padding != other->surround->padding) |
+ return StyleDifferenceLayout; |
+ |
+ // If our border widths change, then we need to layout. Other changes to borders only necessitate a repaint. |
+ if (borderLeftWidth() != other->borderLeftWidth() |
+ || borderTopWidth() != other->borderTopWidth() |
+ || borderBottomWidth() != other->borderBottomWidth() |
+ || borderRightWidth() != other->borderRightWidth()) |
+ return StyleDifferenceLayout; |
+ } |
if (rareNonInheritedData.get() != other->rareNonInheritedData.get()) { |
if (rareNonInheritedData->m_appearance != other->rareNonInheritedData->m_appearance |
|| rareNonInheritedData->marginBeforeCollapse != other->rareNonInheritedData->marginBeforeCollapse |
|| rareNonInheritedData->marginAfterCollapse != other->rareNonInheritedData->marginAfterCollapse |
|| rareNonInheritedData->lineClamp != other->rareNonInheritedData->lineClamp |
- || rareNonInheritedData->textOverflow != other->rareNonInheritedData->textOverflow) |
- return StyleDifferenceLayout; |
- |
- if (rareNonInheritedData->m_regionFragment != other->rareNonInheritedData->m_regionFragment) |
- return StyleDifferenceLayout; |
- |
- if (rareNonInheritedData->m_wrapFlow != other->rareNonInheritedData->m_wrapFlow |
+ || rareNonInheritedData->textOverflow != other->rareNonInheritedData->textOverflow |
+ || rareNonInheritedData->m_regionFragment != other->rareNonInheritedData->m_regionFragment |
+ || rareNonInheritedData->m_wrapFlow != other->rareNonInheritedData->m_wrapFlow |
|| rareNonInheritedData->m_wrapThrough != other->rareNonInheritedData->m_wrapThrough |
|| rareNonInheritedData->m_shapeMargin != other->rareNonInheritedData->m_shapeMargin |
- || rareNonInheritedData->m_shapePadding != other->rareNonInheritedData->m_shapePadding) |
+ || rareNonInheritedData->m_shapePadding != other->rareNonInheritedData->m_shapePadding |
+ || rareNonInheritedData->m_order != other->rareNonInheritedData->m_order |
+ || rareNonInheritedData->m_alignContent != other->rareNonInheritedData->m_alignContent |
+ || rareNonInheritedData->m_alignItems != other->rareNonInheritedData->m_alignItems |
+ || rareNonInheritedData->m_alignSelf != other->rareNonInheritedData->m_alignSelf |
+ || rareNonInheritedData->m_justifyContent != other->rareNonInheritedData->m_justifyContent |
+ || rareNonInheritedData->m_grid.get() != other->rareNonInheritedData->m_grid.get() |
+ || rareNonInheritedData->m_gridItem.get() != other->rareNonInheritedData->m_gridItem.get() |
+ || rareNonInheritedData->m_shapeInside != other->rareNonInheritedData->m_shapeInside |
+ || rareNonInheritedData->m_textCombine != other->rareNonInheritedData->m_textCombine |
+ || rareNonInheritedData->hasFilters() != other->rareNonInheritedData->hasFilters()) |
return StyleDifferenceLayout; |
if (rareNonInheritedData->m_deprecatedFlexibleBox.get() != other->rareNonInheritedData->m_deprecatedFlexibleBox.get() |
@@ -420,12 +441,6 @@ StyleDifference RenderStyle::diff(const RenderStyle* other, unsigned& changedCon |
if (rareNonInheritedData->m_flexibleBox.get() != other->rareNonInheritedData->m_flexibleBox.get() |
&& *rareNonInheritedData->m_flexibleBox.get() != *other->rareNonInheritedData->m_flexibleBox.get()) |
return StyleDifferenceLayout; |
- if (rareNonInheritedData->m_order != other->rareNonInheritedData->m_order |
- || rareNonInheritedData->m_alignContent != other->rareNonInheritedData->m_alignContent |
- || rareNonInheritedData->m_alignItems != other->rareNonInheritedData->m_alignItems |
- || rareNonInheritedData->m_alignSelf != other->rareNonInheritedData->m_alignSelf |
- || rareNonInheritedData->m_justifyContent != other->rareNonInheritedData->m_justifyContent) |
- return StyleDifferenceLayout; |
// FIXME: We should add an optimized form of layout that just recomputes visual overflow. |
if (!rareNonInheritedData->shadowDataEquivalent(*other->rareNonInheritedData.get())) |
@@ -445,12 +460,22 @@ StyleDifference RenderStyle::diff(const RenderStyle* other, unsigned& changedCon |
changedContextSensitiveProperties |= ContextSensitivePropertyTransform; |
} |
- if (rareNonInheritedData->m_grid.get() != other->rareNonInheritedData->m_grid.get() |
- || rareNonInheritedData->m_gridItem.get() != other->rareNonInheritedData->m_gridItem.get()) |
+ // If the counter directives change, trigger a relayout to re-calculate counter values and rebuild the counter node tree. |
+ const CounterDirectiveMap* mapA = rareNonInheritedData->m_counterDirectives.get(); |
+ const CounterDirectiveMap* mapB = other->rareNonInheritedData->m_counterDirectives.get(); |
+ if (!(mapA == mapB || (mapA && mapB && *mapA == *mapB))) |
return StyleDifferenceLayout; |
- if (rareNonInheritedData->m_shapeInside != other->rareNonInheritedData->m_shapeInside) |
+ // We only need do layout for opacity changes if adding or losing opacity could trigger a change |
+ // in us being a stacking context. |
+ if (hasAutoZIndex() != other->hasAutoZIndex() && rareNonInheritedData->hasOpacity() != other->rareNonInheritedData->hasOpacity()) { |
+ // FIXME: We would like to use SimplifiedLayout here, but we can't quite do that yet. |
+ // We need to make sure SimplifiedLayout can operate correctly on RenderInlines (we will need |
+ // to add a selfNeedsSimplifiedLayout bit in order to not get confused and taint every line). |
+ // In addition we need to solve the floating object issue when layers come and go. Right now |
+ // a full layout is necessary to keep floating object lists sane. |
return StyleDifferenceLayout; |
+ } |
} |
if (rareInheritedData.get() != other->rareInheritedData.get()) { |
@@ -480,32 +505,48 @@ StyleDifference RenderStyle::diff(const RenderStyle* other, unsigned& changedCon |
|| rareInheritedData->m_lineGrid != other->rareInheritedData->m_lineGrid |
|| rareInheritedData->m_lineSnap != other->rareInheritedData->m_lineSnap |
|| rareInheritedData->m_lineAlign != other->rareInheritedData->m_lineAlign |
- || rareInheritedData->listStyleImage != other->rareInheritedData->listStyleImage) |
+ || rareInheritedData->listStyleImage != other->rareInheritedData->listStyleImage |
+ || rareInheritedData->textStrokeWidth != other->rareInheritedData->textStrokeWidth) |
return StyleDifferenceLayout; |
if (!rareInheritedData->shadowDataEquivalent(*other->rareInheritedData.get())) |
return StyleDifferenceLayout; |
- if (textStrokeWidth() != other->textStrokeWidth()) |
+ if (!QuotesData::equals(rareInheritedData->quotes.get(), other->rareInheritedData->quotes.get())) |
return StyleDifferenceLayout; |
} |
if (visual->m_textAutosizingMultiplier != other->visual->m_textAutosizingMultiplier) |
return StyleDifferenceLayout; |
- if (inherited->line_height != other->inherited->line_height |
+ if (inherited.get() != other->inherited.get()) { |
+ if (inherited->line_height != other->inherited->line_height |
|| inherited->font != other->inherited->font |
|| inherited->horizontal_border_spacing != other->inherited->horizontal_border_spacing |
- || inherited->vertical_border_spacing != other->inherited->vertical_border_spacing |
- || inherited_flags._box_direction != other->inherited_flags._box_direction |
+ || inherited->vertical_border_spacing != other->inherited->vertical_border_spacing) |
+ return StyleDifferenceLayout; |
+ } |
+ |
+ if (inherited_flags._box_direction != other->inherited_flags._box_direction |
|| inherited_flags.m_rtlOrdering != other->inherited_flags.m_rtlOrdering |
+ || inherited_flags._text_align != other->inherited_flags._text_align |
+ || inherited_flags._text_transform != other->inherited_flags._text_transform |
+ || inherited_flags._direction != other->inherited_flags._direction |
+ || inherited_flags._white_space != other->inherited_flags._white_space |
+ || inherited_flags.m_writingMode != other->inherited_flags.m_writingMode) |
+ return StyleDifferenceLayout; |
+ |
+ if (noninherited_flags._overflowX != other->noninherited_flags._overflowX |
+ || noninherited_flags._overflowY != other->noninherited_flags._overflowY |
+ || noninherited_flags._clear != other->noninherited_flags._clear |
+ || noninherited_flags._unicodeBidi != other->noninherited_flags._unicodeBidi |
|| noninherited_flags._position != other->noninherited_flags._position |
|| noninherited_flags._floating != other->noninherited_flags._floating |
- || noninherited_flags._originalDisplay != other->noninherited_flags._originalDisplay) |
+ || noninherited_flags._originalDisplay != other->noninherited_flags._originalDisplay |
+ || noninherited_flags._vertical_align != other->noninherited_flags._vertical_align) |
return StyleDifferenceLayout; |
- |
- if (((int)noninherited_flags._effectiveDisplay) >= TABLE) { |
+ if (noninherited_flags._effectiveDisplay >= FIRST_TABLE_DISPLAY && noninherited_flags._effectiveDisplay <= LAST_TABLE_DISPLAY) { |
if (inherited_flags._border_collapse != other->inherited_flags._border_collapse |
|| inherited_flags._empty_cells != other->inherited_flags._empty_cells |
|| inherited_flags._caption_side != other->inherited_flags._caption_side |
@@ -524,69 +565,15 @@ StyleDifference RenderStyle::diff(const RenderStyle* other, unsigned& changedCon |
|| (borderRightStyle() == BHIDDEN && other->borderRightStyle() == BNONE) |
|| (borderRightStyle() == BNONE && other->borderRightStyle() == BHIDDEN))) |
return StyleDifferenceLayout; |
- } |
- |
- if (noninherited_flags._effectiveDisplay == LIST_ITEM) { |
+ } else if (noninherited_flags._effectiveDisplay == LIST_ITEM) { |
if (inherited_flags._list_style_type != other->inherited_flags._list_style_type |
|| inherited_flags._list_style_position != other->inherited_flags._list_style_position) |
return StyleDifferenceLayout; |
} |
- if (inherited_flags._text_align != other->inherited_flags._text_align |
- || inherited_flags._text_transform != other->inherited_flags._text_transform |
- || inherited_flags._direction != other->inherited_flags._direction |
- || inherited_flags._white_space != other->inherited_flags._white_space |
- || noninherited_flags._clear != other->noninherited_flags._clear |
- || noninherited_flags._unicodeBidi != other->noninherited_flags._unicodeBidi) |
- return StyleDifferenceLayout; |
- |
- // Check block flow direction. |
- if (inherited_flags.m_writingMode != other->inherited_flags.m_writingMode) |
- return StyleDifferenceLayout; |
- |
- // Check text combine mode. |
- if (rareNonInheritedData->m_textCombine != other->rareNonInheritedData->m_textCombine) |
- return StyleDifferenceLayout; |
- |
- // Overflow returns a layout hint. |
- if (noninherited_flags._overflowX != other->noninherited_flags._overflowX |
- || noninherited_flags._overflowY != other->noninherited_flags._overflowY) |
- return StyleDifferenceLayout; |
- |
- // If our border widths change, then we need to layout. Other changes to borders |
- // only necessitate a repaint. |
- if (borderLeftWidth() != other->borderLeftWidth() |
- || borderTopWidth() != other->borderTopWidth() |
- || borderBottomWidth() != other->borderBottomWidth() |
- || borderRightWidth() != other->borderRightWidth()) |
- return StyleDifferenceLayout; |
- |
- // If the counter directives change, trigger a relayout to re-calculate counter values and rebuild the counter node tree. |
- const CounterDirectiveMap* mapA = rareNonInheritedData->m_counterDirectives.get(); |
- const CounterDirectiveMap* mapB = other->rareNonInheritedData->m_counterDirectives.get(); |
- if (!(mapA == mapB || (mapA && mapB && *mapA == *mapB))) |
- return StyleDifferenceLayout; |
- |
if ((visibility() == COLLAPSE) != (other->visibility() == COLLAPSE)) |
return StyleDifferenceLayout; |
- // We only need do layout for opacity changes if adding or losing opacity could trigger a change |
- // in us being a stacking context. |
- if (hasAutoZIndex() != other->hasAutoZIndex() && rareNonInheritedData->hasOpacity() != other->rareNonInheritedData->hasOpacity()) { |
- // FIXME: We would like to use SimplifiedLayout here, but we can't quite do that yet. |
- // We need to make sure SimplifiedLayout can operate correctly on RenderInlines (we will need |
- // to add a selfNeedsSimplifiedLayout bit in order to not get confused and taint every line). |
- // In addition we need to solve the floating object issue when layers come and go. Right now |
- // a full layout is necessary to keep floating object lists sane. |
- return StyleDifferenceLayout; |
- } |
- |
- if (rareNonInheritedData->hasFilters() != other->rareNonInheritedData->hasFilters()) |
- return StyleDifferenceLayout; |
- |
- if (!QuotesData::equals(rareInheritedData->quotes.get(), other->rareInheritedData->quotes.get())) |
- return StyleDifferenceLayout; |
- |
// SVGRenderStyle::diff() might have returned StyleDifferenceRepaint, eg. if fill changes. |
// If eg. the font-size changed at the same time, we're not allowed to return StyleDifferenceRepaint, |
// but have to return StyleDifferenceLayout, that's why this if branch comes after all branches |
@@ -594,18 +581,18 @@ StyleDifference RenderStyle::diff(const RenderStyle* other, unsigned& changedCon |
if (svgChange != StyleDifferenceEqual) |
return svgChange; |
- // Make sure these left/top/right/bottom checks stay below all layout checks and above |
- // all visible checks. |
+ // NOTE: This block must be last in this function for the StyleDifferenceLayoutPositionedMovementOnly |
+ // optimization to work properly. |
if (position() != StaticPosition && surround->offset != other->surround->offset) { |
// Optimize for the case where a positioned layer is moving but not changing size. |
if (position() == AbsolutePosition && positionedObjectMoved(surround->offset, other->surround->offset, m_box->width()) && repaintOnlyDiff(other, changedContextSensitiveProperties) == StyleDifferenceEqual) |
return StyleDifferenceLayoutPositionedMovementOnly; |
- |
// FIXME: We would like to use SimplifiedLayout for relative positioning, but we can't quite do that yet. |
// We need to make sure SimplifiedLayout can operate correctly on RenderInlines (we will need |
// to add a selfNeedsSimplifiedLayout bit in order to not get confused and taint every line). |
return StyleDifferenceLayout; |
} |
+ |
return repaintOnlyDiff(other, changedContextSensitiveProperties); |
} |