Title: [241250] trunk/Source/WebCore
Revision
241250
Author
[email protected]
Date
2019-02-10 10:03:52 -0800 (Sun, 10 Feb 2019)

Log Message

[LFC][IFC] Add intrinsic width support for inline-block boxes
https://bugs.webkit.org/show_bug.cgi?id=194479

Reviewed by Antti Koivisto.

Compute the intrinsic width for the inline-block (formatting context root) and set it as the content box width while
laying out the content for the min/max width.

<div style="position: absolute">before<span id=inline-block style="display: inline-block">inline_block content<span>after</div>

The "inline-block" formatting root returns "inline_block" width for the minimum and "inline_block width" for
the maximum width. These min/max values are used to figure out the intrinsic width for the parent <div>.

* layout/inlineformatting/InlineFormattingContext.cpp:
(WebCore::Layout::InlineFormattingContext::instrinsicWidthConstraints const):
(WebCore::Layout::InlineFormattingContext::computeIntrinsicWidthForFormattingContextRoot const):
(WebCore::Layout::InlineFormattingContext::computeMargin const):
* layout/inlineformatting/InlineFormattingContext.h:
* page/FrameViewLayoutContext.cpp:
(WebCore::layoutUsingFormattingContext):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (241249 => 241250)


--- trunk/Source/WebCore/ChangeLog	2019-02-10 16:53:41 UTC (rev 241249)
+++ trunk/Source/WebCore/ChangeLog	2019-02-10 18:03:52 UTC (rev 241250)
@@ -1,5 +1,28 @@
 2019-02-10  Zalan Bujtas  <[email protected]>
 
+        [LFC][IFC] Add intrinsic width support for inline-block boxes
+        https://bugs.webkit.org/show_bug.cgi?id=194479
+
+        Reviewed by Antti Koivisto.
+
+        Compute the intrinsic width for the inline-block (formatting context root) and set it as the content box width while
+        laying out the content for the min/max width.
+
+        <div style="position: absolute">before<span id=inline-block style="display: inline-block">inline_block content<span>after</div>
+
+        The "inline-block" formatting root returns "inline_block" width for the minimum and "inline_block width" for
+        the maximum width. These min/max values are used to figure out the intrinsic width for the parent <div>.
+
+        * layout/inlineformatting/InlineFormattingContext.cpp:
+        (WebCore::Layout::InlineFormattingContext::instrinsicWidthConstraints const):
+        (WebCore::Layout::InlineFormattingContext::computeIntrinsicWidthForFormattingContextRoot const):
+        (WebCore::Layout::InlineFormattingContext::computeMargin const):
+        * layout/inlineformatting/InlineFormattingContext.h:
+        * page/FrameViewLayoutContext.cpp:
+        (WebCore::layoutUsingFormattingContext):
+
+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
 

Modified: trunk/Source/WebCore/layout/LayoutUnits.h (241249 => 241250)


--- trunk/Source/WebCore/layout/LayoutUnits.h	2019-02-10 16:53:41 UTC (rev 241249)
+++ trunk/Source/WebCore/layout/LayoutUnits.h	2019-02-10 18:03:52 UTC (rev 241250)
@@ -132,6 +132,10 @@
         {
         }
 
+    explicit UsedHorizontalValues()
+        {
+        }
+
     Optional<LayoutUnit> containingBlockWidth;
     Optional<LayoutUnit> width;
     Optional<UsedHorizontalMargin> margin;

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp (241249 => 241250)


