Title: [260824] trunk/Source/WebCore
Revision
260824
Author
[email protected]
Date
2020-04-28 07:44:42 -0700 (Tue, 28 Apr 2020)

Log Message

[LFC] Introduce FormattingContext::ConstraintsForInFlowContent
https://bugs.webkit.org/show_bug.cgi?id=211113

Reviewed by Antti Koivisto.

This makes the layoutInFlowContent() related code look simpler.

* layout/FormattingContext.cpp:
(WebCore::Layout::FormattingContext::layoutOutOfFlowContent):
* layout/FormattingContext.h:
* layout/LayoutContext.cpp:
(WebCore::Layout::LayoutContext::layoutFormattingContextSubtree):
* layout/blockformatting/BlockFormattingContext.cpp:
(WebCore::Layout::BlockFormattingContext::layoutInFlowContent):
* layout/blockformatting/BlockFormattingContext.h:
* layout/inlineformatting/InlineFormattingContext.cpp:
(WebCore::Layout::InlineFormattingContext::layoutInFlowContent):
(WebCore::Layout::InlineFormattingContext::lineLayout):
* layout/inlineformatting/InlineFormattingContext.h:
* layout/integration/LayoutIntegrationLineLayout.cpp:
(WebCore::LayoutIntegration::LineLayout::layout):
* layout/tableformatting/TableFormattingContext.cpp:
(WebCore::Layout::TableFormattingContext::layoutInFlowContent):
(WebCore::Layout::TableFormattingContext::layoutCell):
* layout/tableformatting/TableFormattingContext.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (260823 => 260824)


--- trunk/Source/WebCore/ChangeLog	2020-04-28 14:34:29 UTC (rev 260823)
+++ trunk/Source/WebCore/ChangeLog	2020-04-28 14:44:42 UTC (rev 260824)
@@ -1,3 +1,31 @@
+2020-04-28  Zalan Bujtas  <[email protected]>
+
+        [LFC] Introduce FormattingContext::ConstraintsForInFlowContent
+        https://bugs.webkit.org/show_bug.cgi?id=211113
+
+        Reviewed by Antti Koivisto.
+
+        This makes the layoutInFlowContent() related code look simpler.
+
+        * layout/FormattingContext.cpp:
+        (WebCore::Layout::FormattingContext::layoutOutOfFlowContent):
+        * layout/FormattingContext.h:
+        * layout/LayoutContext.cpp:
+        (WebCore::Layout::LayoutContext::layoutFormattingContextSubtree):
+        * layout/blockformatting/BlockFormattingContext.cpp:
+        (WebCore::Layout::BlockFormattingContext::layoutInFlowContent):
+        * layout/blockformatting/BlockFormattingContext.h:
+        * layout/inlineformatting/InlineFormattingContext.cpp:
+        (WebCore::Layout::InlineFormattingContext::layoutInFlowContent):
+        (WebCore::Layout::InlineFormattingContext::lineLayout):
+        * layout/inlineformatting/InlineFormattingContext.h:
+        * layout/integration/LayoutIntegrationLineLayout.cpp:
+        (WebCore::LayoutIntegration::LineLayout::layout):
+        * layout/tableformatting/TableFormattingContext.cpp:
+        (WebCore::Layout::TableFormattingContext::layoutInFlowContent):
+        (WebCore::Layout::TableFormattingContext::layoutCell):
+        * layout/tableformatting/TableFormattingContext.h:
+
 2020-04-28  Philippe Normand  <[email protected]>
 
         media/track/track-load-error-readyState.html passes only when accompanied by some other tests

Modified: trunk/Source/WebCore/layout/FormattingContext.cpp (260823 => 260824)


--- trunk/Source/WebCore/layout/FormattingContext.cpp	2020-04-28 14:34:29 UTC (rev 260823)
+++ trunk/Source/WebCore/layout/FormattingContext.cpp	2020-04-28 14:44:42 UTC (rev 260824)
@@ -170,10 +170,8 @@
             auto& containerDisplayBox = geometryForBox(containerBox);
 
             if (containerBox.hasInFlowOrFloatingChild()) {
-                auto horizontalConstraintsForInFlowContent = Geometry::horizontalConstraintsForInFlow(containerDisplayBox);
-                auto verticalConstraintsForInFlowContent = Geometry::verticalConstraintsForInFlow(containerDisplayBox);
                 auto formattingContext = LayoutContext::createFormattingContext(containerBox, layoutState());
-                formattingContext->layoutInFlowContent(invalidationState, horizontalConstraintsForInFlowContent, verticalConstraintsForInFlowContent);
+                formattingContext->layoutInFlowContent(invalidationState, Geometry::constraintsForInFlowContent(containerDisplayBox));
             }
             computeOutOfFlowVerticalGeometry(containerBox, horizontalConstraints, verticalConstraints);
             if (containerBox.hasChild()) {

Modified: trunk/Source/WebCore/layout/FormattingContext.h (260823 => 260824)


--- trunk/Source/WebCore/layout/FormattingContext.h	2020-04-28 14:34:29 UTC (rev 260823)
+++ trunk/Source/WebCore/layout/FormattingContext.h	2020-04-28 14:44:42 UTC (rev 260824)
@@ -65,7 +65,11 @@
     FormattingContext(const ContainerBox& formattingContextRoot, FormattingState&);
     virtual ~FormattingContext();
 
-    virtual void layoutInFlowContent(InvalidationState&, const HorizontalConstraints&, const VerticalConstraints&) = 0;
+    struct ConstraintsForInFlowContent {
+        HorizontalConstraints horizontal;
+        VerticalConstraints vertical;
+    };
+    virtual void layoutInFlowContent(InvalidationState&, const ConstraintsForInFlowContent&) = 0;
     void layoutOutOfFlowContent(InvalidationState&, const OutOfFlowHorizontalConstraints&, const VerticalConstraints&);
 
     struct IntrinsicWidthConstraints {
@@ -148,8 +152,7 @@
 
         static OutOfFlowHorizontalConstraints horizontalConstraintsForOutOfFlow(const Display::Box& containingBlockGeometry);
         static VerticalConstraints verticalConstraintsForOutOfFlow(const Display::Box& containingBlockGeometry);
-        static HorizontalConstraints horizontalConstraintsForInFlow(const Display::Box& containingBlockGeometry);
-        static VerticalConstraints verticalConstraintsForInFlow(const Display::Box& containingBlockGeometry);
+        static FormattingContext::ConstraintsForInFlowContent constraintsForInFlowContent(const Display::Box& containingBlockGeometry);
 
     protected:
         friend class FormattingContext;

Modified: trunk/Source/WebCore/layout/FormattingContextGeometry.cpp (260823 => 260824)


--- trunk/Source/WebCore/layout/FormattingContextGeometry.cpp	2020-04-28 14:34:29 UTC (rev 260823)
+++ trunk/Source/WebCore/layout/FormattingContextGeometry.cpp	2020-04-28 14:44:42 UTC (rev 260824)
@@ -1110,16 +1110,11 @@
     return VerticalConstraints { containingBlockGeometry.paddingBoxTop(), containingBlockGeometry.paddingBoxHeight() };
 }
 
-HorizontalConstraints FormattingContext::Geometry::horizontalConstraintsForInFlow(const Display::Box& containingBlockGeometry)
+FormattingContext::ConstraintsForInFlowContent FormattingContext::Geometry::constraintsForInFlowContent(const Display::Box& containingBlockGeometry)
 {
-    return HorizontalConstraints { containingBlockGeometry.contentBoxLeft(), containingBlockGeometry.contentBoxWidth() };
+    return { { containingBlockGeometry.contentBoxLeft(), containingBlockGeometry.contentBoxWidth() }, { containingBlockGeometry.contentBoxTop(), { } } };
 }
 
-VerticalConstraints FormattingContext::Geometry::verticalConstraintsForInFlow(const Display::Box& containingBlockGeometry)
-{
-    return VerticalConstraints { containingBlockGeometry.contentBoxTop(), { } };
 }
-
 }
