Title: [254921] trunk/Source/WebCore
Revision
254921
Author
[email protected]
Date
2020-01-22 07:19:12 -0800 (Wed, 22 Jan 2020)

Log Message

[LFC][BFC] Move float avoider special available width handling to BlockFormattingContext::computeWidthAndMargin
https://bugs.webkit.org/show_bug.cgi?id=206567
<rdar://problem/58783979>

Reviewed by Antti Koivisto.

Now we can move the compute* functions from layoutFormattingContextRoot to the main loop in layoutInFlowContent.

* layout/blockformatting/BlockFormattingContext.cpp:
(WebCore::Layout::BlockFormattingContext::layoutInFlowContent):
(WebCore::Layout::BlockFormattingContext::layoutFormattingContextRoot):
(WebCore::Layout::BlockFormattingContext::computeWidthAndMargin):
* layout/blockformatting/BlockFormattingContext.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (254920 => 254921)


--- trunk/Source/WebCore/ChangeLog	2020-01-22 14:48:42 UTC (rev 254920)
+++ trunk/Source/WebCore/ChangeLog	2020-01-22 15:19:12 UTC (rev 254921)
@@ -1,3 +1,19 @@
+2020-01-22  Zalan Bujtas  <[email protected]>
+
+        [LFC][BFC] Move float avoider special available width handling to BlockFormattingContext::computeWidthAndMargin
+        https://bugs.webkit.org/show_bug.cgi?id=206567
+        <rdar://problem/58783979>
+
+        Reviewed by Antti Koivisto.
+
+        Now we can move the compute* functions from layoutFormattingContextRoot to the main loop in layoutInFlowContent.
+
+        * layout/blockformatting/BlockFormattingContext.cpp:
+        (WebCore::Layout::BlockFormattingContext::layoutInFlowContent):
+        (WebCore::Layout::BlockFormattingContext::layoutFormattingContextRoot):
+        (WebCore::Layout::BlockFormattingContext::computeWidthAndMargin):
+        * layout/blockformatting/BlockFormattingContext.h:
+
 2020-01-22  youenn fablet  <[email protected]>
 
         Add logging of the source of a response used to respond a fetch event

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>&);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to