Title: [263938] trunk/Source/WebCore
Revision
263938
Author
[email protected]
Date
2020-07-04 11:37:44 -0700 (Sat, 04 Jul 2020)

Log Message

[LFC] Do not cache computed horizontal margin values
https://bugs.webkit.org/show_bug.cgi?id=213956

Reviewed by Antti Koivisto.

Outside of the width + margin computation, computed horizontal margin values are only required by
float positioning. Let's just re-computed them on demand (which is basically just a style.marginStart/end resolve).

* layout/FormattingContext.cpp:
(WebCore::Layout::FormattingContext::computeOutOfFlowHorizontalGeometry):
* layout/FormattingContextGeometry.cpp:
(WebCore::Layout::FormattingContext::Geometry::outOfFlowNonReplacedHorizontalGeometry):
(WebCore::Layout::FormattingContext::Geometry::outOfFlowReplacedHorizontalGeometry):
(WebCore::Layout::FormattingContext::Geometry::floatingNonReplacedWidthAndMargin):
(WebCore::Layout::FormattingContext::Geometry::inlineReplacedWidthAndMargin):
* layout/LayoutContext.cpp:
(WebCore::Layout::LayoutContext::layout):
* layout/LayoutUnits.h:
* layout/Verification.cpp:
(WebCore::Layout::outputMismatchingBlockBoxInformationIfNeeded):
* layout/blockformatting/BlockFormattingContext.cpp:
(WebCore::Layout::BlockFormattingContext::computePositionToAvoidFloats):
(WebCore::Layout::BlockFormattingContext::computeWidthAndMargin):
* layout/blockformatting/BlockFormattingContextGeometry.cpp:
(WebCore::Layout::BlockFormattingContext::Geometry::inFlowNonReplacedWidthAndMargin):
(WebCore::Layout::BlockFormattingContext::Geometry::inFlowReplacedWidthAndMargin):
* layout/blockformatting/tablewrapper/TableWrapperBlockFormattingContext.cpp:
(WebCore::Layout::TableWrapperBlockFormattingContext::computeWidthAndMarginForTableBox):
* layout/displaytree/DisplayBox.cpp:
(WebCore::Display::Box::Box):
* layout/displaytree/DisplayBox.h:
(WebCore::Display::Box::setHasValidVerticalNonCollapsedMargin):
(WebCore::Display::Box::setHasValidHorizontalComputedMargin): Deleted.
(WebCore::Display::Box::ComputedHorizontalMargin::ComputedHorizontalMargin): Deleted.
(WebCore::Display::Box::setHorizontalComputedMargin): Deleted.
(WebCore::Display::Box::computedMarginStart const): Deleted.
(WebCore::Display::Box::computedMarginEnd const): Deleted.
* layout/floats/FloatingContext.cpp:
(WebCore::Layout::computedHorizontalMargin):
(WebCore::Layout::FloatingContext::positionForFloat const):
(WebCore::Layout::FloatingContext::positionForNonFloatingFloatAvoider const):
* layout/floats/FloatingContext.h:
* layout/inlineformatting/InlineFormattingContext.cpp:
(WebCore::Layout::InlineFormattingContext::computeHorizontalMargin):
(WebCore::Layout::InlineFormattingContext::computeWidthAndMargin):
* layout/inlineformatting/InlineFormattingContextGeometry.cpp:
(WebCore::Layout::InlineFormattingContext::Geometry::inlineBlockWidthAndMargin):
* layout/tableformatting/TableFormattingContext.cpp:
(WebCore::Layout::TableFormattingContext::setUsedGeometryForRows):
(WebCore::Layout::TableFormattingContext::setUsedGeometryForSections):
(WebCore::Layout::TableFormattingContext::layoutCell):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (263937 => 263938)