-}
 #endif

Modified: trunk/Source/WebCore/layout/FormattingContextQuirks.cpp (260823 => 260824)


--- trunk/Source/WebCore/layout/FormattingContextQuirks.cpp	2020-04-28 14:34:29 UTC (rev 260823)
+++ trunk/Source/WebCore/layout/FormattingContextQuirks.cpp	2020-04-28 14:44:42 UTC (rev 260824)
@@ -53,7 +53,7 @@
             auto& boxGeometry = formattingContext.geometryForBox(*containingBlock, FormattingContext::EscapeReason::FindFixedHeightAncestorQuirk);
 
             auto& containingBlockDisplayBox = formattingContext.geometryForBox(containingBlock->containingBlock(), FormattingContext::EscapeReason::FindFixedHeightAncestorQuirk);
-            auto horizontalConstraints = Geometry::horizontalConstraintsForInFlow(containingBlockDisplayBox);
+            auto horizontalConstraints = Geometry::constraintsForInFlowContent(containingBlockDisplayBox).horizontal;
             auto verticalMargin = formattingContext.geometry().computedVerticalMargin(*containingBlock, horizontalConstraints);
             auto verticalPadding = boxGeometry.paddingTop().valueOr(0) + boxGeometry.paddingBottom().valueOr(0);
             auto verticalBorder = boxGeometry.borderTop() + boxGeometry.borderBottom();

Modified: trunk/Source/WebCore/layout/LayoutContext.cpp (260823 => 260824)


--- trunk/Source/WebCore/layout/LayoutContext.cpp	2020-04-28 14:34:29 UTC (rev 260823)
+++ trunk/Source/WebCore/layout/LayoutContext.cpp	2020-04-28 14:44:42 UTC (rev 260824)
@@ -99,9 +99,8 @@
     auto& displayBox = layoutState().displayBoxForLayoutBox(formattingContextRoot);
 
     if (formattingContextRoot.hasInFlowOrFloatingChild()) {
-        auto horizontalConstraints = HorizontalConstraints { displayBox.contentBoxLeft(), displayBox.contentBoxWidth() };
-        auto verticalConstraints = VerticalConstraints { displayBox.contentBoxTop(), { } };
-        formattingContext->layoutInFlowContent(invalidationState, horizontalConstraints, verticalConstraints);
+        auto constraintsForInFlowContent = FormattingContext::ConstraintsForInFlowContent { { displayBox.contentBoxLeft(), displayBox.contentBoxWidth() }, { displayBox.contentBoxTop(), { } } };
+        formattingContext->layoutInFlowContent(invalidationState, constraintsForInFlowContent);
     }
 
     // FIXME: layoutFormattingContextSubtree() does not perform layout on the root, rather it lays out the root's content.

Modified: trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp (260823 => 260824)


--- trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp	2020-04-28 14:34:29 UTC (rev 260823)
+++ trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp	2020-04-28 14:44:42 UTC (rev 260824)
@@ -52,7 +52,7 @@
 {
 }
 
-void BlockFormattingContext::layoutInFlowContent(InvalidationState& invalidationState, const HorizontalConstraints& rootHorizontalConstraints, const VerticalConstraints& rootVerticalConstraints)
+void BlockFormattingContext::layoutInFlowContent(InvalidationState& invalidationState, const ConstraintsForInFlowContent& constraints)
 {
     // 9.4.1 Block formatting contexts
     // In a block formatting context, boxes are laid out one after the other, vertically, beginning at the top of a containing block.
@@ -91,20 +91,13 @@
         return false;
     };
 
