| 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) 2005 Allan Sandfeld Jensen (kde@carewolf.com) | 4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) |
| 5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com) | 5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com) |
| 6 * Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. | 6 * Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. |
| 7 * Copyright (C) 2010 Google Inc. All rights reserved. | 7 * Copyright (C) 2010 Google Inc. All rights reserved. |
| 8 * | 8 * |
| 9 * This library is free software; you can redistribute it and/or | 9 * This library is free software; you can redistribute it and/or |
| 10 * modify it under the terms of the GNU Library General Public | 10 * modify it under the terms of the GNU Library General Public |
| 11 * License as published by the Free Software Foundation; either | 11 * License as published by the Free Software Foundation; either |
| 12 * version 2 of the License, or (at your option) any later version. | 12 * version 2 of the License, or (at your option) any later version. |
| 13 * | 13 * |
| 14 * This library is distributed in the hope that it will be useful, | 14 * This library is distributed in the hope that it will be useful, |
| 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 17 * Library General Public License for more details. | 17 * Library General Public License for more details. |
| 18 * | 18 * |
| 19 * You should have received a copy of the GNU Library General Public License | 19 * You should have received a copy of the GNU Library General Public License |
| 20 * along with this library; see the file COPYING.LIB. If not, write to | 20 * along with this library; see the file COPYING.LIB. If not, write to |
| 21 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | 21 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
| 22 * Boston, MA 02110-1301, USA. | 22 * Boston, MA 02110-1301, USA. |
| 23 * | 23 * |
| 24 */ | 24 */ |
| 25 | 25 |
| 26 #include "config.h" | 26 #include "config.h" |
| 27 #include "core/rendering/RenderBoxModelObject.h" | 27 #include "core/rendering/RenderBoxModelObject.h" |
| 28 | 28 |
| 29 #include "core/layout/Layer.h" | 29 #include "core/layout/Layer.h" |
| 30 #include "core/layout/LayoutObject.h" |
| 30 #include "core/layout/compositing/CompositedLayerMapping.h" | 31 #include "core/layout/compositing/CompositedLayerMapping.h" |
| 31 #include "core/layout/compositing/LayerCompositor.h" | 32 #include "core/layout/compositing/LayerCompositor.h" |
| 32 #include "core/page/scrolling/ScrollingConstraints.h" | 33 #include "core/page/scrolling/ScrollingConstraints.h" |
| 33 #include "core/rendering/ImageQualityController.h" | 34 #include "core/rendering/ImageQualityController.h" |
| 34 #include "core/rendering/RenderBlock.h" | 35 #include "core/rendering/RenderBlock.h" |
| 35 #include "core/rendering/RenderFlowThread.h" | 36 #include "core/rendering/RenderFlowThread.h" |
| 36 #include "core/rendering/RenderGeometryMap.h" | 37 #include "core/rendering/RenderGeometryMap.h" |
| 37 #include "core/rendering/RenderInline.h" | 38 #include "core/rendering/RenderInline.h" |
| 38 #include "core/rendering/RenderObjectInlines.h" | |
| 39 #include "core/rendering/RenderRegion.h" | 39 #include "core/rendering/RenderRegion.h" |
| 40 #include "core/rendering/RenderTextFragment.h" | 40 #include "core/rendering/RenderTextFragment.h" |
| 41 #include "core/rendering/RenderView.h" | 41 #include "core/rendering/RenderView.h" |
| 42 #include "core/rendering/style/BorderEdge.h" | 42 #include "core/rendering/style/BorderEdge.h" |
| 43 #include "core/rendering/style/ShadowList.h" | 43 #include "core/rendering/style/ShadowList.h" |
| 44 #include "platform/LengthFunctions.h" | 44 #include "platform/LengthFunctions.h" |
| 45 #include "platform/geometry/TransformState.h" | 45 #include "platform/geometry/TransformState.h" |
| 46 #include "platform/graphics/DrawLooperBuilder.h" | 46 #include "platform/graphics/DrawLooperBuilder.h" |
| 47 #include "platform/graphics/GraphicsContextStateSaver.h" | 47 #include "platform/graphics/GraphicsContextStateSaver.h" |
| 48 #include "platform/graphics/Path.h" | 48 #include "platform/graphics/Path.h" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 60 typedef HashMap<const RenderBoxModelObject*, RenderBoxModelObject*> Continuation
Map; | 60 typedef HashMap<const RenderBoxModelObject*, RenderBoxModelObject*> Continuation
Map; |
| 61 static ContinuationMap* continuationMap = nullptr; | 61 static ContinuationMap* continuationMap = nullptr; |
| 62 | 62 |
| 63 void RenderBoxModelObject::setSelectionState(SelectionState state) | 63 void RenderBoxModelObject::setSelectionState(SelectionState state) |
| 64 { | 64 { |
| 65 if (state == SelectionInside && selectionState() != SelectionNone) | 65 if (state == SelectionInside && selectionState() != SelectionNone) |
| 66 return; | 66 return; |
| 67 | 67 |
| 68 if ((state == SelectionStart && selectionState() == SelectionEnd) | 68 if ((state == SelectionStart && selectionState() == SelectionEnd) |
| 69 || (state == SelectionEnd && selectionState() == SelectionStart)) | 69 || (state == SelectionEnd && selectionState() == SelectionStart)) |
| 70 RenderObject::setSelectionState(SelectionBoth); | 70 LayoutObject::setSelectionState(SelectionBoth); |
| 71 else | 71 else |
| 72 RenderObject::setSelectionState(state); | 72 LayoutObject::setSelectionState(state); |
| 73 | 73 |
| 74 // FIXME: We should consider whether it is OK propagating to ancestor Render
Inlines. | 74 // FIXME: We should consider whether it is OK propagating to ancestor Render
Inlines. |
| 75 // This is a workaround for http://webkit.org/b/32123 | 75 // This is a workaround for http://webkit.org/b/32123 |
| 76 // The containing block can be null in case of an orphaned tree. | 76 // The containing block can be null in case of an orphaned tree. |
| 77 RenderBlock* containingBlock = this->containingBlock(); | 77 RenderBlock* containingBlock = this->containingBlock(); |
| 78 if (containingBlock && !containingBlock->isRenderView()) | 78 if (containingBlock && !containingBlock->isRenderView()) |
| 79 containingBlock->setSelectionState(state); | 79 containingBlock->setSelectionState(state); |
| 80 } | 80 } |
| 81 | 81 |
| 82 void RenderBoxModelObject::contentChanged(ContentChangeType changeType) | 82 void RenderBoxModelObject::contentChanged(ContentChangeType changeType) |
| (...skipping 15 matching lines...) Expand all Loading... |
| 98 } | 98 } |
| 99 | 99 |
| 100 RenderBoxModelObject::~RenderBoxModelObject() | 100 RenderBoxModelObject::~RenderBoxModelObject() |
| 101 { | 101 { |
| 102 } | 102 } |
| 103 | 103 |
| 104 void RenderBoxModelObject::willBeDestroyed() | 104 void RenderBoxModelObject::willBeDestroyed() |
| 105 { | 105 { |
| 106 ImageQualityController::remove(this); | 106 ImageQualityController::remove(this); |
| 107 | 107 |
| 108 // A continuation of this RenderObject should be destroyed at subclasses. | 108 // A continuation of this LayoutObject should be destroyed at subclasses. |
| 109 ASSERT(!continuation()); | 109 ASSERT(!continuation()); |
| 110 | 110 |
| 111 LayoutLayerModelObject::willBeDestroyed(); | 111 LayoutLayerModelObject::willBeDestroyed(); |
| 112 } | 112 } |
| 113 | 113 |
| 114 bool RenderBoxModelObject::calculateHasBoxDecorations() const | 114 bool RenderBoxModelObject::calculateHasBoxDecorations() const |
| 115 { | 115 { |
| 116 RenderStyle* styleToUse = style(); | 116 RenderStyle* styleToUse = style(); |
| 117 ASSERT(styleToUse); | 117 ASSERT(styleToUse); |
| 118 return hasBackground() || styleToUse->hasBorder() || styleToUse->hasAppearan
ce() || styleToUse->boxShadow(); | 118 return hasBackground() || styleToUse->hasBorder() || styleToUse->hasAppearan
ce() || styleToUse->boxShadow(); |
| 119 } | 119 } |
| 120 | 120 |
| 121 void RenderBoxModelObject::updateFromStyle() | 121 void RenderBoxModelObject::updateFromStyle() |
| 122 { | 122 { |
| 123 LayoutLayerModelObject::updateFromStyle(); | 123 LayoutLayerModelObject::updateFromStyle(); |
| 124 | 124 |
| 125 RenderStyle* styleToUse = style(); | 125 RenderStyle* styleToUse = style(); |
| 126 setHasBoxDecorationBackground(calculateHasBoxDecorations()); | 126 setHasBoxDecorationBackground(calculateHasBoxDecorations()); |
| 127 setInline(styleToUse->isDisplayInlineType()); | 127 setInline(styleToUse->isDisplayInlineType()); |
| 128 setPositionState(styleToUse->position()); | 128 setPositionState(styleToUse->position()); |
| 129 setHorizontalWritingMode(styleToUse->isHorizontalWritingMode()); | 129 setHorizontalWritingMode(styleToUse->isHorizontalWritingMode()); |
| 130 } | 130 } |
| 131 | 131 |
| 132 static LayoutSize accumulateInFlowPositionOffsets(const RenderObject* child) | 132 static LayoutSize accumulateInFlowPositionOffsets(const LayoutObject* child) |
| 133 { | 133 { |
| 134 if (!child->isAnonymousBlock() || !child->isRelPositioned()) | 134 if (!child->isAnonymousBlock() || !child->isRelPositioned()) |
| 135 return LayoutSize(); | 135 return LayoutSize(); |
| 136 LayoutSize offset; | 136 LayoutSize offset; |
| 137 RenderObject* p = toRenderBlock(child)->inlineElementContinuation(); | 137 LayoutObject* p = toRenderBlock(child)->inlineElementContinuation(); |
| 138 while (p && p->isRenderInline()) { | 138 while (p && p->isRenderInline()) { |
| 139 if (p->isRelPositioned()) { | 139 if (p->isRelPositioned()) { |
| 140 RenderInline* renderInline = toRenderInline(p); | 140 RenderInline* renderInline = toRenderInline(p); |
| 141 offset += renderInline->offsetForInFlowPosition(); | 141 offset += renderInline->offsetForInFlowPosition(); |
| 142 } | 142 } |
| 143 p = p->parent(); | 143 p = p->parent(); |
| 144 } | 144 } |
| 145 return offset; | 145 return offset; |
| 146 } | 146 } |
| 147 | 147 |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 249 if (!element) | 249 if (!element) |
| 250 return referencePoint; | 250 return referencePoint; |
| 251 | 251 |
| 252 if (const RenderBoxModelObject* offsetParent = element->renderBoxModelObject
()) { | 252 if (const RenderBoxModelObject* offsetParent = element->renderBoxModelObject
()) { |
| 253 if (offsetParent->isBox() && !offsetParent->isBody()) | 253 if (offsetParent->isBox() && !offsetParent->isBody()) |
| 254 referencePoint.move(-toRenderBox(offsetParent)->borderLeft(), -toRen
derBox(offsetParent)->borderTop()); | 254 referencePoint.move(-toRenderBox(offsetParent)->borderLeft(), -toRen
derBox(offsetParent)->borderTop()); |
| 255 if (!isOutOfFlowPositioned() || flowThreadContainingBlock()) { | 255 if (!isOutOfFlowPositioned() || flowThreadContainingBlock()) { |
| 256 if (isRelPositioned()) | 256 if (isRelPositioned()) |
| 257 referencePoint.move(relativePositionOffset()); | 257 referencePoint.move(relativePositionOffset()); |
| 258 | 258 |
| 259 RenderObject* current; | 259 LayoutObject* current; |
| 260 for (current = parent(); current != offsetParent && current->parent(
); current = current->parent()) { | 260 for (current = parent(); current != offsetParent && current->parent(
); current = current->parent()) { |
| 261 // FIXME: What are we supposed to do inside SVG content? | 261 // FIXME: What are we supposed to do inside SVG content? |
| 262 if (!isOutOfFlowPositioned()) { | 262 if (!isOutOfFlowPositioned()) { |
| 263 if (current->isBox() && !current->isTableRow()) | 263 if (current->isBox() && !current->isTableRow()) |
| 264 referencePoint.moveBy(toRenderBox(current)->topLeftLocat
ion()); | 264 referencePoint.moveBy(toRenderBox(current)->topLeftLocat
ion()); |
| 265 referencePoint.move(current->parent()->columnOffset(referenc
ePoint)); | 265 referencePoint.move(current->parent()->columnOffset(referenc
ePoint)); |
| 266 } | 266 } |
| 267 } | 267 } |
| 268 | 268 |
| 269 if (offsetParent->isBox() && offsetParent->isBody() && !offsetParent
->isPositioned()) | 269 if (offsetParent->isBox() && offsetParent->isBody() && !offsetParent
->isPositioned()) |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 553 x = std::min(x, std::max<LayoutUnit>(maxX - caretWidth, 0)); | 553 x = std::min(x, std::max<LayoutUnit>(maxX - caretWidth, 0)); |
| 554 | 554 |
| 555 LayoutUnit height = style()->fontMetrics().height(); | 555 LayoutUnit height = style()->fontMetrics().height(); |
| 556 LayoutUnit verticalSpace = lineHeight(true, currentStyle->isHorizontalWritin
gMode() ? HorizontalLine : VerticalLine, PositionOfInteriorLineBoxes) - height; | 556 LayoutUnit verticalSpace = lineHeight(true, currentStyle->isHorizontalWritin
gMode() ? HorizontalLine : VerticalLine, PositionOfInteriorLineBoxes) - height; |
| 557 LayoutUnit y = paddingTop() + borderTop() + (verticalSpace / 2); | 557 LayoutUnit y = paddingTop() + borderTop() + (verticalSpace / 2); |
| 558 return currentStyle->isHorizontalWritingMode() ? LayoutRect(x, y, caretWidth
, height) : LayoutRect(y, x, height, caretWidth); | 558 return currentStyle->isHorizontalWritingMode() ? LayoutRect(x, y, caretWidth
, height) : LayoutRect(y, x, height, caretWidth); |
| 559 } | 559 } |
| 560 | 560 |
| 561 void RenderBoxModelObject::mapAbsoluteToLocalPoint(MapCoordinatesFlags mode, Tra
nsformState& transformState) const | 561 void RenderBoxModelObject::mapAbsoluteToLocalPoint(MapCoordinatesFlags mode, Tra
nsformState& transformState) const |
| 562 { | 562 { |
| 563 RenderObject* o = container(); | 563 LayoutObject* o = container(); |
| 564 if (!o) | 564 if (!o) |
| 565 return; | 565 return; |
| 566 | 566 |
| 567 if (o->isRenderFlowThread()) | 567 if (o->isRenderFlowThread()) |
| 568 transformState.move(o->columnOffset(LayoutPoint(transformState.mappedPoi
nt()))); | 568 transformState.move(o->columnOffset(LayoutPoint(transformState.mappedPoi
nt()))); |
| 569 | 569 |
| 570 o->mapAbsoluteToLocalPoint(mode, transformState); | 570 o->mapAbsoluteToLocalPoint(mode, transformState); |
| 571 | 571 |
| 572 LayoutSize containerOffset = offsetFromContainer(o, LayoutPoint()); | 572 LayoutSize containerOffset = offsetFromContainer(o, LayoutPoint()); |
| 573 | 573 |
| 574 if (!style()->hasOutOfFlowPosition() && o->hasColumns()) { | 574 if (!style()->hasOutOfFlowPosition() && o->hasColumns()) { |
| 575 RenderBlock* block = toRenderBlock(o); | 575 RenderBlock* block = toRenderBlock(o); |
| 576 LayoutPoint point(roundedLayoutPoint(transformState.mappedPoint())); | 576 LayoutPoint point(roundedLayoutPoint(transformState.mappedPoint())); |
| 577 point -= containerOffset; | 577 point -= containerOffset; |
| 578 block->adjustForColumnRect(containerOffset, point); | 578 block->adjustForColumnRect(containerOffset, point); |
| 579 } | 579 } |
| 580 | 580 |
| 581 bool preserve3D = mode & UseTransforms && (o->style()->preserves3D() || styl
e()->preserves3D()); | 581 bool preserve3D = mode & UseTransforms && (o->style()->preserves3D() || styl
e()->preserves3D()); |
| 582 if (mode & UseTransforms && shouldUseTransformFromContainer(o)) { | 582 if (mode & UseTransforms && shouldUseTransformFromContainer(o)) { |
| 583 TransformationMatrix t; | 583 TransformationMatrix t; |
| 584 getTransformFromContainer(o, containerOffset, t); | 584 getTransformFromContainer(o, containerOffset, t); |
| 585 transformState.applyTransform(t, preserve3D ? TransformState::Accumulate
Transform : TransformState::FlattenTransform); | 585 transformState.applyTransform(t, preserve3D ? TransformState::Accumulate
Transform : TransformState::FlattenTransform); |
| 586 } else | 586 } else |
| 587 transformState.move(containerOffset.width(), containerOffset.height(), p
reserve3D ? TransformState::AccumulateTransform : TransformState::FlattenTransfo
rm); | 587 transformState.move(containerOffset.width(), containerOffset.height(), p
reserve3D ? TransformState::AccumulateTransform : TransformState::FlattenTransfo
rm); |
| 588 } | 588 } |
| 589 | 589 |
| 590 const RenderObject* RenderBoxModelObject::pushMappingToContainer(const LayoutLay
erModelObject* ancestorToStopAt, RenderGeometryMap& geometryMap) const | 590 const LayoutObject* RenderBoxModelObject::pushMappingToContainer(const LayoutLay
erModelObject* ancestorToStopAt, RenderGeometryMap& geometryMap) const |
| 591 { | 591 { |
| 592 ASSERT(ancestorToStopAt != this); | 592 ASSERT(ancestorToStopAt != this); |
| 593 | 593 |
| 594 bool ancestorSkipped; | 594 bool ancestorSkipped; |
| 595 RenderObject* container = this->container(ancestorToStopAt, &ancestorSkipped
); | 595 LayoutObject* container = this->container(ancestorToStopAt, &ancestorSkipped
); |
| 596 if (!container) | 596 if (!container) |
| 597 return 0; | 597 return 0; |
| 598 | 598 |
| 599 bool isInline = isRenderInline(); | 599 bool isInline = isRenderInline(); |
| 600 bool isFixedPos = !isInline && style()->position() == FixedPosition; | 600 bool isFixedPos = !isInline && style()->position() == FixedPosition; |
| 601 bool hasTransform = !isInline && hasLayer() && layer()->transform(); | 601 bool hasTransform = !isInline && hasLayer() && layer()->transform(); |
| 602 | 602 |
| 603 LayoutSize adjustmentForSkippedAncestor; | 603 LayoutSize adjustmentForSkippedAncestor; |
| 604 if (ancestorSkipped) { | 604 if (ancestorSkipped) { |
| 605 // There can't be a transform between paintInvalidationContainer and o,
because transforms create containers, so it should be safe | 605 // There can't be a transform between paintInvalidationContainer and o,
because transforms create containers, so it should be safe |
| (...skipping 11 matching lines...) Expand all Loading... |
| 617 t.translateRight(adjustmentForSkippedAncestor.width().toFloat(), adjustm
entForSkippedAncestor.height().toFloat()); | 617 t.translateRight(adjustmentForSkippedAncestor.width().toFloat(), adjustm
entForSkippedAncestor.height().toFloat()); |
| 618 geometryMap.push(this, t, preserve3D, offsetDependsOnPoint, isFixedPos,
hasTransform); | 618 geometryMap.push(this, t, preserve3D, offsetDependsOnPoint, isFixedPos,
hasTransform); |
| 619 } else { | 619 } else { |
| 620 containerOffset += adjustmentForSkippedAncestor; | 620 containerOffset += adjustmentForSkippedAncestor; |
| 621 geometryMap.push(this, containerOffset, preserve3D, offsetDependsOnPoint
, isFixedPos, hasTransform); | 621 geometryMap.push(this, containerOffset, preserve3D, offsetDependsOnPoint
, isFixedPos, hasTransform); |
| 622 } | 622 } |
| 623 | 623 |
| 624 return ancestorSkipped ? ancestorToStopAt : container; | 624 return ancestorSkipped ? ancestorToStopAt : container; |
| 625 } | 625 } |
| 626 | 626 |
| 627 void RenderBoxModelObject::moveChildTo(RenderBoxModelObject* toBoxModelObject, R
enderObject* child, RenderObject* beforeChild, bool fullRemoveInsert) | 627 void RenderBoxModelObject::moveChildTo(RenderBoxModelObject* toBoxModelObject, L
ayoutObject* child, LayoutObject* beforeChild, bool fullRemoveInsert) |
| 628 { | 628 { |
| 629 // We assume that callers have cleared their positioned objects list for chi
ld moves (!fullRemoveInsert) so the | 629 // We assume that callers have cleared their positioned objects list for chi
ld moves (!fullRemoveInsert) so the |
| 630 // positioned renderer maps don't become stale. It would be too slow to do t
he map lookup on each call. | 630 // positioned renderer maps don't become stale. It would be too slow to do t
he map lookup on each call. |
| 631 ASSERT(!fullRemoveInsert || !isRenderBlock() || !toRenderBlock(this)->hasPos
itionedObjects()); | 631 ASSERT(!fullRemoveInsert || !isRenderBlock() || !toRenderBlock(this)->hasPos
itionedObjects()); |
| 632 | 632 |
| 633 ASSERT(this == child->parent()); | 633 ASSERT(this == child->parent()); |
| 634 ASSERT(!beforeChild || toBoxModelObject == beforeChild->parent()); | 634 ASSERT(!beforeChild || toBoxModelObject == beforeChild->parent()); |
| 635 if (fullRemoveInsert && (toBoxModelObject->isRenderBlock() || toBoxModelObje
ct->isRenderInline())) { | 635 if (fullRemoveInsert && (toBoxModelObject->isRenderBlock() || toBoxModelObje
ct->isRenderInline())) { |
| 636 // Takes care of adding the new child correctly if toBlock and fromBlock | 636 // Takes care of adding the new child correctly if toBlock and fromBlock |
| 637 // have different kind of children (block vs inline). | 637 // have different kind of children (block vs inline). |
| 638 toBoxModelObject->addChild(virtualChildren()->removeChildNode(this, chil
d), beforeChild); | 638 toBoxModelObject->addChild(virtualChildren()->removeChildNode(this, chil
d), beforeChild); |
| 639 } else | 639 } else |
| 640 toBoxModelObject->virtualChildren()->insertChildNode(toBoxModelObject, v
irtualChildren()->removeChildNode(this, child, fullRemoveInsert), beforeChild, f
ullRemoveInsert); | 640 toBoxModelObject->virtualChildren()->insertChildNode(toBoxModelObject, v
irtualChildren()->removeChildNode(this, child, fullRemoveInsert), beforeChild, f
ullRemoveInsert); |
| 641 } | 641 } |
| 642 | 642 |
| 643 void RenderBoxModelObject::moveChildrenTo(RenderBoxModelObject* toBoxModelObject
, RenderObject* startChild, RenderObject* endChild, RenderObject* beforeChild, b
ool fullRemoveInsert) | 643 void RenderBoxModelObject::moveChildrenTo(RenderBoxModelObject* toBoxModelObject
, LayoutObject* startChild, LayoutObject* endChild, LayoutObject* beforeChild, b
ool fullRemoveInsert) |
| 644 { | 644 { |
| 645 // This condition is rarely hit since this function is usually called on | 645 // This condition is rarely hit since this function is usually called on |
| 646 // anonymous blocks which can no longer carry positioned objects (see r12076
1) | 646 // anonymous blocks which can no longer carry positioned objects (see r12076
1) |
| 647 // or when fullRemoveInsert is false. | 647 // or when fullRemoveInsert is false. |
| 648 if (fullRemoveInsert && isRenderBlock()) { | 648 if (fullRemoveInsert && isRenderBlock()) { |
| 649 RenderBlock* block = toRenderBlock(this); | 649 RenderBlock* block = toRenderBlock(this); |
| 650 block->removePositionedObjects(0); | 650 block->removePositionedObjects(0); |
| 651 if (block->isRenderBlockFlow()) | 651 if (block->isRenderBlockFlow()) |
| 652 toRenderBlockFlow(block)->removeFloatingObjects(); | 652 toRenderBlockFlow(block)->removeFloatingObjects(); |
| 653 } | 653 } |
| 654 | 654 |
| 655 ASSERT(!beforeChild || toBoxModelObject == beforeChild->parent()); | 655 ASSERT(!beforeChild || toBoxModelObject == beforeChild->parent()); |
| 656 for (RenderObject* child = startChild; child && child != endChild; ) { | 656 for (LayoutObject* child = startChild; child && child != endChild; ) { |
| 657 // Save our next sibling as moveChildTo will clear it. | 657 // Save our next sibling as moveChildTo will clear it. |
| 658 RenderObject* nextSibling = child->nextSibling(); | 658 LayoutObject* nextSibling = child->nextSibling(); |
| 659 moveChildTo(toBoxModelObject, child, beforeChild, fullRemoveInsert); | 659 moveChildTo(toBoxModelObject, child, beforeChild, fullRemoveInsert); |
| 660 child = nextSibling; | 660 child = nextSibling; |
| 661 } | 661 } |
| 662 } | 662 } |
| 663 | 663 |
| 664 } // namespace blink | 664 } // namespace blink |
| OLD | NEW |