Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(522)

Side by Side Diff: Source/WebCore/rendering/CounterNode.cpp

Issue 8048004: Merge 95054 - Source/WebCore: Fixes several bugs when adding CounterNodes to a tree which can cau... (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/835/
Patch Set: Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 node->resetThisAndDescendantsRenderers(); 231 node->resetThisAndDescendantsRenderers();
232 } 232 }
233 } 233 }
234 234
235 void CounterNode::insertAfter(CounterNode* newChild, CounterNode* refChild, cons t AtomicString& identifier) 235 void CounterNode::insertAfter(CounterNode* newChild, CounterNode* refChild, cons t AtomicString& identifier)
236 { 236 {
237 ASSERT(newChild); 237 ASSERT(newChild);
238 ASSERT(!newChild->m_parent); 238 ASSERT(!newChild->m_parent);
239 ASSERT(!newChild->m_previousSibling); 239 ASSERT(!newChild->m_previousSibling);
240 ASSERT(!newChild->m_nextSibling); 240 ASSERT(!newChild->m_nextSibling);
241 ASSERT(!refChild || refChild->m_parent == this); 241 // If the refChild is not our child we can not complete the request. This ha rdens against bugs in RenderCounter.
242 // When renderers are reparented it may request that we insert counter nodes improperly.
243 if (refChild && refChild->m_parent != this)
244 return;
242 245
243 if (newChild->m_hasResetType) { 246 if (newChild->m_hasResetType) {
244 while (m_lastChild != refChild) 247 while (m_lastChild != refChild)
245 RenderCounter::destroyCounterNode(m_lastChild->owner(), identifier); 248 RenderCounter::destroyCounterNode(m_lastChild->owner(), identifier);
246 } 249 }
247 250
248 CounterNode* next; 251 CounterNode* next;
249 252
250 if (refChild) { 253 if (refChild) {
251 next = refChild->m_nextSibling; 254 next = refChild->m_nextSibling;
(...skipping 15 matching lines...) Expand all
267 ASSERT(m_lastChild == refChild); 270 ASSERT(m_lastChild == refChild);
268 m_lastChild = newChild; 271 m_lastChild = newChild;
269 } 272 }
270 273
271 newChild->m_countInParent = newChild->computeCountInParent(); 274 newChild->m_countInParent = newChild->computeCountInParent();
272 newChild->resetThisAndDescendantsRenderers(); 275 newChild->resetThisAndDescendantsRenderers();
273 if (next) 276 if (next)
274 next->recount(); 277 next->recount();
275 return; 278 return;
276 } 279 }
280 // If the new child is the last in the sibling list we must set the parent's lastChild.
281 if (!newChild->m_nextSibling)
282 m_lastChild = newChild;
277 283
278 // The code below handles the case when a formerly root increment counter is loosing its root position 284 // The code below handles the case when a formerly root increment counter is loosing its root position
279 // and therefore its children become next siblings. 285 // and therefore its children become next siblings.
280 CounterNode* last = newChild->m_lastChild; 286 CounterNode* last = newChild->m_lastChild;
281 CounterNode* first = newChild->m_firstChild; 287 CounterNode* first = newChild->m_firstChild;
282 288
283 newChild->m_nextSibling = first; 289 if (first) {
284 first->m_previousSibling = newChild; 290 ASSERT(last);
285 // The case when the original next sibling of the inserted node becomes a ch ild of 291 newChild->m_nextSibling = first;
286 // one of the former children of the inserted node is not handled as it is b elieved 292 if (m_lastChild == newChild)
287 // to be impossible since: 293 m_lastChild = last;
288 // 1. if the increment counter node lost it's root position as a result of a nother 294
289 // counter node being created, it will be inserted as the last child so n ext is null. 295 first->m_previousSibling = newChild;
290 // 2. if the increment counter node lost it's root position as a result of a renderer being 296
291 // inserted into the document's render tree, all its former children coun ters are attached 297 // The case when the original next sibling of the inserted node becomes a child of
292 // to children of the inserted renderer and hence cannot be in scope for counter nodes 298 // one of the former children of the inserted node is not handled as it is believed
293 // attached to renderers that were already in the document's render tree. 299 // to be impossible since:
294 last->m_nextSibling = next; 300 // 1. if the increment counter node lost it's root position as a result of another
295 if (next) 301 // counter node being created, it will be inserted as the last child so next is null.
296 next->m_previousSibling = last; 302 // 2. if the increment counter node lost it's root position as a result of a renderer being
297 else 303 // inserted into the document's render tree, all its former children counters are attached
298 m_lastChild = last; 304 // to children of the inserted renderer and hence cannot be in scope for counter nodes
299 for (next = first; ; next = next->m_nextSibling) { 305 // attached to renderers that were already in the document's render t ree.
300 next->m_parent = this; 306 last->m_nextSibling = next;
301 if (last == next) 307 if (next) {
302 break; 308 ASSERT(next->m_previousSibling == newChild);
309 next->m_previousSibling = last;
310 } else
311 m_lastChild = last;
312 for (next = first; ; next = next->m_nextSibling) {
313 next->m_parent = this;
314 if (last == next)
315 break;
316 }
303 } 317 }
304 newChild->m_firstChild = 0; 318 newChild->m_firstChild = 0;
305 newChild->m_lastChild = 0; 319 newChild->m_lastChild = 0;
306 newChild->m_countInParent = newChild->computeCountInParent(); 320 newChild->m_countInParent = newChild->computeCountInParent();
307 newChild->resetRenderers(); 321 newChild->resetRenderers();
308 first->recount(); 322 first->recount();
309 } 323 }
310 324
311 void CounterNode::removeChild(CounterNode* oldChild) 325 void CounterNode::removeChild(CounterNode* oldChild)
312 { 326 {
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 379
366 #ifndef NDEBUG 380 #ifndef NDEBUG
367 381
368 void showCounterTree(const WebCore::CounterNode* counter) 382 void showCounterTree(const WebCore::CounterNode* counter)
369 { 383 {
370 if (counter) 384 if (counter)
371 showTreeAndMark(counter); 385 showTreeAndMark(counter);
372 } 386 }
373 387
374 #endif 388 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698