Chromium Code Reviews| Index: third_party/WebKit/Source/core/dom/Element.cpp |
| diff --git a/third_party/WebKit/Source/core/dom/Element.cpp b/third_party/WebKit/Source/core/dom/Element.cpp |
| index 2fde2c526802721659102806ad693fc66f3f70b6..b0c10948acf84246c270e1ccce4ed63c36b07b57 100644 |
| --- a/third_party/WebKit/Source/core/dom/Element.cpp |
| +++ b/third_party/WebKit/Source/core/dom/Element.cpp |
| @@ -1884,7 +1884,6 @@ PassRefPtr<ComputedStyle> Element::originalStyleForLayoutObject() { |
| void Element::recalcStyle(StyleRecalcChange change, Text* nextTextSibling) { |
| DCHECK(document().inStyleRecalc()); |
| DCHECK(!document().lifecycle().inDetach()); |
| - DCHECK(!parentOrShadowHostNode()->needsStyleRecalc()); |
| DCHECK(inActiveDocument()); |
| if (hasCustomStyleCallbacks()) |
| @@ -1901,16 +1900,20 @@ void Element::recalcStyle(StyleRecalcChange change, Text* nextTextSibling) { |
| elementAnimations->setAnimationStyleChange(false); |
| } |
| } |
| - if (parentComputedStyle()) |
| + if (parentComputedStyle()) { |
| change = recalcOwnStyle(change, nextTextSibling); |
| - clearNeedsStyleRecalc(); |
| - clearNeedsReattachLayoutTree(); |
| + } else { |
| + // In case we don't perform recalcOwnStyle we will never clear the |
| + // NeedsReattachLayoutTree flag which is set on the creation of each |
| + // Node. Clear that here. |
| + clearNeedsReattachLayoutTree(); |
| + } |
| } |
| - // If we reattached we don't need to recalc the style of our descendants |
| - // anymore. |
| - if ((change >= UpdatePseudoElements && change < Reattach) || |
| - childNeedsStyleRecalc()) { |
| + // If we are going to reattach we don't need to recalc the style of |
| + // our descendants anymore. |
| + if (change < Reattach && |
| + (change >= UpdatePseudoElements || childNeedsStyleRecalc())) { |
| SelectorFilterParentScope filterScope(*this); |
| StyleSharingDepthScope sharingScope(*this); |
| @@ -1936,9 +1939,11 @@ void Element::recalcStyle(StyleRecalcChange change, Text* nextTextSibling) { |
| childNeedsStyleRecalc() ? Force : change); |
| clearChildNeedsStyleRecalc(); |
| - clearChildNeedsReattachLayoutTree(); |
| } |
| + if (!(needsReattachLayoutTree() || childNeedsReattachLayoutTree())) |
|
esprehn
2017/02/13 22:19:41
Run demorgans here
nainar
2017/02/14 03:42:09
Done.
|
| + clearNeedsStyleRecalc(); |
| + |
| if (hasCustomStyleCallbacks()) |
| didRecalcStyle(); |
| } |
| @@ -1968,7 +1973,6 @@ PassRefPtr<ComputedStyle> Element::propagateInheritedProperties( |
| StyleRecalcChange Element::recalcOwnStyle(StyleRecalcChange change, |
| Text* nextTextSibling) { |
| DCHECK(document().inStyleRecalc()); |
| - DCHECK(!parentOrShadowHostNode()->needsStyleRecalc()); |
| DCHECK(change >= IndependentInherit || needsStyleRecalc()); |
| DCHECK(parentComputedStyle()); |
| @@ -1996,7 +2000,7 @@ StyleRecalcChange Element::recalcOwnStyle(StyleRecalcChange change, |
| styleReattachData.nextTextSibling = nextTextSibling; |
| document().addStyleReattachData(*this, styleReattachData); |
| setNeedsReattachLayoutTree(); |
| - return rebuildLayoutTree(); |
| + return Reattach; |
| } |
| DCHECK(oldStyle); |
| @@ -2037,23 +2041,31 @@ StyleRecalcChange Element::recalcOwnStyle(StyleRecalcChange change, |
| return localChange; |
| } |
| -StyleRecalcChange Element::rebuildLayoutTree() { |
| +void Element::rebuildLayoutTree() { |
| DCHECK(inActiveDocument()); |
| + DCHECK(parentNode()); |
| + |
| StyleReattachData styleReattachData = document().getStyleReattachData(*this); |
| AttachContext reattachContext; |
| reattachContext.resolvedStyle = styleReattachData.computedStyle.get(); |
| bool layoutObjectWillChange = needsAttach() || layoutObject(); |
| - // We are calling Element::rebuildLayoutTree() from inside |
| - // Element::recalcOwnStyle where we set the NeedsReattachLayoutTree |
| - // flag - so needsReattachLayoutTree() should always be true. |
| - DCHECK(parentNode()); |
|
esprehn
2017/02/13 22:19:41
Can we add these DCHECKs back?
nainar
2017/02/14 03:42:09
They are back. They moved above.
|
| - DCHECK(parentNode()->childNeedsReattachLayoutTree()); |
| - DCHECK(needsReattachLayoutTree()); |
| - reattachLayoutTree(reattachContext); |
| - // Since needsReattachLayoutTree() is always true we go into |
| - // reattachLayoutTree() which reattaches all the descendant |
| - // sub-trees. At this point no child should need reattaching. |
| + if (needsReattachLayoutTree()) { |
| + reattachLayoutTree(reattachContext); |
| + } else if (childNeedsReattachLayoutTree()) { |
| + DCHECK(!needsReattachLayoutTree()); |
| + SelectorFilterParentScope filterScope(*this); |
| + StyleSharingDepthScope sharingScope(*this); |
| + reattachPseudoElementLayoutTree(PseudoIdBefore); |
| + rebuildShadowRootLayoutTree(); |
| + rebuildChildrenLayoutTrees(); |
| + reattachPseudoElementLayoutTree(PseudoIdAfter); |
| + reattachPseudoElementLayoutTree(PseudoIdBackdrop); |
| + reattachPseudoElementLayoutTree(PseudoIdFirstLetter); |
| + } |
| + DCHECK(!needsStyleRecalc()); |
| + DCHECK(!childNeedsStyleRecalc()); |
| + DCHECK(!needsReattachLayoutTree()); |
| DCHECK(!childNeedsReattachLayoutTree()); |
| if (layoutObjectWillChange || layoutObject()) { |
| @@ -2062,9 +2074,27 @@ StyleRecalcChange Element::rebuildLayoutTree() { |
| // or store it. |
| // The choice is between increased time and increased memory complexity. |
| reattachWhitespaceSiblingsIfNeeded(styleReattachData.nextTextSibling); |
| - return Reattach; |
| + } else { |
| + clearNeedsStyleRecalc(); |
| + } |
| +} |
| + |
| +void Element::rebuildShadowRootLayoutTree() { |
| + for (ShadowRoot* root = youngestShadowRoot(); root; |
| + root = root->olderShadowRoot()) { |
| + if (root->needsReattachLayoutTree() || root->childNeedsReattachLayoutTree()) |
| + root->rebuildLayoutTree(); |
| + } |
| +} |
| + |
| +void Element::reattachPseudoElementLayoutTree(PseudoId pseudoId) { |
| + if (PseudoElement* element = pseudoElement(pseudoId)) { |
| + if (element->needsReattachLayoutTree() || |
| + element->childNeedsReattachLayoutTree()) |
| + element->rebuildLayoutTree(); |
| + } else { |
| + createPseudoElementIfNeeded(pseudoId); |
| } |
| - return ReattachNoLayoutObject; |
| } |
| void Element::updateCallbackSelectors(const ComputedStyle* oldStyle, |
| @@ -3214,7 +3244,6 @@ void Element::cancelFocusAppearanceUpdate() { |
| } |
| void Element::updatePseudoElement(PseudoId pseudoId, StyleRecalcChange change) { |
| - DCHECK(!needsStyleRecalc()); |
| PseudoElement* element = pseudoElement(pseudoId); |
| if (element && (change == UpdatePseudoElements || |