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

Side by Side Diff: third_party/WebKit/Source/core/dom/Element.cpp

Issue 2476163002: Fixed perf regression by removing tree traversal for text sibling. (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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2001 Peter Kelly (pmk@post.com) 4 * (C) 2001 Peter Kelly (pmk@post.com)
5 * (C) 2001 Dirk Mueller (mueller@kde.org) 5 * (C) 2001 Dirk Mueller (mueller@kde.org)
6 * (C) 2007 David Smith (catfish.man@gmail.com) 6 * (C) 2007 David Smith (catfish.man@gmail.com)
7 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012, 2013 Apple Inc. 7 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012, 2013 Apple Inc.
8 * All rights reserved. 8 * All rights reserved.
9 * (C) 2007 Eric Seidel (eric@webkit.org) 9 * (C) 2007 Eric Seidel (eric@webkit.org)
10 * 10 *
(...skipping 1818 matching lines...) Expand 10 before | Expand all | Expand 10 after
1829 isInTopLayer()); 1829 isInTopLayer());
1830 1830
1831 return style.release(); 1831 return style.release();
1832 } 1832 }
1833 1833
1834 PassRefPtr<ComputedStyle> Element::originalStyleForLayoutObject() { 1834 PassRefPtr<ComputedStyle> Element::originalStyleForLayoutObject() {
1835 DCHECK(document().inStyleRecalc()); 1835 DCHECK(document().inStyleRecalc());
1836 return document().ensureStyleResolver().styleForElement(this); 1836 return document().ensureStyleResolver().styleForElement(this);
1837 } 1837 }
1838 1838
1839 void Element::recalcStyle(StyleRecalcChange change) { 1839 void Element::recalcStyle(StyleRecalcChange change, Text* nextTextSibling) {
1840 DCHECK(document().inStyleRecalc()); 1840 DCHECK(document().inStyleRecalc());
1841 DCHECK(!document().lifecycle().inDetach()); 1841 DCHECK(!document().lifecycle().inDetach());
1842 DCHECK(!parentOrShadowHostNode()->needsStyleRecalc()); 1842 DCHECK(!parentOrShadowHostNode()->needsStyleRecalc());
1843 DCHECK(inActiveDocument()); 1843 DCHECK(inActiveDocument());
1844 1844
1845 if (hasCustomStyleCallbacks()) 1845 if (hasCustomStyleCallbacks())
1846 willRecalcStyle(change); 1846 willRecalcStyle(change);
1847 1847
1848 if (change >= IndependentInherit || needsStyleRecalc()) { 1848 if (change >= IndependentInherit || needsStyleRecalc()) {
1849 if (hasRareData()) { 1849 if (hasRareData()) {
1850 ElementRareData* data = elementRareData(); 1850 ElementRareData* data = elementRareData();
1851 if (change != IndependentInherit) 1851 if (change != IndependentInherit)
1852 data->clearComputedStyle(); 1852 data->clearComputedStyle();
1853 1853
1854 if (change >= IndependentInherit) { 1854 if (change >= IndependentInherit) {
1855 if (ElementAnimations* elementAnimations = data->elementAnimations()) 1855 if (ElementAnimations* elementAnimations = data->elementAnimations())
1856 elementAnimations->setAnimationStyleChange(false); 1856 elementAnimations->setAnimationStyleChange(false);
1857 } 1857 }
1858 } 1858 }
1859 if (parentComputedStyle()) 1859 if (parentComputedStyle())
1860 change = recalcOwnStyle(change); 1860 change = recalcOwnStyle(change, nextTextSibling);
1861 clearNeedsStyleRecalc(); 1861 clearNeedsStyleRecalc();
1862 clearNeedsReattachLayoutTree(); 1862 clearNeedsReattachLayoutTree();
1863 } 1863 }
1864 1864
1865 // If we reattached we don't need to recalc the style of our descendants 1865 // If we reattached we don't need to recalc the style of our descendants
1866 // anymore. 1866 // anymore.
1867 if ((change >= UpdatePseudoElements && change < Reattach) || 1867 if ((change >= UpdatePseudoElements && change < Reattach) ||
1868 childNeedsStyleRecalc()) { 1868 childNeedsStyleRecalc()) {
1869 SelectorFilterParentScope filterScope(*this); 1869 SelectorFilterParentScope filterScope(*this);
1870 StyleSharingDepthScope sharingScope(*this); 1870 StyleSharingDepthScope sharingScope(*this);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1911 const ComputedStyle* style = computedStyle(); 1911 const ComputedStyle* style = computedStyle();
1912 if (!style || style->animations() || style->transitions()) 1912 if (!style || style->animations() || style->transitions())
1913 return nullptr; 1913 return nullptr;
1914 RefPtr<ComputedStyle> newStyle = ComputedStyle::clone(*style); 1914 RefPtr<ComputedStyle> newStyle = ComputedStyle::clone(*style);
1915 newStyle->propagateIndependentInheritedProperties(*parentStyle); 1915 newStyle->propagateIndependentInheritedProperties(*parentStyle);
1916 INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), 1916 INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(),
1917 independentInheritedStylesPropagated, 1); 1917 independentInheritedStylesPropagated, 1);
1918 return newStyle; 1918 return newStyle;
1919 } 1919 }
1920 1920
1921 StyleRecalcChange Element::recalcOwnStyle(StyleRecalcChange change) { 1921 StyleRecalcChange Element::recalcOwnStyle(StyleRecalcChange change,
1922 Text* nextTextSibling) {
1922 DCHECK(document().inStyleRecalc()); 1923 DCHECK(document().inStyleRecalc());
1923 DCHECK(!parentOrShadowHostNode()->needsStyleRecalc()); 1924 DCHECK(!parentOrShadowHostNode()->needsStyleRecalc());
1924 DCHECK(change >= IndependentInherit || needsStyleRecalc()); 1925 DCHECK(change >= IndependentInherit || needsStyleRecalc());
1925 DCHECK(parentComputedStyle()); 1926 DCHECK(parentComputedStyle());
1926 1927
1927 RefPtr<ComputedStyle> oldStyle = mutableComputedStyle(); 1928 RefPtr<ComputedStyle> oldStyle = mutableComputedStyle();
1928 1929
1929 // When propagating inherited changes, we don't need to do a full style recalc 1930 // When propagating inherited changes, we don't need to do a full style recalc
1930 // if the only changed properties are independent. In this case, we can simply 1931 // if the only changed properties are independent. In this case, we can simply
1931 // set these directly on the ComputedStyle object. 1932 // set these directly on the ComputedStyle object.
1932 RefPtr<ComputedStyle> newStyle = propagateInheritedProperties(change); 1933 RefPtr<ComputedStyle> newStyle = propagateInheritedProperties(change);
1933 if (!newStyle) 1934 if (!newStyle)
1934 newStyle = styleForLayoutObject(); 1935 newStyle = styleForLayoutObject();
1935 DCHECK(newStyle); 1936 DCHECK(newStyle);
1936 1937
1937 StyleRecalcChange localChange = 1938 StyleRecalcChange localChange =
1938 ComputedStyle::stylePropagationDiff(oldStyle.get(), newStyle.get()); 1939 ComputedStyle::stylePropagationDiff(oldStyle.get(), newStyle.get());
1939 if (localChange == NoChange) { 1940 if (localChange == NoChange) {
1940 INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), stylesUnchanged, 1); 1941 INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), stylesUnchanged, 1);
1941 } else { 1942 } else {
1942 INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), stylesChanged, 1); 1943 INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), stylesChanged, 1);
1943 } 1944 }
1944 1945
1945 if (localChange == Reattach) { 1946 if (localChange == Reattach) {
1946 document().addNonAttachedStyle(*this, std::move(newStyle)); 1947 document().addStyleRecalcData(
1948 *this, new StyleRecalcData(std::move(newStyle), nextTextSibling));
1947 setNeedsReattachLayoutTree(); 1949 setNeedsReattachLayoutTree();
1948 return rebuildLayoutTree(); 1950 return rebuildLayoutTree();
1949 } 1951 }
1950 1952
1951 DCHECK(oldStyle); 1953 DCHECK(oldStyle);
1952 1954
1953 if (localChange != NoChange) 1955 if (localChange != NoChange)
1954 updateCallbackSelectors(oldStyle.get(), newStyle.get()); 1956 updateCallbackSelectors(oldStyle.get(), newStyle.get());
1955 1957
1956 if (LayoutObject* layoutObject = this->layoutObject()) { 1958 if (LayoutObject* layoutObject = this->layoutObject()) {
(...skipping 25 matching lines...) Expand all
1982 } 1984 }
1983 if (oldStyle->hasPseudoElementStyle() || newStyle->hasPseudoElementStyle()) 1985 if (oldStyle->hasPseudoElementStyle() || newStyle->hasPseudoElementStyle())
1984 return UpdatePseudoElements; 1986 return UpdatePseudoElements;
1985 } 1987 }
1986 1988
1987 return localChange; 1989 return localChange;
1988 } 1990 }
1989 1991
1990 StyleRecalcChange Element::rebuildLayoutTree() { 1992 StyleRecalcChange Element::rebuildLayoutTree() {
1991 DCHECK(inActiveDocument()); 1993 DCHECK(inActiveDocument());
1994 StyleRecalcData* styleRecalcData = document().getStyleRecalcData(*this);
1992 AttachContext reattachContext; 1995 AttachContext reattachContext;
1993 reattachContext.resolvedStyle = document().getNonAttachedStyle(*this); 1996 reattachContext.resolvedStyle = styleRecalcData->computedStyle.get();
1994 bool layoutObjectWillChange = needsAttach() || layoutObject(); 1997 bool layoutObjectWillChange = needsAttach() || layoutObject();
1995 1998
1996 // We are calling Element::rebuildLayoutTree() from inside 1999 // We are calling Element::rebuildLayoutTree() from inside
1997 // Element::recalcOwnStyle where we set the NeedsReattachLayoutTree 2000 // Element::recalcOwnStyle where we set the NeedsReattachLayoutTree
1998 // flag - so needsReattachLayoutTree() should always be true. 2001 // flag - so needsReattachLayoutTree() should always be true.
1999 DCHECK(parentNode()); 2002 DCHECK(parentNode());
2000 DCHECK(parentNode()->childNeedsReattachLayoutTree()); 2003 DCHECK(parentNode()->childNeedsReattachLayoutTree());
2001 DCHECK(needsReattachLayoutTree()); 2004 DCHECK(needsReattachLayoutTree());
2002 reattachLayoutTree(reattachContext); 2005 reattachLayoutTree(reattachContext);
2003 // Since needsReattachLayoutTree() is always true we go into 2006 // Since needsReattachLayoutTree() is always true we go into
2004 // reattachLayoutTree() which reattaches all the descendant 2007 // reattachLayoutTree() which reattaches all the descendant
2005 // sub-trees. At this point no child should need reattaching. 2008 // sub-trees. At this point no child should need reattaching.
2006 DCHECK(!childNeedsReattachLayoutTree()); 2009 DCHECK(!childNeedsReattachLayoutTree());
2007 2010
2008 if (layoutObjectWillChange || layoutObject()) { 2011 if (layoutObjectWillChange || layoutObject()) {
2009 // nextTextSibling is passed on to recalcStyle from recalcDescendantStyles 2012 // nextTextSibling is passed on to recalcStyle from recalcDescendantStyles
2010 // we can either traverse the current subtree from this node onwards 2013 // we can either traverse the current subtree from this node onwards
2011 // or store it. 2014 // or store it.
2012 // The choice is between increased time and increased memory complexity. 2015 // The choice is between increased time and increased memory complexity.
2013 reattachWhitespaceSiblingsIfNeeded(nextTextSibling()); 2016 reattachWhitespaceSiblingsIfNeeded(styleRecalcData->nextTextSibling);
2014 return Reattach; 2017 return Reattach;
2015 } 2018 }
2016 return ReattachNoLayoutObject; 2019 return ReattachNoLayoutObject;
2017 } 2020 }
2018 2021
2019 void Element::updateCallbackSelectors(const ComputedStyle* oldStyle, 2022 void Element::updateCallbackSelectors(const ComputedStyle* oldStyle,
2020 const ComputedStyle* newStyle) { 2023 const ComputedStyle* newStyle) {
2021 Vector<String> emptyVector; 2024 Vector<String> emptyVector;
2022 const Vector<String>& oldCallbackSelectors = 2025 const Vector<String>& oldCallbackSelectors =
2023 oldStyle ? oldStyle->callbackSelectors() : emptyVector; 2026 oldStyle ? oldStyle->callbackSelectors() : emptyVector;
(...skipping 2064 matching lines...) Expand 10 before | Expand all | Expand 10 after
4088 } 4091 }
4089 4092
4090 DEFINE_TRACE_WRAPPERS(Element) { 4093 DEFINE_TRACE_WRAPPERS(Element) {
4091 if (hasRareData()) { 4094 if (hasRareData()) {
4092 visitor->traceWrappers(elementRareData()); 4095 visitor->traceWrappers(elementRareData());
4093 } 4096 }
4094 ContainerNode::traceWrappers(visitor); 4097 ContainerNode::traceWrappers(visitor);
4095 } 4098 }
4096 4099
4097 } // namespace blink 4100 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698