--- trunk/Source/WebCore/ChangeLog	2020-07-04 17:18:45 UTC (rev 263937)
+++ trunk/Source/WebCore/ChangeLog	2020-07-04 18:37:44 UTC (rev 263938)
@@ -1,3 +1,57 @@
+2020-07-04  Zalan Bujtas  <[email protected]>
+
+        [LFC] Do not cache computed horizontal margin values
+        https://bugs.webkit.org/show_bug.cgi?id=213956
+
+        Reviewed by Antti Koivisto.
+
+        Outside of the width + margin computation, computed horizontal margin values are only required by
+        float positioning. Let's just re-computed them on demand (which is basically just a style.marginStart/end resolve).
+
+        * layout/FormattingContext.cpp:
+        (WebCore::Layout::FormattingContext::computeOutOfFlowHorizontalGeometry):
+        * layout/FormattingContextGeometry.cpp:
+        (WebCore::Layout::FormattingContext::Geometry::outOfFlowNonReplacedHorizontalGeometry):
+        (WebCore::Layout::FormattingContext::Geometry::outOfFlowReplacedHorizontalGeometry):
+        (WebCore::Layout::FormattingContext::Geometry::floatingNonReplacedWidthAndMargin):
+        (WebCore::Layout::FormattingContext::Geometry::inlineReplacedWidthAndMargin):
+        * layout/LayoutContext.cpp:
+        (WebCore::Layout::LayoutContext::layout):
+        * layout/LayoutUnits.h:
+        * layout/Verification.cpp:
+        (WebCore::Layout::outputMismatchingBlockBoxInformationIfNeeded):
+        * layout/blockformatting/BlockFormattingContext.cpp:
+        (WebCore::Layout::BlockFormattingContext::computePositionToAvoidFloats):
+        (WebCore::Layout::BlockFormattingContext::computeWidthAndMargin):
+        * layout/blockformatting/BlockFormattingContextGeometry.cpp:
+        (WebCore::Layout::BlockFormattingContext::Geometry::inFlowNonReplacedWidthAndMargin):
+        (WebCore::Layout::BlockFormattingContext::Geometry::inFlowReplacedWidthAndMargin):
+        * layout/blockformatting/tablewrapper/TableWrapperBlockFormattingContext.cpp:
+        (WebCore::Layout::TableWrapperBlockFormattingContext::computeWidthAndMarginForTableBox):
+        * layout/displaytree/DisplayBox.cpp:
+        (WebCore::Display::Box::Box):
+        * layout/displaytree/DisplayBox.h:
+        (WebCore::Display::Box::setHasValidVerticalNonCollapsedMargin):
+        (WebCore::Display::Box::setHasValidHorizontalComputedMargin): Deleted.
+        (WebCore::Display::Box::ComputedHorizontalMargin::ComputedHorizontalMargin): Deleted.
+        (WebCore::Display::Box::setHorizontalComputedMargin): Deleted.
+        (WebCore::Display::Box::computedMarginStart const): Deleted.
+        (WebCore::Display::Box::computedMarginEnd const): Deleted.
+        * layout/floats/FloatingContext.cpp:
+        (WebCore::Layout::computedHorizontalMargin):
+        (WebCore::Layout::FloatingContext::positionForFloat const):
+        (WebCore::Layout::FloatingContext::positionForNonFloatingFloatAvoider const):
+        * layout/floats/FloatingContext.h:
+        * layout/inlineformatting/InlineFormattingContext.cpp:
+        (WebCore::Layout::InlineFormattingContext::computeHorizontalMargin):
+        (WebCore::Layout::InlineFormattingContext::computeWidthAndMargin):
+        * layout/inlineformatting/InlineFormattingContextGeometry.cpp:
+        (WebCore::Layout::InlineFormattingContext::Geometry::inlineBlockWidthAndMargin):
+        * layout/tableformatting/TableFormattingContext.cpp:
+        (WebCore::Layout::TableFormattingContext::setUsedGeometryForRows):
+        (WebCore::Layout::TableFormattingContext::setUsedGeometryForSections):
+        (WebCore::Layout::TableFormattingContext::layoutCell):
+
 2020-07-04  Darin Adler  <[email protected]>
 
         Make generate-unified-sources.sh not depend on features being listed in FEATURE_DEFINES environment variable

Modified: trunk/Source/WebCore/layout/FormattingContext.cpp (263937 => 263938)


--- trunk/Source/WebCore/layout/FormattingContext.cpp	2020-07-04 17:18:45 UTC (rev 263937)
+++ trunk/Source/WebCore/layout/FormattingContext.cpp	2020-07-04 18:37:44 UTC (rev 263938)
@@ -94,7 +94,6 @@
     displayBox.setLeft(horizontalGeometry.left + horizontalGeometry.contentWidthAndMargin.usedMargin.start);
     displayBox.setContentBoxWidth(horizontalGeometry.contentWidthAndMargin.contentWidth);
     displayBox.setHorizontalMargin({ horizontalGeometry.contentWidthAndMargin.usedMargin });
