diff options
Diffstat (limited to 'WebCore/rendering/RenderCounter.cpp')
-rw-r--r-- | WebCore/rendering/RenderCounter.cpp | 43 |
1 files changed, 25 insertions, 18 deletions
diff --git a/WebCore/rendering/RenderCounter.cpp b/WebCore/rendering/RenderCounter.cpp index 639221d..c357be1 100644 --- a/WebCore/rendering/RenderCounter.cpp +++ b/WebCore/rendering/RenderCounter.cpp @@ -35,7 +35,7 @@ namespace WebCore { using namespace HTMLNames; -typedef HashMap<RefPtr<AtomicStringImpl>, CounterNode*> CounterMap; +typedef HashMap<RefPtr<AtomicStringImpl>, RefPtr<CounterNode> > CounterMap; typedef HashMap<const RenderObject*, CounterMap*> CounterMaps; static CounterNode* makeCounterNode(RenderObject*, const AtomicString& identifier, bool alwaysCreateCounter); @@ -235,10 +235,12 @@ static CounterNode* makeCounterNode(RenderObject* object, const AtomicString& id { ASSERT(object); - if (object->m_hasCounterNodeMap) - if (CounterMap* nodeMap = counterMaps().get(object)) - if (CounterNode* node = nodeMap->get(identifier.impl())) + if (object->m_hasCounterNodeMap) { + if (CounterMap* nodeMap = counterMaps().get(object)) { + if (CounterNode* node = nodeMap->get(identifier.impl()).get()) return node; + } + } bool isReset = false; int value = 0; @@ -247,9 +249,9 @@ static CounterNode* makeCounterNode(RenderObject* object, const AtomicString& id CounterNode* newParent = 0; CounterNode* newPreviousSibling = 0; - CounterNode* newNode = new CounterNode(object, isReset, value); + RefPtr<CounterNode> newNode = CounterNode::create(object, isReset, value); if (findPlaceForCounter(object, identifier, isReset, newParent, newPreviousSibling)) - newParent->insertAfter(newNode, newPreviousSibling, identifier); + newParent->insertAfter(newNode.get(), newPreviousSibling, identifier); CounterMap* nodeMap; if (object->m_hasCounterNodeMap) nodeMap = counterMaps().get(object); @@ -260,7 +262,7 @@ static CounterNode* makeCounterNode(RenderObject* object, const AtomicString& id } nodeMap->set(identifier.impl(), newNode); if (newNode->parent() || !object->nextInPreOrder(object->parent())) - return newNode; + return newNode.get(); // Checking if some nodes that were previously counter tree root nodes // should become children of this node now. CounterMaps& maps = counterMaps(); @@ -268,7 +270,7 @@ static CounterNode* makeCounterNode(RenderObject* object, const AtomicString& id for (RenderObject* currentRenderer = object->nextInPreOrder(stayWithin); currentRenderer; currentRenderer = currentRenderer->nextInPreOrder(stayWithin)) { if (!currentRenderer->m_hasCounterNodeMap) continue; - CounterNode* currentCounter = maps.get(currentRenderer)->get(identifier.impl()); + CounterNode* currentCounter = maps.get(currentRenderer)->get(identifier.impl()).get(); if (!currentCounter) continue; if (currentCounter->parent()) { @@ -282,7 +284,7 @@ static CounterNode* makeCounterNode(RenderObject* object, const AtomicString& id if (currentRenderer->lastChild()) currentRenderer = currentRenderer->lastChild(); } - return newNode; + return newNode.get(); } RenderCounter::RenderCounter(Document* node, const CounterContent& counter) @@ -292,6 +294,10 @@ RenderCounter::RenderCounter(Document* node, const CounterContent& counter) { } +RenderCounter::~RenderCounter() +{ +} + const char* RenderCounter::renderName() const { return "RenderCounter"; @@ -345,9 +351,9 @@ void RenderCounter::invalidate(const AtomicString& identifier) static void destroyCounterNodeWithoutMapRemoval(const AtomicString& identifier, CounterNode* node) { CounterNode* previous; - for (CounterNode* child = node->lastDescendant(); child && child != node; child = previous) { + for (RefPtr<CounterNode> child = node->lastDescendant(); child && child != node; child = previous) { previous = child->previousInPreOrder(); - child->parent()->removeChild(child, identifier); + child->parent()->removeChild(child.get(), identifier); ASSERT(counterMaps().get(child->renderer())->get(identifier.impl()) == child); counterMaps().get(child->renderer())->remove(identifier.impl()); if (!child->renderer()->documentBeingDestroyed()) { @@ -355,7 +361,6 @@ static void destroyCounterNodeWithoutMapRemoval(const AtomicString& identifier, if (children) children->invalidateCounters(child->renderer(), identifier); } - delete child; } RenderObject* renderer = node->renderer(); if (!renderer->documentBeingDestroyed()) { @@ -364,7 +369,6 @@ static void destroyCounterNodeWithoutMapRemoval(const AtomicString& identifier, } if (CounterNode* parent = node->parent()) parent->removeChild(node, identifier); - delete node; } void RenderCounter::destroyCounterNodes(RenderObject* renderer) @@ -377,7 +381,7 @@ void RenderCounter::destroyCounterNodes(RenderObject* renderer) CounterMap::const_iterator end = map->end(); for (CounterMap::const_iterator it = map->begin(); it != end; ++it) { AtomicString identifier(it->first.get()); - destroyCounterNodeWithoutMapRemoval(identifier, it->second); + destroyCounterNodeWithoutMapRemoval(identifier, it->second.get()); } maps.remove(mapsIterator); delete map; @@ -392,7 +396,7 @@ void RenderCounter::destroyCounterNode(RenderObject* renderer, const AtomicStrin CounterMap::iterator mapIterator = map->find(identifier.impl()); if (mapIterator == map->end()) return; - destroyCounterNodeWithoutMapRemoval(identifier, mapIterator->second); + destroyCounterNodeWithoutMapRemoval(identifier, mapIterator->second.get()); map->remove(mapIterator); // We do not delete "map" here even if empty because we expect to reuse // it soon. In order for a renderer to lose all its counters permanently, @@ -422,21 +426,24 @@ static void updateCounters(RenderObject* renderer) CounterMap* counterMap = counterMaps().get(renderer); ASSERT(counterMap); for (CounterDirectiveMap::const_iterator it = directiveMap->begin(); it != end; ++it) { - CounterNode* node = counterMap->get(it->first.get()); + RefPtr<CounterNode> node = counterMap->get(it->first.get()); if (!node) { makeCounterNode(renderer, AtomicString(it->first.get()), false); continue; } CounterNode* newParent = 0; CounterNode* newPreviousSibling; + findPlaceForCounter(renderer, AtomicString(it->first.get()), node->hasResetType(), newParent, newPreviousSibling); + if (node != counterMap->get(it->first.get())) + continue; CounterNode* parent = node->parent(); if (newParent == parent && newPreviousSibling == node->previousSibling()) continue; if (parent) - parent->removeChild(node, it->first.get()); + parent->removeChild(node.get(), it->first.get()); if (newParent) - newParent->insertAfter(node, newPreviousSibling, it->first.get()); + newParent->insertAfter(node.get(), newPreviousSibling, it->first.get()); } } |