| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) | 2 * Copyright (C) 2005 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 24 matching lines...) Expand all Loading... |
| 35 m_countInParent(0), | 35 m_countInParent(0), |
| 36 m_owner(o), | 36 m_owner(o), |
| 37 m_rootLayoutObject(nullptr), | 37 m_rootLayoutObject(nullptr), |
| 38 m_parent(nullptr), | 38 m_parent(nullptr), |
| 39 m_previousSibling(nullptr), | 39 m_previousSibling(nullptr), |
| 40 m_nextSibling(nullptr), | 40 m_nextSibling(nullptr), |
| 41 m_firstChild(nullptr), | 41 m_firstChild(nullptr), |
| 42 m_lastChild(nullptr) {} | 42 m_lastChild(nullptr) {} |
| 43 | 43 |
| 44 CounterNode::~CounterNode() { | 44 CounterNode::~CounterNode() { |
| 45 // Ideally this would be an assert and this would never be reached. In reality | 45 // Ideally this would be an assert and this would never be reached. In reality
this happens a lot |
| 46 // this happens a lot so we need to handle these cases. The node is still | 46 // so we need to handle these cases. The node is still connected to the tree s
o we need to detach it. |
| 47 // connected to the tree so we need to detach it. | |
| 48 if (m_parent || m_previousSibling || m_nextSibling || m_firstChild || | 47 if (m_parent || m_previousSibling || m_nextSibling || m_firstChild || |
| 49 m_lastChild) { | 48 m_lastChild) { |
| 50 CounterNode* oldParent = nullptr; | 49 CounterNode* oldParent = nullptr; |
| 51 CounterNode* oldPreviousSibling = nullptr; | 50 CounterNode* oldPreviousSibling = nullptr; |
| 52 // Instead of calling removeChild() we do this safely as the tree is likely | 51 // Instead of calling removeChild() we do this safely as the tree is likely
broken if we get here. |
| 53 // broken if we get here. | |
| 54 if (m_parent) { | 52 if (m_parent) { |
| 55 if (m_parent->m_firstChild == this) | 53 if (m_parent->m_firstChild == this) |
| 56 m_parent->m_firstChild = m_nextSibling; | 54 m_parent->m_firstChild = m_nextSibling; |
| 57 if (m_parent->m_lastChild == this) | 55 if (m_parent->m_lastChild == this) |
| 58 m_parent->m_lastChild = m_previousSibling; | 56 m_parent->m_lastChild = m_previousSibling; |
| 59 oldParent = m_parent; | 57 oldParent = m_parent; |
| 60 m_parent = nullptr; | 58 m_parent = nullptr; |
| 61 } | 59 } |
| 62 if (m_previousSibling) { | 60 if (m_previousSibling) { |
| 63 if (m_previousSibling->m_nextSibling == this) | 61 if (m_previousSibling->m_nextSibling == this) |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 197 value->m_nextForSameCounter = nullptr; | 195 value->m_nextForSameCounter = nullptr; |
| 198 value->m_counterNode = nullptr; | 196 value->m_counterNode = nullptr; |
| 199 return; | 197 return; |
| 200 } | 198 } |
| 201 previous = iterator; | 199 previous = iterator; |
| 202 } | 200 } |
| 203 ASSERT_NOT_REACHED(); | 201 ASSERT_NOT_REACHED(); |
| 204 } | 202 } |
| 205 | 203 |
| 206 void CounterNode::resetLayoutObjects() { | 204 void CounterNode::resetLayoutObjects() { |
| 207 while (m_rootLayoutObject) { | 205 while (m_rootLayoutObject) |
| 208 // This makes m_rootLayoutObject point to the next layoutObject if any since | 206 m_rootLayoutObject |
| 209 // it disconnects the m_rootLayoutObject from this. | 207 ->invalidate(); // This makes m_rootLayoutObject point to the next layo
utObject if any since it disconnects the m_rootLayoutObject from this. |
| 210 m_rootLayoutObject->invalidate(); | |
| 211 } | |
| 212 } | 208 } |
| 213 | 209 |
| 214 void CounterNode::resetThisAndDescendantsLayoutObjects() { | 210 void CounterNode::resetThisAndDescendantsLayoutObjects() { |
| 215 CounterNode* node = this; | 211 CounterNode* node = this; |
| 216 do { | 212 do { |
| 217 node->resetLayoutObjects(); | 213 node->resetLayoutObjects(); |
| 218 node = node->nextInPreOrder(this); | 214 node = node->nextInPreOrder(this); |
| 219 } while (node); | 215 } while (node); |
| 220 } | 216 } |
| 221 | 217 |
| 222 void CounterNode::recount() { | 218 void CounterNode::recount() { |
| 223 for (CounterNode* node = this; node; node = node->m_nextSibling) { | 219 for (CounterNode* node = this; node; node = node->m_nextSibling) { |
| 224 int oldCount = node->m_countInParent; | 220 int oldCount = node->m_countInParent; |
| 225 int newCount = node->computeCountInParent(); | 221 int newCount = node->computeCountInParent(); |
| 226 if (oldCount == newCount) | 222 if (oldCount == newCount) |
| 227 break; | 223 break; |
| 228 node->m_countInParent = newCount; | 224 node->m_countInParent = newCount; |
| 229 node->resetThisAndDescendantsLayoutObjects(); | 225 node->resetThisAndDescendantsLayoutObjects(); |
| 230 } | 226 } |
| 231 } | 227 } |
| 232 | 228 |
| 233 void CounterNode::insertAfter(CounterNode* newChild, | 229 void CounterNode::insertAfter(CounterNode* newChild, |
| 234 CounterNode* refChild, | 230 CounterNode* refChild, |
| 235 const AtomicString& identifier) { | 231 const AtomicString& identifier) { |
| 236 ASSERT(newChild); | 232 ASSERT(newChild); |
| 237 ASSERT(!newChild->m_parent); | 233 ASSERT(!newChild->m_parent); |
| 238 ASSERT(!newChild->m_previousSibling); | 234 ASSERT(!newChild->m_previousSibling); |
| 239 ASSERT(!newChild->m_nextSibling); | 235 ASSERT(!newChild->m_nextSibling); |
| 240 // If the refChild is not our child we can not complete the request. This | 236 // If the refChild is not our child we can not complete the request. This hard
ens against bugs in LayoutCounter. |
| 241 // hardens against bugs in LayoutCounter. | 237 // When layoutObjects are reparented it may request that we insert counter nod
es improperly. |
| 242 // When layoutObjects are reparented it may request that we insert counter | |
| 243 // nodes improperly. | |
| 244 if (refChild && refChild->m_parent != this) | 238 if (refChild && refChild->m_parent != this) |
| 245 return; | 239 return; |
| 246 | 240 |
| 247 if (newChild->m_hasResetType) { | 241 if (newChild->m_hasResetType) { |
| 248 while (m_lastChild != refChild) | 242 while (m_lastChild != refChild) |
| 249 LayoutCounter::destroyCounterNode(m_lastChild->owner(), identifier); | 243 LayoutCounter::destroyCounterNode(m_lastChild->owner(), identifier); |
| 250 } | 244 } |
| 251 | 245 |
| 252 CounterNode* next; | 246 CounterNode* next; |
| 253 | 247 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 272 } | 266 } |
| 273 | 267 |
| 274 if (!newChild->m_firstChild || newChild->m_hasResetType) { | 268 if (!newChild->m_firstChild || newChild->m_hasResetType) { |
| 275 newChild->m_countInParent = newChild->computeCountInParent(); | 269 newChild->m_countInParent = newChild->computeCountInParent(); |
| 276 newChild->resetThisAndDescendantsLayoutObjects(); | 270 newChild->resetThisAndDescendantsLayoutObjects(); |
| 277 if (next) | 271 if (next) |
| 278 next->recount(); | 272 next->recount(); |
| 279 return; | 273 return; |
| 280 } | 274 } |
| 281 | 275 |
| 282 // The code below handles the case when a formerly root increment counter is | 276 // The code below handles the case when a formerly root increment counter is l
oosing its root position |
| 283 // loosing its root position and therefore its children become next siblings. | 277 // and therefore its children become next siblings. |
| 284 CounterNode* last = newChild->m_lastChild; | 278 CounterNode* last = newChild->m_lastChild; |
| 285 CounterNode* first = newChild->m_firstChild; | 279 CounterNode* first = newChild->m_firstChild; |
| 286 | 280 |
| 287 if (first) { | 281 if (first) { |
| 288 ASSERT(last); | 282 ASSERT(last); |
| 289 newChild->m_nextSibling = first; | 283 newChild->m_nextSibling = first; |
| 290 if (m_lastChild == newChild) | 284 if (m_lastChild == newChild) |
| 291 m_lastChild = last; | 285 m_lastChild = last; |
| 292 | 286 |
| 293 first->m_previousSibling = newChild; | 287 first->m_previousSibling = newChild; |
| 294 | 288 |
| 295 // The case when the original next sibling of the inserted node becomes a | 289 // The case when the original next sibling of the inserted node becomes a ch
ild of |
| 296 // child of one of the former children of the inserted node is not handled | 290 // one of the former children of the inserted node is not handled as it is b
elieved |
| 297 // as it is believed to be impossible since: | 291 // to be impossible since: |
| 298 // 1. if the increment counter node lost it's root position as a result of | 292 // 1. if the increment counter node lost it's root position as a result of a
nother |
| 299 // another counter node being created, it will be inserted as the last | 293 // counter node being created, it will be inserted as the last child so n
ext is null. |
| 300 // child so next is null. | 294 // 2. if the increment counter node lost it's root position as a result of a
layoutObject being |
| 301 // 2. if the increment counter node lost it's root position as a result of a | 295 // inserted into the document's layout tree, all its former children coun
ters are attached |
| 302 // layoutObject being inserted into the document's layout tree, all its | 296 // to children of the inserted layoutObject and hence cannot be in scope
for counter nodes |
| 303 // former children counters are attached to children of the inserted | 297 // attached to layoutObjects that were already in the document's layout t
ree. |
| 304 // layoutObject and hence cannot be in scope for counter nodes attached | |
| 305 // to layoutObjects that were already in the document's layout tree. | |
| 306 last->m_nextSibling = next; | 298 last->m_nextSibling = next; |
| 307 if (next) { | 299 if (next) { |
| 308 ASSERT(next->m_previousSibling == newChild); | 300 ASSERT(next->m_previousSibling == newChild); |
| 309 next->m_previousSibling = last; | 301 next->m_previousSibling = last; |
| 310 } else { | 302 } else { |
| 311 m_lastChild = last; | 303 m_lastChild = last; |
| 312 } | 304 } |
| 313 for (next = first;; next = next->m_nextSibling) { | 305 for (next = first;; next = next->m_nextSibling) { |
| 314 next->m_parent = this; | 306 next->m_parent = this; |
| 315 if (last == next) | 307 if (last == next) |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 382 #ifndef NDEBUG | 374 #ifndef NDEBUG |
| 383 | 375 |
| 384 void showCounterTree(const blink::CounterNode* counter) { | 376 void showCounterTree(const blink::CounterNode* counter) { |
| 385 if (counter) | 377 if (counter) |
| 386 showTreeAndMark(counter); | 378 showTreeAndMark(counter); |
| 387 else | 379 else |
| 388 fprintf(stderr, "Cannot showCounterTree for (nil).\n"); | 380 fprintf(stderr, "Cannot showCounterTree for (nil).\n"); |
| 389 } | 381 } |
| 390 | 382 |
| 391 #endif | 383 #endif |
| OLD | NEW |