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

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

Issue 2766163002: Pass nextTextSibling to ::before layout rebuild. (Closed)
Patch Set: Created 3 years, 9 months 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 a403176069c3b352a8a11cbf448a268666686e72..75ec9446f6fd349cf5b75d86b34052a93ddd7fdd 100644
--- a/third_party/WebKit/Source/core/dom/Element.cpp
+++ b/third_party/WebKit/Source/core/dom/Element.cpp
@@ -2037,12 +2037,13 @@ void Element::rebuildLayoutTree(Text* nextTextSibling) {
DCHECK(!needsReattachLayoutTree());
SelectorFilterParentScope filterScope(*this);
StyleSharingDepthScope sharingScope(*this);
- reattachPseudoElementLayoutTree(PseudoIdBefore);
- rebuildShadowRootLayoutTree();
- rebuildChildrenLayoutTrees();
- reattachPseudoElementLayoutTree(PseudoIdAfter);
- reattachPseudoElementLayoutTree(PseudoIdBackdrop);
- reattachPseudoElementLayoutTree(PseudoIdFirstLetter);
+ Text* nextTextSibling = nullptr;
+ rebuildPseudoElementLayoutTree(PseudoIdAfter);
+ rebuildShadowRootLayoutTree(nextTextSibling);
+ rebuildChildrenLayoutTrees(nextTextSibling);
+ rebuildPseudoElementLayoutTree(PseudoIdBefore, nextTextSibling);
esprehn 2017/03/28 20:56:51 Why do we only need this for ::before?
rune 2017/03/29 10:39:47 We always evaluate the need for a whitespace layou
+ rebuildPseudoElementLayoutTree(PseudoIdBackdrop);
+ rebuildPseudoElementLayoutTree(PseudoIdFirstLetter);
}
DCHECK(!needsStyleRecalc());
DCHECK(!childNeedsStyleRecalc());
@@ -2050,19 +2051,31 @@ void Element::rebuildLayoutTree(Text* nextTextSibling) {
DCHECK(!childNeedsReattachLayoutTree());
}
-void Element::rebuildShadowRootLayoutTree() {
+void Element::rebuildShadowRootLayoutTree(Text*& nextTextSibling) {
for (ShadowRoot* root = youngestShadowRoot(); root;
root = root->olderShadowRoot()) {
+ // TODO(rune@opera.com): nextTextSibling is not set correctly when we have
+ // slotted nodes (crbug.com/648931). Also, it may be incorrect when we have
+ // multiple shadow roots (for V0 shadow hosts).
+ //
+ // When we call this method and neither this, nor our child nodes are marked
+ // for re-attachment, it means one or more pseudo elements needs re-
+ // attachment. In that case, find the first text node sibling not preceeded
+ // by any in-flow children as the nextTextSibling to allow correct
+ // whitespace re-attachment if the ::before element display changes.
if (root->needsReattachLayoutTree() || root->childNeedsReattachLayoutTree())
- root->rebuildLayoutTree();
+ root->rebuildLayoutTree(nextTextSibling);
+ else
+ nextTextSibling = root->findNextTextSibling();
esprehn 2017/03/28 20:56:51 ShadowRoot can't have siblings so this doesn't mak
rune 2017/03/29 10:39:47 Rewrote this for PS2.
}
}
-void Element::reattachPseudoElementLayoutTree(PseudoId pseudoId) {
+void Element::rebuildPseudoElementLayoutTree(PseudoId pseudoId,
+ Text* nextTextSibling) {
if (PseudoElement* element = pseudoElement(pseudoId)) {
if (element->needsReattachLayoutTree() ||
element->childNeedsReattachLayoutTree())
- element->rebuildLayoutTree();
+ element->rebuildLayoutTree(nextTextSibling);
} else {
createPseudoElementIfNeeded(pseudoId);
}

Powered by Google App Engine
This is Rietveld 408576698