OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2009, 2010 Apple Inc. All rights reserved. | 2 * Copyright (C) 2009, 2010 Apple Inc. All rights reserved. |
3 * Copyright (C) Research In Motion Limited 2010. All rights reserved. | 3 * Copyright (C) Research In Motion Limited 2010. All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
56 firstChild()->destroy(); | 56 firstChild()->destroy(); |
57 } else { | 57 } else { |
58 // Destroy any anonymous children remaining in the render tree, as w
ell as implicit (shadow) DOM elements like those used in the engine-based text f
ields. | 58 // Destroy any anonymous children remaining in the render tree, as w
ell as implicit (shadow) DOM elements like those used in the engine-based text f
ields. |
59 if (firstChild()->node()) | 59 if (firstChild()->node()) |
60 firstChild()->node()->setRenderer(0); | 60 firstChild()->node()->setRenderer(0); |
61 firstChild()->destroy(); | 61 firstChild()->destroy(); |
62 } | 62 } |
63 } | 63 } |
64 } | 64 } |
65 | 65 |
66 static RenderNamedFlowThread* renderNamedFlowThreadContainer(RenderObject* objec
t) | |
67 { | |
68 while (object && object->isAnonymousBlock() && !object->isRenderNamedFlowThr
ead()) | |
69 object = object->parent(); | |
70 | |
71 return object && object->isRenderNamedFlowThread() ? toRenderNamedFlowThread
(object) : 0; | |
72 } | |
73 | |
74 RenderObject* RenderObjectChildList::removeChildNode(RenderObject* owner, Render
Object* oldChild, bool fullRemove) | 66 RenderObject* RenderObjectChildList::removeChildNode(RenderObject* owner, Render
Object* oldChild, bool fullRemove) |
75 { | 67 { |
76 ASSERT(oldChild->parent() == owner); | 68 ASSERT(oldChild->parent() == owner); |
77 | 69 |
78 if (oldChild->isFloatingOrOutOfFlowPositioned()) | 70 if (oldChild->isFloatingOrOutOfFlowPositioned()) |
79 toRenderBox(oldChild)->removeFloatingOrPositionedChildFromBlockLists(); | 71 toRenderBox(oldChild)->removeFloatingOrPositionedChildFromBlockLists(); |
80 | 72 |
81 // So that we'll get the appropriate dirty bit set (either that a normal flo
w child got yanked or | 73 // So that we'll get the appropriate dirty bit set (either that a normal flo
w child got yanked or |
82 // that a positioned child got yanked). We also repaint, so that the area e
xposed when the child | 74 // that a positioned child got yanked). We also repaint, so that the area e
xposed when the child |
83 // disappears gets repainted properly. | 75 // disappears gets repainted properly. |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 | 111 |
120 if (oldChild->isQuote()) | 112 if (oldChild->isQuote()) |
121 toRenderQuote(oldChild)->detachQuote(); | 113 toRenderQuote(oldChild)->detachQuote(); |
122 | 114 |
123 if (oldChild->inRenderFlowThread()) { | 115 if (oldChild->inRenderFlowThread()) { |
124 if (oldChild->isBox()) | 116 if (oldChild->isBox()) |
125 oldChild->enclosingRenderFlowThread()->removeRenderBoxRegionInfo
(toRenderBox(oldChild)); | 117 oldChild->enclosingRenderFlowThread()->removeRenderBoxRegionInfo
(toRenderBox(oldChild)); |
126 oldChild->enclosingRenderFlowThread()->clearRenderObjectCustomStyle(
oldChild); | 118 oldChild->enclosingRenderFlowThread()->clearRenderObjectCustomStyle(
oldChild); |
127 } | 119 } |
128 | 120 |
129 if (RenderNamedFlowThread* containerFlowThread = renderNamedFlowThreadCo
ntainer(owner)) | 121 if (RenderNamedFlowThread* containerFlowThread = owner->enclosingRenderN
amedFlowThread()) |
130 containerFlowThread->removeFlowChild(oldChild); | 122 containerFlowThread->removeFlowChild(oldChild); |
131 | 123 |
132 #if ENABLE(SVG) | 124 #if ENABLE(SVG) |
133 // Update cached boundaries in SVG renderers, if a child is removed. | 125 // Update cached boundaries in SVG renderers, if a child is removed. |
134 owner->setNeedsBoundariesUpdate(); | 126 owner->setNeedsBoundariesUpdate(); |
135 #endif | 127 #endif |
136 } | 128 } |
137 | 129 |
138 // If oldChild is the start or end of the selection, then clear the selectio
n to | 130 // If oldChild is the start or end of the selection, then clear the selectio
n to |
139 // avoid problems of invalid pointers. | 131 // avoid problems of invalid pointers. |
(...skipping 22 matching lines...) Expand all Loading... |
162 if (!owner->documentBeingDestroyed()) { | 154 if (!owner->documentBeingDestroyed()) { |
163 RenderCounter::rendererRemovedFromTree(oldChild); | 155 RenderCounter::rendererRemovedFromTree(oldChild); |
164 } | 156 } |
165 | 157 |
166 if (AXObjectCache::accessibilityEnabled()) | 158 if (AXObjectCache::accessibilityEnabled()) |
167 owner->document()->axObjectCache()->childrenChanged(owner); | 159 owner->document()->axObjectCache()->childrenChanged(owner); |
168 | 160 |
169 return oldChild; | 161 return oldChild; |
170 } | 162 } |
171 | 163 |
172 void RenderObjectChildList::appendChildNode(RenderObject* owner, RenderObject* n
ewChild, bool fullAppend) | 164 void RenderObjectChildList::appendChildNode(RenderObject* owner, RenderObject* n
ewChild, bool notifyRenderer) |
173 { | 165 { |
174 ASSERT(newChild->parent() == 0); | 166 ASSERT(newChild->parent() == 0); |
175 ASSERT(!owner->isBlockFlow() || (!newChild->isTableSection() && !newChild->i
sTableRow() && !newChild->isTableCell())); | 167 ASSERT(!owner->isBlockFlow() || (!newChild->isTableSection() && !newChild->i
sTableRow() && !newChild->isTableCell())); |
176 | 168 |
177 newChild->setParent(owner); | 169 newChild->setParent(owner); |
178 RenderObject* lChild = lastChild(); | 170 RenderObject* lChild = lastChild(); |
179 | 171 |
180 if (lChild) { | 172 if (lChild) { |
181 newChild->setPreviousSibling(lChild); | 173 newChild->setPreviousSibling(lChild); |
182 lChild->setNextSibling(newChild); | 174 lChild->setNextSibling(newChild); |
183 } else | 175 } else |
184 setFirstChild(newChild); | 176 setFirstChild(newChild); |
185 | 177 |
186 setLastChild(newChild); | 178 setLastChild(newChild); |
187 | 179 |
188 if (fullAppend) { | 180 if (notifyRenderer) |
189 // Keep our layer hierarchy updated. Optimize for the common case where
we don't have any children | 181 newChild->insertedIntoTree(); |
190 // and don't have a layer attached to ourselves. | |
191 RenderLayer* layer = 0; | |
192 if (newChild->firstChild() || newChild->hasLayer()) { | |
193 layer = owner->enclosingLayer(); | |
194 newChild->addLayers(layer); | |
195 } | |
196 | |
197 // if the new child is visible but this object was not, tell the layer i
t has some visible content | |
198 // that needs to be drawn and layer visibility optimization can't be use
d | |
199 if (owner->style()->visibility() != VISIBLE && newChild->style()->visibi
lity() == VISIBLE && !newChild->hasLayer()) { | |
200 if (!layer) | |
201 layer = owner->enclosingLayer(); | |
202 if (layer) | |
203 layer->setHasVisibleContent(); | |
204 } | |
205 | |
206 if (newChild->isListItem()) | |
207 toRenderListItem(newChild)->updateListMarkerNumbers(); | |
208 | |
209 if (!newChild->isFloating() && owner->childrenInline()) | |
210 owner->dirtyLinesFromChangedChild(newChild); | |
211 | |
212 if (newChild->isRenderRegion()) | |
213 toRenderRegion(newChild)->attachRegion(); | |
214 | |
215 // You can't attachQuote() otherwise the quote would be attached too ear
ly | |
216 // and get the wrong depth since generated content is inserted into anon
ymous | |
217 // renderers before going into the main render tree. | |
218 | |
219 if (RenderNamedFlowThread* containerFlowThread = renderNamedFlowThreadCo
ntainer(owner)) | |
220 containerFlowThread->addFlowChild(newChild); | |
221 } | |
222 | 182 |
223 if (!owner->documentBeingDestroyed()) { | 183 if (!owner->documentBeingDestroyed()) { |
224 RenderCounter::rendererSubtreeAttached(newChild); | 184 RenderCounter::rendererSubtreeAttached(newChild); |
225 } | 185 } |
226 newChild->setNeedsLayoutAndPrefWidthsRecalc(); // Goes up the containing blo
ck hierarchy. | 186 newChild->setNeedsLayoutAndPrefWidthsRecalc(); // Goes up the containing blo
ck hierarchy. |
227 if (!owner->normalChildNeedsLayout()) | 187 if (!owner->normalChildNeedsLayout()) |
228 owner->setChildNeedsLayout(true); // We may supply the static position f
or an absolute positioned child. | 188 owner->setChildNeedsLayout(true); // We may supply the static position f
or an absolute positioned child. |
229 | 189 |
230 if (AXObjectCache::accessibilityEnabled()) | 190 if (AXObjectCache::accessibilityEnabled()) |
231 owner->document()->axObjectCache()->childrenChanged(owner); | 191 owner->document()->axObjectCache()->childrenChanged(owner); |
232 } | 192 } |
233 | 193 |
234 void RenderObjectChildList::insertChildNode(RenderObject* owner, RenderObject* c
hild, RenderObject* beforeChild, bool fullInsert) | 194 void RenderObjectChildList::insertChildNode(RenderObject* owner, RenderObject* c
hild, RenderObject* beforeChild, bool notifyRenderer) |
235 { | 195 { |
236 if (!beforeChild) { | 196 if (!beforeChild) { |
237 appendChildNode(owner, child, fullInsert); | 197 appendChildNode(owner, child, notifyRenderer); |
238 return; | 198 return; |
239 } | 199 } |
240 | 200 |
241 ASSERT(!child->parent()); | 201 ASSERT(!child->parent()); |
242 while (beforeChild->parent() != owner && beforeChild->parent()->isAnonymousB
lock()) | 202 while (beforeChild->parent() != owner && beforeChild->parent()->isAnonymousB
lock()) |
243 beforeChild = beforeChild->parent(); | 203 beforeChild = beforeChild->parent(); |
244 ASSERT(beforeChild->parent() == owner); | 204 ASSERT(beforeChild->parent() == owner); |
245 | 205 |
246 ASSERT(!owner->isBlockFlow() || (!child->isTableSection() && !child->isTable
Row() && !child->isTableCell())); | 206 ASSERT(!owner->isBlockFlow() || (!child->isTableSection() && !child->isTable
Row() && !child->isTableCell())); |
247 | 207 |
248 if (beforeChild == firstChild()) | 208 if (beforeChild == firstChild()) |
249 setFirstChild(child); | 209 setFirstChild(child); |
250 | 210 |
251 RenderObject* prev = beforeChild->previousSibling(); | 211 RenderObject* prev = beforeChild->previousSibling(); |
252 child->setNextSibling(beforeChild); | 212 child->setNextSibling(beforeChild); |
253 beforeChild->setPreviousSibling(child); | 213 beforeChild->setPreviousSibling(child); |
254 if (prev) | 214 if (prev) |
255 prev->setNextSibling(child); | 215 prev->setNextSibling(child); |
256 child->setPreviousSibling(prev); | 216 child->setPreviousSibling(prev); |
257 | 217 |
258 child->setParent(owner); | 218 child->setParent(owner); |
259 | 219 |
260 if (fullInsert) { | 220 if (notifyRenderer) |
261 // Keep our layer hierarchy updated. Optimize for the common case where
we don't have any children | 221 child->insertedIntoTree(); |
262 // and don't have a layer attached to ourselves. | |
263 RenderLayer* layer = 0; | |
264 if (child->firstChild() || child->hasLayer()) { | |
265 layer = owner->enclosingLayer(); | |
266 child->addLayers(layer); | |
267 } | |
268 | |
269 // if the new child is visible but this object was not, tell the layer i
t has some visible content | |
270 // that needs to be drawn and layer visibility optimization can't be use
d | |
271 if (owner->style()->visibility() != VISIBLE && child->style()->visibilit
y() == VISIBLE && !child->hasLayer()) { | |
272 if (!layer) | |
273 layer = owner->enclosingLayer(); | |
274 if (layer) | |
275 layer->setHasVisibleContent(); | |
276 } | |
277 | |
278 if (child->isListItem()) | |
279 toRenderListItem(child)->updateListMarkerNumbers(); | |
280 | |
281 if (!child->isFloating() && owner->childrenInline()) | |
282 owner->dirtyLinesFromChangedChild(child); | |
283 | |
284 if (child->isRenderRegion()) | |
285 toRenderRegion(child)->attachRegion(); | |
286 | |
287 // Calling attachQuote() here would be too early (before anonymous rende
rers are inserted) | |
288 // see appendChild() for more explanation. | |
289 | |
290 if (RenderNamedFlowThread* containerFlowThread = renderNamedFlowThreadCo
ntainer(owner)) | |
291 containerFlowThread->addFlowChild(child, beforeChild); | |
292 } | |
293 | 222 |
294 if (!owner->documentBeingDestroyed()) { | 223 if (!owner->documentBeingDestroyed()) { |
295 RenderCounter::rendererSubtreeAttached(child); | 224 RenderCounter::rendererSubtreeAttached(child); |
296 } | 225 } |
297 child->setNeedsLayoutAndPrefWidthsRecalc(); | 226 child->setNeedsLayoutAndPrefWidthsRecalc(); |
298 if (!owner->normalChildNeedsLayout()) | 227 if (!owner->normalChildNeedsLayout()) |
299 owner->setChildNeedsLayout(true); // We may supply the static position f
or an absolute positioned child. | 228 owner->setChildNeedsLayout(true); // We may supply the static position f
or an absolute positioned child. |
300 | 229 |
301 if (AXObjectCache::accessibilityEnabled()) | 230 if (AXObjectCache::accessibilityEnabled()) |
302 owner->document()->axObjectCache()->childrenChanged(owner); | 231 owner->document()->axObjectCache()->childrenChanged(owner); |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
577 if (!generatedContentContainer) | 506 if (!generatedContentContainer) |
578 return; | 507 return; |
579 | 508 |
580 // Handle placement of run-ins. We do the run-in placement at the end since
generatedContentContainer can get destroyed. | 509 // Handle placement of run-ins. We do the run-in placement at the end since
generatedContentContainer can get destroyed. |
581 RenderObject* generatedContentContainerImmediateParent = generatedContentCon
tainer->parent(); | 510 RenderObject* generatedContentContainerImmediateParent = generatedContentCon
tainer->parent(); |
582 if (generatedContentContainerImmediateParent->isRenderBlock()) | 511 if (generatedContentContainerImmediateParent->isRenderBlock()) |
583 toRenderBlock(generatedContentContainerImmediateParent)->placeRunInIfNee
ded(generatedContentContainer, PlaceGeneratedRunIn); | 512 toRenderBlock(generatedContentContainerImmediateParent)->placeRunInIfNee
ded(generatedContentContainer, PlaceGeneratedRunIn); |
584 } | 513 } |
585 | 514 |
586 } // namespace WebCore | 515 } // namespace WebCore |
OLD | NEW |