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

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

Issue 2117143003: Add a fast-path for independent inherited properties (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@computedstyle_cleanup_rename_final_member_fields
Patch Set: Small rename Created 4 years, 5 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 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. All rights reserved. 7 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012, 2013 Apple Inc. All rights reserved.
8 * (C) 2007 Eric Seidel (eric@webkit.org) 8 * (C) 2007 Eric Seidel (eric@webkit.org)
9 * 9 *
10 * This library is free software; you can redistribute it and/or 10 * This library is free software; you can redistribute it and/or
(...skipping 1685 matching lines...) Expand 10 before | Expand all | Expand 10 after
1696 void Element::recalcStyle(StyleRecalcChange change, Text* nextTextSibling) 1696 void Element::recalcStyle(StyleRecalcChange change, Text* nextTextSibling)
1697 { 1697 {
1698 DCHECK(document().inStyleRecalc()); 1698 DCHECK(document().inStyleRecalc());
1699 DCHECK(!document().lifecycle().inDetach()); 1699 DCHECK(!document().lifecycle().inDetach());
1700 DCHECK(!parentOrShadowHostNode()->needsStyleRecalc()); 1700 DCHECK(!parentOrShadowHostNode()->needsStyleRecalc());
1701 DCHECK(inActiveDocument()); 1701 DCHECK(inActiveDocument());
1702 1702
1703 if (hasCustomStyleCallbacks()) 1703 if (hasCustomStyleCallbacks())
1704 willRecalcStyle(change); 1704 willRecalcStyle(change);
1705 1705
1706 if (change >= Inherit || needsStyleRecalc()) { 1706 if (change >= IndependentInherit || needsStyleRecalc()) {
1707 if (hasRareData()) { 1707 if (hasRareData()) {
1708 ElementRareData* data = elementRareData(); 1708 ElementRareData* data = elementRareData();
1709 data->clearComputedStyle(); 1709 if (change != IndependentInherit)
1710 data->clearComputedStyle();
1710 1711
1711 if (change >= Inherit) { 1712 if (change >= IndependentInherit) {
1712 if (ElementAnimations* elementAnimations = data->elementAnimatio ns()) 1713 if (ElementAnimations* elementAnimations = data->elementAnimatio ns())
1713 elementAnimations->setAnimationStyleChange(false); 1714 elementAnimations->setAnimationStyleChange(false);
1714 } 1715 }
1715 } 1716 }
1716 if (parentComputedStyle()) 1717 if (parentComputedStyle())
1717 change = recalcOwnStyle(change); 1718 change = recalcOwnStyle(change);
1718 clearNeedsStyleRecalc(); 1719 clearNeedsStyleRecalc();
1719 } 1720 }
1720 1721
1721 // If we reattached we don't need to recalc the style of our descendants any more. 1722 // If we reattached we don't need to recalc the style of our descendants any more.
(...skipping 23 matching lines...) Expand all
1745 clearChildNeedsStyleRecalc(); 1746 clearChildNeedsStyleRecalc();
1746 } 1747 }
1747 1748
1748 if (hasCustomStyleCallbacks()) 1749 if (hasCustomStyleCallbacks())
1749 didRecalcStyle(change); 1750 didRecalcStyle(change);
1750 1751
1751 if (change == Reattach) 1752 if (change == Reattach)
1752 reattachWhitespaceSiblingsIfNeeded(nextTextSibling); 1753 reattachWhitespaceSiblingsIfNeeded(nextTextSibling);
1753 } 1754 }
1754 1755
1756 bool Element::canPropagateInheritedProperties(StyleRecalcChange change)
1757 {
1758 return change == IndependentInherit
1759 && !needsStyleRecalc()
1760 && computedStyle()
1761 && parentComputedStyle()
1762 && !computedStyle()->animations()
1763 && !computedStyle()->transitions()
1764 && !hasAnimations();
1765 }
1766
1755 StyleRecalcChange Element::recalcOwnStyle(StyleRecalcChange change) 1767 StyleRecalcChange Element::recalcOwnStyle(StyleRecalcChange change)
1756 { 1768 {
1757 DCHECK(document().inStyleRecalc()); 1769 DCHECK(document().inStyleRecalc());
1758 DCHECK(!parentOrShadowHostNode()->needsStyleRecalc()); 1770 DCHECK(!parentOrShadowHostNode()->needsStyleRecalc());
1759 DCHECK(change >= Inherit || needsStyleRecalc()); 1771 DCHECK(change >= IndependentInherit || needsStyleRecalc());
1760 DCHECK(parentComputedStyle()); 1772 DCHECK(parentComputedStyle());
1761 1773
1762 RefPtr<ComputedStyle> oldStyle = mutableComputedStyle(); 1774 RefPtr<ComputedStyle> oldStyle = mutableComputedStyle();
1763 RefPtr<ComputedStyle> newStyle = styleForLayoutObject(); 1775 RefPtr<ComputedStyle> newStyle;
1776
1777 // When propagating inherited changes, we don't need to do a full style reca lc
1778 // if the only changed properties are independent. In this case, we can simp ly
1779 // set these directly on the ComputedStyle object.
1780 if (canPropagateInheritedProperties(change)) {
1781 newStyle = ComputedStyle::clone(*computedStyle());
1782 ComputedStyle::propagateIndependentInheritedProperties(*parentComputedSt yle(), *newStyle);
1783 INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), independentInher itedStylesPropagated, 1);
1784 } else {
1785 newStyle = styleForLayoutObject();
1786 }
1764 DCHECK(newStyle); 1787 DCHECK(newStyle);
1765 1788
1766 StyleRecalcChange localChange = ComputedStyle::stylePropagationDiff(oldStyle .get(), newStyle.get()); 1789 StyleRecalcChange localChange = ComputedStyle::stylePropagationDiff(oldStyle .get(), newStyle.get());
1767 if (localChange == NoChange) { 1790 if (localChange == NoChange) {
1768 INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), stylesUnchanged, 1); 1791 INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), stylesUnchanged, 1);
1769 } else { 1792 } else {
1770 INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), stylesChanged, 1 ); 1793 INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), stylesChanged, 1 );
1771 } 1794 }
1772 1795
1773 if (localChange == Reattach) { 1796 if (localChange == Reattach) {
(...skipping 19 matching lines...) Expand all
1793 layoutObject->setStyleInternal(newStyle.get()); 1816 layoutObject->setStyleInternal(newStyle.get());
1794 } 1817 }
1795 } 1818 }
1796 1819
1797 if (getStyleChangeType() >= SubtreeStyleChange) 1820 if (getStyleChangeType() >= SubtreeStyleChange)
1798 return Force; 1821 return Force;
1799 1822
1800 if (change > Inherit || localChange > Inherit) 1823 if (change > Inherit || localChange > Inherit)
1801 return max(localChange, change); 1824 return max(localChange, change);
1802 1825
1803 if (localChange < Inherit) { 1826 if (localChange < IndependentInherit) {
1804 if (oldStyle->hasChildDependentFlags()) { 1827 if (oldStyle->hasChildDependentFlags()) {
1805 if (childNeedsStyleRecalc()) 1828 if (childNeedsStyleRecalc())
1806 return Inherit; 1829 return Inherit;
1807 newStyle->copyChildDependentFlagsFrom(*oldStyle); 1830 newStyle->copyChildDependentFlagsFrom(*oldStyle);
1808 } 1831 }
1809 if (oldStyle->hasPseudoElementStyle() || newStyle->hasPseudoElementStyle ()) 1832 if (oldStyle->hasPseudoElementStyle() || newStyle->hasPseudoElementStyle ())
1810 return UpdatePseudoElements; 1833 return UpdatePseudoElements;
1811 } 1834 }
1812 1835
1813 return localChange; 1836 return localChange;
(...skipping 1924 matching lines...) Expand 10 before | Expand all | Expand 10 after
3738 3761
3739 DEFINE_TRACE_WRAPPERS(Element) 3762 DEFINE_TRACE_WRAPPERS(Element)
3740 { 3763 {
3741 if (hasRareData()) { 3764 if (hasRareData()) {
3742 visitor->traceWrappers(elementRareData()); 3765 visitor->traceWrappers(elementRareData());
3743 } 3766 }
3744 ContainerNode::traceWrappers(visitor); 3767 ContainerNode::traceWrappers(visitor);
3745 } 3768 }
3746 3769
3747 } // namespace blink 3770 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698