-    auto horizontalConstraintsForLayoutBox = [&] (const auto& layoutBox) {
+    auto constraintsForLayoutBox = [&] (const auto& layoutBox) {
         auto& containingBlock = layoutBox.containingBlock();
         if (&containingBlock == &formattingRoot)
-            return rootHorizontalConstraints;
-        return Geometry::horizontalConstraintsForInFlow(geometryForBox(containingBlock));
+            return constraints;
+        return Geometry::constraintsForInFlowContent(geometryForBox(containingBlock));
     };
 
-    auto verticalConstraintsForLayoutBox = [&] (const auto& layoutBox) {
-        auto& containingBlock = layoutBox.containingBlock();
-        if (&containingBlock == &formattingRoot)
-            return rootVerticalConstraints;
-        return Geometry::verticalConstraintsForInFlow(geometryForBox(containingBlock));
-    };
-
     // This is a post-order tree traversal layout.
     // The root container layout is done in the formatting context it lives in, not that one it creates, so let's start with the first child.
     appendNextToLayoutQueue(formattingRoot, LayoutDirection::Child);
@@ -116,16 +109,13 @@
         // Traverse down on the descendants and compute width/static position until we find a leaf node.
         while (true) {
             auto& layoutBox = *layoutQueue.last();
-            auto horizontalConstraints = horizontalConstraintsForLayoutBox(layoutBox);
-            auto verticalConstraints = verticalConstraintsForLayoutBox(layoutBox);
+            auto containingBlockConstraints = constraintsForLayoutBox(layoutBox);
 
-            computeBorderAndPadding(layoutBox, horizontalConstraints);
-            computeStaticVerticalPosition(layoutBox, verticalConstraints);
+            computeBorderAndPadding(layoutBox, containingBlockConstraints.horizontal);
+            computeStaticVerticalPosition(layoutBox, containingBlockConstraints.vertical);
 
-            auto horizontalConstraintsPair = ConstraintsPair<HorizontalConstraints> { rootHorizontalConstraints, horizontalConstraints };
-            auto verticalConstraintsPair = ConstraintsPair<VerticalConstraints> { rootVerticalConstraints, verticalConstraints };
-            computeWidthAndMargin(floatingContext, layoutBox, horizontalConstraintsPair, verticalConstraintsPair);
-            computeStaticHorizontalPosition(layoutBox, horizontalConstraints);
+            computeWidthAndMargin(floatingContext, layoutBox, { constraints, containingBlockConstraints });
+            computeStaticHorizontalPosition(layoutBox, containingBlockConstraints.horizontal);
 
             if (layoutBox.establishesFormattingContext()) {
                 if (is<ContainerBox>(layoutBox) && downcast<ContainerBox>(layoutBox).hasInFlowOrFloatingChild()) {
@@ -132,7 +122,7 @@
                     auto& containerBox = downcast<ContainerBox>(layoutBox);
                     if (containerBox.establishesInlineFormattingContext()) {
                         // IFCs inherit floats from parent FCs. We need final vertical position to find intruding floats.
-                        precomputeVerticalPositionForBoxAndAncestors(containerBox, horizontalConstraintsPair, verticalConstraintsPair);
+                        precomputeVerticalPositionForBoxAndAncestors(containerBox, { constraints, containingBlockConstraints });
                         if (containerBox.hasFloatClear()) {
                             // Roots with clear set are special because they both inherit floats but avoid them the same time. 
                             // If we just let the root sit at the pre-computed static vertical position, we might find unrelated
@@ -140,11 +130,8 @@
                             computeVerticalPositionForFloatClear(floatingContext, containerBox);
                         }
                     }
-                    auto& rootDisplayBox = geometryForBox(containerBox);
-                    auto horizontalConstraintsForInFlowContent = Geometry::horizontalConstraintsForInFlow(rootDisplayBox);
-                    auto verticalConstraintsForInFlowContent = Geometry::verticalConstraintsForInFlow(rootDisplayBox);
                     // Layout the inflow descendants of this formatting context root.
-                    LayoutContext::createFormattingContext(containerBox, layoutState())->layoutInFlowContent(invalidationState, horizontalConstraintsForInFlowContent, verticalConstraintsForInFlowContent);
+                    LayoutContext::createFormattingContext(containerBox, layoutState())->layoutInFlowContent(invalidationState, Geometry::constraintsForInFlowContent(geometryForBox(containerBox)));
                 }
                 break;
             }
@@ -155,11 +142,10 @@
         // Climb back on the ancestors and compute height/final position.
         while (!layoutQueue.isEmpty()) {
             auto& layoutBox = *layoutQueue.takeLast();
-            auto horizontalConstraints = horizontalConstraintsForLayoutBox(layoutBox);
-            auto verticalConstraints = verticalConstraintsForLayoutBox(layoutBox);
+            auto containingBlockConstraints = constraintsForLayoutBox(layoutBox);
 
             // All inflow descendants (if there are any) are laid out by now. Let's compute the box's height.
-            computeHeightAndMargin(layoutBox, horizontalConstraints, verticalConstraints);
+            computeHeightAndMargin(layoutBox, containingBlockConstraints);
 
             auto establishesFormattingContext = layoutBox.establishesFormattingContext(); 
             if (establishesFormattingContext) {
@@ -174,14 +160,12 @@
             }
             // Resolve final positions.
             if (layoutBox.isFloatAvoider()) {
-                auto horizontalConstraintsPair = ConstraintsPair<HorizontalConstraints> { rootHorizontalConstraints, horizontalConstraints };
-                auto verticalConstraintsPair = ConstraintsPair<VerticalConstraints> { rootVerticalConstraints, verticalConstraints };
-                computePositionToAvoidFloats(floatingContext, layoutBox, horizontalConstraintsPair, verticalConstraintsPair);
+                computePositionToAvoidFloats(floatingContext, layoutBox, { constraints, containingBlockConstraints });
                 if (layoutBox.isFloatingPositioned())
                     floatingContext.append(layoutBox);
             }
             if (!establishesFormattingContext && is<ContainerBox>(layoutBox))
-                placeInFlowPositionedChildren(downcast<ContainerBox>(layoutBox), horizontalConstraints);
+                placeInFlowPositionedChildren(downcast<ContainerBox>(layoutBox), containingBlockConstraints.horizontal);
 
             if (appendNextToLayoutQueue(layoutBox, LayoutDirection::Sibling))
                 break;
@@ -188,11 +172,11 @@
         }
     }
     // Place the inflow positioned children.
-    placeInFlowPositionedChildren(formattingRoot, rootHorizontalConstraints);
+    placeInFlowPositionedChildren(formattingRoot, constraints.horizontal);
     LOG_WITH_STREAM(FormattingContextLayout, stream << "[End] -> block formatting context -> formatting root(" << &root() << ")");
 }
 
