Changeset 77191 in webkit
- Timestamp:
- Jan 31, 2011 6:36:12 PM (13 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r77186 r77191 1 2011-01-31 Carol Szabo <carol.szabo@nokia.com> 2 3 Reviewed by David Hyatt. 4 5 Code Changes only. 6 7 It is needlessly expensive to find the generating node from an anonymous renderer of a pseudoelement. 8 https://bugs.webkit.org/show_bug.cgi?id=53024 9 10 No new tests. No change in functionality 11 12 * rendering/RenderObject.h: 13 (WebCore::RenderObject::before): 14 (WebCore::RenderObject::after): 15 (WebCore::RenderObject::generatingNode): 16 Added new accessors for the use of the CSS 2.1 counters code 17 (mainlyly) 18 * rendering/RenderObjectChildList.cpp: 19 (WebCore::beforeAfterContainer): 20 (WebCore::RenderObjectChildList::invalidateCounters): 21 (WebCore::RenderObjectChildList::before): 22 (WebCore::RenderObjectChildList::after): 23 Refactored the code to take advantage of the new accessors. 24 (WebCore::RenderObjectChildList::updateBeforeAfterContent): 25 Changed to store the generating node in the :before and :after 26 renderers. 27 * rendering/RenderObjectChildList.h: 28 1 29 2011-01-31 Krithigassree Sambamurthy <krithigassree.sambamurthy@nokia.com> 2 30 -
trunk/Source/WebCore/rendering/RenderObject.h
r76590 r77191 144 144 return 0; 145 145 } 146 RenderObject* beforePseudoElementRenderer() const 147 { 148 if (const RenderObjectChildList* children = virtualChildren()) 149 return children->beforePseudoElementRenderer(this); 150 return 0; 151 } 152 RenderObject* afterPseudoElementRenderer() const 153 { 154 if (const RenderObjectChildList* children = virtualChildren()) 155 return children->afterPseudoElementRenderer(this); 156 return 0; 157 } 146 158 virtual RenderObjectChildList* virtualChildren() { return 0; } 147 159 virtual const RenderObjectChildList* virtualChildren() const { return 0; } … … 446 458 447 459 Node* node() const { return m_isAnonymous ? 0 : m_node; } 460 461 // Returns the styled node that caused the generation of this renderer. 462 // This is the same as node() except for renderers of :before and :after 463 // pseudo elements for which their parent node is returned. 464 Node* generatingNode() const { return m_node == document() ? 0 : m_node; } 448 465 void setNode(Node* node) { m_node = node; } 449 466 -
trunk/Source/WebCore/rendering/RenderObjectChildList.cpp
r76859 r77191 248 248 } 249 249 250 static RenderObject* beforeAfterContainer(RenderObject* container, PseudoId type)251 {252 if (type == BEFORE) {253 // An anonymous (generated) inline run-in that has PseudoId BEFORE must come from a grandparent.254 // Therefore we should skip these generated run-ins when checking our immediate children.255 // If we don't find our :before child immediately, then we should check if we own a256 // generated inline run-in in the next level of children.257 RenderObject* first = container;258 do {259 // Skip list markers and generated run-ins260 first = first->firstChild();261 while (first && (first->isListMarker() || (first->isRenderInline() && first->isRunIn() && first->isAnonymous())))262 first = first->nextSibling();263 } while (first && first->isAnonymous() && first->style()->styleType() == NOPSEUDO);264 265 if (!first)266 return 0;267 268 if (first->style()->styleType() == type)269 return first;270 271 // Check for a possible generated run-in, using run-in positioning rules.272 // Skip inlines and floating / positioned blocks, and place as the first child.273 first = container->firstChild();274 if (!first->isRenderBlock())275 return 0;276 while (first && first->isFloatingOrPositioned())277 first = first->nextSibling();278 if (first) {279 first = first->firstChild();280 // We still need to skip any list markers that could exist before the run-in.281 while (first && first->isListMarker())282 first = first->nextSibling();283 if (first && first->style()->styleType() == type && first->isRenderInline() && first->isRunIn() && first->isAnonymous())284 return first;285 }286 return 0;287 }288 289 if (type == AFTER) {290 RenderObject* last = container;291 do {292 last = last->lastChild();293 } while (last && last->isAnonymous() && last->style()->styleType() == NOPSEUDO && !last->isListMarker());294 if (last && last->style()->styleType() != type)295 return 0;296 return last;297 }298 299 ASSERT_NOT_REACHED();300 return 0;301 }302 303 250 static RenderObject* findBeforeAfterParent(RenderObject* object) 304 251 { … … 331 278 } 332 279 333 void RenderObjectChildList::invalidateCounters( RenderObject* owner, const AtomicString& identifier)280 void RenderObjectChildList::invalidateCounters(const RenderObject* owner, const AtomicString& identifier) 334 281 { 335 282 ASSERT(!owner->documentBeingDestroyed()); 336 invalidateCountersInContainer(beforeAfterContainer(owner, BEFORE), identifier); 337 invalidateCountersInContainer(beforeAfterContainer(owner, AFTER), identifier); 338 } 339 340 void RenderObjectChildList::updateBeforeAfterContent(RenderObject* owner, PseudoId type, RenderObject* styledObject) 283 invalidateCountersInContainer(beforePseudoElementRenderer(owner), identifier); 284 invalidateCountersInContainer(afterPseudoElementRenderer(owner), identifier); 285 } 286 287 RenderObject* RenderObjectChildList::beforePseudoElementRenderer(const RenderObject* owner) const 288 { 289 // An anonymous (generated) inline run-in that has PseudoId BEFORE must come from a grandparent. 290 // Therefore we should skip these generated run-ins when checking our immediate children. 291 // If we don't find our :before child immediately, then we should check if we own a 292 // generated inline run-in in the next level of children. 293 RenderObject* first = const_cast<RenderObject*>(owner); 294 do { 295 // Skip list markers and generated run-ins 296 first = first->firstChild(); 297 while (first && (first->isListMarker() || (first->isRenderInline() && first->isRunIn() && first->isAnonymous()))) 298 first = first->nextSibling(); 299 } while (first && first->isAnonymous() && first->style()->styleType() == NOPSEUDO); 300 301 if (!first) 302 return 0; 303 304 if (first->style()->styleType() == BEFORE) 305 return first; 306 307 // Check for a possible generated run-in, using run-in positioning rules. 308 // Skip inlines and floating / positioned blocks, and place as the first child. 309 first = owner->firstChild(); 310 if (!first->isRenderBlock()) 311 return 0; 312 while (first && first->isFloatingOrPositioned()) 313 first = first->nextSibling(); 314 if (first) { 315 first = first->firstChild(); 316 // We still need to skip any list markers that could exist before the run-in. 317 while (first && first->isListMarker()) 318 first = first->nextSibling(); 319 if (first && first->style()->styleType() == BEFORE && first->isRenderInline() && first->isRunIn() && first->isAnonymous()) 320 return first; 321 } 322 return 0; 323 } 324 325 RenderObject* RenderObjectChildList::afterPseudoElementRenderer(const RenderObject* owner) const 326 { 327 RenderObject* last = const_cast<RenderObject*>(owner); 328 do { 329 last = last->lastChild(); 330 } while (last && last->isAnonymous() && last->style()->styleType() == NOPSEUDO && !last->isListMarker()); 331 if (last && last->style()->styleType() != AFTER) 332 return 0; 333 return last; 334 } 335 336 void RenderObjectChildList::updateBeforeAfterContent(RenderObject* owner, PseudoId type, const RenderObject* styledObject) 341 337 { 342 338 // Double check that the document did in fact use generated content rules. Otherwise we should not have been called. … … 351 347 352 348 RenderStyle* pseudoElementStyle = styledObject->getCachedPseudoStyle(type); 353 RenderObject* child = beforeAfterContainer(owner, type); 349 RenderObject* child; 350 switch (type) { 351 case BEFORE: 352 child = beforePseudoElementRenderer(owner); 353 break; 354 case AFTER: 355 child = afterPseudoElementRenderer(owner); 356 break; 357 default: 358 ASSERT_NOT_REACHED(); 359 return; 360 } 354 361 355 362 // Whether or not we currently have generated content attached. … … 465 472 // to find the original content properly. 466 473 generatedContentContainer = RenderObject::createObject(owner->document(), pseudoElementStyle); 474 ASSERT(styledObject->node()); // The styled object cannot be anonymous or else it could not have ':before' or ':after' pseudo elements. 475 generatedContentContainer->setNode(styledObject->node()); // This allows access to the generatingNode. 467 476 generatedContentContainer->setStyle(pseudoElementStyle); 468 477 owner->addChild(generatedContentContainer, insertBefore); -
trunk/Source/WebCore/rendering/RenderObjectChildList.h
r65021 r77191 56 56 void insertChildNode(RenderObject* owner, RenderObject* child, RenderObject* before, bool fullInsert = true); 57 57 58 void updateBeforeAfterContent(RenderObject* owner, PseudoId type, RenderObject* styledObject = 0); 59 void invalidateCounters(RenderObject* owner, const AtomicString& identifier); 58 void updateBeforeAfterContent(RenderObject* owner, PseudoId type, const RenderObject* styledObject = 0); 59 RenderObject* beforePseudoElementRenderer(const RenderObject* owner) const; 60 RenderObject* afterPseudoElementRenderer(const RenderObject* owner) const; 61 void invalidateCounters(const RenderObject* owner, const AtomicString& identifier); 60 62 61 63 private:
Note: See TracChangeset
for help on using the changeset viewer.