Title: [232257] trunk/Source/WebCore
Revision
232257
Author
za...@apple.com
Date
2018-05-29 08:19:49 -0700 (Tue, 29 May 2018)

Log Message

[LFC] Miscellaneous fixes to ensure no assertion in LayoutContext::layout
https://bugs.webkit.org/show_bug.cgi?id=186052

Reviewed by Antti Koivisto.

With this patch, LayoutContext::layout() does not assert on <html><body><div></div></body></html> anymore.

* layout/LayoutContext.cpp:
(WebCore::Layout::LayoutContext::initializeRoot): New context root is always a layout root.
* layout/LayoutContext.h:
* layout/Verification.cpp:
(WebCore::Layout::outputMismatchingBoxInformationIfNeeded):
* layout/blockformatting/BlockFormattingContext.cpp:
(WebCore::Layout::BlockFormattingContext::layout const): we need computed margin/border/padding for width computation
* layout/displaytree/DisplayBox.cpp: Add clone() method to be able to carry over the 'hasValid*' bits.
(WebCore::Display::Box::Style::Style):
(WebCore::Display::Box::borderBox const):
(WebCore::Display::Box::contentBox const):
* layout/displaytree/DisplayBox.h:
(WebCore::Display::Box::Rect::operator LayoutRect const):
(WebCore::Display::Box::setSize):
(WebCore::Display::Box::setHasValidMargin):
(WebCore::Display::Box::setHasValidBorder):
(WebCore::Display::Box::setHasValidPadding):
(WebCore::Display::Box::Rect::setHasValidPosition):
(WebCore::Display::Box::Rect::setHasValidSize):
(WebCore::Display::Box::Rect::setSize):
(WebCore::Display::Box::Rect::clone const):
(WebCore::Display::Box::setMargin):
(WebCore::Display::Box::setBorder):
(WebCore::Display::Box::setPadding):
(WebCore::Display::Box::Rect::Rect): Deleted.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (232256 => 232257)


--- trunk/Source/WebCore/ChangeLog	2018-05-29 15:00:09 UTC (rev 232256)
+++ trunk/Source/WebCore/ChangeLog	2018-05-29 15:19:49 UTC (rev 232257)
@@ -1,3 +1,38 @@
+2018-05-29  Zalan Bujtas  <za...@apple.com>
+
+        [LFC] Miscellaneous fixes to ensure no assertion in LayoutContext::layout
+        https://bugs.webkit.org/show_bug.cgi?id=186052
+
+        Reviewed by Antti Koivisto.
+
+        With this patch, LayoutContext::layout() does not assert on <html><body><div></div></body></html> anymore.
+
+        * layout/LayoutContext.cpp:
+        (WebCore::Layout::LayoutContext::initializeRoot): New context root is always a layout root.
+        * layout/LayoutContext.h:
+        * layout/Verification.cpp:
+        (WebCore::Layout::outputMismatchingBoxInformationIfNeeded):
+        * layout/blockformatting/BlockFormattingContext.cpp:
+        (WebCore::Layout::BlockFormattingContext::layout const): we need computed margin/border/padding for width computation  
+        * layout/displaytree/DisplayBox.cpp: Add clone() method to be able to carry over the 'hasValid*' bits.
+        (WebCore::Display::Box::Style::Style):
+        (WebCore::Display::Box::borderBox const):
+        (WebCore::Display::Box::contentBox const):
+        * layout/displaytree/DisplayBox.h:
+        (WebCore::Display::Box::Rect::operator LayoutRect const):
+        (WebCore::Display::Box::setSize):
+        (WebCore::Display::Box::setHasValidMargin):
+        (WebCore::Display::Box::setHasValidBorder):
+        (WebCore::Display::Box::setHasValidPadding):
+        (WebCore::Display::Box::Rect::setHasValidPosition):
+        (WebCore::Display::Box::Rect::setHasValidSize):
+        (WebCore::Display::Box::Rect::setSize):
+        (WebCore::Display::Box::Rect::clone const):
+        (WebCore::Display::Box::setMargin):
+        (WebCore::Display::Box::setBorder):
+        (WebCore::Display::Box::setPadding):
+        (WebCore::Display::Box::Rect::Rect): Deleted.
+
 2018-05-29  Wenson Hsieh  <wenson_hs...@apple.com>
 
         [Extra zoom mode] "Significant area painted" rendering progress event is rarely fired