-    displayBox.setHorizontalComputedMargin({ horizontalGeometry.contentWidthAndMargin.computedMargin });
 }
 
 void FormattingContext::computeOutOfFlowVerticalGeometry(const Box& layoutBox, const ConstraintsForOutOfFlowContent& constraints)

Modified: trunk/Source/WebCore/layout/FormattingContextGeometry.cpp (263937 => 263938)


--- trunk/Source/WebCore/layout/FormattingContextGeometry.cpp	2020-07-04 17:18:45 UTC (rev 263937)
+++ trunk/Source/WebCore/layout/FormattingContextGeometry.cpp	2020-07-04 18:37:44 UTC (rev 263938)
@@ -605,7 +605,7 @@
     *right += containingBlockPaddingVerticalEdge;
 
     LOG_WITH_STREAM(FormattingContextLayout, stream << "[Position][Width][Margin] -> out-of-flow non-replaced -> left(" << *left << "px) right("  << *right << "px) width(" << *width << "px) margin(" << usedHorizontalMargin.start << "px, "  << usedHorizontalMargin.end << "px) layoutBox(" << &layoutBox << ")");
-    return { *left, *right, { *width, usedHorizontalMargin, computedHorizontalMargin } };
+    return { *left, *right, { *width, usedHorizontalMargin } };
 }
 
 VerticalGeometry FormattingContext::Geometry::outOfFlowReplacedVerticalGeometry(const ReplacedBox& replacedBox, const HorizontalConstraints& horizontalConstraints, const VerticalConstraints& verticalConstraints, const OverrideVerticalValues& overrideVerticalValues) const
@@ -791,7 +791,7 @@
     *right += containingBlockPaddingVerticalEdge;
 
     LOG_WITH_STREAM(FormattingContextLayout, stream << "[Position][Width][Margin] -> out-of-flow replaced -> left(" << *left << "px) right("  << *right << "px) width(" << width << "px) margin(" << *usedMarginStart << "px, "  << *usedMarginEnd << "px) layoutBox(" << &replacedBox << ")");
-    return { *left, *right, { width, { *usedMarginStart, *usedMarginEnd }, computedHorizontalMargin } };
+    return { *left, *right, { width, { *usedMarginStart, *usedMarginEnd } } };
 }
 
 ContentHeightAndMargin FormattingContext::Geometry::complicatedCases(const Box& layoutBox, const HorizontalConstraints& horizontalConstraints, const OverrideVerticalValues& overrideVerticalValues) const
@@ -844,7 +844,7 @@
         width = shrinkToFitWidth(layoutBox, horizontalConstraints.logicalWidth);
 
     LOG_WITH_STREAM(FormattingContextLayout, stream << "[Width][Margin] -> floating non-replaced -> width(" << *width << "px) margin(" << usedHorizontallMargin.start << "px, " << usedHorizontallMargin.end << "px) -> layoutBox(" << &layoutBox << ")");
-    return ContentWidthAndMargin { *width, usedHorizontallMargin, computedHorizontalMargin };
+    return ContentWidthAndMargin { *width, usedHorizontallMargin };
 }
 
 ContentHeightAndMargin FormattingContext::Geometry::floatingReplacedHeightAndMargin(const ReplacedBox& replacedBox, const HorizontalConstraints& horizontalConstraints, const OverrideVerticalValues& overrideVerticalValues) const
@@ -1012,7 +1012,7 @@
     ASSERT(width);
 
     LOG_WITH_STREAM(FormattingContextLayout, stream << "[Width][Margin] -> inflow replaced -> width(" << *width << "px) margin(" << usedMarginStart() << "px, " << usedMarginEnd() << "px) -> layoutBox(" << &replacedBox << ")");
-    return { *width, { usedMarginStart(), usedMarginEnd() }, computedHorizontalMargin };
+    return { *width, { usedMarginStart(), usedMarginEnd() } };
 }
 
 LayoutSize FormattingContext::Geometry::inFlowPositionedPositionOffset(const Box& layoutBox, const HorizontalConstraints& horizontalConstraints) const

Modified: trunk/Source/WebCore/layout/LayoutContext.cpp (263937 => 263938)


--- trunk/Source/WebCore/layout/LayoutContext.cpp	2020-07-04 17:18:45 UTC (rev 263937)
+++ trunk/Source/WebCore/layout/LayoutContext.cpp	2020-07-04 18:37:44 UTC (rev 263938)
@@ -66,7 +66,6 @@
     // we could not lay it out even if we wanted to since it's outside of this LayoutContext.
     auto& displayBox = layoutState().displayBoxForRootLayoutBox();
     displayBox.setHorizontalMargin({ });
