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

Side by Side Diff: Source/core/dom/Document.cpp

Issue 143873016: Implement style invalidation tree walk for targeted style recalc upon class change. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 10 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 | Annotate | Revision Log
« no previous file with comments | « Source/core/dom/Document.h ('k') | Source/core/dom/Element.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 Dirk Mueller (mueller@kde.org) 4 * (C) 2001 Dirk Mueller (mueller@kde.org)
5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) 5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org)
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All r ights reserved. 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All r ights reserved.
7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/) 7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/)
8 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. 8 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved.
9 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) 9 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
10 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved. 10 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved.
(...skipping 1561 matching lines...) Expand 10 before | Expand all | Expand 10 after
1572 { 1572 {
1573 if (!root) { 1573 if (!root) {
1574 exceptionState.throwDOMException(NotSupportedError, "The provided node i s invalid."); 1574 exceptionState.throwDOMException(NotSupportedError, "The provided node i s invalid.");
1575 return 0; 1575 return 0;
1576 } 1576 }
1577 return TreeWalker::create(root, whatToShow, filter); 1577 return TreeWalker::create(root, whatToShow, filter);
1578 } 1578 }
1579 1579
1580 bool Document::shouldCallRecalcStyleForDocument() 1580 bool Document::shouldCallRecalcStyleForDocument()
1581 { 1581 {
1582 return needsStyleRecalc() || childNeedsStyleRecalc() || childNeedsDistributi onRecalc() || !m_useElementsNeedingUpdate.isEmpty(); 1582 return needsStyleRecalc() || childNeedsStyleRecalc() || childNeedsDistributi onRecalc() || !m_useElementsNeedingUpdate.isEmpty() || childNeedsStyleInvalidati on();
1583 } 1583 }
1584 1584
1585 void Document::scheduleStyleRecalc() 1585 void Document::scheduleStyleRecalc()
1586 { 1586 {
1587 if (!isActive()) 1587 if (!isActive())
1588 return; 1588 return;
1589 1589
1590 if (m_hasPendingStyleRecalc || !shouldScheduleLayout()) 1590 if (m_hasPendingStyleRecalc || !shouldScheduleLayout())
1591 return; 1591 return;
1592 1592
(...skipping 17 matching lines...) Expand all
1610 } 1610 }
1611 1611
1612 void Document::updateDistributionIfNeeded() 1612 void Document::updateDistributionIfNeeded()
1613 { 1613 {
1614 if (!childNeedsDistributionRecalc()) 1614 if (!childNeedsDistributionRecalc())
1615 return; 1615 return;
1616 TRACE_EVENT0("webkit", "Document::recalcDistribution"); 1616 TRACE_EVENT0("webkit", "Document::recalcDistribution");
1617 recalcDistribution(); 1617 recalcDistribution();
1618 } 1618 }
1619 1619
1620 void Document::updateStyleInvalidationIfNeeded()
1621 {
1622 if (!childNeedsStyleInvalidation())
1623 return;
1624 TRACE_EVENT0("webkit", "Document::computeNeedsStyleRecalcState");
1625 if (!styleResolver()) {
1626 clearChildNeedsStyleInvalidation();
1627 return;
1628 }
1629
1630 // FIXME: the style resolver can be deleted at present. Either resolve
1631 // crbug.com/335964 or move the invalidation data elsewhere.
1632 styleResolver()->ensureRuleFeatureSet().computeStyleInvalidation(*this);
1633 }
1634
1620 void Document::updateDistributionForNodeIfNeeded(Node* node) 1635 void Document::updateDistributionForNodeIfNeeded(Node* node)
1621 { 1636 {
1622 if (node->inDocument()) { 1637 if (node->inDocument()) {
1623 updateDistributionIfNeeded(); 1638 updateDistributionIfNeeded();
1624 return; 1639 return;
1625 } 1640 }
1626 Node* root = node; 1641 Node* root = node;
1627 while (Node* host = root->shadowHost()) 1642 while (Node* host = root->shadowHost())
1628 root = host; 1643 root = host;
1629 while (Node* ancestor = root->parentOrShadowHostNode()) 1644 while (Node* ancestor = root->parentOrShadowHostNode())
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
1698 body->setNeedsStyleRecalc(); 1713 body->setNeedsStyleRecalc();
1699 } 1714 }
1700 } 1715 }
1701 1716
1702 if (RenderStyle* style = documentElement()->renderStyle()) { 1717 if (RenderStyle* style = documentElement()->renderStyle()) {
1703 if (style->direction() != rootDirection || style->writingMode() != rootW ritingMode) 1718 if (style->direction() != rootDirection || style->writingMode() != rootW ritingMode)
1704 documentElement()->setNeedsStyleRecalc(); 1719 documentElement()->setNeedsStyleRecalc();
1705 } 1720 }
1706 } 1721 }
1707 1722
1723 // FIXME: need a better name than recalcStyle. It's performing style invalidatio n, style recalc, and distribution.
1708 void Document::recalcStyle(StyleRecalcChange change) 1724 void Document::recalcStyle(StyleRecalcChange change)
1709 { 1725 {
1710 // we should not enter style recalc while painting 1726 // we should not enter style recalc while painting
1711 RELEASE_ASSERT(!view() || !view()->isPainting()); 1727 RELEASE_ASSERT(!view() || !view()->isPainting());
1712 1728
1713 // FIXME: We should never enter here without a FrameView or with an inactive document. 1729 // FIXME: We should never enter here without a FrameView or with an inactive document.
1714 if (!isActive() || !view()) 1730 if (!isActive() || !view())
1715 return; 1731 return;
1716 1732
1717 if (m_inStyleRecalc) 1733 if (m_inStyleRecalc)
1718 return; 1734 return;
1719 1735
1720 TRACE_EVENT0("webkit", "Document::recalcStyle"); 1736 TRACE_EVENT0("webkit", "Document::recalcStyle");
1721 TRACE_EVENT_SCOPED_SAMPLING_STATE("Blink", "RecalcStyle"); 1737 TRACE_EVENT_SCOPED_SAMPLING_STATE("Blink", "RecalcStyle");
1722 1738
1723 InspectorInstrumentationCookie cookie = InspectorInstrumentation::willRecalc ulateStyle(this); 1739 InspectorInstrumentationCookie cookie = InspectorInstrumentation::willRecalc ulateStyle(this);
1724 1740
1725 updateDistributionIfNeeded(); 1741 updateDistributionIfNeeded();
1726 updateUseShadowTrees(); 1742 updateUseShadowTrees();
1743 updateStyleInvalidationIfNeeded();
1727 1744
1728 if (m_evaluateMediaQueriesOnStyleRecalc) { 1745 if (m_evaluateMediaQueriesOnStyleRecalc) {
1729 m_evaluateMediaQueriesOnStyleRecalc = false; 1746 m_evaluateMediaQueriesOnStyleRecalc = false;
1730 evaluateMediaQueryList(); 1747 evaluateMediaQueryList();
1731 } 1748 }
1732 1749
1733 // FIXME: We should update style on our ancestor chain before proceeding 1750 // FIXME: We should update style on our ancestor chain before proceeding
1734 // however doing so currently causes several tests to crash, as Frame::setDo cument calls Document::attach 1751 // however doing so currently causes several tests to crash, as Frame::setDo cument calls Document::attach
1735 // before setting the DOMWindow on the Frame, or the SecurityOrigin on the d ocument. The attach, in turn 1752 // before setting the DOMWindow on the Frame, or the SecurityOrigin on the d ocument. The attach, in turn
1736 // resolves style (here) and then when we resolve style on the parent chain, we may end up 1753 // resolves style (here) and then when we resolve style on the parent chain, we may end up
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
1819 void Document::updateStyleForNodeIfNeeded(Node* node) 1836 void Document::updateStyleForNodeIfNeeded(Node* node)
1820 { 1837 {
1821 if (!shouldCallRecalcStyleForDocument()) 1838 if (!shouldCallRecalcStyleForDocument())
1822 return; 1839 return;
1823 1840
1824 // At this point, we know that we need to recalc some style on the document in order to fully update styles. 1841 // At this point, we know that we need to recalc some style on the document in order to fully update styles.
1825 // However, style on 'node' only needs to be recalculated if a global recomp utation is needed, or a node on 1842 // However, style on 'node' only needs to be recalculated if a global recomp utation is needed, or a node on
1826 // the path from 'node' to the root needs style recalc. 1843 // the path from 'node' to the root needs style recalc.
1827 1844
1828 // Global needed. 1845 // Global needed.
1829 bool needsRecalc = needsStyleRecalc() || childNeedsDistributionRecalc() || ! m_useElementsNeedingUpdate.isEmpty(); 1846 bool needsRecalc = needsStyleRecalc() || childNeedsDistributionRecalc() || ! m_useElementsNeedingUpdate.isEmpty() || childNeedsStyleInvalidation();
1830 1847
1831 // On the path. 1848 // On the path.
1832 for (Node* ancestor = node; ancestor && !needsRecalc; ancestor = ancestor->p arentOrShadowHostNode()) 1849 for (Node* ancestor = node; ancestor && !needsRecalc; ancestor = ancestor->p arentOrShadowHostNode())
1833 needsRecalc = ancestor->needsStyleRecalc(); 1850 needsRecalc = ancestor->needsStyleRecalc();
1834 if (needsRecalc) 1851 if (needsRecalc)
1835 updateStyleIfNeeded(); 1852 updateStyleIfNeeded();
1836 } 1853 }
1837 1854
1838 void Document::updateLayout() 1855 void Document::updateLayout()
1839 { 1856 {
(...skipping 3526 matching lines...) Expand 10 before | Expand all | Expand 10 after
5366 if (!page->focusController().isActive() || !page->focusController().isFocuse d()) 5383 if (!page->focusController().isActive() || !page->focusController().isFocuse d())
5367 return false; 5384 return false;
5368 if (Frame* focusedFrame = page->focusController().focusedFrame()) { 5385 if (Frame* focusedFrame = page->focusController().focusedFrame()) {
5369 if (focusedFrame->tree().isDescendantOf(frame())) 5386 if (focusedFrame->tree().isDescendantOf(frame()))
5370 return true; 5387 return true;
5371 } 5388 }
5372 return false; 5389 return false;
5373 } 5390 }
5374 5391
5375 } // namespace WebCore 5392 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/dom/Document.h ('k') | Source/core/dom/Element.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698