Changeset 207374 in webkit
- Timestamp:
- Oct 15, 2016 7:24:33 AM (8 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r207373 r207374 1 2016-10-15 Zalan Bujtas <zalan@apple.com> 2 3 CounterNode::resetRenderers is so inefficient. 4 https://bugs.webkit.org/show_bug.cgi?id=163480 5 6 Reviewed by Simon Fraser. 7 8 CounterNode::resetRenderers() removes all the associated renderers from this CounterNode 9 and sets the dirty bit on them. 10 This patch does all that in a loop, instead of traversing the linked tree on each removal. 11 12 No change in functionality. 13 14 * rendering/CounterNode.cpp: 15 (WebCore::CounterNode::CounterNode): 16 (WebCore::CounterNode::~CounterNode): 17 (WebCore::CounterNode::nextInPreOrderAfterChildren): 18 (WebCore::CounterNode::lastDescendant): 19 (WebCore::CounterNode::addRenderer): These assertions do not seem super useful. 20 (WebCore::CounterNode::removeRenderer): 21 (WebCore::CounterNode::resetRenderers): 22 (WebCore::CounterNode::insertAfter): 23 (WebCore::CounterNode::removeChild): 24 * rendering/CounterNode.h: 25 * rendering/RenderCounter.cpp: 26 (WebCore::makeCounterNode): 27 (WebCore::RenderCounter::RenderCounter): 28 (WebCore::RenderCounter::~RenderCounter): 29 (WebCore::RenderCounter::originalText): 30 (WebCore::updateCounters): 31 (WebCore::RenderCounter::invalidate): Deleted. 32 * rendering/RenderCounter.h: 33 1 34 2016-10-15 Antoine Quint <graouts@apple.com> 2 35 -
trunk/Source/WebCore/rendering/CounterNode.cpp
r181166 r207374 34 34 , m_countInParent(0) 35 35 , m_owner(owner) 36 , m_rootRenderer(0)37 , m_parent(0)38 , m_previousSibling(0)39 , m_nextSibling(0)40 , m_firstChild(0)41 , m_lastChild(0)42 36 { 43 37 } … … 48 42 // so we need to handle these cases. The node is still connected to the tree so we need to detach it. 49 43 if (m_parent || m_previousSibling || m_nextSibling || m_firstChild || m_lastChild) { 50 CounterNode* oldParent = 0;51 CounterNode* oldPreviousSibling = 0;44 CounterNode* oldParent = nullptr; 45 CounterNode* oldPreviousSibling = nullptr; 52 46 // Instead of calling removeChild() we do this safely as the tree is likely broken if we get here. 53 47 if (m_parent) { … … 57 51 m_parent->m_lastChild = m_previousSibling; 58 52 oldParent = m_parent; 59 m_parent = 0;53 m_parent = nullptr; 60 54 } 61 55 if (m_previousSibling) { … … 63 57 m_previousSibling->m_nextSibling = m_nextSibling; 64 58 oldPreviousSibling = m_previousSibling; 65 m_previousSibling = 0;59 m_previousSibling = nullptr; 66 60 } 67 61 if (m_nextSibling) { 68 62 if (m_nextSibling->m_previousSibling == this) 69 63 m_nextSibling->m_previousSibling = oldPreviousSibling; 70 m_nextSibling = 0;64 m_nextSibling = nullptr; 71 65 } 72 66 if (m_firstChild) { … … 74 68 for (CounterNode* child = m_firstChild; child; ) { 75 69 CounterNode* nextChild = child->m_nextSibling; 76 CounterNode* nextSibling = 0;70 CounterNode* nextSibling = nullptr; 77 71 child->m_parent = oldParent; 78 72 if (oldPreviousSibling) { … … 99 93 { 100 94 if (this == stayWithin) 101 return 0;95 return nullptr; 102 96 103 97 const CounterNode* current = this; … … 106 100 current = current->m_parent; 107 101 if (!current || current == stayWithin) 108 return 0;102 return nullptr; 109 103 } 110 104 return next; … … 123 117 CounterNode* last = m_lastChild; 124 118 if (!last) 125 return 0;119 return nullptr; 126 120 127 121 while (CounterNode* lastChild = last->m_lastChild) … … 152 146 } 153 147 154 void CounterNode::addRenderer(RenderCounter* value) 155 { 156 if (!value) { 157 ASSERT_NOT_REACHED(); 148 void CounterNode::addRenderer(RenderCounter& renderer) 149 { 150 ASSERT(!renderer.m_counterNode); 151 ASSERT(!renderer.m_nextForSameCounter); 152 renderer.m_nextForSameCounter = m_rootRenderer; 153 m_rootRenderer = &renderer; 154 renderer.m_counterNode = this; 155 } 156 157 void CounterNode::removeRenderer(RenderCounter& renderer) 158 { 159 ASSERT(renderer.m_counterNode && renderer.m_counterNode == this); 160 RenderCounter* previous = nullptr; 161 for (auto* current = m_rootRenderer; current; previous = current, current = current->m_nextForSameCounter) { 162 if (current != &renderer) 163 continue; 164 165 if (previous) 166 previous->m_nextForSameCounter = renderer.m_nextForSameCounter; 167 else 168 m_rootRenderer = renderer.m_nextForSameCounter; 169 renderer.m_nextForSameCounter = nullptr; 170 renderer.m_counterNode = nullptr; 158 171 return; 159 172 } 160 if (value->m_counterNode) { 161 ASSERT_NOT_REACHED(); 162 value->m_counterNode->removeRenderer(value); 163 } 164 ASSERT(!value->m_nextForSameCounter); 165 for (RenderCounter* iterator = m_rootRenderer;iterator; iterator = iterator->m_nextForSameCounter) { 166 if (iterator == value) { 167 ASSERT_NOT_REACHED(); 168 return; 169 } 170 } 171 value->m_nextForSameCounter = m_rootRenderer; 172 m_rootRenderer = value; 173 if (value->m_counterNode != this) { 174 if (value->m_counterNode) { 175 ASSERT_NOT_REACHED(); 176 value->m_counterNode->removeRenderer(value); 177 } 178 value->m_counterNode = this; 179 } 180 } 181 182 void CounterNode::removeRenderer(RenderCounter* value) 183 { 184 if (!value) { 185 ASSERT_NOT_REACHED(); 173 ASSERT_NOT_REACHED(); 174 } 175 176 void CounterNode::resetRenderers() 177 { 178 if (!m_rootRenderer) 186 179 return; 187 } 188 if (value->m_counterNode && value->m_counterNode != this) { 189 ASSERT_NOT_REACHED(); 190 value->m_counterNode->removeRenderer(value); 191 } 192 RenderCounter* previous = 0; 193 for (RenderCounter* iterator = m_rootRenderer;iterator; iterator = iterator->m_nextForSameCounter) { 194 if (iterator == value) { 195 if (previous) 196 previous->m_nextForSameCounter = value->m_nextForSameCounter; 197 else 198 m_rootRenderer = value->m_nextForSameCounter; 199 value->m_nextForSameCounter = 0; 200 value->m_counterNode = 0; 201 return; 202 } 203 previous = iterator; 204 } 205 ASSERT_NOT_REACHED(); 206 } 207 208 void CounterNode::resetRenderers() 209 { 210 while (m_rootRenderer) 211 m_rootRenderer->invalidate(); // This makes m_rootRenderer point to the next renderer if any since it disconnects the m_rootRenderer from this. 180 bool skipLayoutAndPerfWidthsRecalc = m_rootRenderer->documentBeingDestroyed(); 181 auto* current = m_rootRenderer; 182 while (current) { 183 if (!skipLayoutAndPerfWidthsRecalc) 184 current->setNeedsLayoutAndPrefWidthsRecalc(); 185 auto* next = current->m_nextForSameCounter; 186 current->m_nextForSameCounter = nullptr; 187 current->m_counterNode = nullptr; 188 current = next; 189 } 190 m_rootRenderer = nullptr; 212 191 } 213 192 … … 313 292 } 314 293 } 315 newChild->m_firstChild = 0;316 newChild->m_lastChild = 0;294 newChild->m_firstChild = nullptr; 295 newChild->m_lastChild = nullptr; 317 296 newChild->m_countInParent = newChild->computeCountInParent(); 318 297 newChild->resetRenderers(); … … 329 308 CounterNode* previous = oldChild->m_previousSibling; 330 309 331 oldChild->m_nextSibling = 0;332 oldChild->m_previousSibling = 0;333 oldChild->m_parent = 0;310 oldChild->m_nextSibling = nullptr; 311 oldChild->m_previousSibling = nullptr; 312 oldChild->m_parent = nullptr; 334 313 335 314 if (previous) -
trunk/Source/WebCore/rendering/CounterNode.h
r181166 r207374 50 50 int countInParent() const { return m_countInParent; } 51 51 RenderElement& owner() const { return m_owner; } 52 void addRenderer(RenderCounter *);53 void removeRenderer(RenderCounter *);52 void addRenderer(RenderCounter&); 53 void removeRenderer(RenderCounter&); 54 54 55 55 // Invalidates the text in the renderers of this counter, if any. … … 63 63 CounterNode* lastDescendant() const; 64 64 CounterNode* previousInPreOrder() const; 65 CounterNode* nextInPreOrder(const CounterNode* stayWithin = 0) const;66 CounterNode* nextInPreOrderAfterChildren(const CounterNode* stayWithin = 0) const;65 CounterNode* nextInPreOrder(const CounterNode* stayWithin = nullptr) const; 66 CounterNode* nextInPreOrderAfterChildren(const CounterNode* stayWithin = nullptr) const; 67 67 68 68 void insertAfter(CounterNode* newChild, CounterNode* beforeChild, const AtomicString& identifier); … … 83 83 int m_countInParent; 84 84 RenderElement& m_owner; 85 RenderCounter* m_rootRenderer ;85 RenderCounter* m_rootRenderer { nullptr }; 86 86 87 CounterNode* m_parent ;88 CounterNode* m_previousSibling ;89 CounterNode* m_nextSibling ;90 CounterNode* m_firstChild ;91 CounterNode* m_lastChild ;87 CounterNode* m_parent { nullptr }; 88 CounterNode* m_previousSibling { nullptr }; 89 CounterNode* m_nextSibling { nullptr }; 90 CounterNode* m_firstChild { nullptr }; 91 CounterNode* m_lastChild { nullptr }; 92 92 }; 93 93 -
trunk/Source/WebCore/rendering/RenderCounter.cpp
r194819 r207374 305 305 return nullptr; 306 306 307 RefPtr<CounterNode> newParent = 0;308 RefPtr<CounterNode> newPreviousSibling = 0;307 RefPtr<CounterNode> newParent; 308 RefPtr<CounterNode> newPreviousSibling; 309 309 RefPtr<CounterNode> newNode = CounterNode::create(renderer, isReset, value); 310 310 if (findPlaceForCounter(renderer, identifier, isReset, newParent, newPreviousSibling)) … … 346 346 : RenderText(document, emptyString()) 347 347 , m_counter(counter) 348 , m_counterNode(nullptr)349 , m_nextForSameCounter(0)350 348 { 351 349 view().addRenderCounter(); … … 357 355 358 356 if (m_counterNode) { 359 m_counterNode->removeRenderer( this);357 m_counterNode->removeRenderer(*this); 360 358 ASSERT(!m_counterNode); 361 359 } … … 386 384 beforeAfterContainer = beforeAfterContainer->parent(); 387 385 } 388 makeCounterNode(*beforeAfterContainer, m_counter.identifier(), true)->addRenderer(const_cast<RenderCounter *>(this));386 makeCounterNode(*beforeAfterContainer, m_counter.identifier(), true)->addRenderer(const_cast<RenderCounter&>(*this)); 389 387 ASSERT(m_counterNode); 390 388 } … … 426 424 427 425 RenderText::computePreferredLogicalWidths(lead); 428 }429 430 void RenderCounter::invalidate()431 {432 m_counterNode->removeRenderer(this);433 ASSERT(!m_counterNode);434 if (documentBeingDestroyed())435 return;436 setNeedsLayoutAndPrefWidthsRecalc();437 426 } 438 427 … … 523 512 continue; 524 513 } 525 RefPtr<CounterNode> newParent = 0;526 RefPtr<CounterNode> newPreviousSibling = 0;514 RefPtr<CounterNode> newParent; 515 RefPtr<CounterNode> newPreviousSibling; 527 516 528 517 findPlaceForCounter(renderer, it->key, node->hasResetType(), newParent, newPreviousSibling); -
trunk/Source/WebCore/rendering/RenderCounter.h
r197563 r207374 50 50 void computePreferredLogicalWidths(float leadWidth) override; 51 51 52 // Removes the reference to the CounterNode associated with this renderer.53 // This is used to cause a counter display update when the CounterNode tree changes.54 void invalidate();55 56 52 CounterContent m_counter; 57 CounterNode* m_counterNode ;58 RenderCounter* m_nextForSameCounter ;53 CounterNode* m_counterNode { nullptr }; 54 RenderCounter* m_nextForSameCounter { nullptr }; 59 55 friend class CounterNode; 60 56 }; … … 66 62 #if ENABLE(TREE_DEBUGGING) 67 63 // Outside the WebCore namespace for ease of invocation from gdb. 68 void showCounterRendererTree(const WebCore::RenderObject*, const char* counterName = 0);64 void showCounterRendererTree(const WebCore::RenderObject*, const char* counterName = nullptr); 69 65 #endif 70 66
Note: See TracChangeset
for help on using the changeset viewer.