Changeset 122524 in webkit
- Timestamp:
- Jul 12, 2012 4:14:40 PM (12 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r122518 r122524 1 2012-07-12 Elliott Sprehn <esprehn@gmail.com> 2 3 Unneeded tree walking when adding or removing children due to RenderCounter / RenderQuote logic 4 https://bugs.webkit.org/show_bug.cgi?id=89900 5 6 Reviewed by Eric Seidel and Abhishek Arya. 7 8 Previously we would walk the all children a renderer whenever adding 9 or removing a child renderer from its RenderObjectChildList to look for 10 RenderQuote and RenderCounter instances to update. This patch introduces 11 a counter in RenderView for the number of RenderQuote and RenderCounter 12 instances in that document so we can avoid these traversals. 13 14 No tests needed since this is just a short circuiting of logic and the existing 15 tests should cover it. 16 17 * rendering/RenderCounter.cpp: 18 (WebCore::RenderCounter::RenderCounter): Increment instance counter. 19 (WebCore::RenderCounter::willBeDestroyed): Decrement instance counter. 20 (WebCore): 21 (WebCore::RenderCounter::rendererRemovedFromTree): Short circuit when counter is zero. 22 (WebCore::RenderCounter::rendererSubtreeAttached): Short circuit when counter is zero. 23 * rendering/RenderCounter.h: 24 (RenderCounter): 25 * rendering/RenderObjectChildList.cpp: 26 (WebCore::RenderObjectChildList::removeChildNode): Short circuit calling into Counter and Quote code when the document is being destroyed. 27 * rendering/RenderQuote.cpp: 28 (WebCore::RenderQuote::RenderQuote): 29 (WebCore::RenderQuote::willBeDestroyed): 30 (WebCore): 31 (WebCore::RenderQuote::rendererSubtreeAttached): Increment instance counter. 32 (WebCore::RenderQuote::rendererRemovedFromTree): Decrement instance counter. 33 * rendering/RenderQuote.h: 34 (RenderQuote): 35 * rendering/RenderView.cpp: 36 (WebCore::RenderView::RenderView): 37 * rendering/RenderView.h: Methods for managing the RenderQuote and RenderCounter counts. 38 (RenderView): 39 (WebCore::RenderView::addRenderQuote): 40 (WebCore::RenderView::removeRenderQuote): 41 (WebCore::RenderView::hasRenderQuotes): 42 (WebCore::RenderView::addRenderCounter): 43 (WebCore::RenderView::removeRenderCounter): 44 (WebCore::RenderView::hasRenderCounters): 45 1 46 2012-07-12 Ryosuke Niwa <rniwa@webkit.org> 2 47 -
trunk/Source/WebCore/rendering/RenderCounter.cpp
r115736 r122524 475 475 , m_nextForSameCounter(0) 476 476 { 477 view()->addRenderCounter(); 477 478 } 478 479 … … 483 484 ASSERT(!m_counterNode); 484 485 } 486 } 487 488 void RenderCounter::willBeDestroyed() 489 { 490 if (view()) 491 view()->removeRenderCounter(); 492 RenderText::willBeDestroyed(); 485 493 } 486 494 … … 597 605 } 598 606 599 void RenderCounter::rendererRemovedFromTree(RenderObject* removedRenderer) 600 { 601 RenderObject* currentRenderer = removedRenderer->lastLeafChild(); 607 void RenderCounter::rendererRemovedFromTree(RenderObject* renderer) 608 { 609 ASSERT(renderer->view()); 610 if (!renderer->view()->hasRenderCounters()) 611 return; 612 RenderObject* currentRenderer = renderer->lastLeafChild(); 602 613 if (!currentRenderer) 603 currentRenderer = re movedRenderer;614 currentRenderer = renderer; 604 615 while (true) { 605 616 destroyCounterNodes(currentRenderer); 606 if (currentRenderer == re movedRenderer)617 if (currentRenderer == renderer) 607 618 break; 608 619 currentRenderer = currentRenderer->previousInPreOrder(); … … 648 659 void RenderCounter::rendererSubtreeAttached(RenderObject* renderer) 649 660 { 661 ASSERT(renderer->view()); 662 if (!renderer->view()->hasRenderCounters()) 663 return; 650 664 Node* node = renderer->node(); 651 665 if (node) -
trunk/Source/WebCore/rendering/RenderCounter.h
r86358 r122524 41 41 static void rendererStyleChanged(RenderObject*, const RenderStyle* oldStyle, const RenderStyle* newStyle); 42 42 43 protected: 44 virtual void willBeDestroyed(); 45 43 46 private: 44 47 virtual const char* renderName() const; -
trunk/Source/WebCore/rendering/RenderObjectChildList.cpp
r122502 r122524 155 155 oldChild->setParent(0); 156 156 157 RenderCounter::rendererRemovedFromTree(oldChild); 158 RenderQuote::rendererRemovedFromTree(oldChild); 157 // rendererRemovedFromTree walks the whole subtree. We can improve performance 158 // by skipping this step when destroying the entire tree. 159 if (!owner->documentBeingDestroyed()) { 160 RenderCounter::rendererRemovedFromTree(oldChild); 161 RenderQuote::rendererRemovedFromTree(oldChild); 162 } 159 163 160 164 if (AXObjectCache::accessibilityEnabled()) -
trunk/Source/WebCore/rendering/RenderQuote.cpp
r116908 r122524 58 58 , m_previous(0) 59 59 { 60 view()->addRenderQuote(); 60 61 } 61 62 62 63 RenderQuote::~RenderQuote() 63 64 { 65 } 66 67 void RenderQuote::willBeDestroyed() 68 { 69 if (view()) 70 view()->removeRenderQuote(); 71 RenderText::willBeDestroyed(); 64 72 } 65 73 … … 279 287 void RenderQuote::rendererSubtreeAttached(RenderObject* renderer) 280 288 { 281 if (renderer->documentBeingDestroyed()) 289 ASSERT(renderer->view()); 290 if (!renderer->view()->hasRenderQuotes()) 282 291 return; 283 292 for (RenderObject* descendant = renderer; descendant; descendant = descendant->nextInPreOrder(renderer)) … … 288 297 } 289 298 290 void RenderQuote::rendererRemovedFromTree(RenderObject* subtreeRoot) 291 { 292 if (subtreeRoot->documentBeingDestroyed()) 299 void RenderQuote::rendererRemovedFromTree(RenderObject* renderer) 300 { 301 ASSERT(renderer->view()); 302 if (!renderer->view()->hasRenderQuotes()) 293 303 return; 294 for (RenderObject* descendant = subtreeRoot; descendant; descendant = descendant->nextInPreOrder(subtreeRoot))304 for (RenderObject* descendant = renderer; descendant; descendant = descendant->nextInPreOrder(renderer)) 295 305 if (descendant->isQuote()) { 296 306 RenderQuote* removedQuote = toRenderQuote(descendant); … … 298 308 removedQuote->m_previous = 0; 299 309 int depth = removedQuote->m_depth; 300 for (descendant = descendant->nextInPreOrder( subtreeRoot); descendant; descendant = descendant->nextInPreOrder(subtreeRoot))310 for (descendant = descendant->nextInPreOrder(renderer); descendant; descendant = descendant->nextInPreOrder(renderer)) 301 311 if (descendant->isQuote()) 302 312 removedQuote = toRenderQuote(descendant); -
trunk/Source/WebCore/rendering/RenderQuote.h
r95901 r122524 36 36 protected: 37 37 virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle); 38 virtual void willBeDestroyed(); 38 39 private: 39 40 virtual const char* renderName() const; -
trunk/Source/WebCore/rendering/RenderView.cpp
r120757 r122524 63 63 , m_layoutState(0) 64 64 , m_layoutStateDisableCount(0) 65 , m_renderQuoteCount(0) 66 , m_renderCounterCount(0) 65 67 { 66 68 // Clear our anonymous bit, set because RenderObject assumes -
trunk/Source/WebCore/rendering/RenderView.h
r120757 r122524 193 193 void setFixedPositionedObjectsNeedLayout(); 194 194 195 // FIXME: This is a work around because the current implementation of counters and quotes 196 // requires walking the entire tree repeatedly and most pages don't actually use either 197 // feature so we shouldn't take the performance hit when not needed. Long term we should 198 // rewrite the counter and quotes code. 199 void addRenderQuote() { m_renderQuoteCount++; } 200 void removeRenderQuote() { ASSERT(m_renderQuoteCount > 0); m_renderQuoteCount--; } 201 bool hasRenderQuotes() { return m_renderQuoteCount; } 202 void addRenderCounter() { m_renderCounterCount++; } 203 void removeRenderCounter() { ASSERT(m_renderCounterCount > 0); m_renderCounterCount--; } 204 bool hasRenderCounters() { return m_renderCounterCount; } 205 195 206 protected: 196 207 virtual void mapLocalToContainer(RenderBoxModelObject* repaintContainer, bool useTransforms, bool fixed, TransformState&, ApplyContainerFlipOrNot = ApplyContainerFlip, bool* wasFixed = 0) const; … … 288 299 OwnPtr<FlowThreadController> m_flowThreadController; 289 300 RefPtr<IntervalArena> m_intervalArena; 301 302 unsigned m_renderQuoteCount; 303 unsigned m_renderCounterCount; 290 304 }; 291 305
Note: See TracChangeset
for help on using the changeset viewer.