Changeset 77191 in webkit


Ignore:
Timestamp:
Jan 31, 2011 6:36:12 PM (13 years ago)
Author:
carol.szabo@nokia.com
Message:

2011-01-31 Carol Szabo <carol.szabo@nokia.com>

Reviewed by David Hyatt.

Code Changes only.

It is needlessly expensive to find the generating node from an anonymous renderer of a pseudoelement.
https://bugs.webkit.org/show_bug.cgi?id=53024

No new tests. No change in functionality

  • rendering/RenderObject.h: (WebCore::RenderObject::before): (WebCore::RenderObject::after): (WebCore::RenderObject::generatingNode): Added new accessors for the use of the CSS 2.1 counters code (mainlyly)
  • rendering/RenderObjectChildList.cpp: (WebCore::beforeAfterContainer): (WebCore::RenderObjectChildList::invalidateCounters): (WebCore::RenderObjectChildList::before): (WebCore::RenderObjectChildList::after): Refactored the code to take advantage of the new accessors. (WebCore::RenderObjectChildList::updateBeforeAfterContent): Changed to store the generating node in the :before and :after renderers.
  • rendering/RenderObjectChildList.h:
Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r77186 r77191  
     12011-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
    1292011-01-31  Krithigassree Sambamurthy  <krithigassree.sambamurthy@nokia.com>
    230
  • trunk/Source/WebCore/rendering/RenderObject.h

    r76590 r77191  
    144144        return 0;
    145145    }
     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    }
    146158    virtual RenderObjectChildList* virtualChildren() { return 0; }
    147159    virtual const RenderObjectChildList* virtualChildren() const { return 0; }
     
    446458
    447459    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; }
    448465    void setNode(Node* node) { m_node = node; }
    449466
  • trunk/Source/WebCore/rendering/RenderObjectChildList.cpp

    r76859 r77191  
    248248}
    249249
    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 a
    256         // generated inline run-in in the next level of children.
    257         RenderObject* first = container;
    258         do {
    259             // Skip list markers and generated run-ins
    260             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 
    303250static RenderObject* findBeforeAfterParent(RenderObject* object)
    304251{
     
    331278}
    332279
    333 void RenderObjectChildList::invalidateCounters(RenderObject* owner, const AtomicString& identifier)
     280void RenderObjectChildList::invalidateCounters(const RenderObject* owner, const AtomicString& identifier)
    334281{
    335282    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
     287RenderObject* 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
     325RenderObject* 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
     336void RenderObjectChildList::updateBeforeAfterContent(RenderObject* owner, PseudoId type, const RenderObject* styledObject)
    341337{
    342338    // Double check that the document did in fact use generated content rules.  Otherwise we should not have been called.
     
    351347
    352348    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    }
    354361
    355362    // Whether or not we currently have generated content attached.
     
    465472                // to find the original content properly.
    466473                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.
    467476                generatedContentContainer->setStyle(pseudoElementStyle);
    468477                owner->addChild(generatedContentContainer, insertBefore);
  • trunk/Source/WebCore/rendering/RenderObjectChildList.h

    r65021 r77191  
    5656    void insertChildNode(RenderObject* owner, RenderObject* child, RenderObject* before, bool fullInsert = true);
    5757
    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);
    6062
    6163private:
Note: See TracChangeset for help on using the changeset viewer.