Changeset 172730 in webkit


Ignore:
Timestamp:
Aug 18, 2014 3:16:47 PM (10 years ago)
Author:
Antti Koivisto
Message:

Tighten RenderCounter typing
https://bugs.webkit.org/show_bug.cgi?id=136049

Reviewed by Andreas Kling.

RenderObject* -> RenderElement&

  • rendering/CounterNode.cpp:

(WebCore::CounterNode::CounterNode):
(WebCore::CounterNode::create):
(WebCore::showTreeAndMark):

  • rendering/CounterNode.h:

(WebCore::CounterNode::owner):

  • rendering/RenderCounter.cpp:

(WebCore::previousInPreOrder):
(WebCore::parentOrPseudoHostElement):
(WebCore::previousSiblingOrParent):
(WebCore::areRenderersElementsSiblings):
(WebCore::nextInPreOrder):
(WebCore::planCounter):
(WebCore::findPlaceForCounter):
(WebCore::makeCounterNode):
(WebCore::RenderCounter::originalText):
(WebCore::destroyCounterNodeWithoutMapRemoval):
(WebCore::RenderCounter::destroyCounterNodes):
(WebCore::RenderCounter::destroyCounterNode):
(WebCore::RenderCounter::rendererRemovedFromTree):
(WebCore::updateCounters):
(WebCore::RenderCounter::rendererSubtreeAttached):
(WebCore::RenderCounter::rendererStyleChanged):
(showCounterRendererTree):

  • rendering/RenderCounter.h:
  • rendering/RenderElement.cpp:

(WebCore::RenderElement::RenderElement):
(WebCore::RenderElement::insertChildInternal):
(WebCore::RenderElement::removeChildInternal):
(WebCore::RenderElement::styleDidChange):
(WebCore::RenderElement::willBeDestroyed):

  • rendering/RenderElement.h:

(WebCore::RenderElement::hasCounterNodeMap):
(WebCore::RenderElement::setHasCounterNodeMap):

Move CounterNodeMap to RenderElement from RenderObject.

  • rendering/RenderObject.cpp:

(WebCore::RenderObject::willBeDestroyed):

  • rendering/RenderObject.h:

(WebCore::RenderObject::RenderObjectBitfields::RenderObjectBitfields):
(WebCore::RenderObject::hasCounterNodeMap): Deleted.
(WebCore::RenderObject::setHasCounterNodeMap): Deleted.

