Changeset 138909 in webkit


Ignore:
Timestamp:
Jan 5, 2013 3:07:05 PM (11 years ago)
Author:
esprehn@chromium.org
Message:

Remove RenderObjectChildList::beforePseudoElementRenderer and afterPseudoElementRenderer
https://bugs.webkit.org/show_bug.cgi?id=106132

Reviewed by Abhishek Arya.

We no longer need the complicated traversals in beforePseudoElementRenderer
and afterPseudoElementRenderer since we can get the renderers of pseudo
elements through the node. This removes all that code and swaps it for
Element::pseudoElementRenderer.

This is possible now that r138850 removed all the now incorrect manual
management of pseudo element renderers from the render tree that was
left over from before the switch to DOM based pseudo elements.

No new tests, just refactoring.

  • css/CSSComputedStyleDeclaration.cpp:

(WebCore::CSSComputedStyleDeclaration::getPropertyCSSValue):

  • dom/Element.cpp:

(WebCore::Element::pseudoElementRenderer):

Added, gets the renderer of the pseudo element by PseudoId if it
exists.

  • dom/Element.h:

(Element):

  • dom/NodeRenderingTraversal.cpp:

(WebCore::NodeRenderingTraversal::nextSiblingSlow):
(WebCore::NodeRenderingTraversal::previousSiblingSlow):

  • rendering/RenderCounter.cpp:

(WebCore::previousInPreOrder):
(WebCore::previousSiblingOrParent):
(WebCore::nextInPreOrder):

  • rendering/RenderObject.h:

(WebCore::RenderObject::lastChild):

  • rendering/RenderObjectChildList.cpp:
  • rendering/RenderObjectChildList.h:

(RenderObjectChildList):

  • rendering/RenderTreeAsText.cpp:

(WebCore::counterValueForElement):