-Optional<LayoutUnit> BlockFormattingContext::usedAvailableWidthForFloatAvoider(const FloatingContext& floatingContext, const Box& layoutBox, const ConstraintsPair<HorizontalConstraints>& horizontalConstraints, const ConstraintsPair<VerticalConstraints>& verticalConstraints)
+Optional<LayoutUnit> BlockFormattingContext::usedAvailableWidthForFloatAvoider(const FloatingContext& floatingContext, const Box& layoutBox, const ConstraintsPair& constraintsPair)
 {
     // Normally the available width for an in-flow block level box is the width of the containing block's content box.
     // However (and can't find it anywhere in the spec) non-floating positioned float avoider block level boxes are constrained by existing floats.
@@ -206,7 +190,7 @@
 
     ASSERT(layoutBox.establishesFormattingContext());
     // Vertical static position is not computed yet for this formatting context root, so let's just pre-compute it for now.
-    precomputeVerticalPositionForBoxAndAncestors(layoutBox, horizontalConstraints, verticalConstraints);
+    precomputeVerticalPositionForBoxAndAncestors(layoutBox, constraintsPair);
 
     auto mapLogicalTopToFormattingContextRoot = [&] {
         auto& formattingContextRoot = root();
@@ -223,12 +207,12 @@
     if (!constraints.left && !constraints.right)
         return { };
     // Shrink the available space if the floats are actually intruding at this vertical position.
-    auto availableWidth = horizontalConstraints.containingBlock.logicalWidth;
+    auto availableWidth = constraintsPair.containingBlock.horizontal.logicalWidth;
     if (constraints.left)
         availableWidth -= constraints.left->x;
     if (constraints.right) {
         // FIXME: Map the logicalRight to the root's coordinate system.
-        availableWidth -= std::max(0_lu, horizontalConstraints.containingBlock.logicalRight() - constraints.right->x);
+        availableWidth -= std::max(0_lu, constraintsPair.containingBlock.horizontal.logicalRight() - constraints.right->x);
     }
     return availableWidth;
 }
@@ -255,13 +239,13 @@
     formattingState().displayBox(layoutBox).setLeft(geometry().staticHorizontalPosition(layoutBox, horizontalConstraints));
 }
 
-void BlockFormattingContext::precomputeVerticalPositionForAncestors(const Box& layoutBox, const ConstraintsPair<HorizontalConstraints>& horizontalConstraints, const ConstraintsPair<VerticalConstraints>& verticalConstraints)
+void BlockFormattingContext::precomputeVerticalPositionForAncestors(const Box& layoutBox, const ConstraintsPair& constraintsPair)
 {
     ASSERT(layoutBox.isFloatAvoider());
-    precomputeVerticalPositionForBoxAndAncestors(layoutBox.containingBlock(), horizontalConstraints, verticalConstraints);
+    precomputeVerticalPositionForBoxAndAncestors(layoutBox.containingBlock(), constraintsPair);
 }
 
-void BlockFormattingContext::precomputeVerticalPositionForBoxAndAncestors(const Box& layoutBox, const ConstraintsPair<HorizontalConstraints>& horizontalConstraints, const ConstraintsPair<VerticalConstraints>& verticalConstraints)
+void BlockFormattingContext::precomputeVerticalPositionForBoxAndAncestors(const Box& layoutBox, const ConstraintsPair& constraintsPair)
 {
     // In order to figure out whether a box should avoid a float, we need to know the final positions of both (ignore relative positioning for now).
     // In block formatting context the final position for a normal flow box includes
@@ -274,16 +258,12 @@
     // The idea here is that as long as we don't cross the block formatting context boundary, we should be able to pre-compute the final top position.
     // FIXME: we currently don't account for the "clear" property when computing the final position for an ancestor.
     for (auto* ancestor = &layoutBox; ancestor && ancestor != &root(); ancestor = &ancestor->containingBlock()) {
-        auto horizontalConstraintsForAncestor = [&] {
+        auto constraintsForAncestor = [&] {
             auto& containingBlock = ancestor->containingBlock();
-            return &containingBlock == &root() ? horizontalConstraints.root : Geometry::horizontalConstraintsForInFlow(geometryForBox(containingBlock));
-        };
-        auto verticalConstraintsForAncestor = [&] {
-            auto& containingBlock = ancestor->containingBlock();
-            return &containingBlock == &root() ? verticalConstraints.root : Geometry::verticalConstraintsForInFlow(geometryForBox(containingBlock));
-        };
+            return &containingBlock == &root() ? constraintsPair.formattingContextRoot : Geometry::constraintsForInFlowContent(geometryForBox(containingBlock));
+        }();
 
-        auto computedVerticalMargin = geometry().computedVerticalMargin(*ancestor, horizontalConstraintsForAncestor());
+        auto computedVerticalMargin = geometry().computedVerticalMargin(*ancestor, constraintsForAncestor.horizontal);
         auto usedNonCollapsedMargin = UsedVerticalMargin::NonCollapsedValues { computedVerticalMargin.before.valueOr(0), computedVerticalMargin.after.valueOr(0) };
         auto precomputedMarginBefore = marginCollapse().precomputedMarginBefore(*ancestor, usedNonCollapsedMargin);
         formattingState().setPositiveAndNegativeVerticalMargin(*ancestor, { precomputedMarginBefore.positiveAndNegativeMarginBefore, { } });
@@ -293,7 +273,7 @@
         auto collapsedValues = UsedVerticalMargin::CollapsedValues { precomputedMarginBefore.collapsedValue, { }, false };
         auto verticalMargin = UsedVerticalMargin { nonCollapsedValues, collapsedValues };
         displayBox.setVerticalMargin(verticalMargin);
-        displayBox.setTop(verticalPositionWithMargin(*ancestor, verticalMargin, verticalConstraintsForAncestor()));
+        displayBox.setTop(verticalPositionWithMargin(*ancestor, verticalMargin, constraintsForAncestor.vertical));
 #if ASSERT_ENABLED
         setPrecomputedMarginBefore(*ancestor, precomputedMarginBefore);
         displayBox.setHasPrecomputedMarginBefore();
@@ -301,7 +281,7 @@
     }
 }
 