Modified: trunk/Source/WebCore/layout/LayoutContext.cpp (232256 => 232257)


--- trunk/Source/WebCore/layout/LayoutContext.cpp	2018-05-29 15:00:09 UTC (rev 232256)
+++ trunk/Source/WebCore/layout/LayoutContext.cpp	2018-05-29 15:19:49 UTC (rev 232257)
@@ -51,12 +51,13 @@
 
 void LayoutContext::initializeRoot(const Container& root, const LayoutSize& containerSize)
 {
+    ASSERT(root.establishesFormattingContext());
+
     m_root = makeWeakPtr(const_cast<Container&>(root));
     auto& displayBox = createDisplayBox(root);
     // Root is always at 0 0 with no margin 
     displayBox.setTopLeft({ });
-    displayBox.setWidth(containerSize.width());
-    displayBox.setHeight(containerSize.height());
+    displayBox.setSize(containerSize);
     displayBox.setMargin({ });
 
     auto& style = root.style();
@@ -66,8 +67,8 @@
         style.borderLeft().width(),
         style.borderBottom().width(),
         style.borderRight().width()
+    });
 
-    });
     displayBox.setPadding({
         valueForLength(style.paddingTop(), containerSize.width()),
         valueForLength(style.paddingLeft(), containerSize.width()),
@@ -74,6 +75,8 @@
         valueForLength(style.paddingBottom(), containerSize.width()),
         valueForLength(style.paddingRight(), containerSize.width())
     });
+
+    m_formattingContextRootListForLayout.add(&root);
 }
 
 void LayoutContext::updateLayout()

Modified: trunk/Source/WebCore/layout/LayoutContext.h (232256 => 232257)


--- trunk/Source/WebCore/layout/LayoutContext.h	2018-05-29 15:00:09 UTC (rev 232256)
+++ trunk/Source/WebCore/layout/LayoutContext.h	2018-05-29 15:19:49 UTC (rev 232257)
@@ -77,12 +77,12 @@
     FormattingState& establishedFormattingState(const Box& formattingContextRoot, const FormattingContext&);
     std::unique_ptr<FormattingContext> formattingContext(const Box& formattingContextRoot);
 
+    Display::Box& createDisplayBox(const Box&);
+    Display::Box* displayBoxForLayoutBox(const Box& layoutBox) const { return m_layoutToDisplayBox.get(&layoutBox); }
+
     // For testing purposes only
     void verifyAndOutputMismatchingLayoutTree(const RenderView&) const;
 
-    Display::Box& createDisplayBox(const Box&);
-    Display::Box* displayBoxForLayoutBox(const Box& layoutBox) const { return m_layoutToDisplayBox.get(&layoutBox); }
-
 private:
     WeakPtr<Container> m_root;
     HashSet<const Container*> m_formattingContextRootListForLayout;

Modified: trunk/Source/WebCore/layout/Verification.cpp (232256 => 232257)


--- trunk/Source/WebCore/layout/Verification.cpp	2018-05-29 15:00:09 UTC (rev 232256)
+++ trunk/Source/WebCore/layout/Verification.cpp	2018-05-29 15:19:49 UTC (rev 232257)
@@ -56,7 +56,7 @@
     auto* displayBox = context.displayBoxForLayoutBox(layoutBox);
     ASSERT(displayBox);
 
