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(), ¤t->owner());
}
fflush(stderr);
}
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);
}