Index: third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp |
diff --git a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp |
index 77ef5f3b1fde827d72b508e64aac1bbbffae1a14..7adac6d84776a2d3c2acef072ce02adae93ab9d8 100644 |
--- a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp |
+++ b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp |
@@ -2121,7 +2121,7 @@ void LayoutBlockFlow::adjustFloatingBlock(const MarginInfo& marginInfo) { |
LayoutUnit logicalTop = logicalHeight(); |
if (!marginInfo.canCollapseWithMarginBefore()) |
logicalTop += marginInfo.margin(); |
- positionNewFloats(logicalTop); |
+ placeNewFloats(logicalTop); |
} |
void LayoutBlockFlow::handleAfterSideOfBlock(LayoutBox* lastChild, |
@@ -3325,7 +3325,7 @@ void LayoutBlockFlow::childBecameNonInline(LayoutObject*) { |
} |
void LayoutBlockFlow::clearFloats(EClear clear) { |
- positionNewFloats(logicalHeight()); |
+ placeNewFloats(logicalHeight()); |
// set y position |
LayoutUnit newY = lowestFloatLogicalBottom(clear); |
if (size().height() < newY) |
@@ -3565,8 +3565,8 @@ void LayoutBlockFlow::removeFloatingObjectsBelow(FloatingObject* lastFloat, |
} |
} |
-bool LayoutBlockFlow::positionNewFloats(LayoutUnit logicalTop, |
- LineWidth* width) { |
+bool LayoutBlockFlow::placeNewFloats(LayoutUnit logicalTopMarginEdge, |
+ LineWidth* width) { |
if (!m_floatingObjects) |
return false; |
@@ -3595,9 +3595,10 @@ bool LayoutBlockFlow::positionNewFloats(LayoutUnit logicalTop, |
} |
// The float cannot start above the top position of the last positioned float. |
- if (lastPlacedFloatingObject) |
- logicalTop = |
- std::max(logicalTopForFloat(*lastPlacedFloatingObject), logicalTop); |
+ if (lastPlacedFloatingObject) { |
+ logicalTopMarginEdge = std::max( |
+ logicalTopMarginEdge, logicalTopForFloat(*lastPlacedFloatingObject)); |
+ } |
FloatingObjectSetIterator end = floatingObjectSet.end(); |
// Now walk through the set of unpositioned floats and place them. |
@@ -3607,7 +3608,8 @@ bool LayoutBlockFlow::positionNewFloats(LayoutUnit logicalTop, |
// unplaced floats in our list that come from somewhere else, we have a bug. |
DCHECK_EQ(floatingObject.layoutObject()->containingBlock(), this); |
- logicalTop = positionAndLayoutFloat(floatingObject, logicalTop); |
+ logicalTopMarginEdge = |
+ positionAndLayoutFloat(floatingObject, logicalTopMarginEdge); |
m_floatingObjects->addPlacedObject(floatingObject); |
@@ -3619,7 +3621,7 @@ bool LayoutBlockFlow::positionNewFloats(LayoutUnit logicalTop, |
LayoutUnit LayoutBlockFlow::positionAndLayoutFloat( |
FloatingObject& floatingObject, |
- LayoutUnit logicalTop) { |
+ LayoutUnit logicalTopMarginEdge) { |
LayoutBox& childBox = *floatingObject.layoutObject(); |
// FIXME Investigate if this can be removed. crbug.com/370006 |
@@ -3628,28 +3630,30 @@ LayoutUnit LayoutBlockFlow::positionAndLayoutFloat( |
LayoutUnit childLogicalLeftMargin = style()->isLeftToRightDirection() |
? marginStartForChild(childBox) |
: marginEndForChild(childBox); |
- logicalTop = |
- std::max(logicalTop, lowestFloatLogicalBottom(childBox.style()->clear())); |
+ logicalTopMarginEdge = |
+ std::max(logicalTopMarginEdge, |
+ lowestFloatLogicalBottom(childBox.style()->clear())); |
bool isPaginated = view()->layoutState()->isPaginated(); |
if (isPaginated && !childrenInline()) { |
// Forced breaks are inserted at class A break points. Floats may be |
// affected by a break-after value on the previous in-flow sibling. |
if (LayoutBox* previousInFlowBox = childBox.previousInFlowSiblingBox()) { |
- logicalTop = |
- applyForcedBreak(logicalTop, previousInFlowBox->breakAfter()); |
+ logicalTopMarginEdge = applyForcedBreak(logicalTopMarginEdge, |
+ previousInFlowBox->breakAfter()); |
} |
} |
LayoutPoint floatLogicalLocation = |
- computeLogicalLocationForFloat(floatingObject, logicalTop); |
+ computeLogicalLocationForFloat(floatingObject, logicalTopMarginEdge); |
+ logicalTopMarginEdge = floatLogicalLocation.y(); |
setLogicalLeftForFloat(floatingObject, floatLogicalLocation.x()); |
setLogicalLeftForChild(childBox, |
floatLogicalLocation.x() + childLogicalLeftMargin); |
- setLogicalTopForChild( |
- childBox, floatLogicalLocation.y() + marginBeforeForChild(childBox)); |
+ setLogicalTopForChild(childBox, |
+ logicalTopMarginEdge + marginBeforeForChild(childBox)); |
SubtreeLayoutScope layoutScope(childBox); |
if (isPaginated && !childBox.needsLayout()) |
@@ -3691,20 +3695,21 @@ LayoutUnit LayoutBlockFlow::positionAndLayoutFloat( |
if (!strut) { |
// If we are unsplittable and don't fit, move to the next page or column |
// if that helps the situation. |
- strut = adjustForUnsplittableChild(childBox, floatLogicalLocation.y()) - |
- floatLogicalLocation.y(); |
+ strut = adjustForUnsplittableChild(childBox, logicalTopMarginEdge) - |
+ logicalTopMarginEdge; |
} |
childBox.setPaginationStrut(strut); |
if (strut) { |
floatLogicalLocation = computeLogicalLocationForFloat( |
- floatingObject, floatLogicalLocation.y() + strut); |
+ floatingObject, logicalTopMarginEdge + strut); |
+ logicalTopMarginEdge = floatLogicalLocation.y(); |
setLogicalLeftForFloat(floatingObject, floatLogicalLocation.x()); |
setLogicalLeftForChild(childBox, |
floatLogicalLocation.x() + childLogicalLeftMargin); |
setLogicalTopForChild( |
- childBox, floatLogicalLocation.y() + marginBeforeForChild(childBox)); |
+ childBox, logicalTopMarginEdge + marginBeforeForChild(childBox)); |
if (childBox.isLayoutBlock()) |
childBox.setChildNeedsLayout(MarkOnlyThis); |
@@ -3712,7 +3717,7 @@ LayoutUnit LayoutBlockFlow::positionAndLayoutFloat( |
} |
} |
- setLogicalTopForFloat(floatingObject, floatLogicalLocation.y()); |
+ setLogicalTopForFloat(floatingObject, logicalTopMarginEdge); |
setLogicalHeightForFloat(floatingObject, logicalHeightForChild(childBox) + |
marginBeforeForChild(childBox) + |
@@ -3721,7 +3726,7 @@ LayoutUnit LayoutBlockFlow::positionAndLayoutFloat( |
if (ShapeOutsideInfo* shapeOutside = childBox.shapeOutsideInfo()) |
shapeOutside->setReferenceBoxLogicalSize(logicalSizeForChild(childBox)); |
- return floatLogicalLocation.y(); |
+ return logicalTopMarginEdge; |
} |
bool LayoutBlockFlow::hasOverhangingFloat(LayoutBox* layoutBox) { |