[LFC][IFC] LineBuilder::InlineItemRun objects don't have vertical geometry
https://bugs.webkit.org/show_bug.cgi?id=204752
<rdar://problem/57560643>

Reviewed by Antti Koivisto.

Height and vertical position are computed when the InlineItemRun objects are merged and transformed into LineBuilder::Run objects.

* layout/inlineformatting/InlineLineBuilder.cpp:
(WebCore::Layout::LineBuilder::ContinousContent::append):
(WebCore::Layout::LineBuilder::ContinousContent::close):
(WebCore::Layout::LineBuilder::Run::Run):
(WebCore::Layout::LineBuilder::appendNonBreakableSpace):
(WebCore::Layout::LineBuilder::appendInlineContainerStart):
(WebCore::Layout::LineBuilder::appendInlineContainerEnd):
(WebCore::Layout::LineBuilder::appendTextContent):
(WebCore::Layout::LineBuilder::appendNonReplacedInlineBox):
(WebCore::Layout::LineBuilder::appendLineBreak):
(WebCore::Layout::LineBuilder::isVisuallyNonEmpty const):
(WebCore::Layout::LineBuilder::InlineItemRun::InlineItemRun):
(WebCore::Layout::LineBuilder::InlineItemRun::setCollapsesToZeroAdvanceWidth):
(WebCore::Layout::LineBuilder::InlineItemRun::removeTrailingLetterSpacing):
* layout/inlineformatting/InlineLineBuilder.h:
(WebCore::Layout::LineBuilder::InlineItemRun::logicalLeft const):
(WebCore::Layout::LineBuilder::InlineItemRun::logicalWidth const):
(WebCore::Layout::LineBuilder::InlineItemRun::logicalRect const): Deleted.

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@253003 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index eea8dde..431d755 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,32 @@
+2019-12-02  Zalan Bujtas  <zalan@apple.com>
+
+        [LFC][IFC] LineBuilder::InlineItemRun objects don't have vertical geometry
+        https://bugs.webkit.org/show_bug.cgi?id=204752
+        <rdar://problem/57560643>
+
+        Reviewed by Antti Koivisto.
+
+        Height and vertical position are computed when the InlineItemRun objects are merged and transformed into LineBuilder::Run objects.
+
+        * layout/inlineformatting/InlineLineBuilder.cpp:
+        (WebCore::Layout::LineBuilder::ContinousContent::append):
+        (WebCore::Layout::LineBuilder::ContinousContent::close):
+        (WebCore::Layout::LineBuilder::Run::Run):
+        (WebCore::Layout::LineBuilder::appendNonBreakableSpace):
+        (WebCore::Layout::LineBuilder::appendInlineContainerStart):
+        (WebCore::Layout::LineBuilder::appendInlineContainerEnd):
+        (WebCore::Layout::LineBuilder::appendTextContent):
+        (WebCore::Layout::LineBuilder::appendNonReplacedInlineBox):
+        (WebCore::Layout::LineBuilder::appendLineBreak):
+        (WebCore::Layout::LineBuilder::isVisuallyNonEmpty const):
+        (WebCore::Layout::LineBuilder::InlineItemRun::InlineItemRun):
+        (WebCore::Layout::LineBuilder::InlineItemRun::setCollapsesToZeroAdvanceWidth):
+        (WebCore::Layout::LineBuilder::InlineItemRun::removeTrailingLetterSpacing):
+        * layout/inlineformatting/InlineLineBuilder.h:
+        (WebCore::Layout::LineBuilder::InlineItemRun::logicalLeft const):
+        (WebCore::Layout::LineBuilder::InlineItemRun::logicalWidth const):
+        (WebCore::Layout::LineBuilder::InlineItemRun::logicalRect const): Deleted.
+
 2019-12-02  Simon Fraser  <simon.fraser@apple.com>
 
         Remove the confusing Value struct used for calc results
diff --git a/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp b/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp
index 9d56077..b1f6a3f 100644
--- a/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp
+++ b/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp
@@ -74,7 +74,7 @@
 
     ASSERT(inlineItemRun.isText());
     m_expandedLength += inlineItemRun.textContext()->length();
-    m_expandedWidth += inlineItemRun.logicalRect().width();
+    m_expandedWidth += inlineItemRun.logicalWidth();
 
     if (m_textIsAlignJustify) {
         m_hasTrailingExpansionOpportunity = inlineItemRun.hasExpansionOpportunity();
@@ -90,9 +90,6 @@
         return { m_initialInlineRun };
     // Expand the text content and set the expansion opportunities.
     ASSERT(m_initialInlineRun.isText());
-    auto logicalRect = m_initialInlineRun.logicalRect();
-    logicalRect.expandHorizontally(m_expandedWidth);
-
     auto textContext = *m_initialInlineRun.textContext();
     auto length = textContext.length() + m_expandedLength;
     textContext.expand(length);
@@ -104,13 +101,13 @@
             ++m_expansionOpportunityCount;
         textContext.setExpansion({ expansionBehavior, { } });
     }
