[LFC][IFC] Use FontCascade::spaceWidth to measure single or collapsed whitespace content
https://bugs.webkit.org/show_bug.cgi?id=204594
<rdar://problem/57478360>

Reviewed by Antti Koivisto.

* layout/inlineformatting/InlineTextItem.cpp:
(WebCore::Layout::InlineTextItem::createAndAppendTextItems):


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@252869 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index 319d71c..ddd4bf2 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,14 @@
+2019-11-25  Zalan Bujtas  <zalan@apple.com>
+
+        [LFC][IFC] Use FontCascade::spaceWidth to measure single or collapsed whitespace content
+        https://bugs.webkit.org/show_bug.cgi?id=204594
+        <rdar://problem/57478360>
+
+        Reviewed by Antti Koivisto.
+
+        * layout/inlineformatting/InlineTextItem.cpp:
+        (WebCore::Layout::InlineTextItem::createAndAppendTextItems):
+
 2019-11-25  Antti Koivisto  <antti@apple.com>
 
         User Variant for RenderBlockFlow line layout
diff --git a/Source/WebCore/layout/inlineformatting/InlineTextItem.cpp b/Source/WebCore/layout/inlineformatting/InlineTextItem.cpp
index b69f360..875538f 100644
--- a/Source/WebCore/layout/inlineformatting/InlineTextItem.cpp
+++ b/Source/WebCore/layout/inlineformatting/InlineTextItem.cpp
@@ -29,6 +29,7 @@
 #if ENABLE(LAYOUT_FORMATTING_CONTEXT)
 
 #include "BreakLines.h"
+#include "FontCascade.h"
 
 namespace WebCore {
 namespace Layout {
@@ -82,16 +83,18 @@
 
 void InlineTextItem::createAndAppendTextItems(InlineItems& inlineContent, const Box& inlineBox)
 {
-    auto text = inlineBox.textContext()->content;
+    auto& textContext = *inlineBox.textContext();
+    auto text = textContext.content;
     if (!text.length())
         return inlineContent.append(InlineTextItem::createEmptyItem(inlineBox));
 
     auto& style = inlineBox.style();
+    auto& font = style.fontCascade();
     LazyLineBreakIterator lineBreakIterator(text);
     unsigned currentPosition = 0;
 
     auto inlineItemWidth = [&](auto startPosition, auto length) -> Optional<LayoutUnit> {
-        if (!inlineBox.textContext()->canUseSimplifiedContentMeasuring)
+        if (!textContext.canUseSimplifiedContentMeasuring)
             return { };
         return TextUtil::width(inlineBox, startPosition, startPosition + length);
     };
@@ -111,7 +114,9 @@
 
         if (isWhitespaceCharacter(text[currentPosition])) {
             auto length = moveToNextNonWhitespacePosition(text, currentPosition);
-            inlineContent.append(InlineTextItem::createWhitespaceItem(inlineBox, currentPosition, length, inlineItemWidth(currentPosition, length)));
+            auto simpleSingleWhitespaceContent = textContext.canUseSimplifiedContentMeasuring && (length == 1 || style.collapseWhiteSpace());
+            auto width = simpleSingleWhitespaceContent ? makeOptional(LayoutUnit { font.spaceWidth() }) : inlineItemWidth(currentPosition, length);
+            inlineContent.append(InlineTextItem::createWhitespaceItem(inlineBox, currentPosition, length, width));
             currentPosition += length;
             continue;
         }