-void BlockFormattingContext::computePositionToAvoidFloats(const FloatingContext& floatingContext, const Box& layoutBox, const ConstraintsPair<HorizontalConstraints>& horizontalConstraints, const ConstraintsPair<VerticalConstraints>& verticalConstraints)
+void BlockFormattingContext::computePositionToAvoidFloats(const FloatingContext& floatingContext, const Box& layoutBox, const ConstraintsPair& constraintsPair)
 {
     ASSERT(layoutBox.isFloatAvoider());
     // In order to position a float avoider we need to know its vertical position relative to its formatting context root (and not just its containing block),
@@ -309,14 +289,14 @@
     // to a different set of containing blocks (but they all descendants of the BFC root).
     // However according to the BFC rules, at this point of the layout flow we don't yet have computed vertical positions for the ancestors.
     if (layoutBox.isFloatingPositioned()) {
-        precomputeVerticalPositionForAncestors(layoutBox, horizontalConstraints, verticalConstraints);
-        formattingState().displayBox(layoutBox).setTopLeft(floatingContext.positionForFloat(layoutBox, horizontalConstraints.containingBlock));
+        precomputeVerticalPositionForAncestors(layoutBox, constraintsPair);
+        formattingState().displayBox(layoutBox).setTopLeft(floatingContext.positionForFloat(layoutBox, constraintsPair.containingBlock.horizontal));
         return;
     }
     // Non-float positioned float avoiders (formatting context roots and clear boxes) should be fine unless there are floats in this context.
     if (floatingContext.isEmpty())
         return;
-    precomputeVerticalPositionForAncestors(layoutBox, horizontalConstraints, verticalConstraints);
+    precomputeVerticalPositionForAncestors(layoutBox, constraintsPair);
     if (layoutBox.hasFloatClear())
         return computeVerticalPositionForFloatClear(floatingContext, layoutBox);
 
@@ -344,9 +324,9 @@
     // FIXME: Reset the margin values on the ancestors/previous siblings now that the float avoider with clearance does not margin collapse anymore.
 }
 
