Title: [250484] trunk/Source/WebCore
Revision
250484
Author
za...@apple.com
Date
2019-09-28 16:58:10 -0700 (Sat, 28 Sep 2019)

Log Message

[LFC][IFC] Line::InitialConstraints's heightAndBaseline should be optional
https://bugs.webkit.org/show_bug.cgi?id=202348

Reviewed by Antti Koivisto.

Vertical properties are undefined while computing the preferred width.

* layout/inlineformatting/InlineFormattingContextLineLayout.cpp:
(WebCore::Layout::LineInput::LineInput):
(WebCore::Layout::InlineFormattingContext::InlineLayout::computedIntrinsicWidth const):
* layout/inlineformatting/InlineLine.cpp:
(WebCore::Layout::Line::Line):
* layout/inlineformatting/InlineLine.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (250483 => 250484)


--- trunk/Source/WebCore/ChangeLog	2019-09-28 21:38:14 UTC (rev 250483)
+++ trunk/Source/WebCore/ChangeLog	2019-09-28 23:58:10 UTC (rev 250484)
@@ -1,3 +1,19 @@
+2019-09-28  Zalan Bujtas  <za...@apple.com>
+
+        [LFC][IFC] Line::InitialConstraints's heightAndBaseline should be optional
+        https://bugs.webkit.org/show_bug.cgi?id=202348
+
+        Reviewed by Antti Koivisto.
+
+        Vertical properties are undefined while computing the preferred width.
+
+        * layout/inlineformatting/InlineFormattingContextLineLayout.cpp:
+        (WebCore::Layout::LineInput::LineInput):
+        (WebCore::Layout::InlineFormattingContext::InlineLayout::computedIntrinsicWidth const):
+        * layout/inlineformatting/InlineLine.cpp:
+        (WebCore::Layout::Line::Line):
+        * layout/inlineformatting/InlineLine.h:
+
 2019-09-28  Chris Dumez  <cdu...@apple.com>
 
         [Experiment][iOS] Add temporary HTTP header to distinguish iPads for requests to Google

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp (250483 => 250484)


--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp	2019-09-28 21:38:14 UTC (rev 250483)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp	2019-09-28 23:58:10 UTC (rev 250484)
@@ -91,6 +91,14 @@
     Optional<LayoutUnit> floatMinimumLogicalBottom;
 };
 
+LineInput::LineInput(const Line::InitialConstraints& initialLineConstraints, Line::SkipVerticalAligment skipVerticalAligment, IndexAndRange firstToProcess, const InlineItems& inlineItems)
+    : initialConstraints(initialLineConstraints)
+    , skipVerticalAligment(skipVerticalAligment)
+    , firstInlineItem(firstToProcess)
+    , inlineItems(inlineItems)
+{
+}
+
 struct LineContent {
     Optional<IndexAndRange> lastCommitted;
     Vector<WeakPtr<InlineItem>> floats;
@@ -262,14 +270,6 @@
     return close();
 }
 
-LineInput::LineInput(const Line::InitialConstraints& initialLineConstraints, Line::SkipVerticalAligment skipVerticalAligment, IndexAndRange firstToProcess, const InlineItems& inlineItems)
-    : initialConstraints(initialLineConstraints)
-    , skipVerticalAligment(skipVerticalAligment)
-    , firstInlineItem(firstToProcess)
-    , inlineItems(inlineItems)
-{
-}
-
 InlineFormattingContext::InlineLayout::InlineLayout(InlineFormattingContext& inlineFormattingContext, UsedHorizontalValues usedHorizontalValues)
     : m_inlineFormattingContext(inlineFormattingContext)
     , m_usedHorizontalValues(usedHorizontalValues)
@@ -346,10 +346,14 @@
     auto& formattingContext = this->formattingContext();
     LayoutUnit maximumLineWidth;
     IndexAndRange currentInlineItem;
-    auto quirks = formattingContext.quirks();
     while (currentInlineItem.index < inlineItems.size()) {
-        auto lineContent = LineLayout(formattingContext, { { { }, widthConstraint(), false, quirks.lineHeightConstraints(formattingRoot()) }, Line::SkipVerticalAligment::Yes, currentInlineItem, inlineItems }).layout();
-        currentInlineItem = { lineContent.lastCommitted->index + 1, WTF::nullopt };
+        // Only the horiztonal available width is constrained when computing intrinsic width.
+        auto initialLineConstraints = Line::InitialConstraints { { }, widthConstraint(), false, { } };
+        auto lineInput = LineInput { initialLineConstraints, Line::SkipVerticalAligment::Yes, currentInlineItem, inlineItems };
+
+        auto lineContent = LineLayout(formattingContext, lineInput).layout();
+
+        currentInlineItem = { lineContent.lastCommitted->index + 1, { } };
         LayoutUnit floatsWidth;
         for (auto& floatItem : lineContent.floats)
             floatsWidth += formattingContext.geometryForBox(floatItem->layoutBox()).marginBoxWidth();

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLine.cpp (250483 => 250484)


--- trunk/Source/WebCore/layout/inlineformatting/InlineLine.cpp	2019-09-28 21:38:14 UTC (rev 250483)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLine.cpp	2019-09-28 23:58:10 UTC (rev 250484)
@@ -59,12 +59,15 @@
 
 Line::Line(const InlineFormattingContext& inlineFormattingContext, const InitialConstraints& initialConstraints, SkipVerticalAligment skipVerticalAligment)
     : m_inlineFormattingContext(inlineFormattingContext)
-    , m_initialStrut(initialConstraints.heightAndBaseline.strut)
+    , m_initialStrut(initialConstraints.heightAndBaseline ? initialConstraints.heightAndBaseline->strut : WTF::nullopt)
     , m_lineLogicalWidth(initialConstraints.availableLogicalWidth)
     , m_skipVerticalAligment(skipVerticalAligment == SkipVerticalAligment::Yes)
 {
-    auto lineRect = Display::Rect { initialConstraints.logicalTopLeft, { }, initialConstraints.heightAndBaseline.height };
-    auto baseline = LineBox::Baseline { initialConstraints.heightAndBaseline.baselineOffset, initialConstraints.heightAndBaseline.height - initialConstraints.heightAndBaseline.baselineOffset };
+    ASSERT(m_skipVerticalAligment || initialConstraints.heightAndBaseline);
+    auto initialLineHeight = initialConstraints.heightAndBaseline ? initialConstraints.heightAndBaseline->height : LayoutUnit();
+    auto initialBaselineOffset = initialConstraints.heightAndBaseline ? initialConstraints.heightAndBaseline->baselineOffset : LayoutUnit();
+    auto lineRect = Display::Rect { initialConstraints.logicalTopLeft, { }, initialLineHeight };
+    auto baseline = LineBox::Baseline { initialBaselineOffset, initialLineHeight - initialBaselineOffset };
     m_lineBox = LineBox { lineRect, baseline, { } };
 }
 

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLine.h (250483 => 250484)


--- trunk/Source/WebCore/layout/inlineformatting/InlineLine.h	2019-09-28 21:38:14 UTC (rev 250483)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLine.h	2019-09-28 23:58:10 UTC (rev 250484)
@@ -49,7 +49,7 @@
             LayoutUnit baselineOffset;
             Optional<LineBox::Baseline> strut;
         };
-        HeightAndBaseline heightAndBaseline;
+        Optional<HeightAndBaseline> heightAndBaseline;
     };
     enum class SkipVerticalAligment { No, Yes };
     Line(const InlineFormattingContext&, const InitialConstraints&, SkipVerticalAligment);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to