Modified: trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp (254920 => 254921)
--- trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp 2020-01-22 14:48:42 UTC (rev 254920)
+++ trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp 2020-01-22 15:19:12 UTC (rev 254921)
@@ -118,6 +118,11 @@
auto horizontalConstraints = horizontalConstraintsForLayoutBox(layoutBox);
auto verticalConstraints = verticalConstraintsForLayoutBox(layoutBox);
+ computeBorderAndPadding(layoutBox, horizontalConstraints.containingBlock);
+ computeStaticVerticalPosition(floatingContext, layoutBox, horizontalConstraints, verticalConstraints);
+ computeWidthAndMargin(floatingContext, layoutBox, horizontalConstraints);
+ computeStaticHorizontalPosition(layoutBox, horizontalConstraints);
+
if (layoutBox.establishesFormattingContext()) {
// layoutFormattingContextRoot() takes care of the layoutBox itself and its descendants.
layoutFormattingContextRoot(layoutBox, floatingContext, invalidationState, horizontalConstraints, verticalConstraints);
@@ -126,9 +131,6 @@
break;
continue;
}
- computeBorderAndPadding(layoutBox, horizontalConstraints.containingBlock);
- computeWidthAndMargin(layoutBox, horizontalConstraints);
- computeStaticPosition(floatingContext, layoutBox, horizontalConstraints, verticalConstraints);
if (!appendNextToLayoutQueue(layoutBox, LayoutDirection::Child))
break;
}
@@ -187,44 +189,33 @@
return availableWidth;
}
-void BlockFormattingContext::layoutFormattingContextRoot(const Box& layoutBox, FloatingContext& floatingContext, InvalidationState& invalidationState, const ConstraintsPair<HorizontalConstraints>& horizontalConstraints, const ConstraintsPair<VerticalConstraints>& verticalConstraints)
+void BlockFormattingContext::layoutFormattingContextRoot(const Box& formattingContextRoot, FloatingContext& floatingContext, InvalidationState& invalidationState, const ConstraintsPair<HorizontalConstraints>& horizontalConstraints, const ConstraintsPair<VerticalConstraints>& verticalConstraints)
{
- ASSERT(layoutBox.establishesFormattingContext());
+ ASSERT(formattingContextRoot.establishesFormattingContext());
// Start laying out this formatting root in the formatting contenxt it lives in.
- LOG_WITH_STREAM(FormattingContextLayout, stream << "[Compute] -> [Position][Border][Padding][Width][Margin] -> for layoutBox(" << &layoutBox << ")");
- auto availableWidth = horizontalConstraints.containingBlock.logicalWidth;
- auto horizontalAvailableSpaceIsConstrainedByExistingFloats = layoutBox.isFloatAvoider() && !layoutBox.isFloatingPositioned();
- if (horizontalAvailableSpaceIsConstrainedByExistingFloats) {
- if (auto adjustedAvailableWidth = usedAvailableWidthForFloatAvoider(floatingContext, layoutBox))
- availableWidth = *adjustedAvailableWidth;
- }
- auto adjustedHorizontalConstraints = ConstraintsPair<HorizontalConstraints> { horizontalConstraints.root, { horizontalConstraints.containingBlock.logicalLeft, availableWidth } };
+ LOG_WITH_STREAM(FormattingContextLayout, stream << "[Compute] -> [Position][Border][Padding][Width][Margin] -> for layoutBox(" << &formattingContextRoot << ")");
- computeBorderAndPadding(layoutBox, adjustedHorizontalConstraints.containingBlock);
- computeStaticVerticalPosition(floatingContext, layoutBox, horizontalConstraints, verticalConstraints);
- computeWidthAndMargin(layoutBox, adjustedHorizontalConstraints);
- computeStaticHorizontalPosition(layoutBox, adjustedHorizontalConstraints);
-
- if (is<Container>(layoutBox)) {
+ if (is<Container>(formattingContextRoot)) {
// Swich over to the new formatting context (the one that the root creates).
- auto& rootContainer = downcast<Container>(layoutBox);
+ auto& rootContainer = downcast<Container>(formattingContextRoot);
auto& rootContainerDisplayBox = geometryForBox(rootContainer);
auto formattingContext = LayoutContext::createFormattingContext(rootContainer, layoutState());
formattingContext->layoutInFlowContent(invalidationState, Geometry::horizontalConstraintsForInFlow(rootContainerDisplayBox), Geometry::verticalConstraintsForInFlow(rootContainerDisplayBox));
// Come back and finalize the root's geometry.
- computeHeightAndMargin(rootContainer, adjustedHorizontalConstraints, verticalConstraints);
+ computeHeightAndMargin(rootContainer, horizontalConstraints, verticalConstraints);
// Now that we computed the root's height, we can go back and layout the out-of-flow content.
auto horizontalConstraintsForOutOfFlow = Geometry::horizontalConstraintsForOutOfFlow(rootContainerDisplayBox);
auto verticalConstraintsForOutOfFlow = Geometry::verticalConstraintsForOutOfFlow(rootContainerDisplayBox);
formattingContext->layoutOutOfFlowContent(invalidationState, horizontalConstraintsForOutOfFlow, verticalConstraintsForOutOfFlow);
} else
- computeHeightAndMargin(layoutBox, adjustedHorizontalConstraints, verticalConstraints);
+ computeHeightAndMargin(formattingContextRoot, horizontalConstraints, verticalConstraints);
// Float related final positioning.
- if (layoutBox.isFloatingPositioned()) {
- computeFloatingPosition(floatingContext, layoutBox);
- floatingContext.append(layoutBox);
- } else if (layoutBox.establishesBlockFormattingContext())
- computePositionToAvoidFloats(floatingContext, layoutBox);
+ if (formattingContextRoot.isFloatingPositioned()) {
+ computeFloatingPosition(floatingContext, formattingContextRoot);
+ floatingContext.append(formattingContextRoot);
+ }
+ if (formattingContextRoot.isFloatAvoider())
+ computePositionToAvoidFloats(floatingContext, formattingContextRoot);
}
void BlockFormattingContext::placeInFlowPositionedChildren(const Box& layoutBox, const ConstraintsPair<HorizontalConstraints>& horizontalConstraints)
@@ -387,15 +378,20 @@
formattingState().displayBox(layoutBox).setTopLeft(*adjustedPosition);
}
-void BlockFormattingContext::computeWidthAndMargin(const Box& layoutBox, const ConstraintsPair<HorizontalConstraints>& horizontalConstraints)
+void BlockFormattingContext::computeWidthAndMargin(const FloatingContext& floatingContext, const Box& layoutBox, const ConstraintsPair<HorizontalConstraints>& horizontalConstraints)
{
auto compute = [&](Optional<LayoutUnit> usedWidth) -> ContentWidthAndMargin {
+ if (layoutBox.isFloatingPositioned())
+ return geometry().floatingWidthAndMargin(layoutBox, horizontalConstraints.containingBlock, { usedWidth, { } });
+
+ if (layoutBox.isFloatAvoider()) {
+ auto availableWidth = usedAvailableWidthForFloatAvoider(floatingContext, layoutBox).valueOr(horizontalConstraints.containingBlock.logicalWidth);
+ return geometry().inFlowWidthAndMargin(layoutBox, { horizontalConstraints.containingBlock.logicalLeft, availableWidth }, { usedWidth, { } });
+ }
+
if (layoutBox.isInFlow())
return geometry().inFlowWidthAndMargin(layoutBox, horizontalConstraints.containingBlock, { usedWidth, { } });
- if (layoutBox.isFloatingPositioned())
- return geometry().floatingWidthAndMargin(layoutBox, horizontalConstraints.containingBlock, { usedWidth, { } });
-
ASSERT_NOT_REACHED();
return { };
};
Modified: trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.h (254920 => 254921)
--- trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.h 2020-01-22 14:48:42 UTC (rev 254920)
+++ trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.h 2020-01-22 15:19:12 UTC (rev 254921)
@@ -60,7 +60,7 @@
void layoutFormattingContextRoot(const Box&, FloatingContext&, InvalidationState&, const ConstraintsPair<HorizontalConstraints>&, const ConstraintsPair<VerticalConstraints>&);
void placeInFlowPositionedChildren(const Box&, const ConstraintsPair<HorizontalConstraints>&);
- void computeWidthAndMargin(const Box&, const ConstraintsPair<HorizontalConstraints>&);
+ void computeWidthAndMargin(const FloatingContext&, const Box&, const ConstraintsPair<HorizontalConstraints>&);
void computeHeightAndMargin(const Box&, const ConstraintsPair<HorizontalConstraints>&, const ConstraintsPair<VerticalConstraints>&);
void computeStaticHorizontalPosition(const Box&, const ConstraintsPair<HorizontalConstraints>&);