Modified: trunk/Source/WebCore/ChangeLog (241248 => 241249)
--- trunk/Source/WebCore/ChangeLog 2019-02-10 14:38:26 UTC (rev 241248)
+++ trunk/Source/WebCore/ChangeLog 2019-02-10 16:53:41 UTC (rev 241249)
@@ -1,3 +1,20 @@
+2019-02-10 Zalan Bujtas <[email protected]>
+
+ [LFC][IFC] Add intrinsic width support for replaced boxes
+ https://bugs.webkit.org/show_bug.cgi?id=194478
+
+ Reviewed by Antti Koivisto.
+
+ * layout/inlineformatting/InlineFormattingContext.cpp:
+ (WebCore::Layout::InlineFormattingContext::layout const):
+ (WebCore::Layout::InlineFormattingContext::instrinsicWidthConstraints const):
+ (WebCore::Layout::InlineFormattingContext::computeMargin const):
+ (WebCore::Layout::InlineFormattingContext::computeBorderAndPadding const):
+ (WebCore::Layout::InlineFormattingContext::layoutFormattingContextRoot const):
+ (WebCore::Layout::InlineFormattingContext::computeWidthAndHeightForReplacedInlineBox const):
+ (WebCore::Layout::InlineFormattingContext::computeMarginBorderAndPadding const): Deleted.
+ * layout/inlineformatting/InlineFormattingContext.h:
+
2019-02-10 Alicia Boya GarcĂa <[email protected]>
[MSE][GStreamer] Add missing return type to lambda
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp (241248 => 241249)
--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp 2019-02-10 14:38:26 UTC (rev 241248)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp 2019-02-10 16:53:41 UTC (rev 241249)
@@ -77,9 +77,11 @@
while (layoutBox) {
if (layoutBox->establishesFormattingContext())
layoutFormattingContextRoot(*layoutBox, usedValues);
- else if (is<Container>(*layoutBox))
- computeMarginBorderAndPadding(downcast<InlineContainer>(*layoutBox), usedValues);
- else if (layoutBox->isReplaced())
+ else if (is<Container>(*layoutBox)) {
+ auto& inlineContainer = downcast<InlineContainer>(*layoutBox);
+ computeMargin(inlineContainer, usedValues);
+ computeBorderAndPadding(inlineContainer, usedValues);
+ } else if (layoutBox->isReplaced())
computeWidthAndHeightForReplacedInlineBox(*layoutBox, usedValues);
layoutBox = nextInPreOrder(*layoutBox, root);
}
@@ -101,10 +103,17 @@
auto usedValues = UsedHorizontalValues { { }, { }, { } };
auto* layoutBox = root.firstInFlowOrFloatingChild();
while (layoutBox) {
- if (layoutBox->establishesFormattingContext() || layoutBox->isReplaced())
+ if (layoutBox->establishesFormattingContext())
ASSERT_NOT_IMPLEMENTED_YET();
- else if (is<Container>(*layoutBox))
- computeMarginBorderAndPadding(downcast<InlineContainer>(*layoutBox), usedValues);
+ else if (layoutBox->isReplaced() || is<Container>(*layoutBox)) {
+ computeBorderAndPadding(*layoutBox, usedValues);
+ if (layoutBox->isReplaced())
+ computeWidthAndMargin(*layoutBox, usedValues);
+ else {
+ // Simple inline container with no intrinsic width <span>.
+ computeMargin(downcast<InlineContainer>(*layoutBox), usedValues);
+ }
+ }
layoutBox = nextInPreOrder(*layoutBox, root);
}
@@ -130,20 +139,12 @@
return instrinsicWidthConstraints;
}
-void InlineFormattingContext::computeBorderAndPadding(const Box& layoutBox, UsedHorizontalValues usedValues) const
+void InlineFormattingContext::computeMargin(const InlineContainer& inlineContainer, UsedHorizontalValues usedValues) const
{
- auto& displayBox = layoutState().displayBoxForLayoutBox(layoutBox);
- displayBox.setBorder(Geometry::computedBorder(layoutBox));
- displayBox.setPadding(Geometry::computedPadding(layoutBox, usedValues));
-}
-
-void InlineFormattingContext::computeMarginBorderAndPadding(const InlineContainer& inlineContainer, UsedHorizontalValues usedValues) const
-{
// Non-replaced, non-formatting root containers (<span></span>) don't have width property -> non width computation.
ASSERT(!inlineContainer.replaced());
ASSERT(!inlineContainer.establishesFormattingContext());
- computeBorderAndPadding(inlineContainer, usedValues);
auto& displayBox = layoutState().displayBoxForLayoutBox(inlineContainer);
auto computedHorizontalMargin = Geometry::computedHorizontalMargin(inlineContainer, usedValues);
displayBox.setHorizontalComputedMargin(computedHorizontalMargin);
@@ -150,6 +151,13 @@
displayBox.setHorizontalMargin({ computedHorizontalMargin.start.valueOr(0), computedHorizontalMargin.end.valueOr(0) });
}
+void InlineFormattingContext::computeBorderAndPadding(const Box& layoutBox, UsedHorizontalValues usedValues) const
+{
+ auto& displayBox = layoutState().displayBoxForLayoutBox(layoutBox);
+ displayBox.setBorder(Geometry::computedBorder(layoutBox));
+ displayBox.setPadding(Geometry::computedPadding(layoutBox, usedValues));
+}
+
void InlineFormattingContext::computeWidthAndMargin(const Box& layoutBox, UsedHorizontalValues usedValues) const
{
auto& layoutState = this->layoutState();
@@ -191,6 +199,7 @@
void InlineFormattingContext::layoutFormattingContextRoot(const Box& root, UsedHorizontalValues usedValues) const
{
ASSERT(root.isFloatingPositioned() || root.isInlineBlockBox());
+ ASSERT(usedValues.containingBlockWidth);
computeBorderAndPadding(root, usedValues);
computeWidthAndMargin(root, usedValues);
@@ -208,6 +217,7 @@
ASSERT(!layoutBox.isContainer());
ASSERT(!layoutBox.establishesFormattingContext());
ASSERT(layoutBox.replaced());
+ ASSERT(usedValues.containingBlockWidth);
computeBorderAndPadding(layoutBox, usedValues);
computeWidthAndMargin(layoutBox, usedValues);
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h (241248 => 241249)
--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h 2019-02-10 14:38:26 UTC (rev 241248)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h 2019-02-10 16:53:41 UTC (rev 241249)
@@ -87,8 +87,8 @@
void layoutFormattingContextRoot(const Box&, UsedHorizontalValues) const;
void computeWidthAndHeightForReplacedInlineBox(const Box&, UsedHorizontalValues) const;
+ void computeMargin(const InlineContainer&, UsedHorizontalValues) const;
void computeBorderAndPadding(const Box&, UsedHorizontalValues) const;
- void computeMarginBorderAndPadding(const InlineContainer&, UsedHorizontalValues) const;
void computeHeightAndMargin(const Box&) const;
void computeWidthAndMargin(const Box&, UsedHorizontalValues) const;