-void BlockFormattingContext::computeWidthAndMargin(const FloatingContext& floatingContext, const Box& layoutBox, const ConstraintsPair<HorizontalConstraints>& horizontalConstraintsPair, const ConstraintsPair<VerticalConstraints>& verticalConstraintsPair)
+void BlockFormattingContext::computeWidthAndMargin(const FloatingContext& floatingContext, const Box& layoutBox, const ConstraintsPair& constraintsPair)
 {
-    auto& horizontalConstraints = horizontalConstraintsPair.containingBlock; 
+    auto& horizontalConstraints = constraintsPair.containingBlock.horizontal; 
     auto compute = [&](Optional<LayoutUnit> usedWidth) -> ContentWidthAndMargin {
         if (layoutBox.isFloatingPositioned())
             return geometry().floatingWidthAndMargin(layoutBox, horizontalConstraints, { usedWidth, { } });
@@ -354,7 +334,7 @@
         if (layoutBox.isFloatAvoider()) {
             auto availableWidth = horizontalConstraints.logicalWidth;
             if (layoutBox.style().logicalWidth().isAuto())
-                availableWidth = usedAvailableWidthForFloatAvoider(floatingContext, layoutBox, horizontalConstraintsPair, verticalConstraintsPair).valueOr(availableWidth);
+                availableWidth = usedAvailableWidthForFloatAvoider(floatingContext, layoutBox, constraintsPair).valueOr(availableWidth);
             return geometry().inFlowWidthAndMargin(layoutBox, { horizontalConstraints.logicalLeft, availableWidth }, { usedWidth, { } });
         }
 
@@ -385,14 +365,14 @@
     displayBox.setHorizontalComputedMargin(contentWidthAndMargin.computedMargin);
 }
 
-void BlockFormattingContext::computeHeightAndMargin(const Box& layoutBox, const HorizontalConstraints& horizontalConstraints, const VerticalConstraints& verticalConstraints)
+void BlockFormattingContext::computeHeightAndMargin(const Box& layoutBox, const ConstraintsForInFlowContent& constraints)
 {
     auto compute = [&](Optional<LayoutUnit> usedHeight) -> ContentHeightAndMargin {
         if (layoutBox.isInFlow())
-            return geometry().inFlowHeightAndMargin(layoutBox, horizontalConstraints, { usedHeight });
+            return geometry().inFlowHeightAndMargin(layoutBox, constraints.horizontal, { usedHeight });
 
         if (layoutBox.isFloatingPositioned())
-            return geometry().floatingHeightAndMargin(layoutBox, horizontalConstraints, { usedHeight });
+            return geometry().floatingHeightAndMargin(layoutBox, constraints.horizontal, { usedHeight });
 
         ASSERT_NOT_REACHED();
         return { };
@@ -449,7 +429,7 @@
     }
 #endif
     auto& displayBox = formattingState().displayBox(layoutBox);
-    displayBox.setTop(verticalPositionWithMargin(layoutBox, verticalMargin, verticalConstraints));
+    displayBox.setTop(verticalPositionWithMargin(layoutBox, verticalMargin, constraints.vertical));
     displayBox.setContentBoxHeight(contentHeightAndMargin.contentHeight);
     displayBox.setVerticalMargin(verticalMargin);
     // Adjust the previous sibling's margin bottom now that this box's vertical margin is computed.

Modified: trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.h (260823 => 260824)


--- trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.h	2020-04-28 14:34:29 UTC (rev 260823)
+++ trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.h	2020-04-28 14:44:42 UTC (rev 260824)
@@ -48,27 +48,26 @@
 public:
     BlockFormattingContext(const ContainerBox& formattingContextRoot, BlockFormattingState&);
 
-    void layoutInFlowContent(InvalidationState&, const HorizontalConstraints&, const VerticalConstraints&) override;
+    void layoutInFlowContent(InvalidationState&, const ConstraintsForInFlowContent&) override;
 
 private:
 
-    template<typename T>
     struct ConstraintsPair {
-        const T root;
-        const T containingBlock;
+        const ConstraintsForInFlowContent formattingContextRoot;
+        const ConstraintsForInFlowContent containingBlock;
     };
     void placeInFlowPositionedChildren(const ContainerBox&, const HorizontalConstraints&);
 
-    void computeWidthAndMargin(const FloatingContext&, const Box&, const ConstraintsPair<HorizontalConstraints>&, const ConstraintsPair<VerticalConstraints>&);
-    void computeHeightAndMargin(const Box&, const HorizontalConstraints&, const VerticalConstraints&);
+    void computeWidthAndMargin(const FloatingContext&, const Box&, const ConstraintsPair&);
+    void computeHeightAndMargin(const Box&, const ConstraintsForInFlowContent&);
 
     void computeStaticHorizontalPosition(const Box&, const HorizontalConstraints&);
     void computeStaticVerticalPosition(const Box&, const VerticalConstraints&);
-    void computePositionToAvoidFloats(const FloatingContext&, const Box&, const ConstraintsPair<HorizontalConstraints>&, const ConstraintsPair<VerticalConstraints>&);
+    void computePositionToAvoidFloats(const FloatingContext&, const Box&, const ConstraintsPair&);
     void computeVerticalPositionForFloatClear(const FloatingContext&, const Box&);
 
-    void precomputeVerticalPositionForAncestors(const Box&, const ConstraintsPair<HorizontalConstraints>&, const ConstraintsPair<VerticalConstraints>&);
-    void precomputeVerticalPositionForBoxAndAncestors(const Box&, const ConstraintsPair<HorizontalConstraints>&, const ConstraintsPair<VerticalConstraints>&);
+    void precomputeVerticalPositionForAncestors(const Box&, const ConstraintsPair&);
+    void precomputeVerticalPositionForBoxAndAncestors(const Box&, const ConstraintsPair&);
 
     IntrinsicWidthConstraints computedIntrinsicWidthConstraints() override;
     LayoutUnit verticalPositionWithMargin(const Box&, const UsedVerticalMargin&, const VerticalConstraints&) const;
@@ -167,7 +166,7 @@
     };
     BlockFormattingContext::Quirks quirks() const { return Quirks(*this); }
 
-    Optional<LayoutUnit> usedAvailableWidthForFloatAvoider(const FloatingContext&, const Box&, const ConstraintsPair<HorizontalConstraints>&, const ConstraintsPair<VerticalConstraints>&);
+    Optional<LayoutUnit> usedAvailableWidthForFloatAvoider(const FloatingContext&, const Box&, const ConstraintsPair&);
 
     const BlockFormattingState& formattingState() const { return downcast<BlockFormattingState>(FormattingContext::formattingState()); }
     BlockFormattingState& formattingState() { return downcast<BlockFormattingState>(FormattingContext::formattingState()); }

Modified: trunk/Source/WebCore/layout/blockformatting/BlockFormattingContextQuirks.cpp (260823 => 260824)


--- trunk/Source/WebCore/layout/blockformatting/BlockFormattingContextQuirks.cpp	2020-04-28 14:34:29 UTC (rev 260823)
+++ trunk/Source/WebCore/layout/blockformatting/BlockFormattingContextQuirks.cpp	2020-04-28 14:44:42 UTC (rev 260824)
@@ -91,7 +91,7 @@
     bodyBoxContentHeight -= documentBoxGeometry.verticalBorder() + documentBoxGeometry.verticalPadding().valueOr(0);
     // However the non-in-flow document box's vertical margins are ignored. They don't affect the body box's content height.
     if (documentBox.isInFlow()) {
-        auto precomputeDocumentBoxVerticalMargin = formattingContext.geometry().computedVerticalMargin(documentBox, Geometry::horizontalConstraintsForInFlow(initialContainingBlockGeometry));
+        auto precomputeDocumentBoxVerticalMargin = formattingContext.geometry().computedVerticalMargin(documentBox, Geometry::constraintsForInFlowContent(initialContainingBlockGeometry).horizontal);
         bodyBoxContentHeight -= precomputeDocumentBoxVerticalMargin.before.valueOr(0) + precomputeDocumentBoxVerticalMargin.after.valueOr(0);
     }
     return std::max(contentHeightAndMargin.contentHeight,  bodyBoxContentHeight);

Modified: trunk/Source/WebCore/layout/blockformatting/PrecomputedBlockMarginCollapse.cpp (260823 => 260824)


--- trunk/Source/WebCore/layout/blockformatting/PrecomputedBlockMarginCollapse.cpp	2020-04-28 14:34:29 UTC (rev 260823)
+++ trunk/Source/WebCore/layout/blockformatting/PrecomputedBlockMarginCollapse.cpp	2020-04-28 14:44:42 UTC (rev 260824)
@@ -44,7 +44,7 @@
     if (blockFormattingState.hasPositiveAndNegativeVerticalMargin(layoutBox))
         return blockFormattingState.positiveAndNegativeVerticalMargin(layoutBox).before;
 
-    auto horizontalConstraints = Geometry::horizontalConstraintsForInFlow(formattingContext().geometryForBox(layoutBox.containingBlock()));
+    auto horizontalConstraints = Geometry::constraintsForInFlowContent(formattingContext().geometryForBox(layoutBox.containingBlock())).horizontal;
     auto computedVerticalMargin = formattingContext().geometry().computedVerticalMargin(layoutBox, horizontalConstraints);
     auto nonCollapsedMargin = UsedVerticalMargin::NonCollapsedValues { computedVerticalMargin.before.valueOr(0), computedVerticalMargin.after.valueOr(0) };
     return precomputedPositiveNegativeMarginBefore(layoutBox, nonCollapsedMargin);

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp (260823 => 260824)


--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp	2020-04-28 14:34:29 UTC (rev 260823)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp	2020-04-28 14:44:42 UTC (rev 260824)
@@ -76,7 +76,7 @@
     return nullptr;
 }
 
