Title: [233350] trunk/Source/WebCore
Revision
233350
Author
za...@apple.com
Date
2018-06-29 00:55:53 -0700 (Fri, 29 Jun 2018)

Log Message

[LFC] The static position for an out-of-flow box should include the previous sibling's collapsed margin
https://bugs.webkit.org/show_bug.cgi?id=187169

Reviewed by Antti Koivisto.

When computing the static position of an absolutely positioned box, we need to look at the previous sibling's bottom margin.
If the previous sibling happens to collapse its bottom margin with the parent's bottom margin, we still need to account for it
and compute the static vertical position as if the bottom margin was not collapsed.

* layout/FormattingContext.cpp:
(WebCore::Layout::FormattingContext::computeFloatingHeightAndMargin const):
(WebCore::Layout::FormattingContext::computeOutOfFlowVerticalGeometry const):
* layout/FormattingContextGeometry.cpp:
(WebCore::Layout::staticVerticalPositionForOutOfFlowPositioned):
* layout/LayoutContext.cpp:
(WebCore::Layout::LayoutContext::initializeRoot):
* layout/Verification.cpp:
(WebCore::Layout::outputMismatchingBoxInformationIfNeeded):
* layout/blockformatting/BlockFormattingContext.cpp:
(WebCore::Layout::BlockFormattingContext::computeInFlowHeightAndMargin const):
* layout/displaytree/DisplayBox.cpp:
(WebCore::Display::Box::nonCollapsedMarginBox const):
* layout/displaytree/DisplayBox.h:
(WebCore::Display::Box::setHasValidVerticalNonCollapsedMargin):
(WebCore::Display::Box::setVerticalMargin):
(WebCore::Display::Box::setVerticalNonCollapsedMargin):
(WebCore::Display::Box::nonCollapsedMarginTop const):
(WebCore::Display::Box::nonCollapsedMarginBottom const):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (233349 => 233350)


--- trunk/Source/WebCore/ChangeLog	2018-06-29 05:45:34 UTC (rev 233349)
+++ trunk/Source/WebCore/ChangeLog	2018-06-29 07:55:53 UTC (rev 233350)
@@ -1,3 +1,34 @@
+2018-06-29  Zalan Bujtas  <za...@apple.com>
+
+        [LFC] The static position for an out-of-flow box should include the previous sibling's collapsed margin
+        https://bugs.webkit.org/show_bug.cgi?id=187169
+
+        Reviewed by Antti Koivisto.
+
+        When computing the static position of an absolutely positioned box, we need to look at the previous sibling's bottom margin.
+        If the previous sibling happens to collapse its bottom margin with the parent's bottom margin, we still need to account for it
+        and compute the static vertical position as if the bottom margin was not collapsed.
+
+        * layout/FormattingContext.cpp:
+        (WebCore::Layout::FormattingContext::computeFloatingHeightAndMargin const):
+        (WebCore::Layout::FormattingContext::computeOutOfFlowVerticalGeometry const):
+        * layout/FormattingContextGeometry.cpp:
+        (WebCore::Layout::staticVerticalPositionForOutOfFlowPositioned):
+        * layout/LayoutContext.cpp:
+        (WebCore::Layout::LayoutContext::initializeRoot):
+        * layout/Verification.cpp:
+        (WebCore::Layout::outputMismatchingBoxInformationIfNeeded):
+        * layout/blockformatting/BlockFormattingContext.cpp:
+        (WebCore::Layout::BlockFormattingContext::computeInFlowHeightAndMargin const):
+        * layout/displaytree/DisplayBox.cpp:
+        (WebCore::Display::Box::nonCollapsedMarginBox const):
+        * layout/displaytree/DisplayBox.h:
+        (WebCore::Display::Box::setHasValidVerticalNonCollapsedMargin):
+        (WebCore::Display::Box::setVerticalMargin):
+        (WebCore::Display::Box::setVerticalNonCollapsedMargin):
+        (WebCore::Display::Box::nonCollapsedMarginTop const):
+        (WebCore::Display::Box::nonCollapsedMarginBottom const):
+
 2018-06-27  Antoine Quint  <grao...@apple.com>
 
         [Web Animations] Using a Web Animation leaks the Document

Modified: trunk/Source/WebCore/layout/FormattingContext.cpp (233349 => 233350)


--- trunk/Source/WebCore/layout/FormattingContext.cpp	2018-06-29 05:45:34 UTC (rev 233349)
+++ trunk/Source/WebCore/layout/FormattingContext.cpp	2018-06-29 07:55:53 UTC (rev 233350)
@@ -58,6 +58,7 @@
     displayBox.moveVertically(heightAndMargin.margin.top);
     ASSERT(!heightAndMargin.collapsedMargin);
     displayBox.setVerticalMargin(heightAndMargin.margin);
+    displayBox.setVerticalNonCollapsedMargin(heightAndMargin.margin);
 }
 
 void FormattingContext::computeFloatingWidthAndMargin(LayoutContext& layoutContext, const Box& layoutBox, Display::Box& displayBox) const