-    return { m_initialInlineRun, logicalRect, textContext, m_expansionOpportunityCount };
+    return { m_initialInlineRun,  Display::Rect { 0, m_initialInlineRun.logicalLeft(), m_initialInlineRun.logicalWidth() + m_expandedWidth, { } }, textContext, m_expansionOpportunityCount };
 }
 
 LineBuilder::Run::Run(const InlineItemRun& inlineItemRun)
     : m_layoutBox(&inlineItemRun.layoutBox())
     , m_type(inlineItemRun.type())
-    , m_logicalRect(inlineItemRun.logicalRect())
+    , m_logicalRect({ { }, inlineItemRun.logicalLeft(), inlineItemRun.logicalWidth(), { } })
     , m_textContext(inlineItemRun.textContext())
     , m_isCollapsedToVisuallyEmpty(inlineItemRun.isCollapsedToZeroAdvanceWidth())
 {
@@ -456,22 +453,22 @@
         m_lineBox.setIsConsideredNonEmpty();
 }
 
-void LineBuilder::appendNonBreakableSpace(const InlineItem& inlineItem, const Display::Rect& logicalRect)
+void LineBuilder::appendNonBreakableSpace(const InlineItem& inlineItem, LayoutUnit logicalLeft, LayoutUnit logicalWidth)
 {
-    m_inlineItemRuns.append({ inlineItem, logicalRect });
-    m_lineBox.expandHorizontally(logicalRect.width());
+    m_inlineItemRuns.append({ inlineItem, logicalLeft, logicalWidth });
+    m_lineBox.expandHorizontally(logicalWidth);
 }
 
 void LineBuilder::appendInlineContainerStart(const InlineItem& inlineItem, LayoutUnit logicalWidth)
 {
     // This is really just a placeholder to mark the start of the inline level container <span>.
-    appendNonBreakableSpace(inlineItem, Display::Rect { 0, contentLogicalWidth(), logicalWidth, { } });
+    appendNonBreakableSpace(inlineItem, contentLogicalWidth(), logicalWidth);
 }
 
 void LineBuilder::appendInlineContainerEnd(const InlineItem& inlineItem, LayoutUnit logicalWidth)
 {
     // This is really just a placeholder to mark the end of the inline level container </span>.
-    appendNonBreakableSpace(inlineItem, Display::Rect { 0, contentLogicalRight(), logicalWidth, { } });
+    appendNonBreakableSpace(inlineItem, contentLogicalRight(), logicalWidth);
 }
 
 void LineBuilder::appendTextContent(const InlineTextItem& inlineItem, LayoutUnit logicalWidth)
@@ -508,8 +505,7 @@
     auto collapsedRun = inlineItem.isCollapsible() && inlineItem.length() > 1;
     auto contentStart = inlineItem.start();
     auto contentLength =  collapsedRun ? 1 : inlineItem.length();
-    auto lineRun = InlineItemRun { inlineItem, Display::Rect { 0, contentLogicalWidth(), logicalWidth, { } },
-        Display::Run::TextContext { contentStart, contentLength, inlineItem.layoutBox().textContext()->content } };
+    auto lineRun = InlineItemRun { inlineItem, contentLogicalWidth(), logicalWidth, Display::Run::TextContext { contentStart, contentLength, inlineItem.layoutBox().textContext()->content } };
 
     auto collapsesToZeroAdvanceWidth = willCollapseCompletely();
     if (collapsesToZeroAdvanceWidth)
@@ -518,7 +514,7 @@
     if (collapsedRun)
         lineRun.setIsCollapsed();
 
-    auto lineRunWidth = lineRun.logicalRect().width();
+    auto lineRunWidth = lineRun.logicalWidth();
     // Trailing whitespace content is fully trimmable so as the trailing letter space.
     auto isFullyTrimmable = !shouldPreserveTrailingContent(inlineItem);
     auto isPartiallyTrimmable = !inlineItem.isWhitespace() && inlineItem.style().letterSpacing();
@@ -543,7 +539,7 @@
     auto& layoutBox = inlineItem.layoutBox();
     auto& boxGeometry = formattingContext().geometryForBox(layoutBox);
     auto horizontalMargin = boxGeometry.horizontalMargin();
-    m_inlineItemRuns.append({ inlineItem, Display::Rect { 0, contentLogicalWidth() + horizontalMargin.start, logicalWidth, { } } });
+    m_inlineItemRuns.append({ inlineItem, contentLogicalWidth() + horizontalMargin.start, logicalWidth });
     m_lineBox.expandHorizontally(logicalWidth + horizontalMargin.start + horizontalMargin.end);
     m_trimmableContent.clear();
 }