-    displayBox.setHorizontalComputedMargin({ });
     displayBox.setVerticalMargin({ });
     displayBox.setBorder({ });
     displayBox.setPadding({ });

Modified: trunk/Source/WebCore/layout/LayoutUnits.h (263937 => 263938)


--- trunk/Source/WebCore/layout/LayoutUnits.h	2020-07-04 17:18:45 UTC (rev 263937)
+++ trunk/Source/WebCore/layout/LayoutUnits.h	2020-07-04 18:37:44 UTC (rev 263938)
@@ -138,7 +138,6 @@
 struct ContentWidthAndMargin {
     LayoutUnit contentWidth;
     UsedHorizontalMargin usedMargin;
-    ComputedHorizontalMargin computedMargin;
 };
 
 struct ContentHeightAndMargin {

Modified: trunk/Source/WebCore/layout/Verification.cpp (263937 => 263938)


--- trunk/Source/WebCore/layout/Verification.cpp	2020-07-04 17:18:45 UTC (rev 263937)
+++ trunk/Source/WebCore/layout/Verification.cpp	2020-07-04 18:37:44 UTC (rev 263938)
@@ -232,14 +232,27 @@
         stream.nextLine();
     };
 
-    auto renderBoxLikeMarginBox = [](auto& displayBox) {
+    auto renderBoxLikeMarginBox = [&] (auto& displayBox) {
+        if (layoutBox.isInitialContainingBlock())
+            return displayBox.rect();
+
         // Produce a RenderBox matching margin box.
+        auto containingBlockWidth = context.displayBoxForLayoutBox(layoutBox.containingBlock()).contentBoxWidth();
+        auto marginStart = LayoutUnit { };
+        auto& marginStartStyle = layoutBox.style().marginStart();
+        if (marginStartStyle.isFixed() || marginStartStyle.isPercent() || marginStartStyle.isCalculated())
+            marginStart = valueForLength(marginStartStyle, containingBlockWidth);
+
+        auto marginEnd = LayoutUnit { };
+        auto& marginEndStyle = layoutBox.style().marginEnd();
+        if (marginEndStyle.isFixed() || marginEndStyle.isPercent() || marginEndStyle.isCalculated())
+            marginEnd = valueForLength(marginEndStyle, containingBlockWidth);
+
         auto borderBox = displayBox.borderBox();
-
         return Display::Rect {
             borderBox.top() - displayBox.nonCollapsedMarginBefore(),
-            borderBox.left() - displayBox.computedMarginStart().valueOr(0),
-            displayBox.computedMarginStart().valueOr(0) + borderBox.width() + displayBox.computedMarginEnd().valueOr(0),
+            borderBox.left() - marginStart,
+            marginStart + borderBox.width() + marginEnd,
             displayBox.nonCollapsedMarginBefore() + borderBox.height() + displayBox.nonCollapsedMarginAfter()
         };
     };

Modified: trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp (263937 => 263938)


--- trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp	2020-07-04 17:18:45 UTC (rev 263937)
+++ trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp	2020-07-04 18:37:44 UTC (rev 263938)
@@ -294,7 +294,7 @@
         return computeVerticalPositionForFloatClear(floatingContext, layoutBox);
 
     ASSERT(layoutBox.establishesFormattingContext());
-    formattingState().displayBox(layoutBox).setTopLeft(floatingContext.positionForNonFloatingFloatAvoider(layoutBox));
+    formattingState().displayBox(layoutBox).setTopLeft(floatingContext.positionForNonFloatingFloatAvoider(layoutBox, constraintsPair.containingBlock.horizontal));
 }
 
 void BlockFormattingContext::computeVerticalPositionForFloatClear(const FloatingContext& floatingContext, const Box& layoutBox)
@@ -327,7 +327,6 @@
     auto& displayBox = formattingState().displayBox(layoutBox);
     displayBox.setContentBoxWidth(contentWidthAndMargin.contentWidth);
     displayBox.setHorizontalMargin({ contentWidthAndMargin.usedMargin });
-    displayBox.setHorizontalComputedMargin(contentWidthAndMargin.computedMargin);
 }
 
 void BlockFormattingContext::computeHeightAndMargin(const Box& layoutBox, const ConstraintsForInFlowContent& constraints)

Modified: trunk/Source/WebCore/layout/blockformatting/BlockFormattingContextGeometry.cpp (263937 => 263938)


