[LFC] Add assertions for stale Display::Box geometry
authorzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 7 May 2018 02:09:16 +0000 (02:09 +0000)
committerzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 7 May 2018 02:09:16 +0000 (02:09 +0000)
https://bugs.webkit.org/show_bug.cgi?id=185357

Reviewed by Antti Koivisto.

Ensure that we don't access stale geometry of other boxes during layout.
For example, in order to layout a block child we need the containing block's content box top/left and width (but not the height)

* layout/displaytree/DisplayBox.h:
(WebCore::Display::Box::invalidateTop):
(WebCore::Display::Box::invalidateLeft):
(WebCore::Display::Box::invalidateWidth):
(WebCore::Display::Box::invalidateHeight):
(WebCore::Display::Box::hasValidPosition const):
(WebCore::Display::Box::hasValidSize const):
(WebCore::Display::Box::hasValidGeometry const):
(WebCore::Display::Box::invalidatePosition):
(WebCore::Display::Box::invalidateSize):
(WebCore::Display::Box::setHasValidPosition):
(WebCore::Display::Box::setHasValidSize):
(WebCore::Display::Box::setHasValidGeometry):
(WebCore::Display::Box::rect const):
(WebCore::Display::Box::top const):
(WebCore::Display::Box::left const):
(WebCore::Display::Box::bottom const):
(WebCore::Display::Box::right const):
(WebCore::Display::Box::topLeft const):
(WebCore::Display::Box::bottomRight const):
(WebCore::Display::Box::size const):
(WebCore::Display::Box::width const):
(WebCore::Display::Box::height const):
(WebCore::Display::Box::setRect):
(WebCore::Display::Box::setTopLeft):
(WebCore::Display::Box::setTop):
(WebCore::Display::Box::setLeft):
(WebCore::Display::Box::setSize):
(WebCore::Display::Box::setWidth):
(WebCore::Display::Box::setHeight):

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

Source/WebCore/ChangeLog
Source/WebCore/layout/displaytree/DisplayBox.cpp
Source/WebCore/layout/displaytree/DisplayBox.h

index 9b48d834bc8e34c0e135cc6a765d4660fc1b24f1..b20d52b4d02a2bbc126d85eb4cb6b53df23a60f0 100644 (file)
@@ -1,3 +1,44 @@
+2018-05-06  Zalan Bujtas  <zalan@apple.com>
+
+        [LFC] Add assertions for stale Display::Box geometry
+        https://bugs.webkit.org/show_bug.cgi?id=185357
+
+        Reviewed by Antti Koivisto.
+
+        Ensure that we don't access stale geometry of other boxes during layout.
+        For example, in order to layout a block child we need the containing block's content box top/left and width (but not the height)
+
+        * layout/displaytree/DisplayBox.h:
+        (WebCore::Display::Box::invalidateTop):
+        (WebCore::Display::Box::invalidateLeft):
+        (WebCore::Display::Box::invalidateWidth):
+        (WebCore::Display::Box::invalidateHeight):
+        (WebCore::Display::Box::hasValidPosition const):
+        (WebCore::Display::Box::hasValidSize const):
+        (WebCore::Display::Box::hasValidGeometry const):
+        (WebCore::Display::Box::invalidatePosition):
+        (WebCore::Display::Box::invalidateSize):
+        (WebCore::Display::Box::setHasValidPosition):
+        (WebCore::Display::Box::setHasValidSize):
+        (WebCore::Display::Box::setHasValidGeometry):
+        (WebCore::Display::Box::rect const):
+        (WebCore::Display::Box::top const):
+        (WebCore::Display::Box::left const):
+        (WebCore::Display::Box::bottom const):
+        (WebCore::Display::Box::right const):
+        (WebCore::Display::Box::topLeft const):
+        (WebCore::Display::Box::bottomRight const):
+        (WebCore::Display::Box::size const):
+        (WebCore::Display::Box::width const):
+        (WebCore::Display::Box::height const):
+        (WebCore::Display::Box::setRect):
+        (WebCore::Display::Box::setTopLeft):
+        (WebCore::Display::Box::setTop):
+        (WebCore::Display::Box::setLeft):
+        (WebCore::Display::Box::setSize):
+        (WebCore::Display::Box::setWidth):
+        (WebCore::Display::Box::setHeight):
+
 2018-05-06  Zalan Bujtas  <zalan@apple.com>
 
         [LFC] Add BlockFormattingContext::computeStaticPosition
 2018-05-06  Zalan Bujtas  <zalan@apple.com>
 
         [LFC] Add BlockFormattingContext::computeStaticPosition