--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp	2019-02-10 16:53:41 UTC (rev 241249)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp	2019-02-10 18:03:52 UTC (rev 241250)
@@ -94,20 +94,27 @@
 
 FormattingContext::InstrinsicWidthConstraints InlineFormattingContext::instrinsicWidthConstraints() const
 {
-    ASSERT(!layoutState().formattingStateForBox(root()).instrinsicWidthConstraints(root()));
     ASSERT(is<Container>(root()));
 
     auto& layoutState = this->layoutState();
     auto& root = downcast<Container>(this->root());
+    if (auto instrinsicWidthConstraints = layoutState.formattingStateForBox(root).instrinsicWidthConstraints(root))
+        return *instrinsicWidthConstraints;
 
-    auto usedValues = UsedHorizontalValues { { }, { }, { } };
+    Vector<const Box*> formattingContextRootList;
+    auto usedValues = UsedHorizontalValues { };
     auto* layoutBox = root.firstInFlowOrFloatingChild();
     while (layoutBox) {
-        if (layoutBox->establishesFormattingContext())
+        if (layoutBox->isFloatingPositioned())
             ASSERT_NOT_IMPLEMENTED_YET();
-        else if (layoutBox->isReplaced() || is<Container>(*layoutBox)) {
+        else if (layoutBox->isInlineBlockBox()) {
+            computeIntrinsicWidthForFormattingContextRoot(*layoutBox);
+            formattingContextRootList.append(layoutBox);
+        } else if (layoutBox->isReplaced() || is<Container>(*layoutBox)) {
             computeBorderAndPadding(*layoutBox, usedValues);
-            if (layoutBox->isReplaced())
+            // inline-block and replaced.
+            auto needsWidthComputation = layoutBox->isReplaced() || layoutBox->establishesFormattingContext();
+            if (needsWidthComputation)
                 computeWidthAndMargin(*layoutBox, usedValues);
             else {
                 // Simple inline container with no intrinsic width <span>.
@@ -124,6 +131,13 @@
         LayoutUnit maxContentLogicalRight;
         auto lineBreaker = InlineLineBreaker { layoutState, formattingState().inlineContent(), inlineRunProvider.runs() };
         LayoutUnit lineLogicalRight;
+
+        // Switch to the min/max formatting root width values before formatting the lines.
+        for (auto* formattingRoot : formattingContextRootList) {
+            auto instrinsicWidths = layoutState.formattingStateForBox(*formattingRoot).instrinsicWidthConstraints(*formattingRoot);
+            layoutState.displayBoxForLayoutBox(*formattingRoot).setContentBoxWidth(availableWidth ? instrinsicWidths->maximum : instrinsicWidths->minimum);
+        }
+
         while (auto run = lineBreaker.nextRun(lineLogicalRight, availableWidth, !lineLogicalRight)) {
             if (run->position == InlineLineBreaker::Run::Position::LineBegin)
                 lineLogicalRight = 0;
@@ -139,11 +153,20 @@
     return instrinsicWidthConstraints;
 }
 
+void InlineFormattingContext::computeIntrinsicWidthForFormattingContextRoot(const Box& layoutBox) const
+{
+    ASSERT(layoutBox.establishesFormattingContext());
+
+    auto usedValues = UsedHorizontalValues { };
+    computeBorderAndPadding(layoutBox, usedValues);
+    computeMargin(downcast<InlineContainer>(layoutBox), usedValues);
+    layoutState().createFormattingContext(layoutBox)->instrinsicWidthConstraints();
+}
+
 void InlineFormattingContext::computeMargin(const InlineContainer& inlineContainer, UsedHorizontalValues usedValues) const
 {
-    // Non-replaced, non-formatting root containers (<span></span>) don't have width property -> non width computation. 
+    // Non-replaced and formatting root containers (<span></span>) don't have width property -> non width computation.
     ASSERT(!inlineContainer.replaced());
-    ASSERT(!inlineContainer.establishesFormattingContext());
 
     auto& displayBox = layoutState().displayBoxForLayoutBox(inlineContainer);
     auto computedHorizontalMargin = Geometry::computedHorizontalMargin(inlineContainer, usedValues);

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h (241249 => 241250)


--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h	2019-02-10 16:53:41 UTC (rev 241249)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h	2019-02-10 18:03:52 UTC (rev 241250)
@@ -86,6 +86,7 @@
     };
 
     void layoutFormattingContextRoot(const Box&, UsedHorizontalValues) const;
+    void computeIntrinsicWidthForFormattingContextRoot(const Box&) const;
     void computeWidthAndHeightForReplacedInlineBox(const Box&, UsedHorizontalValues) const;
     void computeMargin(const InlineContainer&, UsedHorizontalValues) const;
     void computeBorderAndPadding(const Box&, UsedHorizontalValues) const;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to