Title: [256711] trunk/Source/WebCore
Revision
256711
Author
[email protected]
Date
2020-02-16 07:38:38 -0800 (Sun, 16 Feb 2020)

Log Message

[LFC][Float] Simplify BlockFormattingContext::usedAvailableWidthForFloatAvoider
https://bugs.webkit.org/show_bug.cgi?id=207823
<rdar://problem/59490669>

Reviewed by Antti Koivisto.

The containing block of this float avoider is either a non-avoider or a formatting context root avoider,
so we don't have to map the left position (and now LFC passes fast/block/block-only again).

* layout/FormattingContext.cpp:
(WebCore::Layout::mapHorizontalPositionToAncestor): Deleted.
(WebCore::Layout::FormattingContext::mapTopToFormattingContextRoot const): Deleted.
(WebCore::Layout::FormattingContext::mapLeftToFormattingContextRoot const): Deleted.
(WebCore::Layout::FormattingContext::mapRightToFormattingContextRoot const): Deleted.
* layout/FormattingContext.h:
* layout/blockformatting/BlockFormattingContext.cpp:
(WebCore::Layout::BlockFormattingContext::usedAvailableWidthForFloatAvoider):
(WebCore::Layout::BlockFormattingContext::computeWidthAndMargin):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (256710 => 256711)


--- trunk/Source/WebCore/ChangeLog	2020-02-16 15:23:56 UTC (rev 256710)
+++ trunk/Source/WebCore/ChangeLog	2020-02-16 15:38:38 UTC (rev 256711)
@@ -1,5 +1,26 @@
 2020-02-16  Zalan Bujtas  <[email protected]>
 
+        [LFC][Float] Simplify BlockFormattingContext::usedAvailableWidthForFloatAvoider
+        https://bugs.webkit.org/show_bug.cgi?id=207823
+        <rdar://problem/59490669>
+
+        Reviewed by Antti Koivisto.
+
+        The containing block of this float avoider is either a non-avoider or a formatting context root avoider,
+        so we don't have to map the left position (and now LFC passes fast/block/block-only again).
+
+        * layout/FormattingContext.cpp:
+        (WebCore::Layout::mapHorizontalPositionToAncestor): Deleted.
+        (WebCore::Layout::FormattingContext::mapTopToFormattingContextRoot const): Deleted.
+        (WebCore::Layout::FormattingContext::mapLeftToFormattingContextRoot const): Deleted.
+        (WebCore::Layout::FormattingContext::mapRightToFormattingContextRoot const): Deleted.
+        * layout/FormattingContext.h:
+        * layout/blockformatting/BlockFormattingContext.cpp:
+        (WebCore::Layout::BlockFormattingContext::usedAvailableWidthForFloatAvoider):
+        (WebCore::Layout::BlockFormattingContext::computeWidthAndMargin):
+
+2020-02-16  Zalan Bujtas  <[email protected]>
+
         [LFC][BFC] Formatting context roots position their own relative children
         https://bugs.webkit.org/show_bug.cgi?id=207822
         <rdar://problem/59490353>

Modified: trunk/Source/WebCore/layout/FormattingContext.cpp (256710 => 256711)


--- trunk/Source/WebCore/layout/FormattingContext.cpp	2020-02-16 15:23:56 UTC (rev 256710)
+++ trunk/Source/WebCore/layout/FormattingContext.cpp	2020-02-16 15:38:38 UTC (rev 256711)
@@ -188,41 +188,6 @@
     LOG_WITH_STREAM(FormattingContextLayout, stream << "End: layout out-of-flow content -> context: " << &layoutState() << " root: " << &root());
 }
 
-static LayoutUnit mapHorizontalPositionToAncestor(const FormattingContext& formattingContext, LayoutUnit horizontalPosition, const ContainerBox& containingBlock, const ContainerBox& ancestor)
-{
-    // "horizontalPosition" is in the coordinate system of the "containingBlock". -> map from containingBlock to ancestor.
-    if (&containingBlock == &ancestor)
-        return horizontalPosition;
-    ASSERT(containingBlock.isContainingBlockDescendantOf(ancestor));
-    for (auto* containerBox = &containingBlock; containerBox && containerBox != &ancestor; containerBox = containerBox->containingBlock())
-        horizontalPosition += formattingContext.geometryForBox(*containerBox).left();
-    return horizontalPosition;
-}
-
-// FIXME: turn these into templates.
-LayoutUnit FormattingContext::mapTopToFormattingContextRoot(const Box& layoutBox) const
-{
-    ASSERT(layoutBox.containingBlock());
-    auto& formattingContextRoot = root();
-    ASSERT(layoutBox.isContainingBlockDescendantOf(formattingContextRoot));
-    auto top = geometryForBox(layoutBox).top();
-    for (auto* containerBox = layoutBox.containingBlock(); containerBox && containerBox != &formattingContextRoot; containerBox = containerBox->containingBlock())
-        top += geometryForBox(*containerBox).top();
-    return top;
-}
-
-LayoutUnit FormattingContext::mapLeftToFormattingContextRoot(const Box& layoutBox) const
-{
-    ASSERT(layoutBox.containingBlock());
-    return mapHorizontalPositionToAncestor(*this, geometryForBox(layoutBox).left(), *layoutBox.containingBlock(), root());
-}
-
-LayoutUnit FormattingContext::mapRightToFormattingContextRoot(const Box& layoutBox) const
-{
-    ASSERT(layoutBox.containingBlock());
-    return mapHorizontalPositionToAncestor(*this, geometryForBox(layoutBox).right(), *layoutBox.containingBlock(), root());
-}
-
 const Display::Box& FormattingContext::geometryForBox(const Box& layoutBox, Optional<EscapeReason> escapeReason) const
 {
     UNUSED_PARAM(escapeReason);

Modified: trunk/Source/WebCore/layout/FormattingContext.h (256710 => 256711)


--- trunk/Source/WebCore/layout/FormattingContext.h	2020-02-16 15:23:56 UTC (rev 256710)
+++ trunk/Source/WebCore/layout/FormattingContext.h	2020-02-16 15:38:38 UTC (rev 256711)
@@ -77,10 +77,6 @@
     };
     virtual IntrinsicWidthConstraints computedIntrinsicWidthConstraints() = 0;
 
