Diff
Modified: trunk/Source/WebCore/ChangeLog (232464 => 232465)
--- trunk/Source/WebCore/ChangeLog 2018-06-04 10:19:06 UTC (rev 232464)
+++ trunk/Source/WebCore/ChangeLog 2018-06-04 14:43:57 UTC (rev 232465)
@@ -1,3 +1,71 @@
+2018-06-01 Zalan Bujtas <[email protected]>
+
+ [LFC] Merge width and horizontal margin computation
+ https://bugs.webkit.org/show_bug.cgi?id=186217
+
+ Reviewed by Antti Koivisto.
+
+ We could certainly compute width and maring separately, but to match each steps defined
+ at https://www.w3.org/TR/CSS22/visudet.html, we should just merge width and horizontal margin computations
+ (followed by height and vertical margins).
+ Use 0 computed marings for now.
+
+ * layout/FormattingContext.cpp:
+ (WebCore::Layout::FormattingContext::computeFloatingWidthAndMargin const):
+ (WebCore::Layout::FormattingContext::computeOutOfFlowWidthAndMargin const):
+ (WebCore::Layout::FormattingContext::computeOutOfFlowHeight const):
+ (WebCore::Layout::FormattingContext::layoutOutOfFlowDescendants const):
+ (WebCore::Layout::FormattingContext::computeOutOfFlowWidth const): Deleted.
+ (WebCore::Layout::FormattingContext::computeFloatingWidth const): Deleted.
+ * layout/FormattingContext.h:
+ * layout/FormattingContextGeometry.cpp:
+ (WebCore::Layout::FormattingContext::Geometry::outOfFlowNonReplacedWidthAndMargin):
+ (WebCore::Layout::FormattingContext::Geometry::outOfFlowReplacedWidthAndMargin):
+ (WebCore::Layout::FormattingContext::Geometry::floatingNonReplacedWidthAndMargin):
+ (WebCore::Layout::FormattingContext::Geometry::floatingReplacedWidthAndMargin):
+ (WebCore::Layout::FormattingContext::Geometry::outOfFlowWidthAndMargin):
+ (WebCore::Layout::FormattingContext::Geometry::floatingWidthAndMargin):
+ (WebCore::Layout::FormattingContext::Geometry::inlineReplacedWidthAndMargin):
+ (WebCore::Layout::FormattingContext::Geometry::computedPadding):
+ (WebCore::Layout::outOfFlowNonReplacedWidth): Deleted.
+ (WebCore::Layout::FormattingContext::Geometry::outOfFlowReplacedWidth): Deleted.
+ (WebCore::Layout::floatingNonReplacedWidth): Deleted.
+ (WebCore::Layout::FormattingContext::Geometry::floatingReplacedWidth): Deleted.
+ (WebCore::Layout::FormattingContext::Geometry::outOfFlowWidth): Deleted.
+ (WebCore::Layout::FormattingContext::Geometry::floatingWidth): Deleted.
+ (WebCore::Layout::FormattingContext::Geometry::inlineReplacedWidth): Deleted.
+ * layout/LayoutContext.cpp:
+ (WebCore::Layout::LayoutContext::initializeRoot):
+ * layout/blockformatting/BlockFormattingContext.cpp:
+ (WebCore::Layout::BlockFormattingContext::layout const):
+ (WebCore::Layout::BlockFormattingContext::computeWidthAndMargin const):
+ (WebCore::Layout::BlockFormattingContext::computeInFlowWidthAndMargin const):
+ (WebCore::Layout::BlockFormattingContext::computeWidth const): Deleted.
+ (WebCore::Layout::BlockFormattingContext::computeInFlowWidth const): Deleted.
+ (WebCore::Layout::BlockFormattingContext::computeMargin const): Deleted.
+ * layout/blockformatting/BlockFormattingContext.h:
+ * layout/blockformatting/BlockFormattingContextGeometry.cpp:
+ (WebCore::Layout::BlockFormattingContext::Geometry::inFlowNonReplacedWidthAndMargin):
+ (WebCore::Layout::BlockFormattingContext::Geometry::inFlowWidthAndMargin):
+ (WebCore::Layout::BlockFormattingContext::Geometry::inFlowNonReplacedWidth): Deleted.
+ (WebCore::Layout::BlockFormattingContext::Geometry::inFlowWidth): Deleted.
+ (WebCore::Layout::BlockFormattingContext::Geometry::computedMargin): Deleted.
+ * layout/displaytree/DisplayBox.cpp:
+ (WebCore::Display::Box::marginBox const):
+ * layout/displaytree/DisplayBox.h:
+ (WebCore::Display::Box::setHasValidVerticalMargin):
+ (WebCore::Display::Box::setHasValidHorizontalMargin):
+ (WebCore::Display::Box::invalidateMargin):
+ (WebCore::Display::Box::setHorizontalMargin):
+ (WebCore::Display::Box::setVerticalMargin):
+ (WebCore::Display::Box::marginTop const):
+ (WebCore::Display::Box::marginLeft const):
+ (WebCore::Display::Box::marginBottom const):
+ (WebCore::Display::Box::marginRight const):
+ (WebCore::Display::Box::Edges::Edges): Deleted.
+ (WebCore::Display::Box::setHasValidMargin): Deleted.
+ (WebCore::Display::Box::setMargin): Deleted.
+
2018-06-03 Michael Catanzaro <[email protected]>
REGRESSION(r232338): [GTK] Broke a few layout tests
Modified: trunk/Source/WebCore/layout/FormattingContext.cpp (232464 => 232465)
--- trunk/Source/WebCore/layout/FormattingContext.cpp 2018-06-04 10:19:06 UTC (rev 232464)
+++ trunk/Source/WebCore/layout/FormattingContext.cpp 2018-06-04 14:43:57 UTC (rev 232465)
@@ -59,19 +59,23 @@
displayBox.setHeight(Geometry::floatingHeight(layoutContext, layoutBox));
}
-void FormattingContext::computeOutOfFlowWidth(LayoutContext& layoutContext, const Box& layoutBox, Display::Box& displayBox) const
+void FormattingContext::computeFloatingWidthAndMargin(LayoutContext& layoutContext, const Box& layoutBox, Display::Box& displayBox) const
{
- displayBox.setWidth(Geometry::outOfFlowWidth(layoutContext, layoutBox));
+ auto widthAndMargin = Geometry::floatingWidthAndMargin(layoutContext, layoutBox);
+ displayBox.setWidth(widthAndMargin.width);
+ displayBox.setHorizontalMargin(widthAndMargin.margin);
}
-void FormattingContext::computeOutOfFlowHeight(LayoutContext& layoutContext, const Box& layoutBox, Display::Box& displayBox) const
+void FormattingContext::computeOutOfFlowWidthAndMargin(LayoutContext& layoutContext, const Box& layoutBox, Display::Box& displayBox) const
{
- displayBox.setHeight(Geometry::outOfFlowHeight(layoutContext, layoutBox));
+ auto widthAndMargin = Geometry::outOfFlowWidthAndMargin(layoutContext, layoutBox);
+ displayBox.setWidth(widthAndMargin.width);
+ displayBox.setHorizontalMargin(widthAndMargin.margin);
}
-void FormattingContext::computeFloatingWidth(LayoutContext& layoutContext, const Box& layoutBox, Display::Box& displayBox) const
+void FormattingContext::computeOutOfFlowHeight(LayoutContext& layoutContext, const Box& layoutBox, Display::Box& displayBox) const
{
- displayBox.setWidth(Geometry::floatingWidth(layoutContext, layoutBox));
+ displayBox.setHeight(Geometry::outOfFlowHeight(layoutContext, layoutBox));
}
void FormattingContext::computeBorderAndPadding(LayoutContext& layoutContext, const Box& layoutBox, Display::Box& displayBox) const
@@ -107,7 +111,7 @@
// of a hypothetical box that would have been the first box of the element if its specified 'position' value had been 'static' and
// its specified 'float' had been 'none' and its specified 'clear' had been 'none'.
computeStaticPosition(layoutContext, layoutBox, displayBox);
- computeOutOfFlowWidth(layoutContext, layoutBox, displayBox);
+ computeOutOfFlowWidthAndMargin(layoutContext, layoutBox, displayBox);
ASSERT(layoutBox.establishesFormattingContext());
auto formattingContext = layoutContext.formattingContext(layoutBox);
Modified: trunk/Source/WebCore/layout/FormattingContext.h (232464 => 232465)
--- trunk/Source/WebCore/layout/FormattingContext.h 2018-06-04 10:19:06 UTC (rev 232464)
+++ trunk/Source/WebCore/layout/FormattingContext.h 2018-06-04 14:43:57 UTC (rev 232465)
@@ -67,7 +67,7 @@
virtual void computeInFlowPositionedPosition(LayoutContext&, const Box&, Display::Box&) const = 0;
void computeFloatingHeight(LayoutContext&, const Box&, Display::Box&) const;
- void computeFloatingWidth(LayoutContext&, const Box&, Display::Box&) const;
+ void computeFloatingWidthAndMargin(LayoutContext&, const Box&, Display::Box&) const;
void computeBorderAndPadding(LayoutContext&, const Box&, Display::Box&) const;
@@ -81,16 +81,21 @@
// This class implements generic positioning and sizing.
class Geometry {
public:
+ struct WidthAndMargin {
+ LayoutUnit width;
+ Display::Box::HorizontalEdges margin;
+ };
+
static LayoutUnit outOfFlowHeight(LayoutContext&, const Box&);
- static LayoutUnit outOfFlowWidth(LayoutContext&, const Box&);
+ static WidthAndMargin outOfFlowWidthAndMargin(LayoutContext&, const Box&);
static LayoutUnit floatingHeight(LayoutContext&, const Box&);
- static LayoutUnit floatingWidth(LayoutContext&, const Box&);
+ static WidthAndMargin floatingWidthAndMargin(LayoutContext&, const Box&);
static LayoutPoint outOfFlowPosition(LayoutContext&, const Box&);
static LayoutUnit inlineReplacedHeight(LayoutContext&, const Box&);
- static LayoutUnit inlineReplacedWidth(LayoutContext&, const Box&);
+ static WidthAndMargin inlineReplacedWidthAndMargin(LayoutContext&, const Box&);
static Display::Box::Edges computedBorder(LayoutContext&, const Box&);
static std::optional<Display::Box::Edges> computedPadding(LayoutContext&, const Box&);
@@ -97,15 +102,20 @@
private:
static LayoutUnit outOfFlowReplacedHeight(LayoutContext&, const Box&);
- static LayoutUnit outOfFlowReplacedWidth(LayoutContext&, const Box&);
+ static WidthAndMargin outOfFlowReplacedWidthAndMargin(LayoutContext&, const Box&);
+
+ static WidthAndMargin outOfFlowNonReplacedWidthAndMargin(LayoutContext&, const Box&);
+
static LayoutUnit floatingReplacedHeight(LayoutContext&, const Box&);
- static LayoutUnit floatingReplacedWidth(LayoutContext&, const Box&);
+ static WidthAndMargin floatingReplacedWidthAndMargin(LayoutContext&, const Box&);
+
+ static WidthAndMargin floatingNonReplacedWidthAndMargin(LayoutContext&, const Box&);
};
private:
void computeOutOfFlowPosition(LayoutContext&, const Box&, Display::Box&) const;
void computeOutOfFlowHeight(LayoutContext&, const Box&, Display::Box&) const;
- void computeOutOfFlowWidth(LayoutContext&, const Box&, Display::Box&) const;
+ void computeOutOfFlowWidthAndMargin(LayoutContext&, const Box&, Display::Box&) const;
WeakPtr<Box> m_root;
};
Modified: trunk/Source/WebCore/layout/FormattingContextGeometry.cpp (232464 => 232465)
--- trunk/Source/WebCore/layout/FormattingContextGeometry.cpp 2018-06-04 10:19:06 UTC (rev 232464)
+++ trunk/Source/WebCore/layout/FormattingContextGeometry.cpp 2018-06-04 14:43:57 UTC (rev 232465)
@@ -128,7 +128,7 @@
return computedHeightValue;
}
-static LayoutUnit outOfFlowNonReplacedWidth(LayoutContext& layoutContext, const Box& layoutBox)
+FormattingContext::Geometry::WidthAndMargin FormattingContext::Geometry::outOfFlowNonReplacedWidthAndMargin(LayoutContext& layoutContext, const Box& layoutBox)
{
ASSERT(layoutBox.isOutOfFlowPositioned() && !layoutBox.replaced());
@@ -183,7 +183,7 @@
ASSERT_NOT_REACHED();
}
- return computedWidthValue;
+ return WidthAndMargin { computedWidthValue, { } };
}
LayoutUnit FormattingContext::Geometry::outOfFlowReplacedHeight(LayoutContext& layoutContext, const Box& layoutBox)
@@ -195,13 +195,13 @@
return inlineReplacedHeight(layoutContext, layoutBox);
}
-LayoutUnit FormattingContext::Geometry::outOfFlowReplacedWidth(LayoutContext& layoutContext, const Box& layoutBox)
+FormattingContext::Geometry::WidthAndMargin FormattingContext::Geometry::outOfFlowReplacedWidthAndMargin(LayoutContext& layoutContext, const Box& layoutBox)
{
ASSERT(layoutBox.isOutOfFlowPositioned() && layoutBox.replaced());
// 10.3.8 Absolutely positioned, replaced elements
//
// The used value of 'width' is determined as for inline replaced elements.
- return inlineReplacedWidth(layoutContext, layoutBox);
+ return inlineReplacedWidthAndMargin(layoutContext, layoutBox);
}
static LayoutUnit floatingNonReplacedHeight(LayoutContext& layoutContext, const Box& layoutBox)
@@ -216,7 +216,7 @@
return height.isAuto() ? contentHeightForFormattingContextRoot(layoutContext, layoutBox) : LayoutUnit(height.value());
}
-static LayoutUnit floatingNonReplacedWidth(LayoutContext& layoutContext, const Box& layoutBox)
+FormattingContext::Geometry::WidthAndMargin FormattingContext::Geometry::floatingNonReplacedWidthAndMargin(LayoutContext& layoutContext, const Box& layoutBox)
{
ASSERT(layoutBox.isFloatingPositioned() && !layoutBox.replaced());
// 10.3.5 Floating, non-replaced elements
@@ -223,7 +223,8 @@
// If 'width' is computed as 'auto', the used value is the "shrink-to-fit" width.
auto width = layoutBox.style().logicalWidth();
- return width.isAuto() ? shrinkToFitWidth(layoutContext, layoutBox) : LayoutUnit(width.value());
+ auto computedWidthValue = width.isAuto() ? shrinkToFitWidth(layoutContext, layoutBox) : LayoutUnit(width.value());
+ return FormattingContext::Geometry::WidthAndMargin { computedWidthValue, { } };
}
LayoutUnit FormattingContext::Geometry::floatingReplacedHeight(LayoutContext& layoutContext, const Box& layoutBox)
@@ -234,13 +235,13 @@
return inlineReplacedHeight(layoutContext, layoutBox);
}
-LayoutUnit FormattingContext::Geometry::floatingReplacedWidth(LayoutContext& layoutContext, const Box& layoutBox)
+FormattingContext::Geometry::WidthAndMargin FormattingContext::Geometry::floatingReplacedWidthAndMargin(LayoutContext& layoutContext, const Box& layoutBox)
{
ASSERT(layoutBox.isFloatingPositioned() && layoutBox.replaced());
// 10.3.6 Floating, replaced elements
//
// The used value of 'width' is determined as for inline replaced elements.
- return inlineReplacedWidth(layoutContext, layoutBox);
+ return inlineReplacedWidthAndMargin(layoutContext, layoutBox);
}
static LayoutPoint outOfFlowNonReplacedPosition(LayoutContext& layoutContext, const Box& layoutBox)
@@ -440,13 +441,13 @@
return outOfFlowReplacedHeight(layoutContext, layoutBox);
}
-LayoutUnit FormattingContext::Geometry::outOfFlowWidth(LayoutContext& layoutContext, const Box& layoutBox)
+FormattingContext::Geometry::WidthAndMargin FormattingContext::Geometry::outOfFlowWidthAndMargin(LayoutContext& layoutContext, const Box& layoutBox)
{
ASSERT(layoutBox.isOutOfFlowPositioned());
if (!layoutBox.replaced())
- return outOfFlowNonReplacedWidth(layoutContext, layoutBox);
- return outOfFlowReplacedWidth(layoutContext, layoutBox);
+ return outOfFlowNonReplacedWidthAndMargin(layoutContext, layoutBox);
+ return outOfFlowReplacedWidthAndMargin(layoutContext, layoutBox);
}
LayoutUnit FormattingContext::Geometry::floatingHeight(LayoutContext& layoutContext, const Box& layoutBox)
@@ -458,13 +459,13 @@
return floatingReplacedHeight(layoutContext, layoutBox);
}
-LayoutUnit FormattingContext::Geometry::floatingWidth(LayoutContext& layoutContext, const Box& layoutBox)
+FormattingContext::Geometry::WidthAndMargin FormattingContext::Geometry::floatingWidthAndMargin(LayoutContext& layoutContext, const Box& layoutBox)
{
ASSERT(layoutBox.isFloatingPositioned());
if (!layoutBox.replaced())
- return floatingNonReplacedWidth(layoutContext, layoutBox);
- return floatingReplacedWidth(layoutContext, layoutBox);
+ return floatingNonReplacedWidthAndMargin(layoutContext, layoutBox);
+ return floatingReplacedWidthAndMargin(layoutContext, layoutBox);
}
LayoutPoint FormattingContext::Geometry::outOfFlowPosition(LayoutContext& layoutContext, const Box& layoutBox)
@@ -518,7 +519,7 @@
return computedHeightValue;
}
-LayoutUnit FormattingContext::Geometry::inlineReplacedWidth(LayoutContext&, const Box& layoutBox)
+FormattingContext::Geometry::WidthAndMargin FormattingContext::Geometry::inlineReplacedWidthAndMargin(LayoutContext&, const Box& layoutBox)
{
ASSERT((layoutBox.isOutOfFlowPositioned() || layoutBox.isFloatingPositioned() || layoutBox.isInFlow()) && layoutBox.replaced());
// 10.3.2 Inline, replaced elements
@@ -564,7 +565,7 @@
computedWidthValue = 300;
}
- return computedWidthValue;
+ return WidthAndMargin { computedWidthValue, { } };
}
Display::Box::Edges FormattingContext::Geometry::computedBorder(LayoutContext&, const Box& layoutBox)
@@ -571,10 +572,8 @@
{
auto& style = layoutBox.style();
return {
- style.borderTop().boxModelWidth(),
- style.borderLeft().boxModelWidth(),
- style.borderBottom().boxModelWidth(),
- style.borderRight().boxModelWidth()
+ { style.borderLeft().boxModelWidth(), style.borderRight().boxModelWidth() },
+ { style.borderTop().boxModelWidth(), style.borderBottom().boxModelWidth() }
};
}
@@ -585,12 +584,10 @@
auto& style = layoutBox.style();
auto containingBlockWidth = layoutContext.displayBoxForLayoutBox(*layoutBox.containingBlock())->width();
- return Display::Box::Edges(
- valueForLength(style.paddingTop(), containingBlockWidth),
- valueForLength(style.paddingLeft(), containingBlockWidth),
- valueForLength(style.paddingBottom(), containingBlockWidth),
- valueForLength(style.paddingRight(), containingBlockWidth)
- );
+ return Display::Box::Edges {
+ { valueForLength(style.paddingLeft(), containingBlockWidth), valueForLength(style.paddingRight(), containingBlockWidth) },
+ { valueForLength(style.paddingTop(), containingBlockWidth), valueForLength(style.paddingBottom(), containingBlockWidth) }
+ };
}
}
Modified: trunk/Source/WebCore/layout/LayoutContext.cpp (232464 => 232465)
--- trunk/Source/WebCore/layout/LayoutContext.cpp 2018-06-04 10:19:06 UTC (rev 232464)
+++ trunk/Source/WebCore/layout/LayoutContext.cpp 2018-06-04 14:43:57 UTC (rev 232465)
@@ -58,22 +58,19 @@
// Root is always at 0 0 with no margin
displayBox.setTopLeft({ });
displayBox.setSize(containerSize);
- displayBox.setMargin({ });
+ displayBox.setHorizontalMargin({ });
+ displayBox.setVerticalMargin({ });
auto& style = root.style();
// 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.setBorder({
- style.borderTop().boxModelWidth(),
- style.borderLeft().boxModelWidth(),
- style.borderBottom().boxModelWidth(),
- style.borderRight().boxModelWidth()
+ { style.borderLeft().boxModelWidth(), style.borderRight().boxModelWidth() },
+ { style.borderTop().boxModelWidth(), style.borderBottom().boxModelWidth() }
});
displayBox.setPadding({
- valueForLength(style.paddingTop(), containerSize.width()),
- valueForLength(style.paddingLeft(), containerSize.width()),
- valueForLength(style.paddingBottom(), containerSize.width()),
- valueForLength(style.paddingRight(), containerSize.width())
+ { valueForLength(style.paddingLeft(), containerSize.width()), valueForLength(style.paddingRight(), containerSize.width()) },
+ { valueForLength(style.paddingTop(), containerSize.width()), valueForLength(style.paddingBottom(), containerSize.width()) }
});
m_formattingContextRootListForLayout.add(&root);
Modified: trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp (232464 => 232465)
--- trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp 2018-06-04 10:19:06 UTC (rev 232464)
+++ trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp 2018-06-04 14:43:57 UTC (rev 232465)
@@ -73,10 +73,9 @@
auto& layoutBox = layoutPair.layoutBox;
auto& displayBox = layoutPair.displayBox;
- computeMargin(layoutContext, layoutBox, displayBox);
computeBorderAndPadding(layoutContext, layoutBox, displayBox);
+ computeWidthAndMargin(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));
@@ -139,13 +138,13 @@
displayBox.setTopLeft(Geometry::inFlowPositionedPosition(layoutContext, layoutBox));
}
-void BlockFormattingContext::computeWidth(LayoutContext& layoutContext, const Box& layoutBox, Display::Box& displayBox) const
+void BlockFormattingContext::computeWidthAndMargin(LayoutContext& layoutContext, const Box& layoutBox, Display::Box& displayBox) const
{
if (layoutBox.isInFlow())
- return computeInFlowWidth(layoutContext, layoutBox, displayBox);
+ return computeInFlowWidthAndMargin(layoutContext, layoutBox, displayBox);
if (layoutBox.isFloatingPositioned())
- return computeFloatingWidth(layoutContext, layoutBox, displayBox);
+ return computeFloatingWidthAndMargin(layoutContext, layoutBox, displayBox);
ASSERT_NOT_REACHED();
}
@@ -166,17 +165,14 @@
displayBox.setHeight(Geometry::inFlowHeight(layoutContext, layoutBox));
}
-void BlockFormattingContext::computeInFlowWidth(LayoutContext& layoutContext, const Box& layoutBox, Display::Box& displayBox) const
+void BlockFormattingContext::computeInFlowWidthAndMargin(LayoutContext& layoutContext, const Box& layoutBox, Display::Box& displayBox) const
{
- displayBox.setWidth(Geometry::inFlowWidth(layoutContext, layoutBox));
+ auto widthAndMargin = Geometry::inFlowWidthAndMargin(layoutContext, layoutBox);
+ displayBox.setWidth(widthAndMargin.width);
+ displayBox.setHorizontalMargin(widthAndMargin.margin);
}
-void BlockFormattingContext::computeMargin(LayoutContext& layoutContext, const Box& layoutBox, Display::Box& displayBox) const
-{
- displayBox.setMargin(Geometry::computedMargin(layoutContext, layoutBox));
}
-
}
-}
#endif
Modified: trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.h (232464 => 232465)
--- trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.h 2018-06-04 10:19:06 UTC (rev 232464)
+++ trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.h 2018-06-04 14:43:57 UTC (rev 232465)
@@ -51,29 +51,26 @@
Ref<FloatingState> createOrFindFloatingState(LayoutContext&) const override;
private:
- void computeWidth(LayoutContext&, const Box&, Display::Box&) const;
+ void computeWidthAndMargin(LayoutContext&, const Box&, Display::Box&) const;
void computeHeight(LayoutContext&, const Box&, Display::Box&) const;
void computeStaticPosition(LayoutContext&, const Box&, Display::Box&) const override;
void computeInFlowPositionedPosition(LayoutContext&, const Box&, Display::Box&) const override;
- void computeInFlowWidth(LayoutContext&, const Box&, Display::Box&) const;
+ void computeInFlowWidthAndMargin(LayoutContext&, const Box&, Display::Box&) const;
void computeInFlowHeight(LayoutContext&, const Box&, Display::Box&) const;
- void computeMargin(LayoutContext&, const Box&, Display::Box&) const;
// This class implements positioning and sizing for boxes participating in a block formatting context.
class Geometry {
public:
static LayoutUnit inFlowHeight(LayoutContext&, const Box&);
- static LayoutUnit inFlowWidth(LayoutContext&, const Box&);
+ static FormattingContext::Geometry::WidthAndMargin inFlowWidthAndMargin(LayoutContext&, const Box&);
static LayoutPoint staticPosition(LayoutContext&, const Box&);
static LayoutPoint inFlowPositionedPosition(LayoutContext&, const Box&);
- static Display::Box::Edges computedMargin(LayoutContext&, const Box&);
-
private:
static LayoutUnit inFlowNonReplacedHeight(LayoutContext&, const Box&);
- static LayoutUnit inFlowNonReplacedWidth(LayoutContext&, const Box&);
+ static FormattingContext::Geometry::WidthAndMargin inFlowNonReplacedWidthAndMargin(LayoutContext&, const Box&);
};
// This class implements margin collapsing for block formatting context.
Modified: trunk/Source/WebCore/layout/blockformatting/BlockFormattingContextGeometry.cpp (232464 => 232465)
--- trunk/Source/WebCore/layout/blockformatting/BlockFormattingContextGeometry.cpp 2018-06-04 10:19:06 UTC (rev 232464)
+++ trunk/Source/WebCore/layout/blockformatting/BlockFormattingContextGeometry.cpp 2018-06-04 14:43:57 UTC (rev 232465)
@@ -113,7 +113,7 @@
return std::max(computedHeight, initialContainingBlockHeight);
}
-LayoutUnit BlockFormattingContext::Geometry::inFlowNonReplacedWidth(LayoutContext& layoutContext, const Box& layoutBox)
+FormattingContext::Geometry::WidthAndMargin BlockFormattingContext::Geometry::inFlowNonReplacedWidthAndMargin(LayoutContext& layoutContext, const Box& layoutBox)
{
ASSERT(layoutBox.isInFlow() && !layoutBox.replaced());
@@ -143,14 +143,14 @@
} else
computedWidthValue = valueForLength(width, containingBlockWidth);
- return computedWidthValue;
+ return FormattingContext::Geometry::WidthAndMargin { computedWidthValue, { } };
};
- auto computedWidth = compute();
+ auto computedWidthAndMarginValue = compute();
if (!isStretchedToViewport(layoutContext, layoutBox))
- return computedWidth;
+ return computedWidthAndMarginValue;
auto initialContainingBlockWidth = layoutContext.displayBoxForLayoutBox(initialContainingBlock(layoutBox))->contentBox().width();
- return std::max(computedWidth, initialContainingBlockWidth);
+ return FormattingContext::Geometry::WidthAndMargin { std::max(computedWidthAndMarginValue.width, initialContainingBlockWidth), { } };
}
LayoutPoint BlockFormattingContext::Geometry::staticPosition(LayoutContext& layoutContext, const Box& layoutBox)
@@ -247,31 +247,18 @@
return FormattingContext::Geometry::inlineReplacedHeight(layoutContext, layoutBox);
}
-LayoutUnit BlockFormattingContext::Geometry::inFlowWidth(LayoutContext& layoutContext, const Box& layoutBox)
+FormattingContext::Geometry::WidthAndMargin BlockFormattingContext::Geometry::inFlowWidthAndMargin(LayoutContext& layoutContext, const Box& layoutBox)
{
ASSERT(layoutBox.isInFlow());
if (!layoutBox.replaced())
- return inFlowNonReplacedWidth(layoutContext, layoutBox);
+ return inFlowNonReplacedWidthAndMargin(layoutContext, layoutBox);
// 10.3.4 Block-level, replaced elements in normal flow
// The used value of 'width' is determined as for inline replaced elements
- return FormattingContext::Geometry::inlineReplacedWidth(layoutContext, layoutBox);
+ return FormattingContext::Geometry::inlineReplacedWidthAndMargin(layoutContext, layoutBox);
}
-Display::Box::Edges BlockFormattingContext::Geometry::computedMargin(LayoutContext& layoutContext, const Box& layoutBox)
-{
- auto& style = layoutBox.style();
- auto containingBlockWidth = layoutContext.displayBoxForLayoutBox(*layoutBox.containingBlock())->width();
-
- return Display::Box::Edges(
- BlockFormattingContext::MarginCollapse::marginTop(layoutBox),
- valueForLength(style.marginLeft(), containingBlockWidth),
- BlockFormattingContext::MarginCollapse::marginBottom(layoutBox),
- valueForLength(style.marginRight(), containingBlockWidth)
- );
}
-
}
-}
#endif
Modified: trunk/Source/WebCore/layout/displaytree/DisplayBox.cpp (232464 => 232465)
--- trunk/Source/WebCore/layout/displaytree/DisplayBox.cpp 2018-06-04 10:19:06 UTC (rev 232464)
+++ trunk/Source/WebCore/layout/displaytree/DisplayBox.cpp 2018-06-04 14:43:57 UTC (rev 232465)
@@ -52,13 +52,14 @@
Box::Rect Box::marginBox() const
{
- ASSERT(m_hasValidMargin);
+ ASSERT(m_hasValidHorizontalMargin);
+ ASSERT(m_hasValidVerticalMargin);
auto marginBox = borderBox();
- marginBox.shiftLeftTo(marginBox.left() - m_margin.left);
- marginBox.shiftTopTo(marginBox.top() - m_margin.top);
- marginBox.shiftRightTo(marginBox.right() + m_margin.right);
- marginBox.shiftBottomTo(marginBox.bottom() + m_margin.bottom);
+ marginBox.shiftLeftTo(marginBox.left() - m_margin.horizontal.left);
+ marginBox.shiftTopTo(marginBox.top() - m_margin.vertical.top);
+ marginBox.shiftRightTo(marginBox.right() + m_margin.horizontal.right);
+ marginBox.shiftBottomTo(marginBox.bottom() + m_margin.vertical.bottom);
return marginBox;
}
@@ -83,10 +84,10 @@
ASSERT(m_hasValidBorder);
auto paddingBox = borderBox();
- paddingBox.shiftLeftTo(paddingBox.left() + m_border.left);
- paddingBox.shiftTopTo(paddingBox.top() + m_border.top);
- paddingBox.shiftRightTo(paddingBox.right() - m_border.right);
- paddingBox.shiftBottomTo(paddingBox.bottom() - m_border.bottom);
+ paddingBox.shiftLeftTo(paddingBox.left() + m_border.horizontal.left);
+ paddingBox.shiftTopTo(paddingBox.top() + m_border.vertical.top);
+ paddingBox.shiftRightTo(paddingBox.right() - m_border.horizontal.right);
+ paddingBox.shiftBottomTo(paddingBox.bottom() - m_border.vertical.bottom);
return paddingBox;
}
@@ -103,10 +104,10 @@
ASSERT(m_hasValidPadding);
auto contentBox = paddingBox();
- contentBox.shiftLeftTo(contentBox.left() + m_padding.left);
- contentBox.shiftTopTo(contentBox.top() + m_padding.top);
- contentBox.shiftRightTo(contentBox.right() - m_padding.right);
- contentBox.shiftBottomTo(contentBox.bottom() - m_padding.bottom);
+ contentBox.shiftLeftTo(contentBox.left() + m_padding.horizontal.left);
+ contentBox.shiftTopTo(contentBox.top() + m_padding.vertical.top);
+ contentBox.shiftRightTo(contentBox.right() - m_padding.horizontal.right);
+ contentBox.shiftBottomTo(contentBox.bottom() - m_padding.vertical.bottom);
return contentBox;
}
Modified: trunk/Source/WebCore/layout/displaytree/DisplayBox.h (232464 => 232465)
--- trunk/Source/WebCore/layout/displaytree/DisplayBox.h 2018-06-04 10:19:06 UTC (rev 232464)
+++ trunk/Source/WebCore/layout/displaytree/DisplayBox.h 2018-06-04 14:43:57 UTC (rev 232465)
@@ -160,30 +160,34 @@
void setHeight(LayoutUnit height) { m_rect.setHeight(height); }
void setSize(const LayoutSize& size) { m_rect.setSize(size); }
- struct Edges {
- Edges() = default;
- Edges(LayoutUnit top, LayoutUnit left, LayoutUnit bottom, LayoutUnit right)
- : top(top)
- , left(left)
- , bottom(bottom)
- , right(right)
- { }
+ struct HorizontalEdges {
+ LayoutUnit left;
+ LayoutUnit right;
+ };
+ struct VerticalEdges {
LayoutUnit top;
- LayoutUnit left;
LayoutUnit bottom;
- LayoutUnit right;
};
- void setMargin(Edges);
+
+ struct Edges {
+ HorizontalEdges horizontal;
+ VerticalEdges vertical;
+ };
+
+ void setHorizontalMargin(HorizontalEdges);
+ void setVerticalMargin(VerticalEdges);
void setBorder(Edges);
void setPadding(Edges);
#if !ASSERT_DISABLED
- void invalidateMargin() { m_hasValidMargin = false; }
+ void invalidateMargin();
void invalidateBorder() { m_hasValidBorder = false; }
void invalidatePadding() { m_hasValidPadding = false; }
- void setHasValidMargin() { m_hasValidMargin = true; }
+ void setHasValidVerticalMargin() { m_hasValidVerticalMargin = true; }
+ void setHasValidHorizontalMargin() { m_hasValidHorizontalMargin = true; }
+
void setHasValidBorder() { m_hasValidBorder = true; }
void setHasValidPadding() { m_hasValidPadding = true; }
#endif
@@ -197,7 +201,8 @@
Edges m_padding;
#if !ASSERT_DISABLED
- bool m_hasValidMargin { false };
+ bool m_hasValidHorizontalMargin { false };
+ bool m_hasValidVerticalMargin { false };
bool m_hasValidBorder { false };
bool m_hasValidPadding { false };
#endif
@@ -221,6 +226,12 @@
m_hasValidWidth = true;
m_hasValidHeight = true;
}
+
+inline void Box::invalidateMargin()
+{
+ m_hasValidHorizontalMargin = false;
+ m_hasValidVerticalMargin = false;
+}
#endif
inline LayoutUnit Box::Rect::top() const
@@ -376,14 +387,22 @@
return m_rect;
}
-inline void Box::setMargin(Edges margin)
+inline void Box::setHorizontalMargin(HorizontalEdges margin)
{
#if !ASSERT_DISABLED
- setHasValidMargin();
+ setHasValidHorizontalMargin();
#endif
- m_margin = margin;
+ m_margin.horizontal = margin;
}
+inline void Box::setVerticalMargin(VerticalEdges margin)
+{
+#if !ASSERT_DISABLED
+ setHasValidVerticalMargin();
+#endif
+ m_margin.vertical = margin;
+}
+
inline void Box::setBorder(Edges border)
{
#if !ASSERT_DISABLED
@@ -402,74 +421,74 @@
inline LayoutUnit Box::marginTop() const
{
- ASSERT(m_hasValidMargin);
- return m_margin.top;
+ ASSERT(m_hasValidVerticalMargin);
+ return m_margin.vertical.top;
}
inline LayoutUnit Box::marginLeft() const
{
- ASSERT(m_hasValidMargin);
- return m_margin.left;
+ ASSERT(m_hasValidHorizontalMargin);
+ return m_margin.horizontal.left;
}
inline LayoutUnit Box::marginBottom() const
{
- ASSERT(m_hasValidMargin);
- return m_margin.bottom;
+ ASSERT(m_hasValidVerticalMargin);
+ return m_margin.vertical.bottom;
}
inline LayoutUnit Box::marginRight() const
{
- ASSERT(m_hasValidMargin);
- return m_margin.right;
+ ASSERT(m_hasValidHorizontalMargin);
+ return m_margin.horizontal.right;
}
inline LayoutUnit Box::paddingTop() const
{
ASSERT(m_hasValidPadding);
- return m_padding.top;
+ return m_padding.vertical.top;
}
inline LayoutUnit Box::paddingLeft() const
{
ASSERT(m_hasValidPadding);
- return m_padding.left;
+ return m_padding.horizontal.left;
}
inline LayoutUnit Box::paddingBottom() const
{
ASSERT(m_hasValidPadding);
- return m_padding.bottom;
+ return m_padding.vertical.bottom;
}
inline LayoutUnit Box::paddingRight() const
{
ASSERT(m_hasValidPadding);
- return m_padding.right;
+ return m_padding.horizontal.right;
}
inline LayoutUnit Box::borderTop() const
{
ASSERT(m_hasValidBorder);
- return m_border.top;
+ return m_border.vertical.top;
}
inline LayoutUnit Box::borderLeft() const
{
ASSERT(m_hasValidBorder);
- return m_border.left;
+ return m_border.horizontal.left;
}
inline LayoutUnit Box::borderBottom() const
{
ASSERT(m_hasValidBorder);
- return m_border.bottom;
+ return m_border.vertical.bottom;
}
inline LayoutUnit Box::borderRight() const
{
ASSERT(m_hasValidBorder);
- return m_border.right;
+ return m_border.horizontal.right;
}
}