[LFC] Adjust static position with containing block's content box top/left
[WebKit-https.git] / Source / WebCore / layout / displaytree / DisplayBox.cpp
index 547ff7808d7a7b57afdf0afb60eb1f9281bfc568..2bcc6f4aece7712b9a54ea94ede50a3f3fa61019 100644 (file)
@@ -28,6 +28,7 @@
 
 #if ENABLE(LAYOUT_FORMATTING_CONTEXT)
 
+#include "RenderStyle.h"
 #include <wtf/IsoMallocInlines.h>
 
 namespace WebCore {
@@ -35,8 +36,8 @@ namespace Display {
 
 WTF_MAKE_ISO_ALLOCATED_IMPL(Box);
 
-Box::Box(EBoxSizing boxSizing)
-    : m_boxSizing(boxSizing)
+Box::Box(const RenderStyle& style)
+    : m_style(style)
 {
 }
 
@@ -44,59 +45,50 @@ Box::~Box()
 {
 }
 
-LayoutRect Box::marginBox() const
+Box::Style::Style(const RenderStyle& style)
+    : boxSizing(style.boxSizing())
 {
-    ASSERT(m_hasValidMargin);
-    auto marginBox = borderBox();
+}
 
-    marginBox.shiftXEdgeTo(marginBox.x() + m_marginLeft);
-    marginBox.shiftYEdgeTo(marginBox.y() + m_marginTop);
-    marginBox.shiftMaxXEdgeTo(marginBox.maxX() - m_marginRight);
-    marginBox.shiftMaxYEdgeTo(marginBox.maxY() - m_marginBottom);
+Box::Rect Box::marginBox() const
+{
+    auto borderBox = this->borderBox();
 
+    Rect marginBox;
+    marginBox.setTop(borderBox.top() - marginTop());
+    marginBox.setLeft(borderBox.left() - marginLeft());
+    marginBox.setHeight(borderBox.height() + marginTop() + marginBottom());
+    marginBox.setWidth(borderBox.width() + marginLeft() + marginRight());
     return marginBox;
 }
 
-LayoutRect Box::borderBox() const
+Box::Rect Box::borderBox() const
 {
-    if (m_boxSizing == BORDER_BOX)
-        return LayoutRect( { }, size());
-
-    // Width is content box.
-    ASSERT(m_hasValidBorder);
-    ASSERT(m_hasValidPadding);
-    auto borderBoxSize = size();
-    borderBoxSize.expand(borderLeft() + paddingLeft() + paddingRight() + borderRight() , borderTop() + paddingTop() + paddingBottom() + borderBottom());
-    return LayoutRect( { }, borderBoxSize);
+    Rect borderBox;
+    borderBox.setTopLeft({ });
+    borderBox.setSize({ width(), height() });
+    return borderBox;
 }
 
-LayoutRect Box::paddingBox() const
+Box::Rect Box::paddingBox() const
 {
-    ASSERT(m_hasValidBorder);
-    auto paddingBox = borderBox();
-
-    paddingBox.shiftXEdgeTo(paddingBox.x() + m_borderLeft);
-    paddingBox.shiftYEdgeTo(paddingBox.y() + m_borderTop);
-    paddingBox.shiftMaxXEdgeTo(paddingBox.maxX() - m_borderRight);
-    paddingBox.shiftMaxYEdgeTo(paddingBox.maxY() - m_borderBottom);
+    auto borderBox = this->borderBox();
 
+    Rect paddingBox;
+    paddingBox.setTop(borderBox.top() + borderTop());
+    paddingBox.setLeft(borderBox.left() + borderLeft());
+    paddingBox.setHeight(borderBox.bottom() - borderTop() - borderBottom());
+    paddingBox.setWidth(borderBox.width() - borderLeft() - borderRight());
     return paddingBox;
 }
 
-LayoutRect Box::contentBox() const
+Box::Rect Box::contentBox() const
 {
-    if (m_boxSizing == CONTENT_BOX)
-        return LayoutRect(LayoutPoint(0, 0), size());
-
-    // Width is border box.
-    ASSERT(m_hasValidPadding);
-    auto contentBox = paddingBox();
-
-    contentBox.shiftXEdgeTo(contentBox.x() + m_paddingLeft);
-    contentBox.shiftYEdgeTo(contentBox.y() + m_paddingTop);
-    contentBox.shiftMaxXEdgeTo(contentBox.maxX() - m_paddingRight);
-    contentBox.shiftMaxYEdgeTo(contentBox.maxY() - m_paddingBottom);
-
+    Rect contentBox;
+    contentBox.setTop(contentBoxTop());
+    contentBox.setLeft(contentBoxLeft());
+    contentBox.setWidth(contentBoxWidth());
+    contentBox.setHeight(contentBoxHeight());
     return contentBox;
 }