@@ -83,6 +84,7 @@
     displayBox.setContentBoxHeight(verticalGeometry.heightAndMargin.height);
     ASSERT(!verticalGeometry.heightAndMargin.collapsedMargin);
     displayBox.setVerticalMargin(verticalGeometry.heightAndMargin.margin);
+    displayBox.setVerticalNonCollapsedMargin(verticalGeometry.heightAndMargin.margin);
 }
 
 void FormattingContext::computeBorderAndPadding(LayoutContext& layoutContext, const Box& layoutBox, Display::Box& displayBox) const

Modified: trunk/Source/WebCore/layout/FormattingContextGeometry.cpp (233349 => 233350)


--- trunk/Source/WebCore/layout/FormattingContextGeometry.cpp	2018-06-29 05:45:34 UTC (rev 233349)
+++ trunk/Source/WebCore/layout/FormattingContextGeometry.cpp	2018-06-29 07:55:53 UTC (rev 233350)
@@ -80,6 +80,11 @@
     ASSERT(layoutBox.isOutOfFlowPositioned());
 
     LayoutUnit top;
+    // Add sibling offset
+    if (auto* previousInFlowSibling = layoutBox.previousInFlowSibling()) {
+        auto& previousInFlowDisplayBox = *layoutContext.displayBoxForLayoutBox(*previousInFlowSibling);
+        top += previousInFlowDisplayBox.bottom() + previousInFlowDisplayBox.nonCollapsedMarginBottom();
+    }
     // Resolve top all the way up to the containing block.
     auto* containingBlock = layoutBox.containingBlock();
     for (auto* parent = layoutBox.parent(); parent; parent = parent->parent()) {
@@ -88,11 +93,6 @@
         if (parent == containingBlock)
             break;
     }
-    // Add sibling offset
-    if (auto* previousInFlowSibling = layoutBox.previousInFlowSibling()) {
-        auto& previousInFlowDisplayBox = *layoutContext.displayBoxForLayoutBox(*previousInFlowSibling);
-        top += previousInFlowDisplayBox.bottom() + previousInFlowDisplayBox.marginBottom();
-    }
     // FIXME: floatings need to be taken into account.
     return top;
 }

Modified: trunk/Source/WebCore/layout/LayoutContext.cpp (233349 => 233350)


--- trunk/Source/WebCore/layout/LayoutContext.cpp	2018-06-29 05:45:34 UTC (rev 233349)
+++ trunk/Source/WebCore/layout/LayoutContext.cpp	2018-06-29 07:55:53 UTC (rev 233350)
@@ -59,6 +59,7 @@
     // FIXME: m_root could very well be a formatting context root with ancestors and resolvable border and padding (as opposed to the topmost root)
     displayBox.setHorizontalMargin({ });
     displayBox.setVerticalMargin({ });
+    displayBox.setVerticalNonCollapsedMargin({ });
     displayBox.setBorder({ });
     displayBox.setPadding({ });
     displayBox.setContentBoxHeight(containerSize.height());

Modified: trunk/Source/WebCore/layout/Verification.cpp (233349 => 233350)


--- trunk/Source/WebCore/layout/Verification.cpp	2018-06-29 05:45:34 UTC (rev 233349)
+++ trunk/Source/WebCore/layout/Verification.cpp	2018-06-29 07:55:53 UTC (rev 233350)
@@ -67,19 +67,10 @@
         return true;
     }
 
-#ifndef NDEBUG
     if (renderer.marginBoxRect() != displayBox->nonCollapsedMarginBox()) {
         outputRect("marginBox", renderer.marginBoxRect(), displayBox->nonCollapsedMarginBox());
         return true;
     }
-#else
-    // For now in non-debug builds, verify the horizontal margin only
-    if (renderer.marginBoxRect().left() != displayBox->marginBox().left()
-        || renderer.marginBoxRect().right() != displayBox->marginBox().right() ) {
-        outputRect("marginBox", renderer.marginBoxRect(), displayBox->marginBox());
-        return true;
-    }
-#endif
 
     if (renderer.borderBoxRect() != displayBox->borderBox()) {
         outputRect("borderBox", renderer.borderBoxRect(), displayBox->borderBox());

Modified: trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp (233349 => 233350)


--- trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp	2018-06-29 05:45:34 UTC (rev 233349)
+++ trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp	2018-06-29 07:55:53 UTC (rev 233350)
@@ -194,9 +194,7 @@
     displayBox.setContentBoxHeight(heightAndMargin.height);
     displayBox.moveVertically(heightAndMargin.collapsedMargin.value_or(heightAndMargin.margin).top);
     displayBox.setVerticalMargin(heightAndMargin.collapsedMargin.value_or(heightAndMargin.margin));
-#ifndef NDEBUG
     displayBox.setVerticalNonCollapsedMargin(heightAndMargin.margin);
-#endif
 }
 
 void BlockFormattingContext::computeInFlowWidthAndMargin(LayoutContext& layoutContext, const Box& layoutBox, Display::Box& displayBox) const

Modified: trunk/Source/WebCore/layout/displaytree/DisplayBox.cpp (233349 => 233350)


