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 7a6688b1a524f0d35371390cd52e2ea488d15955..e6f752ae7e7240e4602177dabcc0248e9a66800f 100644 |
| --- a/third_party/WebKit/Source/core/dom/Element.cpp |
| +++ b/third_party/WebKit/Source/core/dom/Element.cpp |
| @@ -1858,6 +1858,7 @@ void Element::recalcStyle(StyleRecalcChange change, Text* nextTextSibling) { |
| if (parentComputedStyle()) |
| change = recalcOwnStyle(change); |
| clearNeedsStyleRecalc(); |
| + clearNeedsReattachLayoutTree(); |
| } |
| // If we reattached we don't need to recalc the style of our descendants |
| @@ -1893,9 +1894,6 @@ void Element::recalcStyle(StyleRecalcChange change, Text* nextTextSibling) { |
| if (hasCustomStyleCallbacks()) |
| didRecalcStyle(change); |
| - |
| - if (change == Reattach) |
| - reattachWhitespaceSiblingsIfNeeded(nextTextSibling); |
|
esprehn
2016/10/18 02:00:10
We don't need the nextTextSibling here anymore so
|
| } |
| PassRefPtr<ComputedStyle> Element::propagateInheritedProperties( |
| @@ -1944,6 +1942,7 @@ StyleRecalcChange Element::recalcOwnStyle(StyleRecalcChange change) { |
| if (localChange == Reattach) { |
| document().addNonAttachedStyle(*this, std::move(newStyle)); |
| + setNeedsReattachLayoutTree(); |
| return rebuildLayoutTree(); |
| } |
| @@ -1987,12 +1986,31 @@ StyleRecalcChange Element::recalcOwnStyle(StyleRecalcChange change) { |
| } |
| StyleRecalcChange Element::rebuildLayoutTree() { |
| + DCHECK(inActiveDocument()); |
| AttachContext reattachContext; |
| reattachContext.resolvedStyle = document().getNonAttachedStyle(*this); |
| 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()); |
| + DCHECK(parentNode()->childNeedsReattachLayoutTree()); |
| + DCHECK(needsReattachLayoutTree()); |
| reattachLayoutTree(reattachContext); |
| - if (layoutObjectWillChange || layoutObject()) |
| + // Since needsReattachLayoutTree() is always true we go into |
| + // reattachLayoutTree() which reattaches all the descendant |
| + // sub-trees. At this point no child should need reattaching. |
| + DCHECK(!childNeedsReattachLayoutTree()); |
| + |
| + if (layoutObjectWillChange || layoutObject()) { |
| + // nextTextSibling is passed on to recalcStyle from recalcDescendantStyles |
| + // we can either traverse the current subtree from this node onwards |
| + // or store it. |
| + // The choice is between increased time and increased memory complexity. |
| + reattachWhitespaceSiblingsIfNeeded(nextTextSibling()); |
| return Reattach; |
| + } |
| return ReattachNoLayoutObject; |
| } |