[LFC][IFC] Add support for word-spacing property
https://bugs.webkit.org/show_bug.cgi?id=204723
<rdar://problem/57541871>

Reviewed by Antti Koivisto.

* layout/inlineformatting/InlineLineBuilder.cpp:
(WebCore::Layout::LineBuilder::TrimmableContent::append):
* layout/inlineformatting/LineLayoutContext.cpp:
(WebCore::Layout::inlineItemWidth):

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@252967 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index 240e747..8def547 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,16 @@
+2019-12-01  Zalan Bujtas  <zalan@apple.com>
+
+        [LFC][IFC] Add support for word-spacing property
+        https://bugs.webkit.org/show_bug.cgi?id=204723
+        <rdar://problem/57541871>
+
+        Reviewed by Antti Koivisto.
+
+        * layout/inlineformatting/InlineLineBuilder.cpp:
+        (WebCore::Layout::LineBuilder::TrimmableContent::append):
+        * layout/inlineformatting/LineLayoutContext.cpp:
+        (WebCore::Layout::inlineItemWidth):
+
 2019-11-30  Antoine Quint  <graouts@apple.com>
 
         [Web Animations] Implement Animation.commitStyles()
diff --git a/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp b/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp
index cfcad5f..744c112 100644
--- a/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp
+++ b/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp
@@ -710,7 +710,8 @@
 
 void LineBuilder::TrimmableContent::append(LayoutUnit itemRunWidth, size_t runIndex)
 {
-    ASSERT(itemRunWidth >= 0);
+    // word-spacing could very well be negative, but it does not mean that the line gains that much extra space when the content is trimmed.
+    itemRunWidth = std::max(0_lu, itemRunWidth);
     m_width += itemRunWidth;
     m_runIndexes.append(runIndex);
 }
diff --git a/Source/WebCore/layout/inlineformatting/LineLayoutContext.cpp b/Source/WebCore/layout/inlineformatting/LineLayoutContext.cpp
index 8596e32..5b436dc 100644
--- a/Source/WebCore/layout/inlineformatting/LineLayoutContext.cpp
+++ b/Source/WebCore/layout/inlineformatting/LineLayoutContext.cpp
@@ -38,14 +38,17 @@
 static LayoutUnit inlineItemWidth(const FormattingContext& formattingContext, const InlineItem& inlineItem, LayoutUnit contentLogicalLeft)
 {
     if (inlineItem.isForcedLineBreak())
-        return 0;
+        return { };
 
     if (is<InlineTextItem>(inlineItem)) {
         auto& inlineTextItem = downcast<InlineTextItem>(inlineItem);
-        if (auto contentWidth = inlineTextItem.width())
-            return *contentWidth;
-        auto end = inlineTextItem.isCollapsible() ? inlineTextItem.start() + 1 : inlineTextItem.end();
-        return TextUtil::width(inlineTextItem.layoutBox(), inlineTextItem.start(), end, contentLogicalLeft);
+        auto contentWidth = inlineTextItem.width();
+        if (!contentWidth) {
+            auto end = inlineTextItem.isCollapsible() ? inlineTextItem.start() + 1 : inlineTextItem.end();
+            contentWidth = TextUtil::width(inlineTextItem.layoutBox(), inlineTextItem.start(), end, contentLogicalLeft);
+        }
+        auto wordSpacing = inlineTextItem.isWhitespace() ? LayoutUnit(inlineTextItem.style().fontCascade().wordSpacing()) : 0_lu;
+        return *contentWidth + wordSpacing;
     }
 
     auto& layoutBox = inlineItem.layoutBox();