-void InlineFormattingContext::layoutInFlowContent(InvalidationState& invalidationState, const HorizontalConstraints& horizontalConstraints, const VerticalConstraints& verticalConstraints)
+void InlineFormattingContext::layoutInFlowContent(InvalidationState& invalidationState, const ConstraintsForInFlowContent& constraints)
 {
     LOG_WITH_STREAM(FormattingContextLayout, stream << "[Start] -> inline formatting context -> formatting root(" << &root() << ")");
     ASSERT(root().hasInFlowOrFloatingChild());
@@ -93,35 +93,33 @@
             if (is<ContainerBox>(layoutBox) && layoutBox->establishesFormattingContext()) {
                 ASSERT(layoutBox->isInlineBlockBox() || layoutBox->isInlineTableBox() || layoutBox->isFloatingPositioned());
                 auto& containerBox = downcast<ContainerBox>(*layoutBox);
-                computeBorderAndPadding(containerBox, horizontalConstraints);
-                computeWidthAndMargin(containerBox, horizontalConstraints);
+                computeBorderAndPadding(containerBox, constraints.horizontal);
+                computeWidthAndMargin(containerBox, constraints.horizontal);
 
-                auto& rootDisplayBox = geometryForBox(containerBox);
+                auto& formattingRootDisplayBox = geometryForBox(containerBox);
                 if (containerBox.hasInFlowOrFloatingChild()) {
-                    auto horizontalConstraintsForInFlowContent = Geometry::horizontalConstraintsForInFlow(rootDisplayBox);
-                    auto verticalConstraintsForInFlowContent = Geometry::verticalConstraintsForInFlow(rootDisplayBox);
                     auto formattingContext = LayoutContext::createFormattingContext(containerBox, layoutState());
-                    formattingContext->layoutInFlowContent(invalidationState, horizontalConstraintsForInFlowContent, verticalConstraintsForInFlowContent);
+                    formattingContext->layoutInFlowContent(invalidationState, Geometry::constraintsForInFlowContent(formattingRootDisplayBox));
                 }
-                computeHeightAndMargin(containerBox, horizontalConstraints);
+                computeHeightAndMargin(containerBox, constraints.horizontal);
                 if (containerBox.hasChild()) {
-                    auto horizontalConstraintsForOutOfFlow = Geometry::horizontalConstraintsForOutOfFlow(rootDisplayBox);
-                    auto verticalConstraintsForOutOfFlow = Geometry::verticalConstraintsForOutOfFlow(rootDisplayBox);
+                    auto horizontalConstraintsForOutOfFlow = Geometry::horizontalConstraintsForOutOfFlow(formattingRootDisplayBox);
+                    auto verticalConstraintsForOutOfFlow = Geometry::verticalConstraintsForOutOfFlow(formattingRootDisplayBox);
                     auto formattingContext = LayoutContext::createFormattingContext(containerBox, layoutState());
                     formattingContext->layoutOutOfFlowContent(invalidationState, horizontalConstraintsForOutOfFlow, verticalConstraintsForOutOfFlow);
                 }
             } else {
                 // Replaced and other type of leaf atomic inline boxes.
-                computeBorderAndPadding(*layoutBox, horizontalConstraints);
-                computeWidthAndMargin(*layoutBox, horizontalConstraints);
-                computeHeightAndMargin(*layoutBox, horizontalConstraints);
+                computeBorderAndPadding(*layoutBox, constraints.horizontal);
+                computeWidthAndMargin(*layoutBox, constraints.horizontal);
+                computeHeightAndMargin(*layoutBox, constraints.horizontal);
             }
         } else if (layoutBox->isInlineBox()) {
             // Text wrapper boxes (anonymous inline level boxes) and <br>s don't generate display boxes (only display runs).
             if (!layoutBox->isInlineTextBox() && !layoutBox->isLineBreakBox()) {
                 // Inline boxes (<span>) can't get sized/positioned yet. At this point we can only compute their margins, borders and paddings.
-                computeBorderAndPadding(*layoutBox, horizontalConstraints);
-                computeHorizontalMargin(*layoutBox, horizontalConstraints);
+                computeBorderAndPadding(*layoutBox, constraints.horizontal);
+                computeHorizontalMargin(*layoutBox, constraints.horizontal);
                 formattingState().displayBox(*layoutBox).setVerticalMargin({ { }, { } });
             }
         } else
@@ -133,13 +131,13 @@
     collectInlineContentIfNeeded();
 
     auto& inlineItems = formattingState().inlineItems();
-    lineLayout(inlineItems, { 0, inlineItems.size() }, horizontalConstraints, verticalConstraints);
+    lineLayout(inlineItems, { 0, inlineItems.size() }, constraints);
     LOG_WITH_STREAM(FormattingContextLayout, stream << "[End] -> inline formatting context -> formatting root(" << &root() << ")");
 }
 