Location:
trunk/Source/WebCore
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r138908 r138909  
     12013-01-05  Elliott Sprehn  <esprehn@chromium.org>
     2
     3        Remove RenderObjectChildList::beforePseudoElementRenderer and afterPseudoElementRenderer
     4        https://bugs.webkit.org/show_bug.cgi?id=106132
     5
     6        Reviewed by Abhishek Arya.
     7
     8        We no longer need the complicated traversals in beforePseudoElementRenderer
     9        and afterPseudoElementRenderer since we can get the renderers of pseudo
     10        elements through the node. This removes all that code and swaps it for
     11        Element::pseudoElementRenderer.
     12
     13        This is possible now that r138850 removed all the now incorrect manual
     14        management of pseudo element renderers from the render tree that was
     15        left over from before the switch to DOM based pseudo elements.
     16
     17        No new tests, just refactoring.
     18
     19        * css/CSSComputedStyleDeclaration.cpp:
     20        (WebCore::CSSComputedStyleDeclaration::getPropertyCSSValue):
     21        * dom/Element.cpp:
     22        (WebCore::Element::pseudoElementRenderer):
     23            Added, gets the renderer of the pseudo element by PseudoId if it
     24            exists.
     25        * dom/Element.h:
     26        (Element):
     27        * dom/NodeRenderingTraversal.cpp:
     28        (WebCore::NodeRenderingTraversal::nextSiblingSlow):
     29        (WebCore::NodeRenderingTraversal::previousSiblingSlow):
     30        * rendering/RenderCounter.cpp:
     31        (WebCore::previousInPreOrder):
     32        (WebCore::previousSiblingOrParent):
     33        (WebCore::nextInPreOrder):
     34        * rendering/RenderObject.h:
     35        (WebCore::RenderObject::lastChild):
     36        * rendering/RenderObjectChildList.cpp:
     37        * rendering/RenderObjectChildList.h:
     38        (RenderObjectChildList):
     39        * rendering/RenderTreeAsText.cpp:
     40        (WebCore::counterValueForElement):
     41
    1422013-01-05  Robert Hogan  <robert@webkit.org>
    243
  • trunk/Source/WebCore/css/CSSComputedStyleDeclaration.cpp

    r138728 r138909  
    15161516        return 0;
    15171517
    1518     if (renderer) {
    1519         if (m_pseudoElementSpecifier == AFTER)
    1520             renderer = renderer->afterPseudoElementRenderer();
    1521         else if (m_pseudoElementSpecifier == BEFORE)
    1522             renderer = renderer->beforePseudoElementRenderer();
    1523     }
     1518    if (node->isElementNode() && (m_pseudoElementSpecifier == BEFORE || m_pseudoElementSpecifier == AFTER))
     1519        renderer = toElement(node)->pseudoElementRenderer(m_pseudoElementSpecifier);
    15241520
    15251521    propertyID = CSSProperty::resolveDirectionAwareProperty(propertyID, style->direction(), style->writingMode());
  • trunk/Source/WebCore/dom/Element.cpp

    r138823 r138909  
    21722172}
    21732173
     2174RenderObject* Element::pseudoElementRenderer(PseudoId pseudoId) const
     2175{
     2176    if (PseudoElement* element = pseudoElement(pseudoId))
     2177        return element->renderer();
     2178    return 0;
     2179}
    21742180
    21752181// ElementTraversal API
  • trunk/Source/WebCore/dom/Element.h

    r138897 r138909  
    369369    bool hasPseudoElements() const;
    370370    PseudoElement* pseudoElement(PseudoId) const;
    371     PseudoElement* beforePseudoElement() const { return pseudoElement(BEFORE); }
    372     PseudoElement* afterPseudoElement() const { return pseudoElement(AFTER); }
     371    RenderObject* pseudoElementRenderer(PseudoId) const;
    373372    bool childNeedsShadowWalker() const;
    374373    void didShadowTreeAwareChildrenChange();
  • trunk/Source/WebCore/dom/NodeRenderingTraversal.cpp

    r137715 r138909  
    6969    Node* parent = walker.traverseParent(node);
    7070    if (parent && parent->isElementNode())
    71         return toElement(parent)->afterPseudoElement();
     71        return toElement(parent)->pseudoElement(AFTER);
    7272
    7373    return 0;
     
    8888    Node* parent = walker.traverseParent(node);
    8989    if (parent && parent->isElementNode())
    90         return toElement(parent)->beforePseudoElement();
     90        return toElement(parent)->pseudoElement(BEFORE);
    9191
    9292    return 0;
  • trunk/Source/WebCore/rendering/RenderCounter.cpp

    r137406 r138909  
    5454}
    5555
    56 static RenderObject* rendererOfAfterPseudoElement(RenderObject* renderer)
    57 {
    58     RenderObject* lastContinuation = renderer;
    59     while (RenderObject* continuation = lastContinuation->virtualContinuation())
    60         lastContinuation = continuation;
    61     return lastContinuation->afterPseudoElementRenderer();
    62 }
    63 
    6456// This function processes the renderer tree in the order of the DOM tree
    6557// including pseudo elements as defined in CSS 2.1.
    66 // Anonymous renderers are skipped except for those representing pseudo elements.
    6758static RenderObject* previousInPreOrder(const RenderObject* object)
    6859{
     
    8879    while (sibling) {
    8980        if (RenderObject* renderer = sibling->renderer()) {
    90             if (RenderObject* after = rendererOfAfterPseudoElement(renderer))
     81            if (RenderObject* after = sibling->pseudoElementRenderer(AFTER))
    9182                return after;
    9283            parent = sibling;
    9384            sibling = sibling->lastElementChild();
    9485            if (!sibling) {
    95                 if (RenderObject* before = renderer->beforePseudoElementRenderer())
     86                if (RenderObject* before = toElement(renderer->node())->pseudoElementRenderer(BEFORE))
    9687                    return before;
    9788                return renderer;
     
    10293    if (!parent)
    10394        return 0;
    104     RenderObject* renderer = parent->renderer(); // Should never be null
    105     if (RenderObject* before = renderer->beforePseudoElementRenderer())
     95    if (RenderObject* before = parent->pseudoElementRenderer(BEFORE))
    10696        return before;
    107     return renderer;
     97    return parent->renderer();
    10898}
    10999
    110100// This function processes the renderer tree in the order of the DOM tree
    111101// including pseudo elements as defined in CSS 2.1.
    112 // Anonymous renderers are skipped except for those representing pseudo elements.
    113102static RenderObject* previousSiblingOrParent(const RenderObject* object)
    114103{
     
    137126        sibling = sibling->previousElementSibling();
    138127    }
    139     if (parent) {
    140         RenderObject* renderer = parent->renderer();
    141         if (RenderObject* before = renderer->virtualChildren()->beforePseudoElementRenderer(renderer))
    142             return before;
    143         return renderer;
    144     }
    145     return 0;
     128    if (!parent)
     129        return 0;
     130    if (RenderObject* before = parent->pseudoElementRenderer(BEFORE))
     131        return before;
     132    return parent->renderer();
    146133}
    147134
     
    168155// This function processes the renderer tree in the order of the DOM tree
    169156// including pseudo elements as defined in CSS 2.1.
    170 // Anonymous renderers are skipped except for those representing pseudo elements.
    171157static RenderObject* nextInPreOrder(const RenderObject* object, const Element* stayWithin, bool skipDescendants = false)
    172158{
    173159    Element* self;
    174160    Element* child;
    175     RenderObject* result;
    176161    self = toElement(object->generatingNode());
    177162    if (skipDescendants)
     
    180165    case NOPSEUDO:
    181166        ASSERT(!object->isAnonymous());
    182         result = object->beforePseudoElementRenderer();
    183         if (result)
    184             return result;
     167        if (RenderObject* before = self->pseudoElementRenderer(BEFORE))
     168            return before;
    185169        break;
    186170    case BEFORE:
     
    195179    while (true) {
    196180        while (child) {
    197             result = child->renderer();
    198             if (result)
    199                 return result;
     181            if (RenderObject* renderer = child->renderer())
     182                return renderer;
    200183            child = ElementTraversal::nextSkippingChildren(child, self);
    201184        }
    202         result = rendererOfAfterPseudoElement(self->renderer());
    203         if (result)
    204             return result;
     185        if (RenderObject* after = self->pseudoElementRenderer(AFTER))
     186            return after;
    205187nextsibling:
    206188        if (self == stayWithin)
  • trunk/Source/WebCore/rendering/RenderObject.h

    r138113 r138909  
    184184        if (const RenderObjectChildList* children = virtualChildren())
    185185            return children->lastChild();
    186         return 0;
    187     }
    188     RenderObject* beforePseudoElementRenderer() const
    189     {
    190         if (const RenderObjectChildList* children = virtualChildren())
    191             return children->beforePseudoElementRenderer(this);
    192         return 0;
    193     }
    194 
    195     // This function only returns the renderer of the "after" pseudoElement if it is a child of
    196     // this renderer. If "continuations" exist, the function returns 0 even if the element that
    197     // generated this renderer has an "after" pseudo-element.
    198     RenderObject* afterPseudoElementRenderer() const
    199     {
    200         if (const RenderObjectChildList* children = virtualChildren())
    201             return children->afterPseudoElementRenderer(this);
    202186        return 0;
    203187    }
  • trunk/Source/WebCore/rendering/RenderObjectChildList.cpp

    r137336 r138909  
    186186}
    187187
    188 RenderObject* RenderObjectChildList::beforePseudoElementRenderer(const RenderObject* owner) const
    189 {
    190     // An anonymous (generated) inline run-in that has PseudoId BEFORE must come from a grandparent.
    191     // Therefore we should skip these generated run-ins when checking our immediate children.
    192     // If we don't find our :before child immediately, then we should check if we own a
    193     // generated inline run-in in the next level of children.
    194     RenderObject* first = const_cast<RenderObject*>(owner);
    195     do {
    196         first = first->firstChild();
    197         // Skip list markers and generated run-ins.
    198         while (first && (first->isListMarker() || (first->isRenderInline() && first->isRunIn())))
    199             first = first->nextInPreOrderAfterChildren(owner);
    200     } while (first && first->isAnonymous() && first->style()->styleType() == NOPSEUDO);
    201 
    202     if (!first)
    203         return 0;
    204 
    205     if (first->isBeforeContent())
    206         return first;
    207 
    208     // Check for a possible generated run-in, using run-in positioning rules.
    209     first = owner->firstChild();
    210     if (!first->isRenderBlock())
    211         return 0;
    212    
    213     first = first->firstChild();
    214     // We still need to skip any list markers that could exist before the run-in.
    215     while (first && first->isListMarker())
    216         first = first->nextSibling();
    217     if (first && first->isBeforeContent() && first->isRenderInline() && first->isRunIn())
    218         return first;
    219    
    220     return 0;
    221 }
    222 
    223 RenderObject* RenderObjectChildList::afterPseudoElementRenderer(const RenderObject* owner) const
    224 {
    225     RenderObject* last = const_cast<RenderObject*>(owner);
    226     do {
    227         last = last->lastChild();
    228     } while (last && last->isAnonymous() && last->style()->styleType() == NOPSEUDO && !last->isListMarker());
    229     if (last && !last->isAfterContent())
    230         return 0;
    231     return last;
    232 }
    233 
    234188} // namespace WebCore
  • trunk/Source/WebCore/rendering/RenderObjectChildList.h

    r137336 r138909  
    5656    void insertChildNode(RenderObject* owner, RenderObject* child, RenderObject* before, bool notifyRenderer = true);
    5757
    58     RenderObject* beforePseudoElementRenderer(const RenderObject* owner) const;
    59     RenderObject* afterPseudoElementRenderer(const RenderObject* owner) const;
    60 
    6158private:
    6259    RenderObject* m_firstChild;
  • trunk/Source/WebCore/rendering/RenderTreeAsText.cpp

    r136744 r138909  
    902902    bool isFirstCounter = true;
    903903    // The counter renderers should be children of :before or :after pseudo-elements.
    904     if (RenderObject* renderer = element->renderer()) {
    905         if (RenderObject* pseudoElement = renderer->beforePseudoElementRenderer())
    906             writeCounterValuesFromChildren(stream, pseudoElement, isFirstCounter);
    907         if (RenderObject* pseudoElement = renderer->afterPseudoElementRenderer())
    908             writeCounterValuesFromChildren(stream, pseudoElement, isFirstCounter);
    909     }
     904    if (RenderObject* before = element->pseudoElementRenderer(BEFORE))
     905        writeCounterValuesFromChildren(stream, before, isFirstCounter);
     906    if (RenderObject* after = element->pseudoElementRenderer(AFTER))
     907        writeCounterValuesFromChildren(stream, after, isFirstCounter);
    910908    return stream.release();
    911909}
Note: See TracChangeset for help on using the changeset viewer.