--- trunk/Source/WebCore/layout/blockformatting/BlockFormattingContextGeometry.cpp	2020-07-04 17:18:45 UTC (rev 263937)
+++ trunk/Source/WebCore/layout/blockformatting/BlockFormattingContextGeometry.cpp	2020-07-04 18:37:44 UTC (rev 263938)
@@ -204,7 +204,7 @@
         }
         ASSERT(width);
 
-        return ContentWidthAndMargin { *width, usedHorizontalMargin, computedHorizontalMargin };
+        return ContentWidthAndMargin { *width, usedHorizontalMargin };
     };
 
     auto contentWidthAndMargin = compute();
@@ -227,7 +227,7 @@
     auto nonReplacedWidthAndMargin = inFlowNonReplacedWidthAndMargin(replacedBox, horizontalConstraints, OverrideHorizontalValues { usedWidth, overrideHorizontalValues.margin });
 
     LOG_WITH_STREAM(FormattingContextLayout, stream << "[Width][Margin] -> inflow replaced -> width(" << usedWidth  << "px) margin(" << nonReplacedWidthAndMargin.usedMargin.start << "px, " << nonReplacedWidthAndMargin.usedMargin.end << "px) -> layoutBox(" << &replacedBox << ")");
-    return { usedWidth, nonReplacedWidthAndMargin.usedMargin, nonReplacedWidthAndMargin.computedMargin };
+    return { usedWidth, nonReplacedWidthAndMargin.usedMargin };
 }
 
 LayoutUnit BlockFormattingContext::Geometry::staticVerticalPosition(const Box& layoutBox, const VerticalConstraints& verticalConstraints) const

Modified: trunk/Source/WebCore/layout/blockformatting/tablewrapper/TableWrapperBlockFormattingContext.cpp (263937 => 263938)


--- trunk/Source/WebCore/layout/blockformatting/tablewrapper/TableWrapperBlockFormattingContext.cpp	2020-07-04 17:18:45 UTC (rev 263937)
+++ trunk/Source/WebCore/layout/blockformatting/tablewrapper/TableWrapperBlockFormattingContext.cpp	2020-07-04 18:37:44 UTC (rev 263938)
@@ -210,7 +210,6 @@
     auto& displayBox = formattingState().displayBox(tableBox);
     displayBox.setContentBoxWidth(contentWidthAndMargin.contentWidth);
     displayBox.setHorizontalMargin(contentWidthAndMargin.usedMargin);
-    displayBox.setHorizontalComputedMargin(contentWidthAndMargin.computedMargin);
 }
 
 void TableWrapperBlockFormattingContext::computeHeightAndMarginForTableBox(const ContainerBox& tableBox, const ConstraintsForInFlowContent& constraints)

Modified: trunk/Source/WebCore/layout/displaytree/DisplayBox.cpp (263937 => 263938)


--- trunk/Source/WebCore/layout/displaytree/DisplayBox.cpp	2020-07-04 17:18:45 UTC (rev 263937)
+++ trunk/Source/WebCore/layout/displaytree/DisplayBox.cpp	2020-07-04 18:37:44 UTC (rev 263938)
@@ -41,7 +41,6 @@
     , m_contentHeight(other.m_contentHeight)
     , m_horizontalMargin(other.m_horizontalMargin)
     , m_verticalMargin(other.m_verticalMargin)
-    , m_horizontalComputedMargin(other.m_horizontalComputedMargin)
     , m_hasClearance(other.m_hasClearance)
     , m_border(other.m_border)
     , m_padding(other.m_padding)
@@ -51,7 +50,6 @@
     , m_hasValidHorizontalMargin(other.m_hasValidHorizontalMargin)
     , m_hasValidVerticalMargin(other.m_hasValidVerticalMargin)
     , m_hasValidVerticalNonCollapsedMargin(other.m_hasValidVerticalNonCollapsedMargin)
-    , m_hasValidHorizontalComputedMargin(other.m_hasValidHorizontalComputedMargin)
     , m_hasValidBorder(other.m_hasValidBorder)
     , m_hasValidPadding(other.m_hasValidPadding)
     , m_hasValidContentHeight(other.m_hasValidContentHeight)

Modified: trunk/Source/WebCore/layout/displaytree/DisplayBox.h (263937 => 263938)