-    LayoutUnit mapTopToFormattingContextRoot(const Box&) const;
-    LayoutUnit mapLeftToFormattingContextRoot(const Box&) const;
-    LayoutUnit mapRightToFormattingContextRoot(const Box&) const;
-
     bool isBlockFormattingContext() const { return root().establishesBlockFormattingContext(); }
     bool isInlineFormattingContext() const { return root().establishesInlineFormattingContext(); }
     bool isTableFormattingContext() const { return root().establishesTableFormattingContext(); }

Modified: trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp (256710 => 256711)


--- trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp	2020-02-16 15:23:56 UTC (rev 256710)
+++ trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp	2020-02-16 15:38:38 UTC (rev 256711)
@@ -195,31 +195,29 @@
     // Vertical static position is not computed yet, so let's just pre-compute it for now.
     precomputeVerticalPositionForAncestors(layoutBox, horizontalConstraints, verticalConstraints);
     precomputeVerticalPosition(layoutBox, horizontalConstraints.containingBlock, verticalConstraints.containingBlock);
-    auto verticalPosition = mapTopToFormattingContextRoot(layoutBox);
-    // FIXME: Check if the non-yet-computed height affects this computation - and whether we have to resolve it
-    // at a later point or not (can't find this in the spec).
+
+    auto mapLogicalTopToFormattingContextRoot = [&] {
+        auto& formattingContextRoot = root();
+        ASSERT(layoutBox.isContainingBlockDescendantOf(formattingContextRoot));
+        auto top = geometryForBox(layoutBox).top();
+        for (auto* containerBox = layoutBox.containingBlock(); containerBox && containerBox != &formattingContextRoot; containerBox = containerBox->containingBlock())
+            top += geometryForBox(*containerBox).top();
+        return top;
+    };
+
+    auto verticalPosition = mapLogicalTopToFormattingContextRoot();
+    // FIXME: Check if the non-yet-computed height affects this computation - and whether we have to resolve it at a later point.
     auto constraints = floatingContext.constraints(verticalPosition, verticalPosition);
     if (!constraints.left && !constraints.right)
         return { };
-    auto& containingBlock = *layoutBox.containingBlock();
-    auto& containingBlockGeometry = geometryForBox(containingBlock);
-    auto availableWidth = containingBlockGeometry.contentBoxWidth();
-
-    LayoutUnit containingBlockLeft;
-    LayoutUnit containingBlockRight = containingBlockGeometry.right();
-    if (&containingBlock != &root()) {
-        // Move containing block left/right to the root's coordinate system.
-        containingBlockLeft = mapLeftToFormattingContextRoot(containingBlock);
-        containingBlockRight = mapRightToFormattingContextRoot(containingBlock);
-    }
-    auto containingBlockContentBoxLeft = containingBlockLeft + containingBlockGeometry.borderLeft() + containingBlockGeometry.paddingLeft().valueOr(0);
-    auto containingBlockContentBoxRight = containingBlockRight - containingBlockGeometry.borderRight() + containingBlockGeometry.paddingRight().valueOr(0);
-
     // Shrink the available space if the floats are actually intruding at this vertical position.
+    auto availableWidth = horizontalConstraints.containingBlock.logicalWidth;
     if (constraints.left)
-        availableWidth -= std::max<LayoutUnit>(0, constraints.left->x - containingBlockContentBoxLeft);
-    if (constraints.right)
-        availableWidth -= std::max<LayoutUnit>(0, containingBlockContentBoxRight - constraints.right->x);
+        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);
+    }
     return availableWidth;
 }
 
@@ -358,7 +356,9 @@
             return geometry().floatingWidthAndMargin(layoutBox, horizontalConstraints, { usedWidth, { } });
 
         if (layoutBox.isFloatAvoider()) {
-            auto availableWidth = usedAvailableWidthForFloatAvoider(floatingContext, layoutBox, horizontalConstraintsPair, verticalConstraintsPair).valueOr(horizontalConstraints.logicalWidth);
+            auto availableWidth = horizontalConstraints.logicalWidth;
+            if (layoutBox.style().logicalWidth().isAuto())
+                availableWidth = usedAvailableWidthForFloatAvoider(floatingContext, layoutBox, horizontalConstraintsPair, verticalConstraintsPair).valueOr(availableWidth);
             return geometry().inFlowWidthAndMargin(layoutBox, { horizontalConstraints.logicalLeft, availableWidth }, { usedWidth, { } });
         }
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to