OLD | NEW |
1 /** | 1 /** |
2 * Copyright (C) 2004 Allan Sandfeld Jensen (kde@carewolf.com) | 2 * Copyright (C) 2004 Allan Sandfeld Jensen (kde@carewolf.com) |
3 * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. | 3 * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. |
4 * | 4 * |
5 * This library is free software; you can redistribute it and/or | 5 * This library is free software; you can redistribute it and/or |
6 * modify it under the terms of the GNU Library General Public | 6 * modify it under the terms of the GNU Library General Public |
7 * License as published by the Free Software Foundation; either | 7 * License as published by the Free Software Foundation; either |
8 * version 2 of the License, or (at your option) any later version. | 8 * version 2 of the License, or (at your option) any later version. |
9 * | 9 * |
10 * This library is distributed in the hope that it will be useful, | 10 * This library is distributed in the hope that it will be useful, |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
182 | 182 |
183 static bool findPlaceForCounter(RenderObject& counterOwner, const AtomicString&
identifier, bool isReset, RefPtr<CounterNode>& parent, RefPtr<CounterNode>& prev
iousSibling) | 183 static bool findPlaceForCounter(RenderObject& counterOwner, const AtomicString&
identifier, bool isReset, RefPtr<CounterNode>& parent, RefPtr<CounterNode>& prev
iousSibling) |
184 { | 184 { |
185 // We cannot stop searching for counters with the same identifier before we
also | 185 // We cannot stop searching for counters with the same identifier before we
also |
186 // check this renderer, because it may affect the positioning in the tree of
our counter. | 186 // check this renderer, because it may affect the positioning in the tree of
our counter. |
187 RenderObject* searchEndRenderer = previousSiblingOrParent(counterOwner); | 187 RenderObject* searchEndRenderer = previousSiblingOrParent(counterOwner); |
188 // We check renderers in preOrder from the renderer that our counter is atta
ched to | 188 // We check renderers in preOrder from the renderer that our counter is atta
ched to |
189 // towards the begining of the document for counters with the same identifie
r as the one | 189 // towards the begining of the document for counters with the same identifie
r as the one |
190 // we are trying to find a place for. This is the next renderer to be checke
d. | 190 // we are trying to find a place for. This is the next renderer to be checke
d. |
191 RenderObject* currentRenderer = previousInPreOrder(counterOwner); | 191 RenderObject* currentRenderer = previousInPreOrder(counterOwner); |
192 previousSibling = 0; | 192 previousSibling = nullptr; |
193 RefPtr<CounterNode> previousSiblingProtector = 0; | 193 RefPtr<CounterNode> previousSiblingProtector = nullptr; |
194 | 194 |
195 while (currentRenderer) { | 195 while (currentRenderer) { |
196 CounterNode* currentCounter = makeCounterNode(*currentRenderer, identifi
er, false); | 196 CounterNode* currentCounter = makeCounterNode(*currentRenderer, identifi
er, false); |
197 if (searchEndRenderer == currentRenderer) { | 197 if (searchEndRenderer == currentRenderer) { |
198 // We may be at the end of our search. | 198 // We may be at the end of our search. |
199 if (currentCounter) { | 199 if (currentCounter) { |
200 // We have a suitable counter on the EndSearchRenderer. | 200 // We have a suitable counter on the EndSearchRenderer. |
201 if (previousSiblingProtector) { // But we already found another
counter that we come after. | 201 if (previousSiblingProtector) { // But we already found another
counter that we come after. |
202 if (currentCounter->actsAsReset()) { | 202 if (currentCounter->actsAsReset()) { |
203 // We found a reset counter that is on a renderer that i
s a sibling of ours or a parent. | 203 // We found a reset counter that is on a renderer that i
s a sibling of ours or a parent. |
204 if (isReset && areRenderersElementsSiblings(*currentRend
erer, counterOwner)) { | 204 if (isReset && areRenderersElementsSiblings(*currentRend
erer, counterOwner)) { |
205 // We are also a reset counter and the previous rese
t was on a sibling renderer | 205 // We are also a reset counter and the previous rese
t was on a sibling renderer |
206 // hence we are the next sibling of that counter if
that reset is not a root or | 206 // hence we are the next sibling of that counter if
that reset is not a root or |
207 // we are a root node if that reset is a root. | 207 // we are a root node if that reset is a root. |
208 parent = currentCounter->parent(); | 208 parent = currentCounter->parent(); |
209 previousSibling = parent ? currentCounter : 0; | 209 previousSibling = parent ? currentCounter : 0; |
210 return parent; | 210 return parent; |
211 } | 211 } |
212 // We are not a reset node or the previous reset must be
on an ancestor of our owner renderer | 212 // We are not a reset node or the previous reset must be
on an ancestor of our owner renderer |
213 // hence we must be a child of that reset counter. | 213 // hence we must be a child of that reset counter. |
214 parent = currentCounter; | 214 parent = currentCounter; |
215 // In some cases renders can be reparented (ex. nodes in
side a table but not in a column or row). | 215 // In some cases renders can be reparented (ex. nodes in
side a table but not in a column or row). |
216 // In these cases the identified previousSibling will be
invalid as its parent is different from | 216 // In these cases the identified previousSibling will be
invalid as its parent is different from |
217 // our identified parent. | 217 // our identified parent. |
218 if (previousSiblingProtector->parent() != currentCounter
) | 218 if (previousSiblingProtector->parent() != currentCounter
) |
219 previousSiblingProtector = 0; | 219 previousSiblingProtector = nullptr; |
220 | 220 |
221 previousSibling = previousSiblingProtector.get(); | 221 previousSibling = previousSiblingProtector.get(); |
222 return true; | 222 return true; |
223 } | 223 } |
224 // CurrentCounter, the counter at the EndSearchRenderer, is
not reset. | 224 // CurrentCounter, the counter at the EndSearchRenderer, is
not reset. |
225 if (!isReset || !areRenderersElementsSiblings(*currentRender
er, counterOwner)) { | 225 if (!isReset || !areRenderersElementsSiblings(*currentRender
er, counterOwner)) { |
226 // If the node we are placing is not reset or we have fo
und a counter that is attached | 226 // If the node we are placing is not reset or we have fo
und a counter that is attached |
227 // to an ancestor of the placed counter's owner renderer
we know we are a sibling of that node. | 227 // to an ancestor of the placed counter's owner renderer
we know we are a sibling of that node. |
228 if (currentCounter->parent() != previousSiblingProtector
->parent()) | 228 if (currentCounter->parent() != previousSiblingProtector
->parent()) |
229 return false; | 229 return false; |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
300 if (CounterNode* node = nodeMap->get(identifier)) | 300 if (CounterNode* node = nodeMap->get(identifier)) |
301 return node; | 301 return node; |
302 } | 302 } |
303 } | 303 } |
304 | 304 |
305 bool isReset = false; | 305 bool isReset = false; |
306 int value = 0; | 306 int value = 0; |
307 if (!planCounter(object, identifier, isReset, value) && !alwaysCreateCounter
) | 307 if (!planCounter(object, identifier, isReset, value) && !alwaysCreateCounter
) |
308 return 0; | 308 return 0; |
309 | 309 |
310 RefPtr<CounterNode> newParent = 0; | 310 RefPtr<CounterNode> newParent = nullptr; |
311 RefPtr<CounterNode> newPreviousSibling = 0; | 311 RefPtr<CounterNode> newPreviousSibling = nullptr; |
312 RefPtr<CounterNode> newNode = CounterNode::create(object, isReset, value); | 312 RefPtr<CounterNode> newNode = CounterNode::create(object, isReset, value); |
313 if (findPlaceForCounter(object, identifier, isReset, newParent, newPreviousS
ibling)) | 313 if (findPlaceForCounter(object, identifier, isReset, newParent, newPreviousS
ibling)) |
314 newParent->insertAfter(newNode.get(), newPreviousSibling.get(), identifi
er); | 314 newParent->insertAfter(newNode.get(), newPreviousSibling.get(), identifi
er); |
315 CounterMap* nodeMap; | 315 CounterMap* nodeMap; |
316 if (object.hasCounterNodeMap()) | 316 if (object.hasCounterNodeMap()) |
317 nodeMap = counterMaps().get(&object); | 317 nodeMap = counterMaps().get(&object); |
318 else { | 318 else { |
319 nodeMap = new CounterMap; | 319 nodeMap = new CounterMap; |
320 counterMaps().set(&object, adoptPtr(nodeMap)); | 320 counterMaps().set(&object, adoptPtr(nodeMap)); |
321 object.setHasCounterNodeMap(true); | 321 object.setHasCounterNodeMap(true); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
378 { | 378 { |
379 return true; | 379 return true; |
380 } | 380 } |
381 | 381 |
382 PassRefPtr<StringImpl> RenderCounter::originalText() const | 382 PassRefPtr<StringImpl> RenderCounter::originalText() const |
383 { | 383 { |
384 if (!m_counterNode) { | 384 if (!m_counterNode) { |
385 RenderObject* beforeAfterContainer = parent(); | 385 RenderObject* beforeAfterContainer = parent(); |
386 while (true) { | 386 while (true) { |
387 if (!beforeAfterContainer) | 387 if (!beforeAfterContainer) |
388 return 0; | 388 return nullptr; |
389 if (!beforeAfterContainer->isAnonymous() && !beforeAfterContainer->i
sPseudoElement()) | 389 if (!beforeAfterContainer->isAnonymous() && !beforeAfterContainer->i
sPseudoElement()) |
390 return 0; // RenderCounters are restricted to before and after p
seudo elements | 390 return nullptr; // RenderCounters are restricted to before and a
fter pseudo elements |
391 PseudoId containerStyle = beforeAfterContainer->style()->styleType()
; | 391 PseudoId containerStyle = beforeAfterContainer->style()->styleType()
; |
392 if ((containerStyle == BEFORE) || (containerStyle == AFTER)) | 392 if ((containerStyle == BEFORE) || (containerStyle == AFTER)) |
393 break; | 393 break; |
394 beforeAfterContainer = beforeAfterContainer->parent(); | 394 beforeAfterContainer = beforeAfterContainer->parent(); |
395 } | 395 } |
396 makeCounterNode(*beforeAfterContainer, m_counter.identifier(), true)->ad
dRenderer(const_cast<RenderCounter*>(this)); | 396 makeCounterNode(*beforeAfterContainer, m_counter.identifier(), true)->ad
dRenderer(const_cast<RenderCounter*>(this)); |
397 ASSERT(m_counterNode); | 397 ASSERT(m_counterNode); |
398 } | 398 } |
399 CounterNode* child = m_counterNode; | 399 CounterNode* child = m_counterNode; |
400 int value = child->actsAsReset() ? child->value() : child->countInParent(); | 400 int value = child->actsAsReset() ? child->value() : child->countInParent(); |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
508 return; | 508 return; |
509 } | 509 } |
510 CounterMap* counterMap = counterMaps().get(&renderer); | 510 CounterMap* counterMap = counterMaps().get(&renderer); |
511 ASSERT(counterMap); | 511 ASSERT(counterMap); |
512 for (CounterDirectiveMap::const_iterator it = directiveMap->begin(); it != e
nd; ++it) { | 512 for (CounterDirectiveMap::const_iterator it = directiveMap->begin(); it != e
nd; ++it) { |
513 RefPtr<CounterNode> node = counterMap->get(it->key); | 513 RefPtr<CounterNode> node = counterMap->get(it->key); |
514 if (!node) { | 514 if (!node) { |
515 makeCounterNode(renderer, it->key, false); | 515 makeCounterNode(renderer, it->key, false); |
516 continue; | 516 continue; |
517 } | 517 } |
518 RefPtr<CounterNode> newParent = 0; | 518 RefPtr<CounterNode> newParent = nullptr; |
519 RefPtr<CounterNode> newPreviousSibling = 0; | 519 RefPtr<CounterNode> newPreviousSibling = nullptr; |
520 | 520 |
521 findPlaceForCounter(renderer, it->key, node->hasResetType(), newParent,
newPreviousSibling); | 521 findPlaceForCounter(renderer, it->key, node->hasResetType(), newParent,
newPreviousSibling); |
522 if (node != counterMap->get(it->key)) | 522 if (node != counterMap->get(it->key)) |
523 continue; | 523 continue; |
524 CounterNode* parent = node->parent(); | 524 CounterNode* parent = node->parent(); |
525 if (newParent == parent && newPreviousSibling == node->previousSibling()
) | 525 if (newParent == parent && newPreviousSibling == node->previousSibling()
) |
526 continue; | 526 continue; |
527 if (parent) | 527 if (parent) |
528 parent->removeChild(node.get()); | 528 parent->removeChild(node.get()); |
529 if (newParent) | 529 if (newParent) |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
609 fprintf(stderr, " "); | 609 fprintf(stderr, " "); |
610 fprintf(stderr, "%p N:%p P:%p PS:%p NS:%p C:%p\n", | 610 fprintf(stderr, "%p N:%p P:%p PS:%p NS:%p C:%p\n", |
611 current, current->node(), current->parent(), current->previousSiblin
g(), | 611 current, current->node(), current->parent(), current->previousSiblin
g(), |
612 current->nextSibling(), current->hasCounterNodeMap() ? | 612 current->nextSibling(), current->hasCounterNodeMap() ? |
613 counterName ? WebCore::counterMaps().get(current)->get(identifier) :
(WebCore::CounterNode*)1 : (WebCore::CounterNode*)0); | 613 counterName ? WebCore::counterMaps().get(current)->get(identifier) :
(WebCore::CounterNode*)1 : (WebCore::CounterNode*)0); |
614 } | 614 } |
615 fflush(stderr); | 615 fflush(stderr); |
616 } | 616 } |
617 | 617 |
618 #endif // NDEBUG | 618 #endif // NDEBUG |
OLD | NEW |