[LFC][BFC] Display::Box interface should reflect that padding is optional.
authorzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 16 Aug 2018 14:40:31 +0000 (14:40 +0000)
committerzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 16 Aug 2018 14:40:31 +0000 (14:40 +0000)
https://bugs.webkit.org/show_bug.cgi?id=188630

Reviewed by Antti Koivisto.

Certain type of boxes can't have paddings (see Layout::Box::isPaddingApplicable).

* layout/FormattingContext.cpp:
(WebCore::Layout::FormattingContext::computeBorderAndPadding const):
(WebCore::Layout::FormattingContext::validateGeometryConstraintsAfterLayout const):
* layout/FormattingContextGeometry.cpp:
(WebCore::Layout::FormattingContext::Geometry::outOfFlowNonReplacedVerticalGeometry):
(WebCore::Layout::FormattingContext::Geometry::outOfFlowNonReplacedHorizontalGeometry):
(WebCore::Layout::FormattingContext::Geometry::outOfFlowReplacedVerticalGeometry):
(WebCore::Layout::FormattingContext::Geometry::outOfFlowReplacedHorizontalGeometry):
* layout/blockformatting/BlockFormattingContextGeometry.cpp:
(WebCore::Layout::BlockFormattingContext::Geometry::inFlowNonReplacedHeightAndMargin):
(WebCore::Layout::BlockFormattingContext::Geometry::inFlowNonReplacedWidthAndMargin):
* layout/displaytree/DisplayBox.h:
(WebCore::Display::Box::width const):
(WebCore::Display::Box::height const):
(WebCore::Display::Box::contentBoxTop const):
(WebCore::Display::Box::contentBoxLeft const):
(WebCore::Display::Box::setPadding):
(WebCore::Display::Box::paddingTop const):
(WebCore::Display::Box::paddingLeft const):
(WebCore::Display::Box::paddingBottom const):
(WebCore::Display::Box::paddingRight const):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@234925 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/layout/FormattingContext.cpp
Source/WebCore/layout/FormattingContextGeometry.cpp
Source/WebCore/layout/blockformatting/BlockFormattingContextGeometry.cpp
Source/WebCore/layout/displaytree/DisplayBox.h

index 3771800..32c996f 100644 (file)
@@ -1,5 +1,36 @@
 2018-08-16  Zalan Bujtas  <zalan@apple.com>
 
+        [LFC][BFC] Display::Box interface should reflect that padding is optional.
+        https://bugs.webkit.org/show_bug.cgi?id=188630
+
+        Reviewed by Antti Koivisto.
+
+        Certain type of boxes can't have paddings (see Layout::Box::isPaddingApplicable).
+
+        * layout/FormattingContext.cpp:
+        (WebCore::Layout::FormattingContext::computeBorderAndPadding const):
+        (WebCore::Layout::FormattingContext::validateGeometryConstraintsAfterLayout const):
+        * layout/FormattingContextGeometry.cpp:
+        (WebCore::Layout::FormattingContext::Geometry::outOfFlowNonReplacedVerticalGeometry):
+        (WebCore::Layout::FormattingContext::Geometry::outOfFlowNonReplacedHorizontalGeometry):
+        (WebCore::Layout::FormattingContext::Geometry::outOfFlowReplacedVerticalGeometry):
+        (WebCore::Layout::FormattingContext::Geometry::outOfFlowReplacedHorizontalGeometry):
+        * layout/blockformatting/BlockFormattingContextGeometry.cpp:
+        (WebCore::Layout::BlockFormattingContext::Geometry::inFlowNonReplacedHeightAndMargin):
+        (WebCore::Layout::BlockFormattingContext::Geometry::inFlowNonReplacedWidthAndMargin):
+        * layout/displaytree/DisplayBox.h:
+        (WebCore::Display::Box::width const):
+        (WebCore::Display::Box::height const):
+        (WebCore::Display::Box::contentBoxTop const):
+        (WebCore::Display::Box::contentBoxLeft const):
+        (WebCore::Display::Box::setPadding):
+        (WebCore::Display::Box::paddingTop const):
+        (WebCore::Display::Box::paddingLeft const):
+        (WebCore::Display::Box::paddingBottom const):
+        (WebCore::Display::Box::paddingRight const):
+
+2018-08-16  Zalan Bujtas  <zalan@apple.com>
+
         [LFC] Add showLayoutTree() that does not require LayoutContext.
         https://bugs.webkit.org/show_bug.cgi?id=188631
 
