Title: [172730] trunk/Source/WebCore
Revision
172730
Author
an...@apple.com
Date
2014-08-18 15:16:47 -0700 (Mon, 18 Aug 2014)

Log 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.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (172729 => 172730)


--- trunk/Source/WebCore/ChangeLog	2014-08-18 22:03:24 UTC (rev 172729)
+++ trunk/Source/WebCore/ChangeLog	2014-08-18 22:16:47 UTC (rev 172730)
@@ -1,3 +1,56 @@
+2014-08-18  Antti Koivisto  <an...@apple.com>
+
+        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.
+
 2014-08-18  Peyton Randolph  <prando...@apple.com>
 
         Expose long mouse press WebKit API. Part of 135257 - Add long mouse press gesture

Modified: trunk/Source/WebCore/rendering/CounterNode.cpp (172729 => 172730)


--- trunk/Source/WebCore/rendering/CounterNode.cpp	2014-08-18 22:03:24 UTC (rev 172729)
+++ trunk/Source/WebCore/rendering/CounterNode.cpp	2014-08-18 22:16:47 UTC (rev 172730)
@@ -28,11 +28,11 @@
 
 namespace WebCore {
 
-CounterNode::CounterNode(RenderElement* o, bool hasResetType, int value)
+CounterNode::CounterNode(RenderElement& owner, bool hasResetType, int value)
     : m_hasResetType(hasResetType)
     , m_value(value)
     , m_countInParent(0)
-    , m_owner(o)
+    , m_owner(owner)
     , m_rootRenderer(0)
     , m_parent(0)
     , m_previousSibling(0)
@@ -90,7 +90,7 @@
     resetRenderers();
 }
 
-PassRefPtr<CounterNode> CounterNode::create(RenderElement* owner, bool hasResetType, int value)
+PassRefPtr<CounterNode> CounterNode::create(RenderElement& owner, bool hasResetType, int value)
 {
     return adoptRef(new CounterNode(owner, hasResetType, value));
 }
@@ -365,7 +365,7 @@
         fprintf(stderr, "%p %s: %d %d P:%p PS:%p NS:%p R:%p\n",
             current, current->actsAsReset() ? "reset____" : "increment", current->value(),
             current->countInParent(), current->parent(), current->previousSibling(),
-            current->nextSibling(), current->owner());
+            current->nextSibling(), &current->owner());
     }
     fflush(stderr);
 }

Modified: trunk/Source/WebCore/rendering/CounterNode.h (172729 => 172730)