-void InlineFormattingContext::lineLayout(InlineItems& inlineItems, LineLayoutContext::InlineItemRange layoutRange, const HorizontalConstraints& horizontalConstraints, const VerticalConstraints& verticalConstraints)
+void InlineFormattingContext::lineLayout(InlineItems& inlineItems, LineLayoutContext::InlineItemRange layoutRange, const ConstraintsForInFlowContent& constraints)
 {
-    auto lineLogicalTop = verticalConstraints.logicalTop;
+    auto lineLogicalTop = constraints.vertical.logicalTop;
     struct PreviousLineEnd {
         unsigned runIndex;
         Optional<unsigned> overflowContentLength;
@@ -149,9 +147,9 @@
     auto lineLayoutContext = LineLayoutContext { *this, root(), inlineItems };
 
     while (!layoutRange.isEmpty()) {
-        lineBuilder.initialize(constraintsForLine(horizontalConstraints, lineLogicalTop));
+        lineBuilder.initialize(constraintsForLine(constraints.horizontal, lineLogicalTop));
         auto lineContent = lineLayoutContext.layoutLine(lineBuilder, layoutRange, previousLineEnd ? previousLineEnd->overflowContentLength : WTF::nullopt);
-        setDisplayBoxesForLine(lineContent, horizontalConstraints);
+        setDisplayBoxesForLine(lineContent, constraints.horizontal);
 
         if (lineContent.trailingInlineItemIndex) {
             lineLogicalTop = lineContent.lineBox.logicalBottom();

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h (260823 => 260824)


--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h	2020-04-28 14:34:29 UTC (rev 260823)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h	2020-04-28 14:44:42 UTC (rev 260824)
@@ -43,7 +43,7 @@
     WTF_MAKE_ISO_ALLOCATED(InlineFormattingContext);
 public:
     InlineFormattingContext(const ContainerBox& formattingContextRoot, InlineFormattingState&);
-    void layoutInFlowContent(InvalidationState&, const HorizontalConstraints&, const VerticalConstraints&) override;
+    void layoutInFlowContent(InvalidationState&, const ConstraintsForInFlowContent&) override;
 
 private:
     IntrinsicWidthConstraints computedIntrinsicWidthConstraints() override;
@@ -77,7 +77,7 @@
     };
     InlineFormattingContext::Geometry geometry() const { return Geometry(*this); }
 
-    void lineLayout(InlineItems&, LineLayoutContext::InlineItemRange, const HorizontalConstraints&, const VerticalConstraints&);
+    void lineLayout(InlineItems&, LineLayoutContext::InlineItemRange, const ConstraintsForInFlowContent&);
 
     void computeIntrinsicWidthForFormattingRoot(const Box&);
     InlineLayoutUnit computedIntrinsicWidthForConstraint(InlineLayoutUnit availableWidth) const;

Modified: trunk/Source/WebCore/layout/integration/LayoutIntegrationLineLayout.cpp (260823 => 260824)


--- trunk/Source/WebCore/layout/integration/LayoutIntegrationLineLayout.cpp	2020-04-28 14:34:29 UTC (rev 260823)
+++ trunk/Source/WebCore/layout/integration/LayoutIntegrationLineLayout.cpp	2020-04-28 14:44:42 UTC (rev 260824)
@@ -110,7 +110,7 @@
     auto horizontalConstraints = Layout::HorizontalConstraints { m_flow.borderAndPaddingStart(), m_flow.contentSize().width() };
     auto verticalConstraints = Layout::VerticalConstraints { m_flow.borderAndPaddingBefore(), { } };
 
-    inlineFormattingContext.layoutInFlowContent(invalidationState, horizontalConstraints, verticalConstraints);
+    inlineFormattingContext.layoutInFlowContent(invalidationState, { horizontalConstraints, verticalConstraints });
     m_inlineFormattingState.shrinkDisplayInlineContent();
 }
 

Modified: trunk/Source/WebCore/layout/tableformatting/TableFormattingContext.cpp (260823 => 260824)


--- trunk/Source/WebCore/layout/tableformatting/TableFormattingContext.cpp	2020-04-28 14:34:29 UTC (rev 260823)
+++ trunk/Source/WebCore/layout/tableformatting/TableFormattingContext.cpp	2020-04-28 14:44:42 UTC (rev 260824)
@@ -48,17 +48,19 @@
 {
 }
 
-void TableFormattingContext::layoutInFlowContent(InvalidationState&, const HorizontalConstraints& horizontalConstraints, const VerticalConstraints& verticalConstraints)
+void TableFormattingContext::layoutInFlowContent(InvalidationState&, const ConstraintsForInFlowContent& constraints)
 {
+    auto availableHorizontalSpace = constraints.horizontal.logicalWidth;
+    auto availableVerticalSpace = constraints.vertical.logicalHeight;
     // 1. Compute width and height for the grid.
-    computeAndDistributeExtraHorizontalSpace(horizontalConstraints.logicalWidth);
-    computeAndDistributeExtraVerticalSpace(horizontalConstraints.logicalWidth, verticalConstraints.logicalHeight);
+    computeAndDistributeExtraHorizontalSpace(availableHorizontalSpace);
+    computeAndDistributeExtraVerticalSpace(availableHorizontalSpace, availableVerticalSpace);
     // 2. Finalize cells.
-    setUsedGeometryForCells(horizontalConstraints.logicalWidth);
+    setUsedGeometryForCells(availableHorizontalSpace);
     // 3. Finalize rows.
-    setUsedGeometryForRows(horizontalConstraints.logicalWidth);
+    setUsedGeometryForRows(availableHorizontalSpace);
     // 4. Finalize sections.
-    setUsedGeometryForSections(horizontalConstraints.logicalWidth);
+    setUsedGeometryForSections(availableHorizontalSpace);
 }
 
 void TableFormattingContext::setUsedGeometryForCells(LayoutUnit availableHorizontalSpace)
@@ -174,10 +176,10 @@
     cellDisplayBox.setContentBoxWidth(availableSpaceForContent);
 
     if (cellBox.hasInFlowOrFloatingChild()) {
-        auto horizontalConstraintsForCellContent = Geometry::horizontalConstraintsForInFlow(cellDisplayBox);
-        auto verticalConstraintsForCellContent = VerticalConstraints { cellDisplayBox.contentBoxTop(), usedCellHeight };
         auto invalidationState = InvalidationState { };
-        LayoutContext::createFormattingContext(cellBox, layoutState())->layoutInFlowContent(invalidationState, horizontalConstraintsForCellContent, verticalConstraintsForCellContent);
+        auto constraintsForCellContent = Geometry::constraintsForInFlowContent(cellDisplayBox);
+        constraintsForCellContent.vertical.logicalHeight = usedCellHeight;
+        LayoutContext::createFormattingContext(cellBox, layoutState())->layoutInFlowContent(invalidationState, constraintsForCellContent);
     }
     cellDisplayBox.setContentBoxHeight(geometry().cellHeigh(cellBox));
 }

Modified: trunk/Source/WebCore/layout/tableformatting/TableFormattingContext.h (260823 => 260824)


--- trunk/Source/WebCore/layout/tableformatting/TableFormattingContext.h	2020-04-28 14:34:29 UTC (rev 260823)
+++ trunk/Source/WebCore/layout/tableformatting/TableFormattingContext.h	2020-04-28 14:44:42 UTC (rev 260824)
@@ -42,7 +42,7 @@
     WTF_MAKE_ISO_ALLOCATED(TableFormattingContext);
 public:
     TableFormattingContext(const ContainerBox& formattingContextRoot, TableFormattingState&);
-    void layoutInFlowContent(InvalidationState&, const HorizontalConstraints&, const VerticalConstraints&) override;
+    void layoutInFlowContent(InvalidationState&, const ConstraintsForInFlowContent&) override;
 
 private:
     class Geometry : public FormattingContext::Geometry {
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to