Chromium Code Reviews| Index: Source/core/rendering/RenderBlockFlow.cpp |
| diff --git a/Source/core/rendering/RenderBlockFlow.cpp b/Source/core/rendering/RenderBlockFlow.cpp |
| index 8a4f224b3df5663e1a5a323024160c2b4bd0edd9..1b718cbb531b6eec6f540f0c5189d0b225a798fa 100644 |
| --- a/Source/core/rendering/RenderBlockFlow.cpp |
| +++ b/Source/core/rendering/RenderBlockFlow.cpp |
| @@ -804,6 +804,7 @@ void RenderBlockFlow::layoutBlockChildren(bool relayoutChildren, LayoutUnit& max |
| maxFloatLogicalBottom = 0; |
| RenderBox* next = firstChildBox(); |
| + RenderBox* lastNormalFlowChild = 0; |
| while (next) { |
| RenderBox* child = next; |
| @@ -829,15 +830,17 @@ void RenderBlockFlow::layoutBlockChildren(bool relayoutChildren, LayoutUnit& max |
| // Lay out the child. |
| layoutBlockChild(child, marginInfo, previousFloatLogicalBottom, maxFloatLogicalBottom); |
| + lastNormalFlowChild = child; |
| // If doing a partial layout and the child was the target renderer, early exit here. |
| if (frameView()->partialLayout().checkPartialLayoutComplete(child)) |
| - break; |
| + return; |
| + |
| } |
| // Now do the handling of the bottom of the block, adding in our bottom border/padding and |
| // determining the correct collapsed bottom margin information. |
| - handleAfterSideOfBlock(beforeEdge, afterEdge, marginInfo); |
| + handleAfterSideOfBlock(lastNormalFlowChild, beforeEdge, afterEdge, marginInfo); |
| } |
| // Our MarginInfo state used when laying out block children. |
| @@ -1006,11 +1009,12 @@ LayoutUnit RenderBlockFlow::collapseMargins(RenderBox* child, MarginInfo& margin |
| LayoutUnit clearanceForSelfCollapsingBlock; |
| RenderObject* prev = child->previousSibling(); |
| + RenderBlockFlow* previousBlockFlow = prev && prev->isRenderBlockFlow() && !prev->isFloatingOrOutOfFlowPositioned() ? toRenderBlockFlow(prev) : 0; |
|
ojan
2014/01/14 00:34:18
Doesn't this change behavior? Was it always wrong
rhogan
2014/01/14 19:23:01
Yes, it was incorrect not to skip past floats/outo
|
| // If the child's previous sibling is a self-collapsing block that cleared a float then its top border edge has been set at the bottom border edge |
| // of the float. Since we want to collapse the child's top margin with the self-collapsing block's top and bottom margins we need to adjust our parent's height to match the |
| // margin top of the self-collapsing block. If the resulting collapsed margin leaves the child still intruding into the float then we will want to clear it. |
| - if (!marginInfo.canCollapseWithMarginBefore() && prev && prev->isRenderBlockFlow() && toRenderBlockFlow(prev)->isSelfCollapsingBlock()) { |
| - clearanceForSelfCollapsingBlock = toRenderBlockFlow(prev)->marginOffsetForSelfCollapsingBlock(); |
| + if (!marginInfo.canCollapseWithMarginBefore() && previousBlockFlow && previousBlockFlow->isSelfCollapsingBlock()) { |
| + clearanceForSelfCollapsingBlock = previousBlockFlow->marginOffsetForSelfCollapsingBlock(); |
| setLogicalHeight(logicalHeight() - clearanceForSelfCollapsingBlock); |
| } |
| @@ -1079,14 +1083,13 @@ LayoutUnit RenderBlockFlow::collapseMargins(RenderBox* child, MarginInfo& margin |
| setLogicalHeight(logicalHeight() + (logicalTop - oldLogicalTop)); |
| } |
| - if (prev && prev->isRenderBlockFlow() && !prev->isFloatingOrOutOfFlowPositioned()) { |
| + if (previousBlockFlow) { |
| // If |child| is a self-collapsing block it may have collapsed into a previous sibling and although it hasn't reduced the height of the parent yet |
| // any floats from the parent will now overhang. |
| - RenderBlockFlow* blockFlow = toRenderBlockFlow(prev); |
| LayoutUnit oldLogicalHeight = logicalHeight(); |
| setLogicalHeight(logicalTop); |
| - if (blockFlow->containsFloats() && !blockFlow->avoidsFloats() && (blockFlow->logicalTop() + blockFlow->lowestFloatLogicalBottom()) > logicalTop) |
| - addOverhangingFloats(blockFlow, false); |
| + if (previousBlockFlow->containsFloats() && !previousBlockFlow->avoidsFloats() && (previousBlockFlow->logicalTop() + previousBlockFlow->lowestFloatLogicalBottom()) > logicalTop) |
| + addOverhangingFloats(previousBlockFlow, false); |
| setLogicalHeight(oldLogicalHeight); |
| // If |child|'s previous sibling is a self-collapsing block that cleared a float and margin collapsing resulted in |child| moving up |
| @@ -1370,16 +1373,15 @@ void RenderBlockFlow::adjustFloatingBlock(const MarginInfo& marginInfo) |
| setLogicalHeight(logicalHeight() - marginOffset); |
| } |
| -void RenderBlockFlow::handleAfterSideOfBlock(LayoutUnit beforeSide, LayoutUnit afterSide, MarginInfo& marginInfo) |
| +void RenderBlockFlow::handleAfterSideOfBlock(RenderBox* lastChild, LayoutUnit beforeSide, LayoutUnit afterSide, MarginInfo& marginInfo) |
| { |
| marginInfo.setAtAfterSideOfBlock(true); |
| // If our last child was a self-collapsing block with clearance then our logical height is flush with the |
| // bottom edge of the float that the child clears. The correct vertical position for the margin-collapsing we want |
| // to perform now is at the child's margin-top - so adjust our height to that position. |
| - RenderObject* child = lastChild(); |
| - if (child && child->isRenderBlockFlow() && toRenderBlockFlow(child)->isSelfCollapsingBlock()) |
| - setLogicalHeight(logicalHeight() - toRenderBlockFlow(child)->marginOffsetForSelfCollapsingBlock()); |
| + if (lastChild && lastChild->isRenderBlockFlow() && lastChild->isSelfCollapsingBlock()) |
| + setLogicalHeight(logicalHeight() - toRenderBlockFlow(lastChild)->marginOffsetForSelfCollapsingBlock()); |
| if (marginInfo.canCollapseMarginAfterWithChildren() && !marginInfo.canCollapseMarginAfterWithLastChild()) |
| marginInfo.setCanCollapseMarginAfterWithChildren(false); |