OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * (C) 2000 Dirk Mueller (mueller@kde.org) | 4 * (C) 2000 Dirk Mueller (mueller@kde.org) |
5 * (C) 2004 Allan Sandfeld Jensen (kde@carewolf.com) | 5 * (C) 2004 Allan Sandfeld Jensen (kde@carewolf.com) |
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2011 Apple Inc. All rights reserv
ed. | 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2011 Apple Inc. All rights reserv
ed. |
7 * Copyright (C) 2009 Google Inc. All rights reserved. | 7 * Copyright (C) 2009 Google Inc. All rights reserved. |
8 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo
bile.com/) | 8 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo
bile.com/) |
9 * | 9 * |
10 * This library is free software; you can redistribute it and/or | 10 * This library is free software; you can redistribute it and/or |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 #include "core/html/HTMLTableElement.h" | 42 #include "core/html/HTMLTableElement.h" |
43 #include "core/page/AutoscrollController.h" | 43 #include "core/page/AutoscrollController.h" |
44 #include "core/page/EventHandler.h" | 44 #include "core/page/EventHandler.h" |
45 #include "core/frame/Frame.h" | 45 #include "core/frame/Frame.h" |
46 #include "core/frame/FrameView.h" | 46 #include "core/frame/FrameView.h" |
47 #include "core/page/Page.h" | 47 #include "core/page/Page.h" |
48 #include "core/frame/Settings.h" | 48 #include "core/frame/Settings.h" |
49 #include "core/frame/UseCounter.h" | 49 #include "core/frame/UseCounter.h" |
50 #include "core/frame/animation/AnimationController.h" | 50 #include "core/frame/animation/AnimationController.h" |
51 #include "core/rendering/CompositedLayerMapping.h" | 51 #include "core/rendering/CompositedLayerMapping.h" |
52 #include "core/rendering/FlowThreadController.h" | |
53 #include "core/rendering/HitTestResult.h" | 52 #include "core/rendering/HitTestResult.h" |
54 #include "core/rendering/LayoutRectRecorder.h" | 53 #include "core/rendering/LayoutRectRecorder.h" |
55 #include "core/rendering/RenderCounter.h" | 54 #include "core/rendering/RenderCounter.h" |
56 #include "core/rendering/RenderDeprecatedFlexibleBox.h" | 55 #include "core/rendering/RenderDeprecatedFlexibleBox.h" |
57 #include "core/rendering/RenderFlexibleBox.h" | 56 #include "core/rendering/RenderFlexibleBox.h" |
58 #include "core/rendering/RenderGeometryMap.h" | 57 #include "core/rendering/RenderGeometryMap.h" |
59 #include "core/rendering/RenderGrid.h" | 58 #include "core/rendering/RenderGrid.h" |
60 #include "core/rendering/RenderImage.h" | 59 #include "core/rendering/RenderImage.h" |
61 #include "core/rendering/RenderImageResourceStyleImage.h" | 60 #include "core/rendering/RenderImageResourceStyleImage.h" |
62 #include "core/rendering/RenderInline.h" | 61 #include "core/rendering/RenderInline.h" |
63 #include "core/rendering/RenderLayer.h" | 62 #include "core/rendering/RenderLayer.h" |
64 #include "core/rendering/RenderLayerCompositor.h" | 63 #include "core/rendering/RenderLayerCompositor.h" |
65 #include "core/rendering/RenderListItem.h" | 64 #include "core/rendering/RenderListItem.h" |
66 #include "core/rendering/RenderMarquee.h" | 65 #include "core/rendering/RenderMarquee.h" |
67 #include "core/rendering/RenderMultiColumnBlock.h" | |
68 #include "core/rendering/RenderNamedFlowThread.h" | |
69 #include "core/rendering/RenderRegion.h" | |
70 #include "core/rendering/RenderRuby.h" | 66 #include "core/rendering/RenderRuby.h" |
71 #include "core/rendering/RenderRubyText.h" | 67 #include "core/rendering/RenderRubyText.h" |
72 #include "core/rendering/RenderScrollbarPart.h" | 68 #include "core/rendering/RenderScrollbarPart.h" |
73 #include "core/rendering/RenderTableCaption.h" | 69 #include "core/rendering/RenderTableCaption.h" |
74 #include "core/rendering/RenderTableCell.h" | 70 #include "core/rendering/RenderTableCell.h" |
75 #include "core/rendering/RenderTableCol.h" | 71 #include "core/rendering/RenderTableCol.h" |
76 #include "core/rendering/RenderTableRow.h" | 72 #include "core/rendering/RenderTableRow.h" |
77 #include "core/rendering/RenderTextControlPlaceholder.h" | 73 #include "core/rendering/RenderTextControlPlaceholder.h" |
78 #include "core/rendering/RenderTheme.h" | 74 #include "core/rendering/RenderTheme.h" |
79 #include "core/rendering/RenderView.h" | 75 #include "core/rendering/RenderView.h" |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 } | 130 } |
135 | 131 |
136 void RenderObject::operator delete(void* ptr) | 132 void RenderObject::operator delete(void* ptr) |
137 { | 133 { |
138 ASSERT(isMainThread()); | 134 ASSERT(isMainThread()); |
139 partitionFree(ptr); | 135 partitionFree(ptr); |
140 } | 136 } |
141 | 137 |
142 RenderObject* RenderObject::createObject(Element* element, RenderStyle* style) | 138 RenderObject* RenderObject::createObject(Element* element, RenderStyle* style) |
143 { | 139 { |
144 Document& doc = element->document(); | |
145 | |
146 // Minimal support for content properties replacing an entire element. | 140 // Minimal support for content properties replacing an entire element. |
147 // Works only if we have exactly one piece of content and it's a URL. | 141 // Works only if we have exactly one piece of content and it's a URL. |
148 // Otherwise acts as if we didn't support this feature. | 142 // Otherwise acts as if we didn't support this feature. |
149 const ContentData* contentData = style->contentData(); | 143 const ContentData* contentData = style->contentData(); |
150 if (contentData && !contentData->next() && contentData->isImage() && !elemen
t->isPseudoElement()) { | 144 if (contentData && !contentData->next() && contentData->isImage() && !elemen
t->isPseudoElement()) { |
151 RenderImage* image = new RenderImage(element); | 145 RenderImage* image = new RenderImage(element); |
152 // RenderImageResourceStyleImage requires a style being present on the i
mage but we don't want to | 146 // RenderImageResourceStyleImage requires a style being present on the i
mage but we don't want to |
153 // trigger a style change now as the node is not fully attached. Moving
this code to style change | 147 // trigger a style change now as the node is not fully attached. Moving
this code to style change |
154 // doesn't make sense as it should be run once at renderer creation. | 148 // doesn't make sense as it should be run once at renderer creation. |
155 image->setStyleInternal(style); | 149 image->setStyleInternal(style); |
(...skipping 19 matching lines...) Expand all Loading... |
175 if (element->hasTagName(rtTag) && style->display() == BLOCK) | 169 if (element->hasTagName(rtTag) && style->display() == BLOCK) |
176 return new RenderRubyText(element); | 170 return new RenderRubyText(element); |
177 | 171 |
178 switch (style->display()) { | 172 switch (style->display()) { |
179 case NONE: | 173 case NONE: |
180 return 0; | 174 return 0; |
181 case INLINE: | 175 case INLINE: |
182 return new RenderInline(element); | 176 return new RenderInline(element); |
183 case BLOCK: | 177 case BLOCK: |
184 case INLINE_BLOCK: | 178 case INLINE_BLOCK: |
185 if ((!style->hasAutoColumnCount() || !style->hasAutoColumnWidth()) && do
c.regionBasedColumnsEnabled()) | |
186 return new RenderMultiColumnBlock(element); | |
187 return new RenderBlockFlow(element); | 179 return new RenderBlockFlow(element); |
188 case LIST_ITEM: | 180 case LIST_ITEM: |
189 return new RenderListItem(element); | 181 return new RenderListItem(element); |
190 case TABLE: | 182 case TABLE: |
191 case INLINE_TABLE: | 183 case INLINE_TABLE: |
192 return new RenderTable(element); | 184 return new RenderTable(element); |
193 case TABLE_ROW_GROUP: | 185 case TABLE_ROW_GROUP: |
194 case TABLE_HEADER_GROUP: | 186 case TABLE_HEADER_GROUP: |
195 case TABLE_FOOTER_GROUP: | 187 case TABLE_FOOTER_GROUP: |
196 return new RenderTableSection(element); | 188 return new RenderTableSection(element); |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
275 bool RenderObject::isHR() const | 267 bool RenderObject::isHR() const |
276 { | 268 { |
277 return node() && node()->hasTagName(hrTag); | 269 return node() && node()->hasTagName(hrTag); |
278 } | 270 } |
279 | 271 |
280 bool RenderObject::isLegend() const | 272 bool RenderObject::isLegend() const |
281 { | 273 { |
282 return node() && node()->hasTagName(legendTag); | 274 return node() && node()->hasTagName(legendTag); |
283 } | 275 } |
284 | 276 |
285 void RenderObject::setFlowThreadStateIncludingDescendants(FlowThreadState state) | |
286 { | |
287 setFlowThreadState(state); | |
288 | |
289 for (RenderObject* child = firstChild(); child; child = child->nextSibling()
) { | |
290 // If the child is a fragmentation context it already updated the descen
dants flag accordingly. | |
291 if (child->isRenderFlowThread()) | |
292 continue; | |
293 ASSERT(state != child->flowThreadState()); | |
294 child->setFlowThreadStateIncludingDescendants(state); | |
295 } | |
296 } | |
297 | |
298 bool RenderObject::requiresAnonymousTableWrappers(const RenderObject* newChild)
const | 277 bool RenderObject::requiresAnonymousTableWrappers(const RenderObject* newChild)
const |
299 { | 278 { |
300 // Check should agree with: | 279 // Check should agree with: |
301 // CSS 2.1 Tables: 17.2.1 Anonymous table objects | 280 // CSS 2.1 Tables: 17.2.1 Anonymous table objects |
302 // http://www.w3.org/TR/CSS21/tables.html#anonymous-boxes | 281 // http://www.w3.org/TR/CSS21/tables.html#anonymous-boxes |
303 if (newChild->isRenderTableCol()) { | 282 if (newChild->isRenderTableCol()) { |
304 const RenderTableCol* newTableColumn = toRenderTableCol(newChild); | 283 const RenderTableCol* newTableColumn = toRenderTableCol(newChild); |
305 bool isColumnInColumnGroup = newTableColumn->isTableColumn() && isRender
TableCol(); | 284 bool isColumnInColumnGroup = newTableColumn->isTableColumn() && isRender
TableCol(); |
306 return !isTable() && !isColumnInColumnGroup; | 285 return !isTable() && !isColumnInColumnGroup; |
307 } else if (newChild->isTableCaption()) | 286 } else if (newChild->isTableCaption()) |
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
600 continue; | 579 continue; |
601 | 580 |
602 RenderBox* ancestorBox = toRenderBox(ancestor); | 581 RenderBox* ancestorBox = toRenderBox(ancestor); |
603 if (ancestorBox->canBeScrolledAndHasScrollableArea()) | 582 if (ancestorBox->canBeScrolledAndHasScrollableArea()) |
604 return ancestorBox; | 583 return ancestorBox; |
605 } | 584 } |
606 | 585 |
607 return 0; | 586 return 0; |
608 } | 587 } |
609 | 588 |
610 RenderFlowThread* RenderObject::locateFlowThreadContainingBlock() const | |
611 { | |
612 ASSERT(flowThreadState() != NotInsideFlowThread); | |
613 | |
614 // See if we have the thread cached because we're in the middle of layout. | |
615 RenderFlowThread* flowThread = view()->flowThreadController()->currentRender
FlowThread(); | |
616 if (flowThread) | |
617 return flowThread; | |
618 | |
619 // Not in the middle of layout so have to find the thread the slow way. | |
620 RenderObject* curr = const_cast<RenderObject*>(this); | |
621 while (curr) { | |
622 if (curr->isRenderFlowThread()) | |
623 return toRenderFlowThread(curr); | |
624 curr = curr->containingBlock(); | |
625 } | |
626 return 0; | |
627 } | |
628 | |
629 RenderNamedFlowThread* RenderObject::renderNamedFlowThreadWrapper() const | |
630 { | |
631 RenderObject* object = const_cast<RenderObject*>(this); | |
632 while (object && object->isAnonymousBlock() && !object->isRenderNamedFlowThr
ead()) | |
633 object = object->parent(); | |
634 | |
635 return object && object->isRenderNamedFlowThread() ? toRenderNamedFlowThread
(object) : 0; | |
636 } | |
637 | |
638 RenderBlock* RenderObject::firstLineBlock() const | 589 RenderBlock* RenderObject::firstLineBlock() const |
639 { | 590 { |
640 return 0; | 591 return 0; |
641 } | 592 } |
642 | 593 |
643 static inline bool objectIsRelayoutBoundary(const RenderObject* object) | 594 static inline bool objectIsRelayoutBoundary(const RenderObject* object) |
644 { | 595 { |
645 // FIXME: In future it may be possible to broaden these conditions in order
to improve performance. | 596 // FIXME: In future it may be possible to broaden these conditions in order
to improve performance. |
646 if (object->isTextControl()) | 597 if (object->isTextControl()) |
647 return true; | 598 return true; |
(...skipping 707 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1355 } | 1306 } |
1356 } | 1307 } |
1357 | 1308 |
1358 if (document().view()->hasSoftwareFilters()) { | 1309 if (document().view()->hasSoftwareFilters()) { |
1359 if (RenderLayer* parentLayer = enclosingLayer()) { | 1310 if (RenderLayer* parentLayer = enclosingLayer()) { |
1360 RenderLayer* enclosingFilterLayer = parentLayer->enclosingFilterLaye
r(); | 1311 RenderLayer* enclosingFilterLayer = parentLayer->enclosingFilterLaye
r(); |
1361 if (enclosingFilterLayer) | 1312 if (enclosingFilterLayer) |
1362 return enclosingFilterLayer->renderer(); | 1313 return enclosingFilterLayer->renderer(); |
1363 } | 1314 } |
1364 } | 1315 } |
1365 | |
1366 // If we have a flow thread, then we need to do individual repaints within t
he RenderRegions instead. | |
1367 // Return the flow thread as a repaint container in order to create a chokep
oint that allows us to change | |
1368 // repainting to do individual region repaints. | |
1369 RenderFlowThread* parentRenderFlowThread = flowThreadContainingBlock(); | |
1370 if (parentRenderFlowThread) { | |
1371 // The ancestor document will do the reparenting when the repaint propag
ates further up. | |
1372 // We're just a seamless child document, and we don't need to do the hac
king. | |
1373 if (parentRenderFlowThread->document() != document()) | |
1374 return repaintContainer; | |
1375 // If we have already found a repaint container then we will repaint int
o that container only if it is part of the same | |
1376 // flow thread. Otherwise we will need to catch the repaint call and sen
d it to the flow thread. | |
1377 RenderFlowThread* repaintContainerFlowThread = repaintContainer ? repain
tContainer->flowThreadContainingBlock() : 0; | |
1378 if (!repaintContainerFlowThread || repaintContainerFlowThread != parentR
enderFlowThread) | |
1379 repaintContainer = parentRenderFlowThread; | |
1380 } | |
1381 return repaintContainer; | 1316 return repaintContainer; |
1382 } | 1317 } |
1383 | 1318 |
1384 void RenderObject::repaintUsingContainer(const RenderLayerModelObject* repaintCo
ntainer, const IntRect& r) const | 1319 void RenderObject::repaintUsingContainer(const RenderLayerModelObject* repaintCo
ntainer, const IntRect& r) const |
1385 { | 1320 { |
1386 if (!repaintContainer) { | 1321 if (!repaintContainer) { |
1387 view()->repaintViewRectangle(r); | 1322 view()->repaintViewRectangle(r); |
1388 return; | 1323 return; |
1389 } | 1324 } |
1390 | 1325 |
(...skipping 18 matching lines...) Expand all Loading... |
1409 // directly to the next chunk of code. | 1344 // directly to the next chunk of code. |
1410 | 1345 |
1411 // Then, convert the repaint rect from repaintConainer space into the sq
uashing GraphicsLayer's coordinates. | 1346 // Then, convert the repaint rect from repaintConainer space into the sq
uashing GraphicsLayer's coordinates. |
1412 if (repaintContainer->hasTransform()) | 1347 if (repaintContainer->hasTransform()) |
1413 offsetRect = repaintContainer->layer()->transform()->mapRect(r); | 1348 offsetRect = repaintContainer->layer()->transform()->mapRect(r); |
1414 offsetRect.move(-repaintContainer->layer()->offsetFromSquashingLayerOrig
in()); | 1349 offsetRect.move(-repaintContainer->layer()->offsetFromSquashingLayerOrig
in()); |
1415 repaintContainer->groupedMapping()->squashingLayer()->setNeedsDisplayInR
ect(offsetRect); | 1350 repaintContainer->groupedMapping()->squashingLayer()->setNeedsDisplayInR
ect(offsetRect); |
1416 return; | 1351 return; |
1417 } | 1352 } |
1418 | 1353 |
1419 if (repaintContainer->isRenderFlowThread()) { | |
1420 toRenderFlowThread(repaintContainer)->repaintRectangleInRegions(r); | |
1421 return; | |
1422 } | |
1423 | |
1424 if (repaintContainer->hasFilter() && repaintContainer->layer()->requiresFull
LayerImageForFilters()) { | 1354 if (repaintContainer->hasFilter() && repaintContainer->layer()->requiresFull
LayerImageForFilters()) { |
1425 repaintContainer->layer()->repainter().setFilterBackendNeedsRepaintingIn
Rect(r); | 1355 repaintContainer->layer()->repainter().setFilterBackendNeedsRepaintingIn
Rect(r); |
1426 return; | 1356 return; |
1427 } | 1357 } |
1428 | 1358 |
1429 RenderView* v = view(); | 1359 RenderView* v = view(); |
1430 if (repaintContainer->isRenderView()) { | 1360 if (repaintContainer->isRenderView()) { |
1431 ASSERT(repaintContainer == v); | 1361 ASSERT(repaintContainer == v); |
1432 bool viewHasCompositedLayer = v->hasLayer() && v->layer()->compositingSt
ate() == PaintsIntoOwnBacking; | 1362 bool viewHasCompositedLayer = v->hasLayer() && v->layer()->compositingSt
ate() == PaintsIntoOwnBacking; |
1433 if (!viewHasCompositedLayer) { | 1363 if (!viewHasCompositedLayer) { |
(...skipping 882 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2316 ASSERT(o == container()); | 2246 ASSERT(o == container()); |
2317 | 2247 |
2318 LayoutSize offset; | 2248 LayoutSize offset; |
2319 | 2249 |
2320 o->adjustForColumns(offset, point); | 2250 o->adjustForColumns(offset, point); |
2321 | 2251 |
2322 if (o->hasOverflowClip()) | 2252 if (o->hasOverflowClip()) |
2323 offset -= toRenderBox(o)->scrolledContentOffset(); | 2253 offset -= toRenderBox(o)->scrolledContentOffset(); |
2324 | 2254 |
2325 if (offsetDependsOnPoint) | 2255 if (offsetDependsOnPoint) |
2326 *offsetDependsOnPoint = hasColumns() || o->isRenderFlowThread(); | 2256 *offsetDependsOnPoint = hasColumns(); |
2327 | 2257 |
2328 return offset; | 2258 return offset; |
2329 } | 2259 } |
2330 | 2260 |
2331 LayoutSize RenderObject::offsetFromAncestorContainer(RenderObject* container) co
nst | 2261 LayoutSize RenderObject::offsetFromAncestorContainer(RenderObject* container) co
nst |
2332 { | 2262 { |
2333 LayoutSize offset; | 2263 LayoutSize offset; |
2334 LayoutPoint referencePoint; | 2264 LayoutPoint referencePoint; |
2335 const RenderObject* currContainer = this; | 2265 const RenderObject* currContainer = this; |
2336 do { | 2266 do { |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2571 if (AXObjectCache* cache = document().existingAXObjectCache()) | 2501 if (AXObjectCache* cache = document().existingAXObjectCache()) |
2572 cache->childrenChanged(this->parent()); | 2502 cache->childrenChanged(this->parent()); |
2573 | 2503 |
2574 remove(); | 2504 remove(); |
2575 | 2505 |
2576 // The remove() call above may invoke axObjectCache()->childrenChanged() on
the parent, which may require the AX render | 2506 // The remove() call above may invoke axObjectCache()->childrenChanged() on
the parent, which may require the AX render |
2577 // object for this renderer. So we remove the AX render object now, after th
e renderer is removed. | 2507 // object for this renderer. So we remove the AX render object now, after th
e renderer is removed. |
2578 if (AXObjectCache* cache = document().existingAXObjectCache()) | 2508 if (AXObjectCache* cache = document().existingAXObjectCache()) |
2579 cache->remove(this); | 2509 cache->remove(this); |
2580 | 2510 |
2581 #ifndef NDEBUG | |
2582 if (!documentBeingDestroyed() && view() && view()->hasRenderNamedFlowThreads
()) { | |
2583 // After remove, the object and the associated information should not be
in any flow thread. | |
2584 const RenderNamedFlowThreadList* flowThreadList = view()->flowThreadCont
roller()->renderNamedFlowThreadList(); | |
2585 for (RenderNamedFlowThreadList::const_iterator iter = flowThreadList->be
gin(); iter != flowThreadList->end(); ++iter) { | |
2586 const RenderNamedFlowThread* renderFlowThread = *iter; | |
2587 ASSERT(!renderFlowThread->hasChild(this)); | |
2588 ASSERT(!renderFlowThread->hasChildInfo(this)); | |
2589 } | |
2590 } | |
2591 #endif | |
2592 | |
2593 // If this renderer had a parent, remove should have destroyed any counters | 2511 // If this renderer had a parent, remove should have destroyed any counters |
2594 // attached to this renderer and marked the affected other counters for | 2512 // attached to this renderer and marked the affected other counters for |
2595 // reevaluation. This apparently redundant check is here for the case when | 2513 // reevaluation. This apparently redundant check is here for the case when |
2596 // this renderer had no parent at the time remove() was called. | 2514 // this renderer had no parent at the time remove() was called. |
2597 | 2515 |
2598 if (hasCounterNodeMap()) | 2516 if (hasCounterNodeMap()) |
2599 RenderCounter::destroyCounterNodes(*this); | 2517 RenderCounter::destroyCounterNodes(*this); |
2600 | 2518 |
2601 setAncestorLineBoxDirty(false); | 2519 setAncestorLineBoxDirty(false); |
2602 | 2520 |
(...skipping 16 matching lines...) Expand all Loading... |
2619 // that needs to be drawn and layer visibility optimization can't be used | 2537 // that needs to be drawn and layer visibility optimization can't be used |
2620 if (parent()->style()->visibility() != VISIBLE && style()->visibility() == V
ISIBLE && !hasLayer()) { | 2538 if (parent()->style()->visibility() != VISIBLE && style()->visibility() == V
ISIBLE && !hasLayer()) { |
2621 if (!layer) | 2539 if (!layer) |
2622 layer = parent()->enclosingLayer(); | 2540 layer = parent()->enclosingLayer(); |
2623 if (layer) | 2541 if (layer) |
2624 layer->setHasVisibleContent(); | 2542 layer->setHasVisibleContent(); |
2625 } | 2543 } |
2626 | 2544 |
2627 if (!isFloating() && parent()->childrenInline()) | 2545 if (!isFloating() && parent()->childrenInline()) |
2628 parent()->dirtyLinesFromChangedChild(this); | 2546 parent()->dirtyLinesFromChangedChild(this); |
2629 | |
2630 if (RenderNamedFlowThread* containerFlowThread = parent()->renderNamedFlowTh
readWrapper()) | |
2631 containerFlowThread->addFlowChild(this); | |
2632 } | 2547 } |
2633 | 2548 |
2634 void RenderObject::willBeRemovedFromTree() | 2549 void RenderObject::willBeRemovedFromTree() |
2635 { | 2550 { |
2636 // FIXME: We should ASSERT(isRooted()) but we have some out-of-order removal
s which would need to be fixed first. | 2551 // FIXME: We should ASSERT(isRooted()) but we have some out-of-order removal
s which would need to be fixed first. |
2637 | 2552 |
2638 // If we remove a visible child from an invisible parent, we don't know the
layer visibility any more. | 2553 // If we remove a visible child from an invisible parent, we don't know the
layer visibility any more. |
2639 RenderLayer* layer = 0; | 2554 RenderLayer* layer = 0; |
2640 if (parent()->style()->visibility() != VISIBLE && style()->visibility() == V
ISIBLE && !hasLayer()) { | 2555 if (parent()->style()->visibility() != VISIBLE && style()->visibility() == V
ISIBLE && !hasLayer()) { |
2641 if ((layer = parent()->enclosingLayer())) | 2556 if ((layer = parent()->enclosingLayer())) |
2642 layer->dirtyVisibleContentStatus(); | 2557 layer->dirtyVisibleContentStatus(); |
2643 } | 2558 } |
2644 | 2559 |
2645 // Keep our layer hierarchy updated. | 2560 // Keep our layer hierarchy updated. |
2646 if (firstChild() || hasLayer()) { | 2561 if (firstChild() || hasLayer()) { |
2647 if (!layer) | 2562 if (!layer) |
2648 layer = parent()->enclosingLayer(); | 2563 layer = parent()->enclosingLayer(); |
2649 removeLayers(layer); | 2564 removeLayers(layer); |
2650 } | 2565 } |
2651 | 2566 |
2652 if (isOutOfFlowPositioned() && parent()->childrenInline()) | 2567 if (isOutOfFlowPositioned() && parent()->childrenInline()) |
2653 parent()->dirtyLinesFromChangedChild(this); | 2568 parent()->dirtyLinesFromChangedChild(this); |
2654 | 2569 |
2655 removeFromRenderFlowThread(); | |
2656 | |
2657 if (RenderNamedFlowThread* containerFlowThread = parent()->renderNamedFlowTh
readWrapper()) | |
2658 containerFlowThread->removeFlowChild(this); | |
2659 | |
2660 // Update cached boundaries in SVG renderers if a child is removed. | 2570 // Update cached boundaries in SVG renderers if a child is removed. |
2661 if (parent()->isSVG()) | 2571 if (parent()->isSVG()) |
2662 parent()->setNeedsBoundariesUpdate(); | 2572 parent()->setNeedsBoundariesUpdate(); |
2663 } | 2573 } |
2664 | 2574 |
2665 void RenderObject::removeFromRenderFlowThread() | |
2666 { | |
2667 if (flowThreadState() == NotInsideFlowThread) | |
2668 return; | |
2669 | |
2670 // Sometimes we remove the element from the flow, but it's not destroyed at
that time. | |
2671 // It's only until later when we actually destroy it and remove all the chil
dren from it. | |
2672 // Currently, that happens for firstLetter elements and list markers. | |
2673 // Pass in the flow thread so that we don't have to look it up for all the c
hildren. | |
2674 removeFromRenderFlowThreadRecursive(flowThreadContainingBlock()); | |
2675 } | |
2676 | |
2677 void RenderObject::removeFromRenderFlowThreadRecursive(RenderFlowThread* renderF
lowThread) | |
2678 { | |
2679 if (const RenderObjectChildList* children = virtualChildren()) { | |
2680 for (RenderObject* child = children->firstChild(); child; child = child-
>nextSibling()) | |
2681 child->removeFromRenderFlowThreadRecursive(renderFlowThread); | |
2682 } | |
2683 | |
2684 RenderFlowThread* localFlowThread = renderFlowThread; | |
2685 if (flowThreadState() == InsideInFlowThread) | |
2686 localFlowThread = flowThreadContainingBlock(); // We have to ask. We can
't just assume we are in the same flow thread. | |
2687 if (localFlowThread) | |
2688 localFlowThread->removeFlowChildInfo(this); | |
2689 setFlowThreadState(NotInsideFlowThread); | |
2690 } | |
2691 | |
2692 void RenderObject::destroyAndCleanupAnonymousWrappers() | 2575 void RenderObject::destroyAndCleanupAnonymousWrappers() |
2693 { | 2576 { |
2694 // If the tree is destroyed, there is no need for a clean-up phase. | 2577 // If the tree is destroyed, there is no need for a clean-up phase. |
2695 if (documentBeingDestroyed()) { | 2578 if (documentBeingDestroyed()) { |
2696 destroy(); | 2579 destroy(); |
2697 return; | 2580 return; |
2698 } | 2581 } |
2699 | 2582 |
2700 RenderObject* destroyRoot = this; | 2583 RenderObject* destroyRoot = this; |
2701 for (RenderObject* destroyRootParent = destroyRoot->parent(); destroyRootPar
ent && destroyRootParent->isAnonymous(); destroyRoot = destroyRootParent, destro
yRootParent = destroyRootParent->parent()) { | 2584 for (RenderObject* destroyRootParent = destroyRoot->parent(); destroyRootPar
ent && destroyRootParent->isAnonymous(); destroyRoot = destroyRootParent, destro
yRootParent = destroyRootParent->parent()) { |
2702 // Anonymous block continuations are tracked and destroyed elsewhere (se
e the bottom of RenderBlock::removeChild) | 2585 // Anonymous block continuations are tracked and destroyed elsewhere (se
e the bottom of RenderBlock::removeChild) |
2703 if (destroyRootParent->isRenderBlock() && toRenderBlock(destroyRootParen
t)->isAnonymousBlockContinuation()) | 2586 if (destroyRootParent->isRenderBlock() && toRenderBlock(destroyRootParen
t)->isAnonymousBlockContinuation()) |
2704 break; | 2587 break; |
2705 // Render flow threads are tracked by the FlowThreadController, so we ca
n't destroy them here. | |
2706 // Column spans are tracked elsewhere. | 2588 // Column spans are tracked elsewhere. |
2707 if (destroyRootParent->isRenderFlowThread() || destroyRootParent->isAnon
ymousColumnSpanBlock()) | 2589 if (destroyRootParent->isAnonymousColumnSpanBlock()) |
2708 break; | 2590 break; |
2709 | 2591 |
2710 if (destroyRootParent->firstChild() != this || destroyRootParent->lastCh
ild() != this) | 2592 if (destroyRootParent->firstChild() != this || destroyRootParent->lastCh
ild() != this) |
2711 break; | 2593 break; |
2712 } | 2594 } |
2713 | 2595 |
2714 destroyRoot->destroy(); | 2596 destroyRoot->destroy(); |
2715 | 2597 |
2716 // WARNING: |this| is deleted here. | 2598 // WARNING: |this| is deleted here. |
2717 } | 2599 } |
(...skipping 437 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3155 return renderer->node()->isInert(); | 3037 return renderer->node()->isInert(); |
3156 } | 3038 } |
3157 | 3039 |
3158 void RenderObject::imageChanged(ImageResource* image, const IntRect* rect) | 3040 void RenderObject::imageChanged(ImageResource* image, const IntRect* rect) |
3159 { | 3041 { |
3160 imageChanged(static_cast<WrappedImagePtr>(image), rect); | 3042 imageChanged(static_cast<WrappedImagePtr>(image), rect); |
3161 } | 3043 } |
3162 | 3044 |
3163 RenderObject* RenderObject::hoverAncestor() const | 3045 RenderObject* RenderObject::hoverAncestor() const |
3164 { | 3046 { |
3165 // When searching for the hover ancestor and encountering a named flow threa
d, | 3047 // FIXME: Remove. |
3166 // the search will continue with the DOM ancestor of the top-most element | 3048 return parent(); |
3167 // in the named flow thread. | |
3168 // See https://code.google.com/p/chromium/issues/detail?id=243278 | |
3169 RenderObject* hoverAncestor = parent(); | |
3170 | |
3171 // Skip anonymous blocks directly flowed into flow threads as it would | |
3172 // prevent us from continuing the search on the DOM tree when reaching the n
amed flow thread. | |
3173 if (hoverAncestor && hoverAncestor->isAnonymousBlock() && hoverAncestor->par
ent() && hoverAncestor->parent()->isRenderNamedFlowThread()) | |
3174 hoverAncestor = hoverAncestor->parent(); | |
3175 | |
3176 if (hoverAncestor && hoverAncestor->isRenderNamedFlowThread()) { | |
3177 hoverAncestor = 0; | |
3178 | |
3179 Node* node = this->node(); | |
3180 if (node) { | |
3181 Node* domAncestorNode = node->parentNode(); | |
3182 if (domAncestorNode) | |
3183 hoverAncestor = domAncestorNode->renderer(); | |
3184 } | |
3185 } | |
3186 | |
3187 return hoverAncestor; | |
3188 } | 3049 } |
3189 | 3050 |
3190 Element* RenderObject::offsetParent() const | 3051 Element* RenderObject::offsetParent() const |
3191 { | 3052 { |
3192 if (isRoot() || isBody()) | 3053 if (isRoot() || isBody()) |
3193 return 0; | 3054 return 0; |
3194 | 3055 |
3195 if (isOutOfFlowPositioned() && style()->position() == FixedPosition) | 3056 if (isOutOfFlowPositioned() && style()->position() == FixedPosition) |
3196 return 0; | 3057 return 0; |
3197 | 3058 |
3198 // If A is an area HTML element which has a map HTML element somewhere in th
e ancestor | 3059 // If A is an area HTML element which has a map HTML element somewhere in th
e ancestor |
3199 // chain return the nearest ancestor map HTML element and stop this algorith
m. | 3060 // chain return the nearest ancestor map HTML element and stop this algorith
m. |
3200 // FIXME: Implement! | 3061 // FIXME: Implement! |
3201 | 3062 |
3202 float effectiveZoom = style()->effectiveZoom(); | 3063 float effectiveZoom = style()->effectiveZoom(); |
3203 Node* node = 0; | 3064 Node* node = 0; |
3204 for (RenderObject* ancestor = parent(); ancestor; ancestor = ancestor->paren
t()) { | 3065 for (RenderObject* ancestor = parent(); ancestor; ancestor = ancestor->paren
t()) { |
3205 // Spec: http://www.w3.org/TR/cssom-view/#offset-attributes | 3066 // Spec: http://www.w3.org/TR/cssom-view/#offset-attributes |
3206 | 3067 |
3207 // CSS regions specification says that region flows should return the bo
dy element as their offsetParent. | |
3208 if (ancestor->isRenderNamedFlowThread()) | |
3209 return document().body(); | |
3210 | |
3211 node = ancestor->node(); | 3068 node = ancestor->node(); |
3212 | 3069 |
3213 if (!node) | 3070 if (!node) |
3214 continue; | 3071 continue; |
3215 | 3072 |
3216 if (ancestor->isPositioned()) | 3073 if (ancestor->isPositioned()) |
3217 break; | 3074 break; |
3218 | 3075 |
3219 if (node->hasTagName(bodyTag)) | 3076 if (node->hasTagName(bodyTag)) |
3220 break; | 3077 break; |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3358 { | 3215 { |
3359 ASSERT_NOT_REACHED(); | 3216 ASSERT_NOT_REACHED(); |
3360 return false; | 3217 return false; |
3361 } | 3218 } |
3362 | 3219 |
3363 bool RenderObject::isRelayoutBoundaryForInspector() const | 3220 bool RenderObject::isRelayoutBoundaryForInspector() const |
3364 { | 3221 { |
3365 return objectIsRelayoutBoundary(this); | 3222 return objectIsRelayoutBoundary(this); |
3366 } | 3223 } |
3367 | 3224 |
3368 bool RenderObject::isRenderNamedFlowFragmentContainer() const | |
3369 { | |
3370 return isRenderBlockFlow() && toRenderBlockFlow(this)->renderNamedFlowFragme
nt(); | |
3371 } | |
3372 | |
3373 } // namespace WebCore | 3225 } // namespace WebCore |
3374 | 3226 |
3375 #ifndef NDEBUG | 3227 #ifndef NDEBUG |
3376 | 3228 |
3377 void showTree(const WebCore::RenderObject* object) | 3229 void showTree(const WebCore::RenderObject* object) |
3378 { | 3230 { |
3379 if (object) | 3231 if (object) |
3380 object->showTreeForThis(); | 3232 object->showTreeForThis(); |
3381 } | 3233 } |
3382 | 3234 |
(...skipping 12 matching lines...) Expand all Loading... |
3395 { | 3247 { |
3396 if (object1) { | 3248 if (object1) { |
3397 const WebCore::RenderObject* root = object1; | 3249 const WebCore::RenderObject* root = object1; |
3398 while (root->parent()) | 3250 while (root->parent()) |
3399 root = root->parent(); | 3251 root = root->parent(); |
3400 root->showRenderTreeAndMark(object1, "*", object2, "-", 0); | 3252 root->showRenderTreeAndMark(object1, "*", object2, "-", 0); |
3401 } | 3253 } |
3402 } | 3254 } |
3403 | 3255 |
3404 #endif | 3256 #endif |
OLD | NEW |