index 4163e76..de48009 100644 (file)
@@ -90,8 +90,7 @@ void FormattingContext::computeOutOfFlowVerticalGeometry(LayoutContext& layoutCo
 void FormattingContext::computeBorderAndPadding(LayoutContext& layoutContext, const Box& layoutBox, Display::Box& displayBox) const
 {
     displayBox.setBorder(Geometry::computedBorder(layoutContext, layoutBox));
-    if (auto padding = Geometry::computedPadding(layoutContext, layoutBox))
-        displayBox.setPadding(*padding);
+    displayBox.setPadding(Geometry::computedPadding(layoutContext, layoutBox));
 }
 
 void FormattingContext::placeInFlowPositionedChildren(LayoutContext& layoutContext, const Container& container) const
@@ -204,16 +203,16 @@ void FormattingContext::validateGeometryConstraintsAfterLayout(const LayoutConte
         if ((layoutBox.isBlockLevelBox() || layoutBox.isOutOfFlowPositioned()) && !layoutBox.replaced()) {
             // margin-left + border-left-width + padding-left + width + padding-right + border-right-width + margin-right = width of containing block
             auto containingBlockWidth = containingBlockDisplayBox.contentBoxWidth();
-            ASSERT(displayBox->marginLeft() + displayBox->borderLeft() + displayBox->paddingLeft() + displayBox->contentBoxWidth()
-                + displayBox->paddingRight() + displayBox->borderRight() + displayBox->marginRight() == containingBlockWidth);
+            ASSERT(displayBox->marginLeft() + displayBox->borderLeft() + displayBox->paddingLeft().value_or(0) + displayBox->contentBoxWidth()
+                + displayBox->paddingRight().value_or(0) + displayBox->borderRight() + displayBox->marginRight() == containingBlockWidth);
         }
 
         // 10.6.4 Absolutely positioned, non-replaced elements
         if (layoutBox.isOutOfFlowPositioned() && !layoutBox.replaced()) {
             // top + margin-top + border-top-width + padding-top + height + padding-bottom + border-bottom-width + margin-bottom + bottom = height of containing block
             auto containingBlockHeight = containingBlockDisplayBox.contentBoxHeight();
-            ASSERT(displayBox->top() + displayBox->marginTop() + displayBox->borderTop() + displayBox->paddingTop() + displayBox->contentBoxHeight()
-                + displayBox->paddingBottom() + displayBox->borderBottom() + displayBox->marginBottom() == containingBlockHeight);
+            ASSERT(displayBox->top() + displayBox->marginTop() + displayBox->borderTop() + displayBox->paddingTop().value_or(0) + displayBox->contentBoxHeight()
+                + displayBox->paddingBottom().value_or(0) + displayBox->borderBottom() + displayBox->marginBottom() == containingBlockHeight);
         }
     }
 }
index d90be21..c833b18 100644 (file)
@@ -196,8 +196,8 @@ VerticalGeometry FormattingContext::Geometry::outOfFlowNonReplacedVerticalGeomet
     auto height = computedValueIfNotAuto(style.logicalHeight(), containingBlockHeight);
     auto marginTop = computedValueIfNotAuto(style.marginTop(), containingBlockWidth);
     auto marginBottom = computedValueIfNotAuto(style.marginBottom(), containingBlockWidth);
-    auto paddingTop = displayBox.paddingTop();
-    auto paddingBottom = displayBox.paddingBottom();
+    auto paddingTop = displayBox.paddingTop().value_or(0);
+    auto paddingBottom = displayBox.paddingBottom().value_or(0);
     auto borderTop = displayBox.borderTop();
     auto borderBottom = displayBox.borderBottom();
 
@@ -314,8 +314,8 @@ HorizontalGeometry FormattingContext::Geometry::outOfFlowNonReplacedHorizontalGe
     auto width = computedValueIfNotAuto(style.logicalWidth(), containingBlockWidth);
     auto marginLeft = computedValueIfNotAuto(style.marginLeft(), containingBlockWidth);
     auto marginRight = computedValueIfNotAuto(style.marginRight(), containingBlockWidth);