--- trunk/Source/WebCore/layout/displaytree/DisplayBox.h	2020-07-04 17:18:45 UTC (rev 263937)
+++ trunk/Source/WebCore/layout/displaytree/DisplayBox.h	2020-07-04 18:37:44 UTC (rev 263938)
@@ -92,14 +92,6 @@
         CollapsedValues m_collapsedValues;
     };
 
-    struct ComputedHorizontalMargin {
-        ComputedHorizontalMargin() = default;
-        ComputedHorizontalMargin(Layout::ComputedHorizontalMargin);
-
-        Optional<LayoutUnit> start;
-        Optional<LayoutUnit> end;
-    };
-
     struct HorizontalMargin {
         HorizontalMargin() = default;
         HorizontalMargin(Layout::UsedHorizontalMargin);
@@ -119,8 +111,6 @@
 
     LayoutUnit nonCollapsedMarginBefore() const;
     LayoutUnit nonCollapsedMarginAfter() const;
-    Optional<LayoutUnit> computedMarginStart() const;
-    Optional<LayoutUnit> computedMarginEnd() const;
 
     LayoutUnit borderTop() const;
     LayoutUnit borderLeft() const;
@@ -182,7 +172,6 @@
 
     void setHorizontalMargin(HorizontalMargin);
     void setVerticalMargin(VerticalMargin);
-    void setHorizontalComputedMargin(ComputedHorizontalMargin);
     void setHasClearance() { m_hasClearance = true; }
 
     void setBorder(Layout::Edges);
@@ -201,7 +190,6 @@
     void setHasValidLeft() { m_hasValidLeft = true; }
     void setHasValidVerticalMargin() { m_hasValidVerticalMargin = true; }
     void setHasValidVerticalNonCollapsedMargin() { m_hasValidVerticalNonCollapsedMargin = true; }
-    void setHasValidHorizontalComputedMargin() { m_hasValidHorizontalComputedMargin = true; }
     void setHasValidHorizontalMargin() { m_hasValidHorizontalMargin = true; }
 
     void setHasValidBorder() { m_hasValidBorder = true; }
@@ -217,7 +205,6 @@
 
     HorizontalMargin m_horizontalMargin;
     VerticalMargin m_verticalMargin;
-    ComputedHorizontalMargin m_horizontalComputedMargin;
     bool m_hasClearance { false };
 
     Layout::Edges m_border;
@@ -229,7 +216,6 @@
     bool m_hasValidHorizontalMargin { false };
     bool m_hasValidVerticalMargin { false };
     bool m_hasValidVerticalNonCollapsedMargin { false };
-    bool m_hasValidHorizontalComputedMargin { false };
     bool m_hasValidBorder { false };
     bool m_hasValidPadding { false };
     bool m_hasValidContentHeight { false };
@@ -268,12 +254,6 @@
 {
 }
 
-inline Box::ComputedHorizontalMargin::ComputedHorizontalMargin(Layout::ComputedHorizontalMargin computedHorizontalMargin)
-    : start(computedHorizontalMargin.start)
-    , end(computedHorizontalMargin.end)
-{
-}
-
 inline Box::HorizontalMargin::HorizontalMargin(Layout::UsedHorizontalMargin horizontalMargin)
     : start(horizontalMargin.start)
     , end(horizontalMargin.end)
@@ -384,14 +364,6 @@
     m_verticalMargin = margin;
 }
 
-inline void Box::setHorizontalComputedMargin(ComputedHorizontalMargin margin)
-{
-#if ASSERT_ENABLED
-    setHasValidHorizontalComputedMargin();
-#endif
-    m_horizontalComputedMargin = margin;
-}
-
 inline void Box::setBorder(Layout::Edges border)
 {
 #if ASSERT_ENABLED
@@ -472,18 +444,6 @@
     return m_verticalMargin.nonCollapsedValues().after;
 }
 
-inline Optional<LayoutUnit> Box::computedMarginStart() const
-{
-    ASSERT(m_hasValidHorizontalComputedMargin);
-    return m_horizontalComputedMargin.start;
-}
-
-inline Optional<LayoutUnit> Box::computedMarginEnd() const
-{
-    ASSERT(m_hasValidHorizontalComputedMargin);
-    return m_horizontalComputedMargin.end;
-}
-
 inline Optional<LayoutUnit> Box::paddingTop() const
 {
     ASSERT(m_hasValidPadding);

Modified: trunk/Source/WebCore/layout/floats/FloatingContext.cpp (263937 => 263938)


--- trunk/Source/WebCore/layout/floats/FloatingContext.cpp	2020-07-04 17:18:45 UTC (rev 263937)
+++ trunk/Source/WebCore/layout/floats/FloatingContext.cpp	2020-07-04 18:37:44 UTC (rev 263938)
@@ -153,6 +153,17 @@
 }
 #endif
 