Location:
trunk/Source/WebCore
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r172729 r172730  
     12014-08-18  Antti Koivisto  <antti@apple.com>
     2
     3        Tighten RenderCounter typing
     4        https://bugs.webkit.org/show_bug.cgi?id=136049
     5
     6        Reviewed by Andreas Kling.
     7
     8        RenderObject* -> RenderElement&
     9
     10        * rendering/CounterNode.cpp:
     11        (WebCore::CounterNode::CounterNode):
     12        (WebCore::CounterNode::create):
     13        (WebCore::showTreeAndMark):
     14        * rendering/CounterNode.h:
     15        (WebCore::CounterNode::owner):
     16        * rendering/RenderCounter.cpp:
     17        (WebCore::previousInPreOrder):
     18        (WebCore::parentOrPseudoHostElement):
     19        (WebCore::previousSiblingOrParent):
     20        (WebCore::areRenderersElementsSiblings):
     21        (WebCore::nextInPreOrder):
     22        (WebCore::planCounter):
     23        (WebCore::findPlaceForCounter):
     24        (WebCore::makeCounterNode):
     25        (WebCore::RenderCounter::originalText):
     26        (WebCore::destroyCounterNodeWithoutMapRemoval):
     27        (WebCore::RenderCounter::destroyCounterNodes):
     28        (WebCore::RenderCounter::destroyCounterNode):
     29        (WebCore::RenderCounter::rendererRemovedFromTree):
     30        (WebCore::updateCounters):
     31        (WebCore::RenderCounter::rendererSubtreeAttached):
     32        (WebCore::RenderCounter::rendererStyleChanged):
     33        (showCounterRendererTree):
     34        * rendering/RenderCounter.h:
     35        * rendering/RenderElement.cpp:
     36        (WebCore::RenderElement::RenderElement):
     37        (WebCore::RenderElement::insertChildInternal):
     38        (WebCore::RenderElement::removeChildInternal):
     39        (WebCore::RenderElement::styleDidChange):
     40        (WebCore::RenderElement::willBeDestroyed):
     41        * rendering/RenderElement.h:
     42        (WebCore::RenderElement::hasCounterNodeMap):
     43        (WebCore::RenderElement::setHasCounterNodeMap):
     44       
     45            Move CounterNodeMap to RenderElement from RenderObject.
     46
     47        * rendering/RenderObject.cpp:
     48        (WebCore::RenderObject::willBeDestroyed):
     49        * rendering/RenderObject.h:
     50        (WebCore::RenderObject::RenderObjectBitfields::RenderObjectBitfields):
     51        (WebCore::RenderObject::hasCounterNodeMap): Deleted.
     52        (WebCore::RenderObject::setHasCounterNodeMap): Deleted.
     53
    1542014-08-18  Peyton Randolph  <prandolph@apple.com>
    255
  • trunk/Source/WebCore/rendering/CounterNode.cpp

    r156622 r172730  
    2929namespace WebCore {
    3030
    31 CounterNode::CounterNode(RenderElement* o, bool hasResetType, int value)
     31CounterNode::CounterNode(RenderElement& owner, bool hasResetType, int value)
    3232    : m_hasResetType(hasResetType)
    3333    , m_value(value)
    3434    , m_countInParent(0)
    35     , m_owner(o)
     35    , m_owner(owner)
    3636    , m_rootRenderer(0)
    3737    , m_parent(0)
     
    9191}
    9292
    93 PassRefPtr<CounterNode> CounterNode::create(RenderElement* owner, bool hasResetType, int value)
     93PassRefPtr<CounterNode> CounterNode::create(RenderElement& owner, bool hasResetType, int value)
    9494{
    9595    return adoptRef(new CounterNode(owner, hasResetType, value));
     
    366366            current, current->actsAsReset() ? "reset____" : "increment", current->value(),
    367367            current->countInParent(), current->parent(), current->previousSibling(),
    368             current->nextSibling(), current->owner());
     368            current->nextSibling(), &current->owner());
    369369    }
    370370    fflush(stderr);
  • trunk/Source/WebCore/rendering/CounterNode.h

    r156622 r172730  
    4343class CounterNode : public RefCounted<CounterNode> {
    4444public:
    45     static PassRefPtr<CounterNode> create(RenderElement*, bool isReset, int value);
     45    static PassRefPtr<CounterNode> create(RenderElement&, bool isReset, int value);
    4646    ~CounterNode();
    4747    bool actsAsReset() const { return m_hasResetType || !m_parent; }
     
    4949    int value() const { return m_value; }
    5050    int countInParent() const { return m_countInParent; }
    51     RenderElement* owner() const { return m_owner; }
     51    RenderElement& owner() const { return m_owner; }
    5252    void addRenderer(RenderCounter*);
    5353    void removeRenderer(RenderCounter*);
     
    7272
    7373private:
    74     CounterNode(RenderElement*, bool isReset, int value);
     74    CounterNode(RenderElement&, bool isReset, int value);
    7575    int computeCountInParent() const;
    7676    // Invalidates the text in the renderer of this counter, if any,
     
    8282    int m_value;
    8383    int m_countInParent;
    84     RenderElement* m_owner;
     84    RenderElement& m_owner;
    8585    RenderCounter* m_rootRenderer;
    8686
  • trunk/Source/WebCore/rendering/RenderCounter.cpp

    r169011 r172730  
    4545
    4646typedef HashMap<AtomicString, RefPtr<CounterNode>> CounterMap;
    47 typedef HashMap<const RenderObject*, std::unique_ptr<CounterMap>> CounterMaps;
    48 
    49 static CounterNode* makeCounterNode(RenderObject*, const AtomicString& identifier, bool alwaysCreateCounter);
     47typedef HashMap<const RenderElement*, std::unique_ptr<CounterMap>> CounterMaps;
     48
     49static CounterNode* makeCounterNode(RenderElement&, const AtomicString& identifier, bool alwaysCreateCounter);
    5050
    5151static CounterMaps& counterMaps()
     
    5757// This function processes the renderer tree in the order of the DOM tree
    5858// including pseudo elements as defined in CSS 2.1.
    59 static RenderObject* previousInPreOrder(const RenderObject* object)
    60 {
    61     Element* self = toElement(object->node());
    62     Element* previous = ElementTraversal::previousIncludingPseudo(self);
     59static RenderElement* previousInPreOrder(const RenderElement& renderer)
     60{
     61    Element* previous = ElementTraversal::previousIncludingPseudo(renderer.element());
    6362    while (previous && !previous->renderer())
    6463        previous = ElementTraversal::previousIncludingPseudo(previous);
     
    6665}
    6766
    68 static inline Element* parentOrPseudoHostElement(const RenderObject* object)
    69 {
    70     if (object->node()->isPseudoElement())
    71         return toPseudoElement(object->node())->hostElement();
    72     return toElement(object->node())->parentElement();
     67static inline Element* parentOrPseudoHostElement(const RenderElement& renderer)
     68{
     69    if (renderer.isPseudoElement())
     70        return renderer.generatingElement();
     71    return renderer.element() ? renderer.element()->parentElement() : nullptr;
    7372}
    7473
    7574// This function processes the renderer tree in the order of the DOM tree
    7675// including pseudo elements as defined in CSS 2.1.
    77 static RenderObject* previousSiblingOrParent(const RenderObject* object)
    78 {
    79     Element* self = toElement(object->node());
    80     Element* previous = ElementTraversal::pseudoAwarePreviousSibling(self);
     76static RenderElement* previousSiblingOrParent(const RenderElement& renderer)
     77{
     78    Element* previous = ElementTraversal::pseudoAwarePreviousSibling(renderer.element());
    8179    while (previous && !previous->renderer())
    8280        previous = ElementTraversal::pseudoAwarePreviousSibling(previous);
    8381    if (previous)
    8482        return previous->renderer();
    85     previous = parentOrPseudoHostElement(object);
    86     return previous ? previous->renderer() : 0;
    87 }
    88 
    89 static inline bool areRenderersElementsSiblings(RenderObject* first, RenderObject* second)
     83    previous = parentOrPseudoHostElement(renderer);
     84    return previous ? previous->renderer() : nullptr;
     85}
     86
     87static inline bool areRenderersElementsSiblings(const RenderElement& first, const RenderElement& second)
    9088{
    9189    return parentOrPseudoHostElement(first) == parentOrPseudoHostElement(second);
     
    9492// This function processes the renderer tree in the order of the DOM tree
    9593// including pseudo elements as defined in CSS 2.1.
    96 static RenderElement* nextInPreOrder(const RenderElement* element, const Element* stayWithin, bool skipDescendants = false)
    97 {
    98     Element* self = element->element();
     94static RenderElement* nextInPreOrder(const RenderElement& renderer, const Element* stayWithin, bool skipDescendants = false)
     95{
     96    Element* self = renderer.element();
    9997    Element* next = skipDescendants ? ElementTraversal::nextIncludingPseudoSkippingChildren(self, stayWithin) : ElementTraversal::nextIncludingPseudo(self, stayWithin);
    10098    while (next && !next->renderer())
     
    103101}
    104102
    105 static bool planCounter(RenderElement* object, const AtomicString& identifier, bool& isReset, int& value)
    106 {
    107     ASSERT(object);
    108 
     103static bool planCounter(RenderElement& renderer, const AtomicString& identifier, bool& isReset, int& value)
     104{
    109105    // We must have a generating node or else we cannot have a counter.
    110     Element* generatingElement = object->generatingElement();
     106    Element* generatingElement = renderer.generatingElement();
    111107    if (!generatingElement)
    112108        return false;
    113109
    114     const RenderStyle& style = object->style();
     110    const RenderStyle& style = renderer.style();
    115111
    116112    switch (style.styleType()) {
     
    118114        // Sometimes elements have more then one renderer. Only the first one gets the counter
    119115        // LayoutTests/http/tests/css/counter-crash.html
    120         if (generatingElement->renderer() != object)
     116        if (generatingElement->renderer() != &renderer)
    121117            return false;
    122118        break;
     
    136132
    137133    if (identifier == "list-item") {
    138         if (object->isListItem()) {
    139             if (toRenderListItem(object)->hasExplicitValue()) {
    140                 value = toRenderListItem(object)->explicitValue();
     134        if (renderer.isListItem()) {
     135            if (toRenderListItem(renderer).hasExplicitValue()) {
     136                value = toRenderListItem(renderer).explicitValue();
    141137                isReset = true;
    142138                return true;
     
    146142            return true;
    147143        }
    148         if (Element* e = object->element()) {
    149             if (e->hasTagName(olTag)) {
    150                 value = toHTMLOListElement(e)->start();
     144        if (Element* element = renderer.element()) {
     145            if (element->hasTagName(olTag)) {
     146                value = toHTMLOListElement(element)->start();
    151147                isReset = true;
    152148                return true;
    153149            }
    154             if (e->hasTagName(ulTag) || e->hasTagName(menuTag) || e->hasTagName(dirTag)) {
     150            if (element->hasTagName(ulTag) || element->hasTagName(menuTag) || element->hasTagName(dirTag)) {
    155151                value = 0;
    156152                isReset = true;
     
    179175// - Non-reset CounterNodes cannot have descendants.
    180176
    181 static bool findPlaceForCounter(RenderObject* counterOwner, const AtomicString& identifier, bool isReset, RefPtr<CounterNode>& parent, RefPtr<CounterNode>& previousSibling)
     177static bool findPlaceForCounter(RenderElement& counterOwner, const AtomicString& identifier, bool isReset, RefPtr<CounterNode>& parent, RefPtr<CounterNode>& previousSibling)
    182178{
    183179    // We cannot stop searching for counters with the same identifier before we also
    184180    // check this renderer, because it may affect the positioning in the tree of our counter.
    185     RenderObject* searchEndRenderer = previousSiblingOrParent(counterOwner);
     181    RenderElement* searchEndRenderer = previousSiblingOrParent(counterOwner);
    186182    // We check renderers in preOrder from the renderer that our counter is attached to
    187183    // towards the begining of the document for counters with the same identifier as the one
    188184    // we are trying to find a place for. This is the next renderer to be checked.
    189     RenderObject* currentRenderer = previousInPreOrder(counterOwner);
     185    RenderElement* currentRenderer = previousInPreOrder(counterOwner);
    190186    previousSibling = 0;
    191187    RefPtr<CounterNode> previousSiblingProtector = 0;
    192188
    193189    while (currentRenderer) {
    194         CounterNode* currentCounter = makeCounterNode(currentRenderer, identifier, false);
     190        CounterNode* currentCounter = makeCounterNode(*currentRenderer, identifier, false);
    195191        if (searchEndRenderer == currentRenderer) {
    196192            // We may be at the end of our search.
     
    200196                    if (currentCounter->actsAsReset()) {
    201197                        // We found a reset counter that is on a renderer that is a sibling of ours or a parent.
    202                         if (isReset && areRenderersElementsSiblings(currentRenderer, counterOwner)) {
     198                        if (isReset && areRenderersElementsSiblings(*currentRenderer, counterOwner)) {
    203199                            // We are also a reset counter and the previous reset was on a sibling renderer
    204200                            // hence we are the next sibling of that counter if that reset is not a root or
     
    221217                    }
    222218                    // CurrentCounter, the counter at the EndSearchRenderer, is not reset.
    223                     if (!isReset || !areRenderersElementsSiblings(currentRenderer, counterOwner)) {
     219                    if (!isReset || !areRenderersElementsSiblings(*currentRenderer, counterOwner)) {
    224220                        // If the node we are placing is not reset or we have found a counter that is attached
    225221                        // to an ancestor of the placed counter's owner renderer we know we are a sibling of that node.
     
    237233                    // to currentCounter.
    238234                    if (currentCounter->actsAsReset()) {
    239                         if (isReset && areRenderersElementsSiblings(currentRenderer, counterOwner)) {
     235                        if (isReset && areRenderersElementsSiblings(*currentRenderer, counterOwner)) {
    240236                            parent = currentCounter->parent();
    241237                            previousSibling = currentCounter;
     
    246242                        return true;
    247243                    }
    248                     if (!isReset || !areRenderersElementsSiblings(currentRenderer, counterOwner)) {
     244                    if (!isReset || !areRenderersElementsSiblings(*currentRenderer, counterOwner)) {
    249245                        parent = currentCounter->parent();
    250246                        previousSibling = currentCounter;
     
    258254            // of our owner renderer was not a reset counter.
    259255            // Set a new goal for the end of the search.
    260             searchEndRenderer = previousSiblingOrParent(currentRenderer);
     256            searchEndRenderer = previousSiblingOrParent(*currentRenderer);
    261257        } else {
    262258            // We are searching descendants of a previous sibling of the renderer that the
     
    271267                        // We are no longer interested in previous siblings of the currentRenderer or their children
    272268                        // as counters they may have attached cannot be the previous sibling of the counter we are placing.
    273                         currentRenderer = parentOrPseudoHostElement(currentRenderer)->renderer();
     269                        currentRenderer = parentOrPseudoHostElement(*currentRenderer)->renderer();
    274270                        continue;
    275271                    }
    276272                } else
    277273                    previousSiblingProtector = currentCounter;
    278                 currentRenderer = previousSiblingOrParent(currentRenderer);
     274                currentRenderer = previousSiblingOrParent(*currentRenderer);
    279275                continue;
    280276            }
     
    285281        // impede the readability of this already complex algorithm.
    286282        if (previousSiblingProtector)
    287             currentRenderer = previousSiblingOrParent(currentRenderer);
     283            currentRenderer = previousSiblingOrParent(*currentRenderer);
    288284        else
    289             currentRenderer = previousInPreOrder(currentRenderer);
     285            currentRenderer = previousInPreOrder(*currentRenderer);
    290286    }
    291287    return false;
    292288}
    293289
    294 static CounterNode* makeCounterNode(RenderObject* object, const AtomicString& identifier, bool alwaysCreateCounter)
    295 {
    296     ASSERT(object);
    297 
    298     // Real text nodes don't have their own style so they can't have counters.
    299     // We can't even look at their styles or we'll see extra resets and increments!
    300     if (object->isText())
    301         return nullptr;
    302 
    303     RenderElement* element = toRenderElement(object);
    304 
    305     if (element->hasCounterNodeMap()) {
    306         if (CounterMap* nodeMap = counterMaps().get(element)) {
     290static CounterNode* makeCounterNode(RenderElement& renderer, const AtomicString& identifier, bool alwaysCreateCounter)
     291{
     292    if (renderer.hasCounterNodeMap()) {
     293        if (CounterMap* nodeMap = counterMaps().get(&renderer)) {
    307294            if (CounterNode* node = nodeMap->get(identifier))
    308295                return node;
     
    312299    bool isReset = false;
    313300    int value = 0;
    314     if (!planCounter(element, identifier, isReset, value) && !alwaysCreateCounter)
     301    if (!planCounter(renderer, identifier, isReset, value) && !alwaysCreateCounter)
    315302        return nullptr;
    316303
    317304    RefPtr<CounterNode> newParent = 0;
    318305    RefPtr<CounterNode> newPreviousSibling = 0;
    319     RefPtr<CounterNode> newNode = CounterNode::create(element, isReset, value);
    320     if (findPlaceForCounter(element, identifier, isReset, newParent, newPreviousSibling))
     306    RefPtr<CounterNode> newNode = CounterNode::create(renderer, isReset, value);
     307    if (findPlaceForCounter(renderer, identifier, isReset, newParent, newPreviousSibling))
    321308        newParent->insertAfter(newNode.get(), newPreviousSibling.get(), identifier);
    322309    CounterMap* nodeMap;
    323     if (element->hasCounterNodeMap())
    324         nodeMap = counterMaps().get(element);
     310    if (renderer.hasCounterNodeMap())
     311        nodeMap = counterMaps().get(&renderer);
    325312    else {
    326313        nodeMap = new CounterMap;
    327         counterMaps().set(element, std::unique_ptr<CounterMap>(nodeMap));
    328         element->setHasCounterNodeMap(true);
     314        counterMaps().set(&renderer, std::unique_ptr<CounterMap>(nodeMap));
     315        renderer.setHasCounterNodeMap(true);
    329316    }
    330317    nodeMap->set(identifier, newNode);
     
    334321    // should become children of this node now.
    335322    CounterMaps& maps = counterMaps();
    336     Element* stayWithin = parentOrPseudoHostElement(element);
     323    Element* stayWithin = parentOrPseudoHostElement(renderer);
    337324    bool skipDescendants;
    338     for (RenderElement* currentRenderer = nextInPreOrder(element, stayWithin); currentRenderer; currentRenderer = nextInPreOrder(currentRenderer, stayWithin, skipDescendants)) {
     325    for (RenderElement* currentRenderer = nextInPreOrder(renderer, stayWithin); currentRenderer; currentRenderer = nextInPreOrder(*currentRenderer, stayWithin, skipDescendants)) {
    339326        skipDescendants = false;
    340327        if (!currentRenderer->hasCounterNodeMap())
     
    346333        if (currentCounter->parent())
    347334            continue;
    348         if (stayWithin == parentOrPseudoHostElement(currentRenderer) && currentCounter->hasResetType())
     335        if (stayWithin == parentOrPseudoHostElement(*currentRenderer) && currentCounter->hasResetType())
    349336            break;
    350337        newNode->insertAfter(currentCounter, newNode->lastChild(), identifier);
     
    400387            beforeAfterContainer = beforeAfterContainer->parent();
    401388        }
    402         makeCounterNode(beforeAfterContainer, m_counter.identifier(), true)->addRenderer(const_cast<RenderCounter*>(this));
     389        makeCounterNode(*beforeAfterContainer, m_counter.identifier(), true)->addRenderer(const_cast<RenderCounter*>(this));
    403390        ASSERT(m_counterNode);
    404391    }
     
    457444        previous = child->previousInPreOrder();
    458445        child->parent()->removeChild(child.get());
    459         ASSERT(counterMaps().get(child->owner())->get(identifier) == child);
    460         counterMaps().get(child->owner())->remove(identifier);
     446        ASSERT(counterMaps().get(&child->owner())->get(identifier) == child);
     447        counterMaps().get(&child->owner())->remove(identifier);
    461448    }
    462449    if (CounterNode* parent = node->parent())
     
    464451}
    465452
    466 void RenderCounter::destroyCounterNodes(RenderObject* owner)
     453void RenderCounter::destroyCounterNodes(RenderElement& owner)
    467454{
    468455    CounterMaps& maps = counterMaps();
    469     CounterMaps::iterator mapsIterator = maps.find(owner);
     456    CounterMaps::iterator mapsIterator = maps.find(&owner);
    470457    if (mapsIterator == maps.end())
    471458        return;
     
    476463    }
    477464    maps.remove(mapsIterator);
    478     owner->setHasCounterNodeMap(false);
    479 }
    480 
    481 void RenderCounter::destroyCounterNode(RenderObject* owner, const AtomicString& identifier)
    482 {
    483     CounterMap* map = counterMaps().get(owner);
     465    owner.setHasCounterNodeMap(false);
     466}
     467
     468void RenderCounter::destroyCounterNode(RenderElement& owner, const AtomicString& identifier)
     469{
     470    CounterMap* map = counterMaps().get(&owner);
    484471    if (!map)
    485472        return;
     
    502489}
    503490
    504 void RenderCounter::rendererRemovedFromTree(RenderObject& renderer)
     491void RenderCounter::rendererRemovedFromTree(RenderElement& renderer)
    505492{
    506493    if (!renderer.view().hasRenderCounters())
     
    510497        currentRenderer = &renderer;
    511498    while (true) {
    512         destroyCounterNodes(currentRenderer);
     499        if (currentRenderer->isRenderElement())
     500            destroyCounterNodes(toRenderElement(*currentRenderer));
    513501        if (currentRenderer == &renderer)
    514502            break;
     
    517505}
    518506
    519 static void updateCounters(RenderObject* renderer)
    520 {
    521     const CounterDirectiveMap* directiveMap = renderer->style().counterDirectives();
     507static void updateCounters(RenderElement& renderer)
     508{
     509    const CounterDirectiveMap* directiveMap = renderer.style().counterDirectives();
    522510    if (!directiveMap)
    523511        return;
    524512    CounterDirectiveMap::const_iterator end = directiveMap->end();
    525     if (!renderer->hasCounterNodeMap()) {
     513    if (!renderer.hasCounterNodeMap()) {
    526514        for (CounterDirectiveMap::const_iterator it = directiveMap->begin(); it != end; ++it)
    527515            makeCounterNode(renderer, it->key, false);
    528516        return;
    529517    }
    530     CounterMap* counterMap = counterMaps().get(renderer);
     518    CounterMap* counterMap = counterMaps().get(&renderer);
    531519    ASSERT(counterMap);
    532520    for (CounterDirectiveMap::const_iterator it = directiveMap->begin(); it != end; ++it) {
     
    552540}
    553541
    554 void RenderCounter::rendererSubtreeAttached(RenderObject* renderer)
    555 {
    556     if (!renderer->view().hasRenderCounters())
    557         return;
    558     Node* node = renderer->node();
    559     if (node && !node->isPseudoElement())
    560         node = node->parentNode();
     542void RenderCounter::rendererSubtreeAttached(RenderElement& renderer)
     543{
     544    if (!renderer.view().hasRenderCounters())
     545        return;
     546    Element* element = renderer.element();
     547    if (element && !element->isPseudoElement())
     548        element = element->parentElement();
    561549    else
    562         node = renderer->generatingNode();
    563     if (node && !node->renderer())
     550        element = renderer.generatingElement();
     551    if (element && !element->renderer())
    564552        return; // No need to update if the parent is not attached yet
    565     for (RenderObject* descendant = renderer; descendant; descendant = descendant->nextInPreOrder(renderer))
    566         updateCounters(descendant);
    567 }
    568 
    569 void RenderCounter::rendererStyleChanged(RenderObject* renderer, const RenderStyle* oldStyle, const RenderStyle* newStyle)
    570 {
    571     Node* node = renderer->generatingNode();
    572     if (!node || !node->renderer())
     553    for (RenderObject* descendant = &renderer; descendant; descendant = descendant->nextInPreOrder(&renderer)) {
     554        if (descendant->isRenderElement())
     555            updateCounters(toRenderElement(*descendant));
     556    }
     557}
     558
     559void RenderCounter::rendererStyleChanged(RenderElement& renderer, const RenderStyle* oldStyle, const RenderStyle* newStyle)
     560{
     561    Element* element = renderer.generatingElement();
     562    if (!element || !element->renderer())
    573563        return; // cannot have generated content or if it can have, it will be handled during attaching
    574564    const CounterDirectiveMap* newCounterDirectives;
     
    596586            }
    597587        } else {
    598             if (renderer->hasCounterNodeMap())
     588            if (renderer.hasCounterNodeMap())
    599589                RenderCounter::destroyCounterNodes(renderer);
    600590        }
     
    624614    AtomicString identifier(counterName);
    625615    for (const WebCore::RenderObject* current = root; current; current = current->nextInPreOrder()) {
     616        if (!current->isRenderElement())
     617            continue;
    626618        fprintf(stderr, "%c", (current == renderer) ? '*' : ' ');
    627619        for (const WebCore::RenderObject* parent = current; parent && parent != root; parent = parent->parent())
     
    629621        fprintf(stderr, "%p N:%p P:%p PS:%p NS:%p C:%p\n",
    630622            current, current->node(), current->parent(), current->previousSibling(),
    631             current->nextSibling(), current->hasCounterNodeMap() ?
    632             counterName ? WebCore::counterMaps().get(current)->get(identifier) : (WebCore::CounterNode*)1 : (WebCore::CounterNode*)0);
     623            current->nextSibling(), toRenderElement(current)->hasCounterNodeMap() ?
     624            counterName ? WebCore::counterMaps().get(toRenderElement(current))->get(identifier) : (WebCore::CounterNode*)1 : (WebCore::CounterNode*)0);
    633625    }
    634626    fflush(stderr);
  • trunk/Source/WebCore/rendering/RenderCounter.h

    r163793 r172730  
    3535    virtual ~RenderCounter();
    3636
    37     static void destroyCounterNodes(RenderObject*);
    38     static void destroyCounterNode(RenderObject*, const AtomicString& identifier);
    39     static void rendererSubtreeAttached(RenderObject*);
    40     static void rendererRemovedFromTree(RenderObject&);
    41     static void rendererStyleChanged(RenderObject*, const RenderStyle* oldStyle, const RenderStyle* newStyle);
     37    static void destroyCounterNodes(RenderElement&);
     38    static void destroyCounterNode(RenderElement&, const AtomicString& identifier);
     39    static void rendererSubtreeAttached(RenderElement&);
     40    static void rendererRemovedFromTree(RenderElement&);
     41    static void rendererStyleChanged(RenderElement&, const RenderStyle* oldStyle, const RenderStyle* newStyle);
    4242
    4343    void updateCounter();
  • trunk/Source/WebCore/rendering/RenderElement.cpp

    r172656 r172730  
    8686    , m_renderBoxNeedsLazyRepaint(false)
    8787    , m_hasPausedImageAnimations(false)
     88    , m_hasCounterNodeMap(false)
    8889    , m_firstChild(nullptr)
    8990    , m_lastChild(nullptr)
     
    569570        if (notifyChildren == NotifyChildren)
    570571            newChild->insertedIntoTree();
    571         RenderCounter::rendererSubtreeAttached(newChild);
     572        if (newChild->isRenderElement())
     573            RenderCounter::rendererSubtreeAttached(toRenderElement(*newChild));
    572574    }
    573575
     
    637639    // rendererRemovedFromTree walks the whole subtree. We can improve performance
    638640    // by skipping this step when destroying the entire tree.
    639     if (!documentBeingDestroyed())
    640         RenderCounter::rendererRemovedFromTree(oldChild);
     641    if (!documentBeingDestroyed() && oldChild.isRenderElement())
     642        RenderCounter::rendererRemovedFromTree(toRenderElement(oldChild));
    641643
    642644    if (AXObjectCache* cache = document().existingAXObjectCache())
     
    921923   
    922924    if (diff == StyleDifferenceLayout || diff == StyleDifferenceSimplifiedLayout) {
    923         RenderCounter::rendererStyleChanged(this, oldStyle, &m_style.get());
     925        RenderCounter::rendererStyleChanged(*this, oldStyle, &m_style.get());
    924926
    925927        // If the object already needs layout, then setNeedsLayout won't do
     
    10071009
    10081010    destroyLeftoverChildren();
     1011
     1012    if (hasCounterNodeMap())
     1013        RenderCounter::destroyCounterNodes(*this);
    10091014
    10101015    RenderObject::willBeDestroyed();
  • trunk/Source/WebCore/rendering/RenderElement.h

    r170774 r172730  
    160160    bool renderBoxNeedsLazyRepaint() const { return m_renderBoxNeedsLazyRepaint; }
    161161
     162    bool hasCounterNodeMap() const { return m_hasCounterNodeMap; }
     163    void setHasCounterNodeMap(bool f) { m_hasCounterNodeMap = f; }
     164
    162165protected:
    163166    enum BaseTypeFlags {
     
    232235    bool m_renderBoxNeedsLazyRepaint : 1;
    233236    bool m_hasPausedImageAnimations : 1;
     237    bool m_hasCounterNodeMap : 1;
    234238
    235239    RenderObject* m_firstChild;
  • trunk/Source/WebCore/rendering/RenderObject.cpp

    r172326 r172730  
    19421942        cache->remove(this);
    19431943
    1944     // If this renderer had a parent, remove should have destroyed any counters
    1945     // attached to this renderer and marked the affected other counters for
    1946     // reevaluation. This apparently redundant check is here for the case when
    1947     // this renderer had no parent at the time remove() was called.
    1948 
    1949     if (hasCounterNodeMap())
    1950         RenderCounter::destroyCounterNodes(this);
    1951 
    19521944    // FIXME: Would like to do this in RenderBoxModelObject, but the timing is so complicated that this can't easily
    19531945    // be moved into RenderBoxModelObject::destroy.
  • trunk/Source/WebCore/rendering/RenderObject.h

    r170425 r172730  
    391391    static inline bool isBeforeOrAfterContent(const RenderObject* obj) { return obj && obj->isBeforeOrAfterContent(); }
    392392
    393     bool hasCounterNodeMap() const { return m_bitfields.hasCounterNodeMap(); }
    394     void setHasCounterNodeMap(bool hasCounterNodeMap) { m_bitfields.setHasCounterNodeMap(hasCounterNodeMap); }
    395393    bool everHadLayout() const { return m_bitfields.everHadLayout(); }
    396394
     
    962960            , m_hasTransform(false)
    963961            , m_hasReflection(false)
    964             , m_hasCounterNodeMap(false)
    965962            , m_everHadLayout(false)
    966963            , m_childrenInline(false)
     
    972969        }
    973970       
    974         // 32 bits have been used here. There are no bits available.
     971        // 31 bits have been used here. There is one bit available.
    975972        ADD_BOOLEAN_BITFIELD(needsLayout, NeedsLayout);
    976973        ADD_BOOLEAN_BITFIELD(needsPositionedMovementLayout, NeedsPositionedMovementLayout);
     
    995992        ADD_BOOLEAN_BITFIELD(hasReflection, HasReflection);
    996993
    997         ADD_BOOLEAN_BITFIELD(hasCounterNodeMap, HasCounterNodeMap);
    998994        ADD_BOOLEAN_BITFIELD(everHadLayout, EverHadLayout);
    999995
Note: See TracChangeset for help on using the changeset viewer.