-    auto paddingLeft = displayBox.paddingLeft();
-    auto paddingRight = displayBox.paddingRight();
+    auto paddingLeft = displayBox.paddingLeft().value_or(0);
+    auto paddingRight = displayBox.paddingRight().value_or(0);
     auto borderLeft = displayBox.borderLeft();
     auto borderRight = displayBox.borderRight();
 
@@ -442,8 +442,8 @@ VerticalGeometry FormattingContext::Geometry::outOfFlowReplacedVerticalGeometry(
     auto height = inlineReplacedHeightAndMargin(layoutContext, layoutBox).height;
     auto marginTop = computedValueIfNotAuto(style.marginTop(), containingBlockWidth);
     auto marginBottom = computedValueIfNotAuto(style.marginBottom(), containingBlockWidth);
-    auto paddingTop = displayBox.paddingTop();
-    auto paddingBottom = displayBox.paddingBottom();
+    auto paddingTop = displayBox.paddingTop().value_or(0);
+    auto paddingBottom = displayBox.paddingBottom().value_or(0);
     auto borderTop = displayBox.borderTop();
     auto borderBottom = displayBox.borderBottom();
 
@@ -515,8 +515,8 @@ HorizontalGeometry FormattingContext::Geometry::outOfFlowReplacedHorizontalGeome
     auto marginLeft = computedValueIfNotAuto(style.marginLeft(), containingBlockWidth);
     auto marginRight = computedValueIfNotAuto(style.marginRight(), containingBlockWidth);
     auto width = inlineReplacedWidthAndMargin(layoutContext, layoutBox).width;
-    auto paddingLeft = displayBox.paddingLeft();
-    auto paddingRight = displayBox.paddingRight();
+    auto paddingLeft = displayBox.paddingLeft().value_or(0);
+    auto paddingRight = displayBox.paddingRight().value_or(0);
     auto borderLeft = displayBox.borderLeft();
     auto borderRight = displayBox.borderRight();
 
index 6dffc0b..b8142d8 100644 (file)
@@ -104,7 +104,7 @@ HeightAndMargin BlockFormattingContext::Geometry::inFlowNonReplacedHeightAndMarg
         VerticalEdges nonCollapsedMargin = { FormattingContext::Geometry::computedValueIfNotAuto(style.marginTop(), containingBlockWidth).value_or(0),
             FormattingContext::Geometry::computedValueIfNotAuto(style.marginBottom(), containingBlockWidth).value_or(0) }; 
         VerticalEdges collapsedMargin = { MarginCollapse::marginTop(layoutContext, layoutBox), MarginCollapse::marginBottom(layoutContext, layoutBox) };
-        auto borderAndPaddingTop = displayBox.borderTop() + displayBox.paddingTop();
+        auto borderAndPaddingTop = displayBox.borderTop() + displayBox.paddingTop().value_or(0);
         
         auto height = style.logicalHeight();
         if (!height.isAuto()) {
@@ -191,8 +191,8 @@ WidthAndMargin BlockFormattingContext::Geometry::inFlowNonReplacedWidthAndMargin
         auto marginRight = FormattingContext::Geometry::computedValueIfNotAuto(style.marginRight(), containingBlockWidth);
         auto borderLeft = displayBox.borderLeft();
         auto borderRight = displayBox.borderRight();
-        auto paddingLeft = displayBox.paddingLeft();
-        auto paddingRight = displayBox.paddingRight();
+        auto paddingLeft = displayBox.paddingLeft().value_or(0);
+        auto paddingRight = displayBox.paddingRight().value_or(0);
 
         // #1
         if (width) {
index fd096d3..3e624f0 100644 (file)
@@ -126,8 +126,8 @@ public:
     LayoutPoint bottomRight() const { return { right(), bottom() }; }
 
     LayoutSize size() const { return { width(), height() }; }
-    LayoutUnit width() const { return borderLeft() + paddingLeft() + contentBoxWidth() + paddingRight() + borderRight(); }
-    LayoutUnit height() const { return borderTop() + paddingTop() + contentBoxHeight() + paddingBottom() + borderBottom(); }
+    LayoutUnit width() const { return borderLeft() + paddingLeft().value_or(0) + contentBoxWidth() + paddingRight().value_or(0) + borderRight(); }
+    LayoutUnit height() const { return borderTop() + paddingTop().value_or(0) + contentBoxHeight() + paddingBottom().value_or(0) + borderBottom(); }
     Rect rect() const { return { top(), left(), width(), height() }; }
     Rect rectWithMargin() const { return { top() - marginTop(), left() - marginLeft(), marginLeft() + width() + marginRight(), marginTop() + height() + marginBottom() }; }
 
@@ -144,13 +144,13 @@ public:
     LayoutUnit borderBottom() const;
     LayoutUnit borderRight() const;
 
-    LayoutUnit paddingTop() const;
-    LayoutUnit paddingLeft() const;
-    LayoutUnit paddingBottom() const;
-    LayoutUnit paddingRight() const;
+    std::optional<LayoutUnit> paddingTop() const;
+    std::optional<LayoutUnit> paddingLeft() const;
+    std::optional<LayoutUnit> paddingBottom() const;
+    std::optional<LayoutUnit> paddingRight() const;
 
-    LayoutUnit contentBoxTop() const { return borderTop() + paddingTop(); }
-    LayoutUnit contentBoxLeft() const { return borderLeft() + paddingLeft(); }
+    LayoutUnit contentBoxTop() const { return borderTop() + paddingTop().value_or(0); }
+    LayoutUnit contentBoxLeft() const { return borderLeft() + paddingLeft().value_or(0); }
     LayoutUnit contentBoxBottom() const { return contentBoxTop() + contentBoxHeight(); }
     LayoutUnit contentBoxRight() const { return contentBoxLeft() + contentBoxWidth(); }
     LayoutUnit contentBoxHeight() const;
@@ -186,7 +186,7 @@ private:
     void setVerticalNonCollapsedMargin(Layout::VerticalEdges);
 
     void setBorder(Layout::Edges);
-    void setPadding(Layout::Edges);
+    void setPadding(std::optional<Layout::Edges>);
 
 #if !ASSERT_DISABLED
     void invalidateMargin();
@@ -214,7 +214,7 @@ private:
     Layout::VerticalEdges m_verticalNonCollapsedMargin;
 
     Layout::Edges m_border;
-    Layout::Edges m_padding;
+    std::optional<Layout::Edges> m_padding;
 
 #if !ASSERT_DISABLED
     bool m_hasValidHorizontalMargin { false };
@@ -476,7 +476,7 @@ inline void Box::setBorder(Layout::Edges border)
     m_border = border;
 }
 
-inline void Box::setPadding(Layout::Edges padding)
+inline void Box::setPadding(std::optional<Layout::Edges> padding)
 {
 #if !ASSERT_DISABLED
     setHasValidPadding();
@@ -520,28 +520,36 @@ inline LayoutUnit Box::nonCollapsedMarginBottom() const
     return m_verticalNonCollapsedMargin.bottom;
 }
 
-inline LayoutUnit Box::paddingTop() const
+inline std::optional<LayoutUnit> Box::paddingTop() const
 {
     ASSERT(m_hasValidPadding);
-    return m_padding.vertical.top;
+    if (!m_padding)
+        return { };
+    return m_padding->vertical.top;
 }
 
-inline LayoutUnit Box::paddingLeft() const
+inline std::optional<LayoutUnit> Box::paddingLeft() const
 {
     ASSERT(m_hasValidPadding);
-    return m_padding.horizontal.left;
+    if (!m_padding)
+        return { };
+    return m_padding->horizontal.left;
 }
 
-inline LayoutUnit Box::paddingBottom() const
+inline std::optional<LayoutUnit> Box::paddingBottom() const
 {
     ASSERT(m_hasValidPadding);
-    return m_padding.vertical.bottom;
+    if (!m_padding)
+        return { };
+    return m_padding->vertical.bottom;
 }
 
-inline LayoutUnit Box::paddingRight() const
+inline std::optional<LayoutUnit> Box::paddingRight() const
 {
     ASSERT(m_hasValidPadding);
-    return m_padding.horizontal.right;
+    if (!m_padding)
+        return { };
+    return m_padding->horizontal.right;
 }
 
 inline LayoutUnit Box::borderTop() const