+static ComputedHorizontalMargin computedHorizontalMargin(const Box& layoutBox, LayoutUnit horizontalConstraint)
+{
+    auto& style = layoutBox.style();
+    auto computedValue = [&] (const auto& margin) {
+        if (margin.isFixed() || margin.isPercent() || margin.isCalculated())
+            return valueForLength(margin, horizontalConstraint);
+        return 0_lu;
+    };
+    return { computedValue(style.marginStart()), computedValue(style.marginEnd()) };
+}
+
 static FloatPair::LeftRightIndex findAvailablePosition(FloatAvoider& floatAvoider, const FloatingState::FloatList& floats)
 {
     Optional<PositionInContextRoot> bottomMost;
@@ -238,7 +249,8 @@
     auto& displayBox = formattingContext().geometryForBox(layoutBox);
     if (absoluteTopLeft.y() - displayBox.marginBefore() < previousFloatAbsoluteTop)
         absoluteTopLeft.setY(previousFloatAbsoluteTop + displayBox.marginBefore());
-    auto margins = Edges { { displayBox.computedMarginStart().valueOr(0), displayBox.computedMarginEnd().valueOr(0) }, { displayBox.marginBefore(), displayBox.marginAfter() } };
+    auto horizontalMargin = computedHorizontalMargin(layoutBox, horizontalConstraints.logicalWidth);
+    auto margins = Edges { { *horizontalMargin.start, *horizontalMargin.end }, { displayBox.marginBefore(), displayBox.marginAfter() } };
     auto floatBox = FloatAvoider { layoutBox, absoluteTopLeft, displayBox.width(), margins, absoluteDisplayBoxCoordinates.containingBlockContentBox };
     findAvailablePosition(floatBox, m_floatingState.floats());
     // From formatting root coordinate system back to containing block's.
@@ -246,7 +258,7 @@
     return { floatBox.left() + margins.horizontal.left - containingBlockTopLeft.x(), floatBox.top() + margins.vertical.top - containingBlockTopLeft.y() };
 }
 