--- trunk/Source/WebCore/rendering/CounterNode.h	2014-08-18 22:03:24 UTC (rev 172729)
+++ trunk/Source/WebCore/rendering/CounterNode.h	2014-08-18 22:16:47 UTC (rev 172730)
@@ -42,13 +42,13 @@
 
 class CounterNode : public RefCounted<CounterNode> {
 public:
-    static PassRefPtr<CounterNode> create(RenderElement*, bool isReset, int value);
+    static PassRefPtr<CounterNode> create(RenderElement&, bool isReset, int value);
     ~CounterNode();
     bool actsAsReset() const { return m_hasResetType || !m_parent; }
     bool hasResetType() const { return m_hasResetType; }
     int value() const { return m_value; }
     int countInParent() const { return m_countInParent; }
-    RenderElement* owner() const { return m_owner; }
+    RenderElement& owner() const { return m_owner; }
     void addRenderer(RenderCounter*);
     void removeRenderer(RenderCounter*);
 
@@ -71,7 +71,7 @@
     void removeChild(CounterNode*);
 
 private:
-    CounterNode(RenderElement*, bool isReset, int value);
+    CounterNode(RenderElement&, bool isReset, int value);
     int computeCountInParent() const;
     // Invalidates the text in the renderer of this counter, if any,
     // and in the renderers of all descendants of this counter, if any.
@@ -81,7 +81,7 @@
     bool m_hasResetType;
     int m_value;
     int m_countInParent;
-    RenderElement* m_owner;
+    RenderElement& m_owner;
     RenderCounter* m_rootRenderer;
 
     CounterNode* m_parent;

Modified: trunk/Source/WebCore/rendering/RenderCounter.cpp (172729 => 172730)


--- trunk/Source/WebCore/rendering/RenderCounter.cpp	2014-08-18 22:03:24 UTC (rev 172729)
+++ trunk/Source/WebCore/rendering/RenderCounter.cpp	2014-08-18 22:16:47 UTC (rev 172730)
@@ -44,9 +44,9 @@
 using namespace HTMLNames;
 
 typedef HashMap<AtomicString, RefPtr<CounterNode>> CounterMap;
-typedef HashMap<const RenderObject*, std::unique_ptr<CounterMap>> CounterMaps;
+typedef HashMap<const RenderElement*, std::unique_ptr<CounterMap>> CounterMaps;
 
-static CounterNode* makeCounterNode(RenderObject*, const AtomicString& identifier, bool alwaysCreateCounter);
+static CounterNode* makeCounterNode(RenderElement&, const AtomicString& identifier, bool alwaysCreateCounter);
 
 static CounterMaps& counterMaps()
 {
@@ -56,68 +56,64 @@
 
 // This function processes the renderer tree in the order of the DOM tree
 // including pseudo elements as defined in CSS 2.1.
-static RenderObject* previousInPreOrder(const RenderObject* object)
+static RenderElement* previousInPreOrder(const RenderElement& renderer)
 {
-    Element* self = toElement(object->node());
-    Element* previous = ElementTraversal::previousIncludingPseudo(self);
+    Element* previous = ElementTraversal::previousIncludingPseudo(renderer.element());
     while (previous && !previous->renderer())
         previous = ElementTraversal::previousIncludingPseudo(previous);
     return previous ? previous->renderer() : 0;
 }
 
-static inline Element* parentOrPseudoHostElement(const RenderObject* object)
+static inline Element* parentOrPseudoHostElement(const RenderElement& renderer)
 {
-    if (object->node()->isPseudoElement())
-        return toPseudoElement(object->node())->hostElement();
-    return toElement(object->node())->parentElement();
+    if (renderer.isPseudoElement())
+        return renderer.generatingElement();
+    return renderer.element() ? renderer.element()->parentElement() : nullptr;
 }
 
 // This function processes the renderer tree in the order of the DOM tree
 // including pseudo elements as defined in CSS 2.1.
-static RenderObject* previousSiblingOrParent(const RenderObject* object)
+static RenderElement* previousSiblingOrParent(const RenderElement& renderer)
 {
-    Element* self = toElement(object->node());
-    Element* previous = ElementTraversal::pseudoAwarePreviousSibling(self);
+    Element* previous = ElementTraversal::pseudoAwarePreviousSibling(renderer.element());
     while (previous && !previous->renderer())
         previous = ElementTraversal::pseudoAwarePreviousSibling(previous);
     if (previous)
         return previous->renderer();
-    previous = parentOrPseudoHostElement(object);
-    return previous ? previous->renderer() : 0;
+    previous = parentOrPseudoHostElement(renderer);
+    return previous ? previous->renderer() : nullptr;
 }
 
-static inline bool areRenderersElementsSiblings(RenderObject* first, RenderObject* second)
+static inline bool areRenderersElementsSiblings(const RenderElement& first, const RenderElement& second)
 {
     return parentOrPseudoHostElement(first) == parentOrPseudoHostElement(second);
 }
 
 // This function processes the renderer tree in the order of the DOM tree
 // including pseudo elements as defined in CSS 2.1.
-static RenderElement* nextInPreOrder(const RenderElement* element, const Element* stayWithin, bool skipDescendants = false)
+static RenderElement* nextInPreOrder(const RenderElement& renderer, const Element* stayWithin, bool skipDescendants = false)
 {
-    Element* self = element->element();
+    Element* self = renderer.element();
     Element* next = skipDescendants ? ElementTraversal::nextIncludingPseudoSkippingChildren(self, stayWithin) : ElementTraversal::nextIncludingPseudo(self, stayWithin);
     while (next && !next->renderer())
         next = skipDescendants ? ElementTraversal::nextIncludingPseudoSkippingChildren(next, stayWithin) : ElementTraversal::nextIncludingPseudo(next, stayWithin);
     return next ? next->renderer() : 0;
 }
 
-static bool planCounter(RenderElement* object, const AtomicString& identifier, bool& isReset, int& value)
+static bool planCounter(RenderElement& renderer, const AtomicString& identifier, bool& isReset, int& value)
 {
-    ASSERT(object);
-
     // We must have a generating node or else we cannot have a counter.
-    Element* generatingElement = object->generatingElement();
+    Element* generatingElement = renderer.generatingElement();
     if (!generatingElement)
         return false;
 
-    const RenderStyle& style = object->style();
+    const RenderStyle& style = renderer.style();
 
     switch (style.styleType()) {
     case NOPSEUDO:
         // Sometimes elements have more then one renderer. Only the first one gets the counter
         // LayoutTests/http/tests/css/counter-crash.html
-        if (generatingElement->renderer() != object)
+        if (generatingElement->renderer() != &renderer)
             return false;
         break;
     case BEFORE:
@@ -135,9 +131,9 @@
     }
 
     if (identifier == "list-item") {
-        if (object->isListItem()) {
-            if (toRenderListItem(object)->hasExplicitValue()) {
-                value = toRenderListItem(object)->explicitValue();
+        if (renderer.isListItem()) {
+            if (toRenderListItem(renderer).hasExplicitValue()) {
+                value = toRenderListItem(renderer).explicitValue();
                 isReset = true;
                 return true;
             }
@@ -145,13 +141,13 @@
             isReset = false;
             return true;
         }
-        if (Element* e = object->element()) {
-            if (e->hasTagName(olTag)) {
-                value = toHTMLOListElement(e)->start();
+        if (Element* element = renderer.element()) {
+            if (element->hasTagName(olTag)) {
+                value = toHTMLOListElement(element)->start();
                 isReset = true;
                 return true;
             }
-            if (e->hasTagName(ulTag) || e->hasTagName(menuTag) || e->hasTagName(dirTag)) {
+            if (element->hasTagName(ulTag) || element->hasTagName(menuTag) || element->hasTagName(dirTag)) {
                 value = 0;
                 isReset = true;
                 return true;
@@ -178,20 +174,20 @@
 // reset node.
 // - Non-reset CounterNodes cannot have descendants.
 
-static bool findPlaceForCounter(RenderObject* counterOwner, const AtomicString& identifier, bool isReset, RefPtr<CounterNode>& parent, RefPtr<CounterNode>& previousSibling)
+static bool findPlaceForCounter(RenderElement& counterOwner, const AtomicString& identifier, bool isReset, RefPtr<CounterNode>& parent, RefPtr<CounterNode>& previousSibling)
 {
     // We cannot stop searching for counters with the same identifier before we also
     // check this renderer, because it may affect the positioning in the tree of our counter.
-    RenderObject* searchEndRenderer = previousSiblingOrParent(counterOwner);
+    RenderElement* searchEndRenderer = previousSiblingOrParent(counterOwner);
     // We check renderers in preOrder from the renderer that our counter is attached to
     // towards the begining of the document for counters with the same identifier as the one
     // we are trying to find a place for. This is the next renderer to be checked.
-    RenderObject* currentRenderer = previousInPreOrder(counterOwner);
+    RenderElement* currentRenderer = previousInPreOrder(counterOwner);
     previousSibling = 0;
     RefPtr<CounterNode> previousSiblingProtector = 0;
 
     while (currentRenderer) {
-        CounterNode* currentCounter = makeCounterNode(currentRenderer, identifier, false);
+        CounterNode* currentCounter = makeCounterNode(*currentRenderer, identifier, false);
         if (searchEndRenderer == currentRenderer) {
             // We may be at the end of our search.
             if (currentCounter) {
@@ -199,7 +195,7 @@
                 if (previousSiblingProtector) { // But we already found another counter that we come after.
                     if (currentCounter->actsAsReset()) {
                         // We found a reset counter that is on a renderer that is a sibling of ours or a parent.
-                        if (isReset && areRenderersElementsSiblings(currentRenderer, counterOwner)) {
+                        if (isReset && areRenderersElementsSiblings(*currentRenderer, counterOwner)) {
                             // We are also a reset counter and the previous reset was on a sibling renderer
                             // hence we are the next sibling of that counter if that reset is not a root or
                             // we are a root node if that reset is a root.
@@ -220,7 +216,7 @@
                         return true;
                     }
                     // CurrentCounter, the counter at the EndSearchRenderer, is not reset.
-                    if (!isReset || !areRenderersElementsSiblings(currentRenderer, counterOwner)) {
+                    if (!isReset || !areRenderersElementsSiblings(*currentRenderer, counterOwner)) {
                         // If the node we are placing is not reset or we have found a counter that is attached
                         // to an ancestor of the placed counter's owner renderer we know we are a sibling of that node.
                         if (currentCounter->parent() != previousSiblingProtector->parent())
@@ -236,7 +232,7 @@
                     // previousSibling, and when we are a sibling of the end counter we must set previousSibling
                     // to currentCounter.
                     if (currentCounter->actsAsReset()) {
-                        if (isReset && areRenderersElementsSiblings(currentRenderer, counterOwner)) {
+                        if (isReset && areRenderersElementsSiblings(*currentRenderer, counterOwner)) {
                             parent = currentCounter->parent();
                             previousSibling = currentCounter;
                             return parent;
@@ -245,7 +241,7 @@
                         previousSibling = previousSiblingProtector.get();
                         return true;
                     }
-                    if (!isReset || !areRenderersElementsSiblings(currentRenderer, counterOwner)) {
+                    if (!isReset || !areRenderersElementsSiblings(*currentRenderer, counterOwner)) {
                         parent = currentCounter->parent();
                         previousSibling = currentCounter;
                         return true;
@@ -257,7 +253,7 @@
             // good counter, or we are a reset node and the counter on the previous sibling
             // of our owner renderer was not a reset counter.
             // Set a new goal for the end of the search.
-            searchEndRenderer = previousSiblingOrParent(currentRenderer);
+            searchEndRenderer = previousSiblingOrParent(*currentRenderer);
         } else {
             // We are searching descendants of a previous sibling of the renderer that the
             // counter being placed is attached to.
@@ -270,12 +266,12 @@
                         previousSiblingProtector = currentCounter;
                         // We are no longer interested in previous siblings of the currentRenderer or their children
                         // as counters they may have attached cannot be the previous sibling of the counter we are placing.
-                        currentRenderer = parentOrPseudoHostElement(currentRenderer)->renderer();
+                        currentRenderer = parentOrPseudoHostElement(*currentRenderer)->renderer();
                         continue;
                     }
                 } else
                     previousSiblingProtector = currentCounter;
-                currentRenderer = previousSiblingOrParent(currentRenderer);
+                currentRenderer = previousSiblingOrParent(*currentRenderer);
                 continue;
             }
         }
@@ -284,26 +280,17 @@
         // performance improvement would create more code duplication than is worthwhile in my oppinion and may further
         // impede the readability of this already complex algorithm.
         if (previousSiblingProtector)
-            currentRenderer = previousSiblingOrParent(currentRenderer);
+            currentRenderer = previousSiblingOrParent(*currentRenderer);
         else
-            currentRenderer = previousInPreOrder(currentRenderer);
+            currentRenderer = previousInPreOrder(*currentRenderer);
     }
     return false;
 }
 
-static CounterNode* makeCounterNode(RenderObject* object, const AtomicString& identifier, bool alwaysCreateCounter)
+static CounterNode* makeCounterNode(RenderElement& renderer, const AtomicString& identifier, bool alwaysCreateCounter)
 {
-    ASSERT(object);
-
-    // Real text nodes don't have their own style so they can't have counters.
-    // We can't even look at their styles or we'll see extra resets and increments!
-    if (object->isText())
-        return nullptr;
-
-    RenderElement* element = toRenderElement(object);
-
-    if (element->hasCounterNodeMap()) {
-        if (CounterMap* nodeMap = counterMaps().get(element)) {
+    if (renderer.hasCounterNodeMap()) {
+        if (CounterMap* nodeMap = counterMaps().get(&renderer)) {
             if (CounterNode* node = nodeMap->get(identifier))
                 return node;
         }
@@ -311,21 +298,21 @@
 
     bool isReset = false;
     int value = 0;
-    if (!planCounter(element, identifier, isReset, value) && !alwaysCreateCounter)
+    if (!planCounter(renderer, identifier, isReset, value) && !alwaysCreateCounter)
         return nullptr;
 
     RefPtr<CounterNode> newParent = 0;
     RefPtr<CounterNode> newPreviousSibling = 0;
-    RefPtr<CounterNode> newNode = CounterNode::create(element, isReset, value);
-    if (findPlaceForCounter(element, identifier, isReset, newParent, newPreviousSibling))
+    RefPtr<CounterNode> newNode = CounterNode::create(renderer, isReset, value);
+    if (findPlaceForCounter(renderer, identifier, isReset, newParent, newPreviousSibling))
         newParent->insertAfter(newNode.get(), newPreviousSibling.get(), identifier);
     CounterMap* nodeMap;
-    if (element->hasCounterNodeMap())
-        nodeMap = counterMaps().get(element);
+    if (renderer.hasCounterNodeMap())
+        nodeMap = counterMaps().get(&renderer);
     else {
         nodeMap = new CounterMap;
-        counterMaps().set(element, std::unique_ptr<CounterMap>(nodeMap));
-        element->setHasCounterNodeMap(true);
+        counterMaps().set(&renderer, std::unique_ptr<CounterMap>(nodeMap));
+        renderer.setHasCounterNodeMap(true);
     }
     nodeMap->set(identifier, newNode);
     if (newNode->parent())
@@ -333,9 +320,9 @@
     // Checking if some nodes that were previously counter tree root nodes
     // should become children of this node now.
     CounterMaps& maps = counterMaps();
-    Element* stayWithin = parentOrPseudoHostElement(element);
+    Element* stayWithin = parentOrPseudoHostElement(renderer);
     bool skipDescendants;
-    for (RenderElement* currentRenderer = nextInPreOrder(element, stayWithin); currentRenderer; currentRenderer = nextInPreOrder(currentRenderer, stayWithin, skipDescendants)) {
+    for (RenderElement* currentRenderer = nextInPreOrder(renderer, stayWithin); currentRenderer; currentRenderer = nextInPreOrder(*currentRenderer, stayWithin, skipDescendants)) {
         skipDescendants = false;
         if (!currentRenderer->hasCounterNodeMap())
             continue;
@@ -345,7 +332,7 @@
         skipDescendants = true;
         if (currentCounter->parent())
             continue;
-        if (stayWithin == parentOrPseudoHostElement(currentRenderer) && currentCounter->hasResetType())
+        if (stayWithin == parentOrPseudoHostElement(*currentRenderer) && currentCounter->hasResetType())
             break;
         newNode->insertAfter(currentCounter, newNode->lastChild(), identifier);
     }
@@ -399,7 +386,7 @@
                 break;
             beforeAfterContainer = beforeAfterContainer->parent();
         }
-        makeCounterNode(beforeAfterContainer, m_counter.identifier(), true)->addRenderer(const_cast<RenderCounter*>(this));
+        makeCounterNode(*beforeAfterContainer, m_counter.identifier(), true)->addRenderer(const_cast<RenderCounter*>(this));
         ASSERT(m_counterNode);
     }
     CounterNode* child = m_counterNode;
@@ -456,17 +443,17 @@
     for (RefPtr<CounterNode> child = node->lastDescendant(); child && child != node; child = previous) {
         previous = child->previousInPreOrder();
         child->parent()->removeChild(child.get());
-        ASSERT(counterMaps().get(child->owner())->get(identifier) == child);
-        counterMaps().get(child->owner())->remove(identifier);
+        ASSERT(counterMaps().get(&child->owner())->get(identifier) == child);
+        counterMaps().get(&child->owner())->remove(identifier);
     }
     if (CounterNode* parent = node->parent())
         parent->removeChild(node);
 }
 
-void RenderCounter::destroyCounterNodes(RenderObject* owner)
+void RenderCounter::destroyCounterNodes(RenderElement& owner)
 {
     CounterMaps& maps = counterMaps();
-    CounterMaps::iterator mapsIterator = maps.find(owner);
+    CounterMaps::iterator mapsIterator = maps.find(&owner);
     if (mapsIterator == maps.end())
         return;
     CounterMap* map = mapsIterator->value.get();
@@ -475,12 +462,12 @@
         destroyCounterNodeWithoutMapRemoval(it->key, it->value.get());
     }
     maps.remove(mapsIterator);
-    owner->setHasCounterNodeMap(false);
+    owner.setHasCounterNodeMap(false);
 }
 
-void RenderCounter::destroyCounterNode(RenderObject* owner, const AtomicString& identifier)
+void RenderCounter::destroyCounterNode(RenderElement& owner, const AtomicString& identifier)
 {
-    CounterMap* map = counterMaps().get(owner);
+    CounterMap* map = counterMaps().get(&owner);
     if (!map)
         return;
     CounterMap::iterator mapIterator = map->find(identifier);
@@ -501,7 +488,7 @@
     // map associated with a renderer, so there is no risk in leaking the map.
 }
 
-void RenderCounter::rendererRemovedFromTree(RenderObject& renderer)
+void RenderCounter::rendererRemovedFromTree(RenderElement& renderer)
 {
     if (!renderer.view().hasRenderCounters())
         return;
@@ -509,25 +496,26 @@
     if (!currentRenderer)
         currentRenderer = &renderer;
     while (true) {
-        destroyCounterNodes(currentRenderer);
+        if (currentRenderer->isRenderElement())
+            destroyCounterNodes(toRenderElement(*currentRenderer));
         if (currentRenderer == &renderer)
             break;
         currentRenderer = currentRenderer->previousInPreOrder();
     }
 }
 
-static void updateCounters(RenderObject* renderer)
+static void updateCounters(RenderElement& renderer)
 {
-    const CounterDirectiveMap* directiveMap = renderer->style().counterDirectives();
+    const CounterDirectiveMap* directiveMap = renderer.style().counterDirectives();
     if (!directiveMap)
         return;
     CounterDirectiveMap::const_iterator end = directiveMap->end();
-    if (!renderer->hasCounterNodeMap()) {
+    if (!renderer.hasCounterNodeMap()) {
         for (CounterDirectiveMap::const_iterator it = directiveMap->begin(); it != end; ++it)
             makeCounterNode(renderer, it->key, false);
         return;
     }
-    CounterMap* counterMap = counterMaps().get(renderer);
+    CounterMap* counterMap = counterMaps().get(&renderer);
     ASSERT(counterMap);
     for (CounterDirectiveMap::const_iterator it = directiveMap->begin(); it != end; ++it) {
         RefPtr<CounterNode> node = counterMap->get(it->key);
@@ -551,25 +539,27 @@
     }
 }
 
-void RenderCounter::rendererSubtreeAttached(RenderObject* renderer)
+void RenderCounter::rendererSubtreeAttached(RenderElement& renderer)
 {
-    if (!renderer->view().hasRenderCounters())
+    if (!renderer.view().hasRenderCounters())
         return;
-    Node* node = renderer->node();
-    if (node && !node->isPseudoElement())
-        node = node->parentNode();
+    Element* element = renderer.element();
+    if (element && !element->isPseudoElement())
+        element = element->parentElement();
     else
-        node = renderer->generatingNode();
-    if (node && !node->renderer())
+        element = renderer.generatingElement();
+    if (element && !element->renderer())
         return; // No need to update if the parent is not attached yet
-    for (RenderObject* descendant = renderer; descendant; descendant = descendant->nextInPreOrder(renderer))
-        updateCounters(descendant);
+    for (RenderObject* descendant = &renderer; descendant; descendant = descendant->nextInPreOrder(&renderer)) {
+        if (descendant->isRenderElement())
+            updateCounters(toRenderElement(*descendant));
+    }
 }
 
-void RenderCounter::rendererStyleChanged(RenderObject* renderer, const RenderStyle* oldStyle, const RenderStyle* newStyle)
+void RenderCounter::rendererStyleChanged(RenderElement& renderer, const RenderStyle* oldStyle, const RenderStyle* newStyle)
 {
-    Node* node = renderer->generatingNode();
-    if (!node || !node->renderer())
+    Element* element = renderer.generatingElement();
+    if (!element || !element->renderer())
         return; // cannot have generated content or if it can have, it will be handled during attaching
     const CounterDirectiveMap* newCounterDirectives;
     const CounterDirectiveMap* oldCounterDirectives;
@@ -595,7 +585,7 @@
                     RenderCounter::destroyCounterNode(renderer, it->key);
             }
         } else {
-            if (renderer->hasCounterNodeMap())
+            if (renderer.hasCounterNodeMap())
                 RenderCounter::destroyCounterNodes(renderer);
         }
     } else if (newStyle && (newCounterDirectives = newStyle->counterDirectives())) {
@@ -623,13 +613,15 @@
 
     AtomicString identifier(counterName);
     for (const WebCore::RenderObject* current = root; current; current = current->nextInPreOrder()) {
+        if (!current->isRenderElement())
+            continue;
         fprintf(stderr, "%c", (current == renderer) ? '*' : ' ');
         for (const WebCore::RenderObject* parent = current; parent && parent != root; parent = parent->parent())
             fprintf(stderr, "    ");
         fprintf(stderr, "%p N:%p P:%p PS:%p NS:%p C:%p\n",
             current, current->node(), current->parent(), current->previousSibling(),
-            current->nextSibling(), current->hasCounterNodeMap() ?
-            counterName ? WebCore::counterMaps().get(current)->get(identifier) : (WebCore::CounterNode*)1 : (WebCore::CounterNode*)0);
+            current->nextSibling(), toRenderElement(current)->hasCounterNodeMap() ?
+            counterName ? WebCore::counterMaps().get(toRenderElement(current))->get(identifier) : (WebCore::CounterNode*)1 : (WebCore::CounterNode*)0);
     }
     fflush(stderr);
 }

Modified: trunk/Source/WebCore/rendering/RenderCounter.h (172729 => 172730)


--- trunk/Source/WebCore/rendering/RenderCounter.h	2014-08-18 22:03:24 UTC (rev 172729)
+++ trunk/Source/WebCore/rendering/RenderCounter.h	2014-08-18 22:16:47 UTC (rev 172730)
@@ -34,11 +34,11 @@
     RenderCounter(Document&, const CounterContent&);
     virtual ~RenderCounter();
 
-    static void destroyCounterNodes(RenderObject*);
-    static void destroyCounterNode(RenderObject*, const AtomicString& identifier);
-    static void rendererSubtreeAttached(RenderObject*);
-    static void rendererRemovedFromTree(RenderObject&);
-    static void rendererStyleChanged(RenderObject*, const RenderStyle* oldStyle, const RenderStyle* newStyle);
+    static void destroyCounterNodes(RenderElement&);
+    static void destroyCounterNode(RenderElement&, const AtomicString& identifier);
+    static void rendererSubtreeAttached(RenderElement&);
+    static void rendererRemovedFromTree(RenderElement&);
+    static void rendererStyleChanged(RenderElement&, const RenderStyle* oldStyle, const RenderStyle* newStyle);
 
     void updateCounter();
 

Modified: trunk/Source/WebCore/rendering/RenderElement.cpp (172729 => 172730)


--- trunk/Source/WebCore/rendering/RenderElement.cpp	2014-08-18 22:03:24 UTC (rev 172729)
+++ trunk/Source/WebCore/rendering/RenderElement.cpp	2014-08-18 22:16:47 UTC (rev 172730)
@@ -85,6 +85,7 @@
     , m_renderInlineAlwaysCreatesLineBoxes(false)
     , m_renderBoxNeedsLazyRepaint(false)
     , m_hasPausedImageAnimations(false)
+    , m_hasCounterNodeMap(false)
     , m_firstChild(nullptr)
     , m_lastChild(nullptr)
     , m_style(WTF::move(style))
@@ -568,7 +569,8 @@
     if (!documentBeingDestroyed()) {
         if (notifyChildren == NotifyChildren)
             newChild->insertedIntoTree();
-        RenderCounter::rendererSubtreeAttached(newChild);
+        if (newChild->isRenderElement())
+            RenderCounter::rendererSubtreeAttached(toRenderElement(*newChild));
     }
 
     newChild->setNeedsLayoutAndPrefWidthsRecalc();
@@ -636,8 +638,8 @@
 
     // rendererRemovedFromTree walks the whole subtree. We can improve performance
     // by skipping this step when destroying the entire tree.
-    if (!documentBeingDestroyed())
-        RenderCounter::rendererRemovedFromTree(oldChild);
+    if (!documentBeingDestroyed() && oldChild.isRenderElement())
+        RenderCounter::rendererRemovedFromTree(toRenderElement(oldChild));
 
     if (AXObjectCache* cache = document().existingAXObjectCache())
         cache->childrenChanged(this);
@@ -920,7 +922,7 @@
         return;
     
     if (diff == StyleDifferenceLayout || diff == StyleDifferenceSimplifiedLayout) {
-        RenderCounter::rendererStyleChanged(this, oldStyle, &m_style.get());
+        RenderCounter::rendererStyleChanged(*this, oldStyle, &m_style.get());
 
         // If the object already needs layout, then setNeedsLayout won't do
         // any work. But if the containing block has changed, then we may need
@@ -1007,6 +1009,9 @@
 
     destroyLeftoverChildren();
 
+    if (hasCounterNodeMap())
+        RenderCounter::destroyCounterNodes(*this);
+
     RenderObject::willBeDestroyed();
 
 #if !ASSERT_DISABLED

Modified: trunk/Source/WebCore/rendering/RenderElement.h (172729 => 172730)


--- trunk/Source/WebCore/rendering/RenderElement.h	2014-08-18 22:03:24 UTC (rev 172729)
+++ trunk/Source/WebCore/rendering/RenderElement.h	2014-08-18 22:16:47 UTC (rev 172730)
@@ -159,6 +159,9 @@
     void setRenderBoxNeedsLazyRepaint(bool b) { m_renderBoxNeedsLazyRepaint = b; }
     bool renderBoxNeedsLazyRepaint() const { return m_renderBoxNeedsLazyRepaint; }
 
+    bool hasCounterNodeMap() const { return m_hasCounterNodeMap; }
+    void setHasCounterNodeMap(bool f) { m_hasCounterNodeMap = f; }
+
 protected:
     enum BaseTypeFlags {
         RenderLayerModelObjectFlag = 1 << 0,
@@ -231,6 +234,7 @@
     bool m_renderInlineAlwaysCreatesLineBoxes : 1;
     bool m_renderBoxNeedsLazyRepaint : 1;
     bool m_hasPausedImageAnimations : 1;
+    bool m_hasCounterNodeMap : 1;
 
     RenderObject* m_firstChild;
     RenderObject* m_lastChild;

Modified: trunk/Source/WebCore/rendering/RenderObject.cpp (172729 => 172730)


--- trunk/Source/WebCore/rendering/RenderObject.cpp	2014-08-18 22:03:24 UTC (rev 172729)
+++ trunk/Source/WebCore/rendering/RenderObject.cpp	2014-08-18 22:16:47 UTC (rev 172730)
@@ -1941,14 +1941,6 @@
     if (AXObjectCache* cache = document().existingAXObjectCache())
         cache->remove(this);
 
-    // If this renderer had a parent, remove should have destroyed any counters
-    // attached to this renderer and marked the affected other counters for
-    // reevaluation. This apparently redundant check is here for the case when
-    // this renderer had no parent at the time remove() was called.
-
-    if (hasCounterNodeMap())
-        RenderCounter::destroyCounterNodes(this);
-
     // FIXME: Would like to do this in RenderBoxModelObject, but the timing is so complicated that this can't easily
     // be moved into RenderBoxModelObject::destroy.
     if (hasLayer()) {

Modified: trunk/Source/WebCore/rendering/RenderObject.h (172729 => 172730)


--- trunk/Source/WebCore/rendering/RenderObject.h	2014-08-18 22:03:24 UTC (rev 172729)
+++ trunk/Source/WebCore/rendering/RenderObject.h	2014-08-18 22:16:47 UTC (rev 172730)
@@ -390,8 +390,6 @@
     static inline bool isAfterContent(const RenderObject* obj) { return obj && obj->isAfterContent(); }
     static inline bool isBeforeOrAfterContent(const RenderObject* obj) { return obj && obj->isBeforeOrAfterContent(); }
 
-    bool hasCounterNodeMap() const { return m_bitfields.hasCounterNodeMap(); }
-    void setHasCounterNodeMap(bool hasCounterNodeMap) { m_bitfields.setHasCounterNodeMap(hasCounterNodeMap); }
     bool everHadLayout() const { return m_bitfields.everHadLayout(); }
 
     bool childrenInline() const { return m_bitfields.childrenInline(); }
@@ -961,7 +959,6 @@
             , m_hasOverflowClip(false)
             , m_hasTransform(false)
             , m_hasReflection(false)
-            , m_hasCounterNodeMap(false)
             , m_everHadLayout(false)
             , m_childrenInline(false)
             , m_positionedState(IsStaticallyPositioned)
@@ -971,7 +968,7 @@
         {
         }
         
-        // 32 bits have been used here. There are no bits available.
+        // 31 bits have been used here. There is one bit available.
         ADD_BOOLEAN_BITFIELD(needsLayout, NeedsLayout);
         ADD_BOOLEAN_BITFIELD(needsPositionedMovementLayout, NeedsPositionedMovementLayout);
         ADD_BOOLEAN_BITFIELD(normalChildNeedsLayout, NormalChildNeedsLayout);
@@ -994,7 +991,6 @@
         ADD_BOOLEAN_BITFIELD(hasTransform, HasTransform);
         ADD_BOOLEAN_BITFIELD(hasReflection, HasReflection);
 
-        ADD_BOOLEAN_BITFIELD(hasCounterNodeMap, HasCounterNodeMap);
         ADD_BOOLEAN_BITFIELD(everHadLayout, EverHadLayout);
 
         // from RenderBlock
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to