--- trunk/Source/WebCore/layout/displaytree/DisplayBox.cpp	2018-06-29 05:45:34 UTC (rev 233349)
+++ trunk/Source/WebCore/layout/displaytree/DisplayBox.cpp	2018-06-29 07:55:53 UTC (rev 233350)
@@ -62,19 +62,17 @@
     return marginBox;
 }
 
-#ifndef NDEBUG
 Box::Rect Box::nonCollapsedMarginBox() const
 {
     auto borderBox = this->borderBox();
 
     Rect marginBox;
-    marginBox.setTop(borderBox.top() - m_nonCollapsedVertivalMargin.top);
+    marginBox.setTop(borderBox.top() - nonCollapsedMarginTop());
     marginBox.setLeft(borderBox.left() - marginLeft());
-    marginBox.setHeight(borderBox.height() + m_nonCollapsedVertivalMargin.top + m_nonCollapsedVertivalMargin.bottom);
+    marginBox.setHeight(borderBox.height() + nonCollapsedMarginTop() + nonCollapsedMarginBottom());
     marginBox.setWidth(borderBox.width() + marginLeft() + marginRight());
     return marginBox;
 }
-#endif
 
 Box::Rect Box::borderBox() const
 {

Modified: trunk/Source/WebCore/layout/displaytree/DisplayBox.h (233349 => 233350)


--- trunk/Source/WebCore/layout/displaytree/DisplayBox.h	2018-06-29 05:45:34 UTC (rev 233349)
+++ trunk/Source/WebCore/layout/displaytree/DisplayBox.h	2018-06-29 07:55:53 UTC (rev 233350)
@@ -131,6 +131,9 @@
     LayoutUnit marginBottom() const;
     LayoutUnit marginRight() const;
 
+    LayoutUnit nonCollapsedMarginTop() const;
+    LayoutUnit nonCollapsedMarginBottom() const;
+
     LayoutUnit borderTop() const;
     LayoutUnit borderLeft() const;
     LayoutUnit borderBottom() const;
@@ -147,9 +150,8 @@
     LayoutUnit contentBoxWidth() const;
 
     Rect marginBox() const;
-#ifndef NDEBUG
     Rect nonCollapsedMarginBox() const;
-#endif
+
     Rect borderBox() const;
     Rect paddingBox() const;
     Rect contentBox() const;
@@ -189,9 +191,8 @@
 
     void setHorizontalMargin(HorizontalEdges);
     void setVerticalMargin(VerticalEdges);
-#ifndef NDEBUG
-    void setVerticalNonCollapsedMargin(VerticalEdges margin) {  m_nonCollapsedVertivalMargin = margin; }
-#endif
+    void setVerticalNonCollapsedMargin(VerticalEdges);
+
     void setBorder(Edges);
     void setPadding(Edges);
 
@@ -201,6 +202,7 @@
     void invalidatePadding() { m_hasValidPadding = false; }
 
     void setHasValidVerticalMargin() { m_hasValidVerticalMargin = true; }
+    void setHasValidVerticalNonCollapsedMargin() { m_hasValidVerticalNonCollapsedMargin = true; }
     void setHasValidHorizontalMargin() { m_hasValidHorizontalMargin = true; }
 
     void setHasValidBorder() { m_hasValidBorder = true; }
@@ -217,9 +219,8 @@
     LayoutUnit m_contentHeight;
 
     Edges m_margin;
-#ifndef NDEBUG
-    VerticalEdges m_nonCollapsedVertivalMargin;
-#endif
+    VerticalEdges m_verticalNonCollapsedMargin;
+
     Edges m_border;
     Edges m_padding;
 
@@ -226,6 +227,7 @@
 #if !ASSERT_DISABLED
     bool m_hasValidHorizontalMargin { false };
     bool m_hasValidVerticalMargin { false };
+    bool m_hasValidVerticalNonCollapsedMargin { false };
     bool m_hasValidBorder { false };
     bool m_hasValidPadding { false };
     bool m_hasValidContentHeight { false };
@@ -466,6 +468,14 @@
     m_margin.vertical = margin;
 }
 
+inline void Box::setVerticalNonCollapsedMargin(VerticalEdges margin)
+{
+#if !ASSERT_DISABLED
+    setHasValidVerticalNonCollapsedMargin();
+#endif
+    m_verticalNonCollapsedMargin = margin;
+}
+
 inline void Box::setBorder(Edges border)
 {
 #if !ASSERT_DISABLED
@@ -506,6 +516,18 @@
     return m_margin.horizontal.right;
 }
 
+inline LayoutUnit Box::nonCollapsedMarginTop() const
+{
+    ASSERT(m_hasValidVerticalNonCollapsedMargin);
+    return m_verticalNonCollapsedMargin.top;
+}
+
+inline LayoutUnit Box::nonCollapsedMarginBottom() const
+{
+    ASSERT(m_hasValidVerticalNonCollapsedMargin);
+    return m_verticalNonCollapsedMargin.bottom;
+}
+
 inline LayoutUnit Box::paddingTop() const
 {
     ASSERT(m_hasValidPadding);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to