index eac3baf183ef49ae2bf5100afb593606d0fe061b..ccdf6483cd12ecd0cc538449f1f52f458e396e68 100644 (file)
@@ -45,6 +45,7 @@ Box::~Box()
 
 LayoutRect Box::marginBox() const
 {
 
 LayoutRect Box::marginBox() const
 {
+    ASSERT(m_hasValidMargin);
     auto marginBox = rect();
     auto topLeftMargin = LayoutSize(m_marginLeft, m_marginTop);
     marginBox.inflate(topLeftMargin);
     auto marginBox = rect();
     auto topLeftMargin = LayoutSize(m_marginLeft, m_marginTop);
     marginBox.inflate(topLeftMargin);
@@ -61,6 +62,7 @@ LayoutRect Box::borderBox() const
 
 LayoutRect Box::paddingBox() const
 {
 
 LayoutRect Box::paddingBox() const
 {
+    ASSERT(m_hasValidBorder);
     auto paddingBox = borderBox();
     auto topLeftBorder = LayoutSize(m_borderLeft, m_borderTop);
     paddingBox.inflate(-topLeftBorder);
     auto paddingBox = borderBox();
     auto topLeftBorder = LayoutSize(m_borderLeft, m_borderTop);
     paddingBox.inflate(-topLeftBorder);
@@ -72,6 +74,7 @@ LayoutRect Box::paddingBox() const
 
 LayoutRect Box::contentBox() const
 {
 
 LayoutRect Box::contentBox() const
 {
+    ASSERT(m_hasValidPadding);
     auto contentBox = paddingBox();
     auto topLeftPadding = LayoutSize(m_paddingLeft, m_paddingTop);
     contentBox.inflate(-topLeftPadding);
     auto contentBox = paddingBox();
     auto topLeftPadding = LayoutSize(m_paddingLeft, m_paddingTop);
     contentBox.inflate(-topLeftPadding);
index 1b24e8426e9c58298b5b63d538fa4bf23ba8e272..3cdfb1c5d08fe1c3bf2112679170123efad17b9b 100644 (file)
@@ -49,24 +49,24 @@ public:
 
     ~Box();
 
 
     ~Box();
 
-    LayoutRect rect() const { return m_rect; }
+    LayoutRect rect() const;
 
 
-    LayoutUnit top() const { return m_rect.y(); }
-    LayoutUnit left() const { return m_rect.x(); }
-    LayoutUnit bottom() const { return m_rect.maxY(); }
-    LayoutUnit right() const { return m_rect.maxX(); }
+    LayoutUnit top() const;
+    LayoutUnit left() const;
+    LayoutUnit bottom() const;
+    LayoutUnit right() const;
 
 
-    LayoutPoint topLeft() const { return m_rect.location(); }
-    LayoutPoint bottomRight() const { return m_rect.location(); }
+    LayoutPoint topLeft() const;
+    LayoutPoint bottomRight() const;
 
 
-    LayoutSize size() const { return m_rect.size(); }
-    LayoutUnit width() const { return m_rect.width(); }
-    LayoutUnit height() const { return m_rect.height(); }
+    LayoutSize size() const;
+    LayoutUnit width() const;
+    LayoutUnit height() const;
 
 
-    LayoutUnit marginTop() const { return m_marginTop; }
-    LayoutUnit marginLeft() const { return m_marginLeft; }
-    LayoutUnit marginBottom() const { return m_marginBottom; }
-    LayoutUnit marginRight() const { return m_marginRight; }
+    LayoutUnit marginTop() const;
+    LayoutUnit marginLeft() const;
+    LayoutUnit marginBottom() const;
+    LayoutUnit marginRight() const;
 
     LayoutRect marginBox() const;
     LayoutRect borderBox() const;
 
     LayoutRect marginBox() const;
     LayoutRect borderBox() const;
@@ -76,30 +76,44 @@ public:
 private:
     Box();
 
 private:
     Box();
 
-    void setRect(const LayoutRect& rect) { m_rect = rect; }
-    void setTopLeft(const LayoutPoint& topLeft) { m_rect.setLocation(topLeft); }
-    void setTop(LayoutUnit top) { m_rect.setY(top); }
-    void setLeft(LayoutUnit left) { m_rect.setX(left); }
-    void setSize(const LayoutSize& size) { m_rect.setSize(size); }
-    void setWidth(LayoutUnit width) { m_rect.setWidth(width); }
-    void setHeight(LayoutUnit height) { m_rect.setHeight(height); }
-
-    void setMarginTop(LayoutUnit marginTop) { m_marginTop = marginTop; }
-    void setMarginLeft(LayoutUnit marginLeft) { m_marginLeft = marginLeft; }
-    void setMarginBottom(LayoutUnit marginBottom) { m_marginBottom = marginBottom; }
-    void setMarginRight(LayoutUnit marginRight) { m_marginRight = marginRight; }
-
-    void setBorderTop(LayoutUnit borderTop) { m_borderTop = borderTop; }
-    void setBorderLeft(LayoutUnit borderLeft) { m_borderLeft = borderLeft; }
-    void setBorderBottom(LayoutUnit borderBottom) { m_borderBottom = borderBottom; }
-    void setBorderRight(LayoutUnit borderRight) { m_borderRight = borderRight; }
-
-    void setPaddingTop(LayoutUnit paddingTop) { m_paddingTop = paddingTop; }
-    void setPaddingLeft(LayoutUnit paddingLeft) { m_paddingLeft = paddingLeft; }
-    void setPaddingBottom(LayoutUnit paddingBottom) { m_paddingBottom = paddingBottom; }
-    void setPaddingRight(LayoutUnit paddingRight) { m_paddingRight = paddingRight; }
+    void setRect(const LayoutRect&);
+    void setTopLeft(const LayoutPoint&);
+    void setTop(LayoutUnit);
+    void setLeft(LayoutUnit);
+    void setSize(const LayoutSize&);
+    void setWidth(LayoutUnit);
+    void setHeight(LayoutUnit);
+
+    void setMargin(LayoutUnit marginTop, LayoutUnit marginLeft, LayoutUnit marginRight, LayoutUnit marginBottom);
+    void setBorder(LayoutUnit borderTop, LayoutUnit borderLeft, LayoutUnit borderRight, LayoutUnit borderBottom);
+    void setPadding(LayoutUnit paddingTop, LayoutUnit paddingLeft, LayoutUnit paddingRight, LayoutUnit paddingBottom);
+
+#if !ASSERT_DISABLED
+    void invalidateTop() { m_hasValidTop = false; }
+    void invalidateLeft() { m_hasValidLeft = false; }
+    void invalidateWidth() { m_hasValidWidth = false; }
+    void invalidateHeight() { m_hasValidHeight = false; }
+    void invalidatePosition();
+    void invalidateSize();
+    void invalidateMargin() { m_hasValidMargin = false; }
+    void invalidateBorder() { m_hasValidBorder = false; }
+    void invalidatePadding() { m_hasValidPadding = false; }
+
+    bool hasValidPosition() const { return m_hasValidTop && m_hasValidLeft; }
+    bool hasValidSize() const { return m_hasValidWidth && m_hasValidHeight; }
+    bool hasValidGeometry() const { return hasValidPosition() && hasValidSize(); }
+    
+    void setHasValidPosition();
+    void setHasValidSize();
+    void setHasValidGeometry();
+    
+    void setHasValidMargin();
+    void setHasValidBorder();
+    void setHasValidPadding();
+#endif
 
     LayoutRect m_rect;
 
     LayoutRect m_rect;
+
     LayoutUnit m_marginTop;
     LayoutUnit m_marginLeft;
     LayoutUnit m_marginBottom;
     LayoutUnit m_marginTop;
     LayoutUnit m_marginLeft;
     LayoutUnit m_marginBottom;
@@ -114,8 +128,223 @@ private:
     LayoutUnit m_paddingLeft;
     LayoutUnit m_paddingBottom;
     LayoutUnit m_paddingRight;
     LayoutUnit m_paddingLeft;
     LayoutUnit m_paddingBottom;
     LayoutUnit m_paddingRight;
+
+#if !ASSERT_DISABLED
+    bool m_hasValidTop { false };
+    bool m_hasValidLeft { false };
+    bool m_hasValidWidth { false };
+    bool m_hasValidHeight { false };
+    bool m_hasValidMargin { false };
+    bool m_hasValidBorder { false };
+    bool m_hasValidPadding { false };
+#endif
 };
 
 };
 
+#if !ASSERT_DISABLED
+inline void Box::invalidatePosition()
+{
+    invalidateTop();
+    invalidateLeft();
+}
+
+inline void Box::invalidateSize()
+{
+    invalidateWidth();
+    invalidateHeight();
+}
+
+inline void Box::setHasValidPosition()
+{
+    m_hasValidTop = true;
+    m_hasValidLeft = true;
+}
+
+inline void Box::setHasValidSize()
+{
+    m_hasValidWidth = true;
+    m_hasValidHeight = true;
+}
+
+inline void Box::setHasValidGeometry()
+{
+    setHasValidPosition();
+    setHasValidSize();
+}
+#endif
+
+inline LayoutRect Box::rect() const
+{
+    ASSERT(hasValidGeometry());
+    return m_rect;
+}
+
+inline LayoutUnit Box::top() const
+{
+    ASSERT(m_hasValidTop);
+    return m_rect.y();
+}
+
+inline LayoutUnit Box::left() const
+{
+    ASSERT(m_hasValidLeft);
+    return m_rect.x();
+}
+
+inline LayoutUnit Box::bottom() const
+{
+    ASSERT(m_hasValidTop && m_hasValidHeight);
+    return m_rect.maxY();
+}
+
+inline LayoutUnit Box::right() const
+{
+    ASSERT(m_hasValidLeft && m_hasValidWidth);
+    return m_rect.maxX();
+}
+
+inline LayoutPoint Box::topLeft() const
+{
+    ASSERT(hasValidPosition());
+    return m_rect.location();
+}
+
+inline LayoutPoint Box::bottomRight() const
+{
+    ASSERT(hasValidGeometry());
+    return m_rect.maxXMaxYCorner();
+}
+
+inline LayoutSize Box::size() const
+{
+    ASSERT(hasValidSize());
+    return m_rect.size();
+}
+
+inline LayoutUnit Box::width() const
+{
+    ASSERT(m_hasValidWidth);
+    return m_rect.width();
+}
+
+inline LayoutUnit Box::height() const
+{
+    ASSERT(m_hasValidHeight);
+    return m_rect.height();
+}
+
+inline void Box::setRect(const LayoutRect& rect)
+{
+#if !ASSERT_DISABLED
+    setHasValidGeometry();
+#endif
+    m_rect = rect;
+}
+
+inline void Box::setTopLeft(const LayoutPoint& topLeft)
+{
+#if !ASSERT_DISABLED
+    setHasValidPosition();
+#endif
+    m_rect.setLocation(topLeft);
+}
+
+inline void Box::setTop(LayoutUnit top)
+{
+#if !ASSERT_DISABLED
+    m_hasValidTop = true;
+#endif
+    m_rect.setY(top);
+}
+
+inline void Box::setLeft(LayoutUnit left)
+{
+#if !ASSERT_DISABLED
+    m_hasValidLeft = true;
+#endif
+    m_rect.setX(left);
+}
+
+inline void Box::setSize(const LayoutSize& size)
+{
+#if !ASSERT_DISABLED
+    setHasValidSize();
+#endif
+    m_rect.setSize(size);
+}
+
+inline void Box::setWidth(LayoutUnit width)
+{
+#if !ASSERT_DISABLED
+    m_hasValidWidth = true;
+#endif
+    m_rect.setWidth(width);
+}
+
+inline void Box::setHeight(LayoutUnit height)
+{
+#if !ASSERT_DISABLED
+    m_hasValidHeight = true;
+#endif
+    m_rect.setHeight(height);
+}
+
+inline void Box::setMargin(LayoutUnit marginTop, LayoutUnit marginLeft, LayoutUnit marginRight, LayoutUnit marginBottom)
+{
+#if !ASSERT_DISABLED
+    void setHasValidMargin();
+#endif
+    m_marginTop = marginTop;
+    m_marginLeft = marginLeft;
+    m_marginBottom = marginBottom;
+    m_marginRight = marginRight;
+}
+
+inline void Box::setBorder(LayoutUnit borderTop, LayoutUnit borderLeft, LayoutUnit borderRight, LayoutUnit borderBottom)
+{
+#if !ASSERT_DISABLED
+    void setHasValidBorder();
+#endif
+    m_borderTop = borderTop;
+    m_borderLeft = borderLeft;
+    m_borderBottom = borderBottom;
+    m_borderRight = borderRight;
+}
+
+inline void Box::setPadding(LayoutUnit paddingTop, LayoutUnit paddingLeft, LayoutUnit paddingRight, LayoutUnit paddingBottom)
+{
+#if !ASSERT_DISABLED
+    void setHasValidPadding();
+#endif
+    m_paddingTop = paddingTop;
+    m_paddingLeft = paddingLeft;
+    m_paddingBottom = paddingBottom;
+    m_paddingRight = paddingRight;
+}
+
+inline LayoutUnit Box::marginTop() const
+{
+    ASSERT(m_hasValidMargin);
+    return m_marginTop;
+}
+
+inline LayoutUnit Box::marginLeft() const
+{
+    ASSERT(m_hasValidMargin);
+    return m_marginLeft;
+}
+
+inline LayoutUnit Box::marginBottom() const
+{
+    ASSERT(m_hasValidMargin);
+    return m_marginBottom;
+}
+
+inline LayoutUnit Box::marginRight() const
+{
+    ASSERT(m_hasValidMargin);
+    return m_marginRight;
+}
+
 }
 }
 #endif
 }
 }
 #endif