-    if (renderer.marginBoxRect() != displayBox->marginBox())
+    if (renderer.frameRect() != displayBox->rect())
         outputRect("frameBox", renderer.frameRect(), displayBox->rect());
 
     if (renderer.marginBoxRect() != displayBox->marginBox())

Modified: trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp (232256 => 232257)


--- trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp	2018-05-29 15:00:09 UTC (rev 232256)
+++ trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp	2018-05-29 15:19:49 UTC (rev 232257)
@@ -73,10 +73,10 @@
             auto& layoutBox = layoutPair.layoutBox;
             auto& displayBox = layoutPair.displayBox;
             
-            computeWidth(layoutContext, layoutBox, displayBox);
             computeMargin(layoutContext, layoutBox, displayBox);
             computeBorderAndPadding(layoutContext, layoutBox, displayBox);
             computeStaticPosition(layoutContext, layoutBox, displayBox);
+            computeWidth(layoutContext, layoutBox, displayBox);
             if (layoutBox.establishesFormattingContext()) {
                 auto formattingContext = layoutContext.formattingContext(layoutBox);
                 formattingContext->layout(layoutContext, layoutContext.establishedFormattingState(layoutBox, *formattingContext));

Modified: trunk/Source/WebCore/layout/displaytree/DisplayBox.cpp (232256 => 232257)


--- trunk/Source/WebCore/layout/displaytree/DisplayBox.cpp	2018-05-29 15:00:09 UTC (rev 232256)
+++ trunk/Source/WebCore/layout/displaytree/DisplayBox.cpp	2018-05-29 15:19:49 UTC (rev 232257)
@@ -48,7 +48,6 @@
 Box::Style::Style(const RenderStyle& style)
     : boxSizing(style.boxSizing())
 {
-
 }
 
 Box::Rect Box::marginBox() const
@@ -66,15 +65,17 @@
 
 Box::Rect Box::borderBox() const
 {
+    auto rect = m_rect.clone();
+    rect.setTopLeft({ });
+
     if (m_style.boxSizing == BoxSizing::BorderBox)
-        return Box::Rect( { }, size());
+        return rect;
 
     // Width is content box.
     ASSERT(m_hasValidBorder);
     ASSERT(m_hasValidPadding);
-    auto borderBoxSize = size();
-    borderBoxSize.expand(borderLeft() + paddingLeft() + paddingRight() + borderRight(), borderTop() + paddingTop() + paddingBottom() + borderBottom());
-    return Box::Rect( { }, borderBoxSize);
+    rect.expand(borderLeft() + paddingLeft() + paddingRight() + borderRight(), borderTop() + paddingTop() + paddingBottom() + borderBottom());
+    return rect;
 }
 
 Box::Rect Box::paddingBox() const
@@ -92,8 +93,11 @@
 
 Box::Rect Box::contentBox() const
 {
-    if (m_style.boxSizing == BoxSizing::ContentBox)
-        return Box::Rect(LayoutPoint(0, 0), size());
+    if (m_style.boxSizing == BoxSizing::ContentBox) {
+        auto rect = m_rect.clone();
+        rect.setTopLeft({ });
+        return rect;
+    }
 
     // Width is border box.
     ASSERT(m_hasValidPadding);

Modified: trunk/Source/WebCore/layout/displaytree/DisplayBox.h (232256 => 232257)


--- trunk/Source/WebCore/layout/displaytree/DisplayBox.h	2018-05-29 15:00:09 UTC (rev 232256)
+++ trunk/Source/WebCore/layout/displaytree/DisplayBox.h	2018-05-29 15:19:49 UTC (rev 232257)
@@ -55,7 +55,6 @@
     class Rect {
     public:
         Rect() = default;
-        Rect(const LayoutPoint&, const LayoutSize&);
         
         LayoutUnit top() const;
         LayoutUnit left() const;
@@ -74,6 +73,7 @@
         void setTopLeft(const LayoutPoint&);
         void setWidth(LayoutUnit);
         void setHeight(LayoutUnit);
+        void setSize(const LayoutSize&);
 
         void shiftLeftTo(LayoutUnit);
         void shiftRightTo(LayoutUnit);
@@ -82,7 +82,8 @@
 
         void expand(LayoutUnit, LayoutUnit);
 
-        operator LayoutRect() const { return m_rect; }
+        Rect clone() const;
+        operator LayoutRect() const;
 
     private:
 #if !ASSERT_DISABLED
@@ -97,6 +98,7 @@
         bool hasValidGeometry() const { return hasValidPosition() && hasValidSize(); }
     
         void setHasValidPosition();
+        void setHasValidSize();
 
         bool m_hasValidTop { false };
         bool m_hasValidLeft { false };
@@ -156,6 +158,7 @@
     void setLeft(LayoutUnit left) { m_rect.setLeft(left); }
     void setWidth(LayoutUnit width) { m_rect.setWidth(width); }
     void setHeight(LayoutUnit height) { m_rect.setHeight(height); }
+    void setSize(const LayoutSize& size) { m_rect.setSize(size); }
 
     struct Edges {
         Edges() = default;
@@ -180,9 +183,9 @@
     void invalidateBorder() { m_hasValidBorder = false; }
     void invalidatePadding() { m_hasValidPadding = false; }
 
-    void setHasValidMargin();
-    void setHasValidBorder();
-    void setHasValidPadding();
+    void setHasValidMargin() { m_hasValidMargin = true; }
+    void setHasValidBorder() { m_hasValidBorder = true; }
+    void setHasValidPadding() { m_hasValidPadding = true; }
 #endif
 
     const Style m_style;
@@ -212,13 +215,13 @@
     m_hasValidTop = true;
     m_hasValidLeft = true;
 }
-#endif
 
-inline Box::Rect::Rect(const LayoutPoint& topLeft, const LayoutSize& size)
-    : m_rect(topLeft, size)
+inline void Box::Rect::setHasValidSize()
 {
-
+    m_hasValidWidth = true;
+    m_hasValidHeight = true;
 }
+#endif
 
 inline LayoutUnit Box::Rect::top() const
 {
@@ -316,6 +319,14 @@
     m_rect.setHeight(height);
 }
 
+inline void Box::Rect::setSize(const LayoutSize& size)
+{
+#if !ASSERT_DISABLED
+    setHasValidSize();
+#endif
+    m_rect.setSize(size);
+}
+
 inline void Box::Rect::shiftLeftTo(LayoutUnit left)
 {
     ASSERT(m_hasValidLeft);
@@ -346,10 +357,29 @@
     m_rect.expand(width, height);
 }
 
+inline Box::Rect Box::Rect::clone() const
+{
+    Rect rect;
+#if !ASSERT_DISABLED
+    rect.m_hasValidTop = m_hasValidTop;
+    rect.m_hasValidLeft = m_hasValidLeft;
+    rect.m_hasValidWidth = m_hasValidWidth;
+    rect.m_hasValidHeight  = m_hasValidHeight;
+#endif 
+    rect.m_rect = m_rect;
+    return rect;
+}
+
+inline Box::Rect::operator LayoutRect() const
+{
+    ASSERT(hasValidGeometry()); 
+    return m_rect;
+}
+
 inline void Box::setMargin(Edges margin)
 {
 #if !ASSERT_DISABLED
-    void setHasValidMargin();
+    setHasValidMargin();
 #endif
     m_margin = margin;
 }
@@ -357,7 +387,7 @@
 inline void Box::setBorder(Edges border)
 {
 #if !ASSERT_DISABLED
-    void setHasValidBorder();
+    setHasValidBorder();
 #endif
     m_border = border;
 }
@@ -365,7 +395,7 @@
 inline void Box::setPadding(Edges padding)
 {
 #if !ASSERT_DISABLED
-    void setHasValidPadding();
+    setHasValidPadding();
 #endif
     m_padding = padding;
 }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to