-LayoutPoint FloatingContext::positionForNonFloatingFloatAvoider(const Box& layoutBox) const
+LayoutPoint FloatingContext::positionForNonFloatingFloatAvoider(const Box& layoutBox, const HorizontalConstraints& horizontalConstraints) const
 {
     ASSERT(layoutBox.establishesBlockFormattingContext());
     ASSERT(!layoutBox.isFloatingPositioned());
@@ -258,7 +270,8 @@
 
     auto absoluteDisplayBoxCoordinates = this->absoluteDisplayBoxCoordinates(layoutBox);
     auto& displayBox = formattingContext().geometryForBox(layoutBox);
-    auto margins = Edges { { displayBox.computedMarginStart().valueOr(0), displayBox.computedMarginEnd().valueOr(0) }, { displayBox.marginBefore(), displayBox.marginAfter() } };
+    auto horizontalMargin = computedHorizontalMargin(layoutBox, horizontalConstraints.logicalWidth);
+    auto margins = Edges { { *horizontalMargin.start, *horizontalMargin.end }, { displayBox.marginBefore(), displayBox.marginAfter() } };
     auto floatAvoider = FloatAvoider { layoutBox, absoluteDisplayBoxCoordinates.topLeft, displayBox.width(), margins, absoluteDisplayBoxCoordinates.containingBlockContentBox };
     findPositionForFormattingContextRoot(floatAvoider);
     auto containingBlockTopLeft = absoluteDisplayBoxCoordinates.containingBlockTopLeft;

Modified: trunk/Source/WebCore/layout/floats/FloatingContext.h (263937 => 263938)


--- trunk/Source/WebCore/layout/floats/FloatingContext.h	2020-07-04 17:18:45 UTC (rev 263937)
+++ trunk/Source/WebCore/layout/floats/FloatingContext.h	2020-07-04 18:37:44 UTC (rev 263938)
@@ -49,7 +49,7 @@
     FloatingState& floatingState() const { return m_floatingState; }
 
     LayoutPoint positionForFloat(const Box&, const HorizontalConstraints&) const;
-    LayoutPoint positionForNonFloatingFloatAvoider(const Box&) const;
+    LayoutPoint positionForNonFloatingFloatAvoider(const Box&, const HorizontalConstraints&) const;
 
     struct ClearancePosition {
         Optional<Position> position;

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp (263937 => 263938)


--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp	2020-07-04 17:18:45 UTC (rev 263937)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp	2020-07-04 18:37:44 UTC (rev 263938)
@@ -281,9 +281,7 @@
 void InlineFormattingContext::computeHorizontalMargin(const Box& layoutBox, const HorizontalConstraints& horizontalConstraints)
 {
     auto computedHorizontalMargin = geometry().computedHorizontalMargin(layoutBox, horizontalConstraints);
-    auto& displayBox = formattingState().displayBox(layoutBox);
-    displayBox.setHorizontalComputedMargin(computedHorizontalMargin);
-    displayBox.setHorizontalMargin({ computedHorizontalMargin.start.valueOr(0), computedHorizontalMargin.end.valueOr(0) });
+    formattingState().displayBox(layoutBox).setHorizontalMargin({ computedHorizontalMargin.start.valueOr(0), computedHorizontalMargin.end.valueOr(0) });
 }
 
 void InlineFormattingContext::computeWidthAndMargin(const Box& layoutBox, const HorizontalConstraints& horizontalConstraints)
@@ -316,7 +314,6 @@
     auto& displayBox = formattingState().displayBox(layoutBox);
     displayBox.setContentBoxWidth(contentWidthAndMargin.contentWidth);
     displayBox.setHorizontalMargin({ contentWidthAndMargin.usedMargin });
-    displayBox.setHorizontalComputedMargin(contentWidthAndMargin.computedMargin);
 }
 
 void InlineFormattingContext::computeHeightAndMargin(const Box& layoutBox, const HorizontalConstraints& horizontalConstraints)

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextGeometry.cpp (263937 => 263938)


--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextGeometry.cpp	2020-07-04 17:18:45 UTC (rev 263937)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextGeometry.cpp	2020-07-04 18:37:44 UTC (rev 263938)
@@ -59,7 +59,7 @@
     // #2
     auto computedHorizontalMargin = Geometry::computedHorizontalMargin(formattingContextRoot, horizontalConstraints);
 
-    return ContentWidthAndMargin { *width, { computedHorizontalMargin.start.valueOr(0_lu), computedHorizontalMargin.end.valueOr(0_lu) }, computedHorizontalMargin };
+    return ContentWidthAndMargin { *width, { computedHorizontalMargin.start.valueOr(0_lu), computedHorizontalMargin.end.valueOr(0_lu) } };
 }
 
 ContentHeightAndMargin InlineFormattingContext::Geometry::inlineBlockHeightAndMargin(const Box& layoutBox, const HorizontalConstraints& horizontalConstraints, const OverrideVerticalValues& overrideVerticalValues) const

Modified: trunk/Source/WebCore/layout/tableformatting/TableFormattingContext.cpp (263937 => 263938)


--- trunk/Source/WebCore/layout/tableformatting/TableFormattingContext.cpp	2020-07-04 17:18:45 UTC (rev 263937)
+++ trunk/Source/WebCore/layout/tableformatting/TableFormattingContext.cpp	2020-07-04 18:37:44 UTC (rev 263938)
@@ -156,7 +156,6 @@
         rowDisplayBox.setPadding(geometry().computedPadding(rowBox, availableHorizontalSpace));
         // Internal table elements do not have margins.
         rowDisplayBox.setHorizontalMargin({ });
-        rowDisplayBox.setHorizontalComputedMargin({ });
         rowDisplayBox.setVerticalMargin({ { }, { } });
 
         auto computedRowBorder = [&] {
@@ -239,7 +238,6 @@
         paddingBefore = WTF::nullopt;
         // Internal table elements do not have margins.
         sectionDisplayBox.setHorizontalMargin({ });
-        sectionDisplayBox.setHorizontalComputedMargin({ });
         sectionDisplayBox.setVerticalMargin({ { }, { } });
 
         sectionDisplayBox.setContentBoxWidth(sectionWidth);
@@ -270,7 +268,6 @@
     cellDisplayBox.setPadding(geometry().computedPadding(cellBox, availableHorizontalSpace));
     // Internal table elements do not have margins.
     cellDisplayBox.setHorizontalMargin({ });
-    cellDisplayBox.setHorizontalComputedMargin({ });
     cellDisplayBox.setVerticalMargin({ { }, { } });
 
     auto availableSpaceForContent = [&] {
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to