Title: [283255] trunk/Source/WebCore
Revision
283255
Author
[email protected]
Date
2021-09-29 13:16:10 -0700 (Wed, 29 Sep 2021)

Log Message

[LFC][IFC] Pass in the first-line style to the InlineContentBreaker::ContinuousContent runs if applicable
https://bugs.webkit.org/show_bug.cgi?id=230924

Reviewed by Antti Koivisto.

Now the inline content breaker has the correct set of style values when first-line style is set.

* layout/formattingContexts/inline/InlineItem.h:
(WebCore::Layout::InlineItem::firstLineStyle const):
* layout/formattingContexts/inline/InlineLineBuilder.cpp:
(WebCore::Layout::LineCandidate::InlineContent::appendInlineItem):
(WebCore::Layout::LineBuilder::layoutInlineContent):
(WebCore::Layout::LineBuilder::computedIntrinsicWidth):
(WebCore::Layout::LineBuilder::initialize):
(WebCore::Layout::LineBuilder::candidateContentForLine):
* layout/formattingContexts/inline/InlineLineBuilder.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (283254 => 283255)


--- trunk/Source/WebCore/ChangeLog	2021-09-29 20:14:31 UTC (rev 283254)
+++ trunk/Source/WebCore/ChangeLog	2021-09-29 20:16:10 UTC (rev 283255)
@@ -1,3 +1,22 @@
+2021-09-29  Alan Bujtas  <[email protected]>
+
+        [LFC][IFC] Pass in the first-line style to the InlineContentBreaker::ContinuousContent runs if applicable
+        https://bugs.webkit.org/show_bug.cgi?id=230924
+
+        Reviewed by Antti Koivisto.
+
+        Now the inline content breaker has the correct set of style values when first-line style is set.
+
+        * layout/formattingContexts/inline/InlineItem.h:
+        (WebCore::Layout::InlineItem::firstLineStyle const):
+        * layout/formattingContexts/inline/InlineLineBuilder.cpp:
+        (WebCore::Layout::LineCandidate::InlineContent::appendInlineItem):
+        (WebCore::Layout::LineBuilder::layoutInlineContent):
+        (WebCore::Layout::LineBuilder::computedIntrinsicWidth):
+        (WebCore::Layout::LineBuilder::initialize):
+        (WebCore::Layout::LineBuilder::candidateContentForLine):
+        * layout/formattingContexts/inline/InlineLineBuilder.h:
+
 2021-09-29  Aditya Keerthi  <[email protected]>
 
         Remove references to '-webkit-clear-button'

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineItem.h (283254 => 283255)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineItem.h	2021-09-29 20:14:31 UTC (rev 283254)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineItem.h	2021-09-29 20:16:10 UTC (rev 283255)
@@ -41,6 +41,7 @@
     Type type() const { return m_type; }
     const Box& layoutBox() const { return *m_layoutBox; }
     const RenderStyle& style() const { return layoutBox().style(); }
+    const RenderStyle& firstLineStyle() const { return layoutBox().firstLineStyle(); }
 
     bool isText() const { return type() == Type::Text; }
     bool isBox() const { return type() == Type::Box; }

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.cpp (283254 => 283255)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.cpp	2021-09-29 20:14:31 UTC (rev 283254)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.cpp	2021-09-29 20:16:10 UTC (rev 283255)
@@ -140,7 +140,7 @@
         const InlineItem* trailingLineBreak() const { return m_trailingLineBreak; }
         const InlineItem* trailingWordBreakOpportunity() const { return m_trailingWordBreakOpportunity; }
 
-        void appendInlineItem(const InlineItem&, InlineLayoutUnit logicalWidth);
+        void appendInlineItem(const InlineItem&, const RenderStyle&, InlineLayoutUnit logicalWidth);
         void appendTrailingLineBreak(const InlineItem& lineBreakItem) { m_trailingLineBreak = &lineBreakItem; }
         void appendtrailingWordBreakOpportunity(const InlineItem& wordBreakItem) { m_trailingWordBreakOpportunity = &wordBreakItem; }
         void reset();
@@ -175,7 +175,7 @@
 {
 }
 
-inline void LineCandidate::InlineContent::appendInlineItem(const InlineItem& inlineItem, InlineLayoutUnit logicalWidth)
+inline void LineCandidate::InlineContent::appendInlineItem(const InlineItem& inlineItem, const RenderStyle& style, InlineLayoutUnit logicalWidth)
 {
     ASSERT(inlineItem.isText() || inlineItem.isBox() || inlineItem.isInlineBoxStart() || inlineItem.isInlineBoxEnd());
     auto collapsibleWidth = [&]() -> std::optional<InlineLayoutUnit> {
@@ -195,8 +195,7 @@
         ASSERT(logicalWidth > letterSpacing);
         return letterSpacing;
     };
-    // FIXME: While the line breaking related properties for atomic level boxes do not depend on the line index (first line style) it'd be great to figure out the correct style to pass in.
-    m_continuousContent.append(inlineItem, !inlineItem.isBox() ? inlineItem.style() : inlineItem.layoutBox().parent().style(), logicalWidth, collapsibleWidth());
+    m_continuousContent.append(inlineItem, style, logicalWidth, collapsibleWidth());
     m_hasInlineLevelBox = m_hasInlineLevelBox || inlineItem.isBox() || inlineItem.isInlineBoxStart();
 }
 
