| Index: Source/WebCore/rendering/RenderCounter.cpp
|
| ===================================================================
|
| --- Source/WebCore/rendering/RenderCounter.cpp (revision 96954)
|
| +++ Source/WebCore/rendering/RenderCounter.cpp (working copy)
|
| @@ -303,13 +303,15 @@
|
| // we are trying to find a place for. This is the next renderer to be checked.
|
| RenderObject* currentRenderer = previousInPreOrder(counterOwner);
|
| previousSibling = 0;
|
| + RefPtr<CounterNode> previousSiblingProtector = 0;
|
| +
|
| while (currentRenderer) {
|
| CounterNode* currentCounter = makeCounterNode(currentRenderer, identifier, false);
|
| if (searchEndRenderer == currentRenderer) {
|
| // We may be at the end of our search.
|
| if (currentCounter) {
|
| // We have a suitable counter on the EndSearchRenderer.
|
| - if (previousSibling) { // But we already found another counter that we come after.
|
| + 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)) {
|
| @@ -326,16 +328,19 @@
|
| // In some cases renders can be reparented (ex. nodes inside a table but not in a column or row).
|
| // In these cases the identified previousSibling will be invalid as its parent is different from
|
| // our identified parent.
|
| - if (previousSibling->parent() != currentCounter)
|
| - previousSibling = 0;
|
| + if (previousSiblingProtector->parent() != currentCounter)
|
| + previousSiblingProtector = 0;
|
| +
|
| + previousSibling = previousSiblingProtector.get();
|
| return true;
|
| }
|
| // CurrentCounter, the counter at the EndSearchRenderer, is not reset.
|
| 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.
|
| - ASSERT(currentCounter->parent() == previousSibling->parent());
|
| + ASSERT(currentCounter->parent() == previousSiblingProtector->parent());
|
| parent = currentCounter->parent();
|
| + previousSibling = previousSiblingProtector.get();
|
| return true;
|
| }
|
| } else {
|
| @@ -350,6 +355,7 @@
|
| return parent;
|
| }
|
| parent = currentCounter;
|
| + previousSibling = previousSiblingProtector.get();
|
| return true;
|
| }
|
| if (!isReset || !areRenderersElementsSiblings(currentRenderer, counterOwner)) {
|
| @@ -357,7 +363,7 @@
|
| previousSibling = currentCounter;
|
| return true;
|
| }
|
| - previousSibling = currentCounter;
|
| + previousSiblingProtector = currentCounter;
|
| }
|
| }
|
| // We come here if the previous sibling or parent of our owner renderer had no
|
| @@ -370,18 +376,18 @@
|
| // counter being placed is attached to.
|
| if (currentCounter) {
|
| // We found a suitable counter.
|
| - if (previousSibling) {
|
| + if (previousSiblingProtector) {
|
| // Since we had a suitable previous counter before, we should only consider this one as our
|
| // previousSibling if it is a reset counter and hence the current previousSibling is its child.
|
| if (currentCounter->actsAsReset()) {
|
| - previousSibling = currentCounter;
|
| + 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 = parentElement(currentRenderer)->renderer();
|
| continue;
|
| }
|
| } else
|
| - previousSibling = currentCounter;
|
| + previousSiblingProtector = currentCounter;
|
| currentRenderer = previousSiblingOrParent(currentRenderer);
|
| continue;
|
| }
|
| @@ -390,7 +396,7 @@
|
| // which may be done twice in some cases. Rearranging the decision points though, to accommodate this
|
| // 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 (previousSibling)
|
| + if (previousSiblingProtector)
|
| currentRenderer = previousSiblingOrParent(currentRenderer);
|
| else
|
| currentRenderer = previousInPreOrder(currentRenderer);
|
|
|