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

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

Issue 143983007: Remove PostAttachCallbacks and replace with something more specialized (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Update Created 6 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 unified diff | Download patch | Annotate | Revision Log
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 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
76 #include "core/dom/MainThreadTaskRunner.h" 76 #include "core/dom/MainThreadTaskRunner.h"
77 #include "core/dom/MutationObserver.h" 77 #include "core/dom/MutationObserver.h"
78 #include "core/dom/NodeChildRemovalTracker.h" 78 #include "core/dom/NodeChildRemovalTracker.h"
79 #include "core/dom/NodeFilter.h" 79 #include "core/dom/NodeFilter.h"
80 #include "core/dom/NodeIterator.h" 80 #include "core/dom/NodeIterator.h"
81 #include "core/dom/NodeRareData.h" 81 #include "core/dom/NodeRareData.h"
82 #include "core/dom/NodeRenderStyle.h" 82 #include "core/dom/NodeRenderStyle.h"
83 #include "core/dom/NodeRenderingTraversal.h" 83 #include "core/dom/NodeRenderingTraversal.h"
84 #include "core/dom/NodeTraversal.h" 84 #include "core/dom/NodeTraversal.h"
85 #include "core/dom/NodeWithIndex.h" 85 #include "core/dom/NodeWithIndex.h"
86 #include "core/dom/PostAttachCallbacks.h"
87 #include "core/dom/ProcessingInstruction.h" 86 #include "core/dom/ProcessingInstruction.h"
88 #include "core/dom/RequestAnimationFrameCallback.h" 87 #include "core/dom/RequestAnimationFrameCallback.h"
89 #include "core/dom/ScriptRunner.h" 88 #include "core/dom/ScriptRunner.h"
90 #include "core/dom/ScriptedAnimationController.h" 89 #include "core/dom/ScriptedAnimationController.h"
91 #include "core/dom/SelectorQuery.h" 90 #include "core/dom/SelectorQuery.h"
92 #include "core/dom/StyleEngine.h" 91 #include "core/dom/StyleEngine.h"
93 #include "core/dom/TouchList.h" 92 #include "core/dom/TouchList.h"
94 #include "core/dom/TransformSource.h" 93 #include "core/dom/TransformSource.h"
95 #include "core/dom/TreeWalker.h" 94 #include "core/dom/TreeWalker.h"
96 #include "core/dom/VisitedLinkState.h" 95 #include "core/dom/VisitedLinkState.h"
(...skipping 1429 matching lines...) Expand 10 before | Expand all | Expand 10 after
1526 exceptionState.throwDOMException(NotSupportedError, ExceptionMessages::a rgumentNullOrIncorrectType(1, "Node")); 1525 exceptionState.throwDOMException(NotSupportedError, ExceptionMessages::a rgumentNullOrIncorrectType(1, "Node"));
1527 return nullptr; 1526 return nullptr;
1528 } 1527 }
1529 return TreeWalker::create(root, whatToShow, filter); 1528 return TreeWalker::create(root, whatToShow, filter);
1530 } 1529 }
1531 1530
1532 bool Document::shouldCallRecalcStyleForDocument() 1531 bool Document::shouldCallRecalcStyleForDocument()
1533 { 1532 {
1534 if (!isActive() || !view()) 1533 if (!isActive() || !view())
1535 return false; 1534 return false;
1536 return needsStyleRecalc() || childNeedsStyleRecalc() || childNeedsDistributi onRecalc() || !m_useElementsNeedingUpdate.isEmpty() || childNeedsStyleInvalidati on(); 1535 if (needsStyleRecalc() || childNeedsStyleRecalc())
1536 return true;
1537 if (childNeedsDistributionRecalc())
1538 return true;
1539 if (!m_useElementsNeedingUpdate.isEmpty())
1540 return true;
1541 if (!m_layerUpdateElements.isEmpty())
1542 return true;
1543 if (childNeedsStyleInvalidation())
1544 return true;
1545 return false;
1537 } 1546 }
1538 1547
1539 bool Document::shouldScheduleStyleRecalc() 1548 bool Document::shouldScheduleStyleRecalc()
1540 { 1549 {
1541 if (!isActive()) 1550 if (!isActive())
1542 return false; 1551 return false;
1543 if (hasPendingStyleRecalc()) 1552 if (hasPendingStyleRecalc())
1544 return false; 1553 return false;
1545 if (inStyleRecalc()) 1554 if (inStyleRecalc())
1546 return false; 1555 return false;
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
1720 1729
1721 if (inStyleRecalc()) 1730 if (inStyleRecalc())
1722 return; 1731 return;
1723 1732
1724 // Entering here from inside layout or paint would be catastrophic since rec alcStyle can 1733 // Entering here from inside layout or paint would be catastrophic since rec alcStyle can
1725 // tear down the render tree or (unfortunately) run script. Kill the whole r enderer if 1734 // tear down the render tree or (unfortunately) run script. Kill the whole r enderer if
1726 // someone managed to get into here from inside layout or paint. 1735 // someone managed to get into here from inside layout or paint.
1727 RELEASE_ASSERT(!view()->isInPerformLayout()); 1736 RELEASE_ASSERT(!view()->isInPerformLayout());
1728 RELEASE_ASSERT(!view()->isPainting()); 1737 RELEASE_ASSERT(!view()->isPainting());
1729 1738
1730 // Script can run below in PostAttachCallbacks or WidgetUpdates, so protect the LocalFrame. 1739 // Script can run below in WidgetUpdates, so protect the LocalFrame.
1731 RefPtr<LocalFrame> protect(m_frame); 1740 RefPtr<LocalFrame> protect(m_frame);
1732 1741
1733 TRACE_EVENT0("webkit", "Document::recalcStyle"); 1742 TRACE_EVENT0("webkit", "Document::recalcStyle");
1734 TRACE_EVENT_SCOPED_SAMPLING_STATE("Blink", "RecalcStyle"); 1743 TRACE_EVENT_SCOPED_SAMPLING_STATE("Blink", "RecalcStyle");
1735 1744
1736 InspectorInstrumentationCookie cookie = InspectorInstrumentation::willRecalc ulateStyle(this); 1745 InspectorInstrumentationCookie cookie = InspectorInstrumentation::willRecalc ulateStyle(this);
1737 1746
1738 updateDistributionIfNeeded(); 1747 updateDistributionIfNeeded();
1739 updateUseShadowTreesIfNeeded(); 1748 updateUseShadowTreesIfNeeded();
1740 updateStyleInvalidationIfNeeded(); 1749 updateStyleInvalidationIfNeeded();
1741 1750
1742 if (m_evaluateMediaQueriesOnStyleRecalc) { 1751 if (m_evaluateMediaQueriesOnStyleRecalc) {
1743 m_evaluateMediaQueriesOnStyleRecalc = false; 1752 m_evaluateMediaQueriesOnStyleRecalc = false;
1744 evaluateMediaQueryList(); 1753 evaluateMediaQueryList();
1745 } 1754 }
1746 1755
1747 // FIXME: We should update style on our ancestor chain before proceeding 1756 // FIXME: We should update style on our ancestor chain before proceeding
1748 // however doing so currently causes several tests to crash, as LocalFrame:: setDocument calls Document::attach 1757 // however doing so currently causes several tests to crash, as LocalFrame:: setDocument calls Document::attach
1749 // before setting the DOMWindow on the LocalFrame, or the SecurityOrigin on the document. The attach, in turn 1758 // before setting the DOMWindow on the LocalFrame, or the SecurityOrigin on the document. The attach, in turn
1750 // resolves style (here) and then when we resolve style on the parent chain, we may end up 1759 // resolves style (here) and then when we resolve style on the parent chain, we may end up
1751 // re-attaching our containing iframe, which when asked HTMLFrameElementBase ::isURLAllowed 1760 // re-attaching our containing iframe, which when asked HTMLFrameElementBase ::isURLAllowed
1752 // hits a null-dereference due to security code always assuming the document has a SecurityOrigin. 1761 // hits a null-dereference due to security code always assuming the document has a SecurityOrigin.
1753 1762
1754 if (m_elemSheet && m_elemSheet->contents()->usesRemUnits()) 1763 if (m_elemSheet && m_elemSheet->contents()->usesRemUnits())
1755 m_styleEngine->setUsesRemUnit(true); 1764 m_styleEngine->setUsesRemUnit(true);
1756 1765
1757 { 1766 {
1758 PostAttachCallbacks::SuspendScope suspendPostAttachCallbacks;
1759 RenderWidget::UpdateSuspendScope suspendWidgetHierarchyUpdates; 1767 RenderWidget::UpdateSuspendScope suspendWidgetHierarchyUpdates;
1760 m_lifecycle.advanceTo(DocumentLifecycle::InStyleRecalc); 1768 m_lifecycle.advanceTo(DocumentLifecycle::InStyleRecalc);
1761 1769
1762 if (styleChangeType() >= SubtreeStyleChange) 1770 if (styleChangeType() >= SubtreeStyleChange)
1763 change = Force; 1771 change = Force;
1764 1772
1765 // FIXME: Cannot access the ensureStyleResolver() before calling styleFo rDocument below because 1773 // FIXME: Cannot access the ensureStyleResolver() before calling styleFo rDocument below because
1766 // apparently the StyleResolver's constructor has side effects. We shoul d fix it. 1774 // apparently the StyleResolver's constructor has side effects. We shoul d fix it.
1767 // See printing/setPrinting.html, printing/width-overflow.html though th ey only fail on 1775 // See printing/setPrinting.html, printing/width-overflow.html though th ey only fail on
1768 // mac when accessing the resolver by what appears to be a viewport size difference. 1776 // mac when accessing the resolver by what appears to be a viewport size difference.
(...skipping 12 matching lines...) Expand all
1781 // Optionally pass StyleResolver::ReportSlowStats to print numbers that require crawling the 1789 // Optionally pass StyleResolver::ReportSlowStats to print numbers that require crawling the
1782 // entire DOM (where collecting them is very slow). 1790 // entire DOM (where collecting them is very slow).
1783 // FIXME: Expose this as a runtime flag. 1791 // FIXME: Expose this as a runtime flag.
1784 // ensureStyleResolver().enableStats(/*StyleResolver::ReportSlowStats*/) ; 1792 // ensureStyleResolver().enableStats(/*StyleResolver::ReportSlowStats*/) ;
1785 1793
1786 if (StyleResolverStats* stats = ensureStyleResolver().stats()) 1794 if (StyleResolverStats* stats = ensureStyleResolver().stats())
1787 stats->reset(); 1795 stats->reset();
1788 1796
1789 if (Element* documentElement = this->documentElement()) { 1797 if (Element* documentElement = this->documentElement()) {
1790 inheritHtmlAndBodyElementStyles(change); 1798 inheritHtmlAndBodyElementStyles(change);
1799 dirtyElementsForLayerUpdate();
1791 if (documentElement->shouldCallRecalcStyle(change)) 1800 if (documentElement->shouldCallRecalcStyle(change))
1792 documentElement->recalcStyle(change); 1801 documentElement->recalcStyle(change);
1802 while (dirtyElementsForLayerUpdate())
1803 documentElement->recalcStyle(NoChange);
abarth-chromium 2014/03/24 17:47:09 Can we really spin an arbitrary number of times he
1793 } 1804 }
1794 1805
1795 ensureStyleResolver().printStats(); 1806 ensureStyleResolver().printStats();
1796 1807
1797 view()->updateCompositingLayersAfterStyleChange(); 1808 view()->updateCompositingLayersAfterStyleChange();
1798 1809
1799 clearChildNeedsStyleRecalc(); 1810 clearChildNeedsStyleRecalc();
1800 1811
1801 if (m_styleEngine->hasResolver()) { 1812 if (m_styleEngine->hasResolver()) {
1802 // Pseudo element removal and similar may only work with these flags still set. Reset them after the style recalc. 1813 // Pseudo element removal and similar may only work with these flags still set. Reset them after the style recalc.
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
1981 void Document::setIsViewSource(bool isViewSource) 1992 void Document::setIsViewSource(bool isViewSource)
1982 { 1993 {
1983 m_isViewSource = isViewSource; 1994 m_isViewSource = isViewSource;
1984 if (!m_isViewSource) 1995 if (!m_isViewSource)
1985 return; 1996 return;
1986 1997
1987 setSecurityOrigin(SecurityOrigin::createUnique()); 1998 setSecurityOrigin(SecurityOrigin::createUnique());
1988 didUpdateSecurityOrigin(); 1999 didUpdateSecurityOrigin();
1989 } 2000 }
1990 2001
2002 bool Document::dirtyElementsForLayerUpdate()
2003 {
2004 if (m_layerUpdateElements.isEmpty())
2005 return false;
2006 HashSet<Element*>::iterator end = m_layerUpdateElements.end();
2007 for (HashSet<Element*>::iterator it = m_layerUpdateElements.begin(); it != e nd; ++it)
2008 (*it)->setNeedsStyleRecalc(LocalStyleChange);
2009 m_layerUpdateElements.clear();
2010 return true;
2011 }
2012
2013 void Document::scheduleLayerUpdate(Element& element)
2014 {
2015 if (element.styleChangeType() == NeedsReattachStyleChange)
2016 return;
2017 element.setNeedsLayerUpdate();
2018 m_layerUpdateElements.add(&element);
2019 scheduleStyleRecalc();
2020 }
2021
2022 void Document::unscheduleLayerUpdate(Element& element)
2023 {
2024 element.clearNeedsLayerUpdate();
2025 m_layerUpdateElements.remove(&element);
2026 }
2027
1991 void Document::scheduleUseShadowTreeUpdate(SVGUseElement& element) 2028 void Document::scheduleUseShadowTreeUpdate(SVGUseElement& element)
1992 { 2029 {
1993 m_useElementsNeedingUpdate.add(&element); 2030 m_useElementsNeedingUpdate.add(&element);
1994 scheduleStyleRecalc(); 2031 scheduleStyleRecalc();
1995 } 2032 }
1996 2033
1997 void Document::unscheduleUseShadowTreeUpdate(SVGUseElement& element) 2034 void Document::unscheduleUseShadowTreeUpdate(SVGUseElement& element)
1998 { 2035 {
1999 m_useElementsNeedingUpdate.remove(&element); 2036 m_useElementsNeedingUpdate.remove(&element);
2000 } 2037 }
(...skipping 3463 matching lines...) Expand 10 before | Expand all | Expand 10 after
5464 } 5501 }
5465 5502
5466 void Document::invalidateNodeListCaches(const QualifiedName* attrName) 5503 void Document::invalidateNodeListCaches(const QualifiedName* attrName)
5467 { 5504 {
5468 HashSet<LiveNodeListBase*>::iterator end = m_listsInvalidatedAtDocument.end( ); 5505 HashSet<LiveNodeListBase*>::iterator end = m_listsInvalidatedAtDocument.end( );
5469 for (HashSet<LiveNodeListBase*>::iterator it = m_listsInvalidatedAtDocument. begin(); it != end; ++it) 5506 for (HashSet<LiveNodeListBase*>::iterator it = m_listsInvalidatedAtDocument. begin(); it != end; ++it)
5470 (*it)->invalidateCache(attrName); 5507 (*it)->invalidateCache(attrName);
5471 } 5508 }
5472 5509
5473 } // namespace WebCore 5510 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698