@@ -267,7 +266,7 @@
 
 LineBuilder::LineContent LineBuilder::layoutInlineContent(const InlineItemRange& needsLayoutRange, size_t partialLeadingContentLength, std::optional<InlineLayoutUnit> overflowLogicalWidth, const InlineRect& initialLineLogicalRect, bool isFirstLine)
 {
-    initialize(initialConstraintsForLine(initialLineLogicalRect, isFirstLine));
+    initialize(initialConstraintsForLine(initialLineLogicalRect, isFirstLine), isFirstLine);
 
     auto committedContent = placeInlineContent(needsLayoutRange, partialLeadingContentLength, overflowLogicalWidth);
     auto committedRange = close(needsLayoutRange, committedContent);
@@ -284,14 +283,15 @@
 
 LineBuilder::IntrinsicContent LineBuilder::computedIntrinsicWidth(const InlineItemRange& needsLayoutRange, InlineLayoutUnit availableWidth)
 {
-    initialize({ { { }, { availableWidth, maxInlineLayoutUnit() } }, false });
+    initialize({ { { }, { availableWidth, maxInlineLayoutUnit() } }, false }, false);
     auto committedContent = placeInlineContent(needsLayoutRange, { }, { });
     auto committedRange = close(needsLayoutRange, committedContent);
     return { committedRange, m_line.contentLogicalWidth(), m_floats };
 }
 
-void LineBuilder::initialize(const UsedConstraints& lineConstraints)
+void LineBuilder::initialize(const UsedConstraints& lineConstraints, bool isFirstLine)
 {
+    m_isFirstLine = isFirstLine;
     m_floats.clear();
     m_partialLeadingTextItem = { };
     m_wrapOpportunityList.clear();
@@ -480,11 +480,12 @@
     ASSERT(softWrapOpportunityIndex <= layoutRange.end);
 
     if (partialLeadingContentLength) {
+        ASSERT(!m_isFirstLine);
         // Handle leading partial content first (overflowing text from the previous line).
         // Construct a partial leading inline item.
         m_partialLeadingTextItem = downcast<InlineTextItem>(m_inlineItems[currentInlineItemIndex]).right(partialLeadingContentLength);
         auto itemWidth = leadingLogicalWidth ? *std::exchange(leadingLogicalWidth, std::nullopt) : inlineItemWidth(*m_partialLeadingTextItem, currentLogicalRight);
-        lineCandidate.inlineContent.appendInlineItem(*m_partialLeadingTextItem, itemWidth);
+        lineCandidate.inlineContent.appendInlineItem(*m_partialLeadingTextItem, m_partialLeadingTextItem->style(), itemWidth);
         currentLogicalRight += itemWidth;
         ++currentInlineItemIndex;
     }
@@ -491,6 +492,9 @@
 
     for (auto index = currentInlineItemIndex; index < softWrapOpportunityIndex; ++index) {
         auto& inlineItem = m_inlineItems[index];
+        auto& style = [&] () -> const RenderStyle& {
+            return m_isFirstLine ? inlineItem.firstLineStyle() : inlineItem.style();
+        }();
         if (inlineItem.isFloat()) {
             lineCandidate.floatItem = &inlineItem;
             // This is a soft wrap opportunity, must be the only item in the list.
@@ -497,13 +501,20 @@
             ASSERT(currentInlineItemIndex + 1 == softWrapOpportunityIndex);
             continue;
         }
-        if (inlineItem.isText() || inlineItem.isInlineBoxStart() || inlineItem.isInlineBoxEnd() || inlineItem.isBox()) {
+        if (inlineItem.isText() || inlineItem.isInlineBoxStart() || inlineItem.isInlineBoxEnd()) {
             ASSERT(!leadingLogicalWidth || inlineItem.isText());
             auto logicalWidth = leadingLogicalWidth ? *std::exchange(leadingLogicalWidth, std::nullopt) : inlineItemWidth(inlineItem, currentLogicalRight);
-            lineCandidate.inlineContent.appendInlineItem(inlineItem, logicalWidth);
+            lineCandidate.inlineContent.appendInlineItem(inlineItem, style, logicalWidth);
             currentLogicalRight += logicalWidth;
             continue;
         }
+        if (inlineItem.isBox()) {
+            auto logicalWidth = inlineItemWidth(inlineItem, currentLogicalRight);
+            // FIXME: While the line breaking related properties for atomic level boxes do not depend on the line index (first line style) it'd be great to figure out the correct style to pass in.
+            lineCandidate.inlineContent.appendInlineItem(inlineItem, inlineItem.layoutBox().parent().style(), logicalWidth);
+            currentLogicalRight += logicalWidth;
+            continue;
+        }
         if (inlineItem.isLineBreak() || inlineItem.isWordBreakOpportunity()) {
             // Since both <br> and <wbr> are explicit word break opportunities they have to be trailing items in this candidate run list unless they are embedded in inline boxes.
             // e.g. <span><wbr></span>

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.h (283254 => 283255)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.h	2021-09-29 20:14:31 UTC (rev 283254)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.h	2021-09-29 20:16:10 UTC (rev 283255)
@@ -97,7 +97,7 @@
     size_t rebuildLine(const InlineItemRange& needsLayoutRange, const InlineItem& lastInlineItemToAdd);
     size_t rebuildLineForTrailingSoftHyphen(const InlineItemRange& layoutRange);
     void commitPartialContent(const InlineContentBreaker::ContinuousContent::RunList&, const InlineContentBreaker::Result::PartialTrailingContent&);
-    void initialize(const UsedConstraints&);
+    void initialize(const UsedConstraints&, bool isFirstLine);
     struct CommittedContent {
         size_t inlineItemCount { 0 };
         size_t partialTrailingContentLength { 0 };
@@ -116,6 +116,8 @@
     const ContainerBox& root() const;
     const LayoutState& layoutState() const;
 
+private:
+    bool m_isFirstLine { false };
     const InlineFormattingContext& m_inlineFormattingContext;
     InlineFormattingState* m_inlineFormattingState { nullptr };
     FloatingState* m_floatingState { nullptr };
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to