Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(387)

Unified Diff: third_party/WebKit/Source/core/dom/Element.cpp

Issue 2473743003: Call Element::rebuildLayoutTree from Document::updateStyle directly (Closed)
Patch Set: Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 7aae88c83b5a16951b3eb756e306129b334a7f90..8502f9bf89cf5abd7e0719a234ef30557fae738d 100644
--- a/third_party/WebKit/Source/core/dom/Element.cpp
+++ b/third_party/WebKit/Source/core/dom/Element.cpp
@@ -1857,7 +1857,6 @@ void Element::recalcStyle(StyleRecalcChange change) {
if (parentComputedStyle())
change = recalcOwnStyle(change);
clearNeedsStyleRecalc();
- clearNeedsReattachLayoutTree();
}
// If we reattached we don't need to recalc the style of our descendants
@@ -1876,6 +1875,7 @@ void Element::recalcStyle(StyleRecalcChange change) {
root->recalcStyle(change);
}
recalcDescendantStyles(change);
+ clearChildNeedsStyleRecalc();
}
updatePseudoElement(PseudoIdAfter, change);
@@ -1887,9 +1887,6 @@ void Element::recalcStyle(StyleRecalcChange change) {
// non-floating we have to take it into account for the first letter.
updatePseudoElement(PseudoIdFirstLetter,
childNeedsStyleRecalc() ? Force : change);
-
- clearChildNeedsStyleRecalc();
- clearChildNeedsReattachLayoutTree();
}
if (hasCustomStyleCallbacks())
@@ -1943,7 +1940,7 @@ StyleRecalcChange Element::recalcOwnStyle(StyleRecalcChange change) {
if (localChange == Reattach) {
document().addNonAttachedStyle(*this, std::move(newStyle));
setNeedsReattachLayoutTree();
- return rebuildLayoutTree();
+ return Reattach;
}
DCHECK(oldStyle);
@@ -1985,33 +1982,52 @@ StyleRecalcChange Element::recalcOwnStyle(StyleRecalcChange change) {
return localChange;
}
-StyleRecalcChange Element::rebuildLayoutTree() {
+void Element::rebuildLayoutTree() {
DCHECK(inActiveDocument());
+ DCHECK(!needsStyleRecalc());
+ DCHECK(!childNeedsStyleRecalc());
+ DCHECK(parentNode());
+ DCHECK(parentNode()->childNeedsReattachLayoutTree());
+
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);
- // 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()) {
esprehn 2016/11/07 22:32:08 You're missing: SelectorFilterParentScope filte
+ rebuildShadowRootLayoutTree();
+ rebuildDescendantLayoutTree();
+ reattachPseudoElementLayoutTree(PseudoIdAfter);
+ reattachPseudoElementLayoutTree(PseudoIdBackdrop);
+ }
+ DCHECK(!needsReattachLayoutTree());
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.
+ // The choice is between increased time and increased memory complexity
+ // (for the duration of Style recalc and Layout Tree Construction).
+ // TODO(bugsnash): This is a performance regression - bugsnash is working on
+ // alleviating this regression.
reattachWhitespaceSiblingsIfNeeded(nextTextSibling());
- return Reattach;
}
- return ReattachNoLayoutObject;
esprehn 2016/11/07 22:32:08 Is ReattachNoLayoutObject dead code now?
+}
+
+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->rebuildLayoutTree();
+ }
}
void Element::updateCallbackSelectors(const ComputedStyle* oldStyle,

Powered by Google App Engine
This is Rietveld 408576698