@@ -557,7 +553,7 @@
 
 void LineBuilder::appendLineBreak(const InlineItem& inlineItem)
 {
-    m_inlineItemRuns.append({ inlineItem, Display::Rect { 0, contentLogicalWidth(), { }, { } } });
+    m_inlineItemRuns.append({ inlineItem, contentLogicalWidth(), { } });
 }
 
 void LineBuilder::adjustBaselineAndLineHeight(const Run& run)
@@ -673,7 +669,7 @@
 
     // Note that this does not check whether the inline container has content. It simply checks if the container itself is considered non-empty.
     if (run.isContainerStart() || run.isContainerEnd()) {
-        if (!run.logicalRect().width())
+        if (!run.logicalWidth())
             return false;
         // Margin does not make the container visually non-empty. Check if it has border or padding.
         auto& boxGeometry = formattingContext().geometryForBox(run.layoutBox());
@@ -689,7 +685,7 @@
         if (!run.layoutBox().establishesFormattingContext())
             return true;
         ASSERT(run.layoutBox().isInlineBlockBox());
-        if (!run.logicalRect().width())
+        if (!run.logicalWidth())
             return false;
         if (m_skipAlignment || formattingContext().geometryForBox(run.layoutBox()).height())
             return true;
@@ -731,9 +727,10 @@
     m_lastRunIsFullyTrimmable = isFullyTrimmable == IsFullyTrimmable::Yes;
 }
 
-LineBuilder::InlineItemRun::InlineItemRun(const InlineItem& inlineItem, const Display::Rect& logicalRect, WTF::Optional<Display::Run::TextContext> textContext)
+LineBuilder::InlineItemRun::InlineItemRun(const InlineItem& inlineItem, LayoutUnit logicalLeft, LayoutUnit logicalWidth, WTF::Optional<Display::Run::TextContext> textContext)
     : m_inlineItem(inlineItem)
-    , m_logicalRect(logicalRect)
+    , m_logicalLeft(logicalLeft)
+    , m_logicalWidth(logicalWidth)
     , m_textContext(textContext)
 {
 }
@@ -741,13 +738,14 @@
 void LineBuilder::InlineItemRun::setCollapsesToZeroAdvanceWidth()
 {
     m_collapsedToZeroAdvanceWidth = true;
-    m_logicalRect.setWidth({ });
+    m_logicalWidth = { };
 }
 
 void LineBuilder::InlineItemRun::removeTrailingLetterSpacing()
 {
     ASSERT(m_inlineItem.style().letterSpacing());
-    m_logicalRect.expandHorizontally(LayoutUnit { -m_inlineItem.style().letterSpacing() });
+    m_logicalWidth -= m_inlineItem.style().letterSpacing();
+    ASSERT(m_logicalWidth > 0);
 }
 
 }
diff --git a/Source/WebCore/layout/inlineformatting/InlineLineBuilder.h b/Source/WebCore/layout/inlineformatting/InlineLineBuilder.h
index 60ea766..6ceea5a 100644
--- a/Source/WebCore/layout/inlineformatting/InlineLineBuilder.h
+++ b/Source/WebCore/layout/inlineformatting/InlineLineBuilder.h
@@ -130,7 +130,7 @@
     LayoutUnit contentLogicalRight() const { return m_lineBox.logicalRight(); }
     LayoutUnit baselineOffset() const { return m_lineBox.baselineOffset(); }
 
-    void appendNonBreakableSpace(const InlineItem&, const Display::Rect& logicalRect);
+    void appendNonBreakableSpace(const InlineItem&, LayoutUnit logicalLeft, LayoutUnit logicalWidth);
     void appendTextContent(const InlineTextItem&, LayoutUnit logicalWidth);
     void appendNonReplacedInlineBox(const InlineItem&, LayoutUnit logicalWidth);
     void appendReplacedInlineBox(const InlineItem&, LayoutUnit logicalWidth);
@@ -155,10 +155,11 @@
 
     class InlineItemRun {
     public:
-        InlineItemRun(const InlineItem&, const Display::Rect&, WTF::Optional<Display::Run::TextContext> = WTF::nullopt);
+        InlineItemRun(const InlineItem&, LayoutUnit logicalLeft, LayoutUnit logicalWidth, WTF::Optional<Display::Run::TextContext> = WTF::nullopt);
 
         const Box& layoutBox() const { return m_inlineItem.layoutBox(); }
-        const Display::Rect& logicalRect() const { return m_logicalRect; }
+        LayoutUnit logicalLeft() const { return m_logicalLeft; }
+        LayoutUnit logicalWidth() const { return m_logicalWidth; }
         const Optional<Display::Run::TextContext>& textContext() const { return m_textContext; }
 
         bool isText() const { return m_inlineItem.isText(); }
@@ -182,7 +183,8 @@
 
     private:
         const InlineItem& m_inlineItem;
-        Display::Rect m_logicalRect;
+        LayoutUnit m_logicalLeft;
+        LayoutUnit m_logicalWidth;
         const Optional<Display::Run::TextContext> m_textContext;
         bool m_isCollapsed { false };
         bool m_collapsedToZeroAdvanceWidth { false };