diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index 645a714..d3e84df 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,19 @@
+2020-01-18  Commit Queue  <commit-queue@webkit.org>
+
+        Unreviewed, rolling out r254780.
+        https://bugs.webkit.org/show_bug.cgi?id=206472
+
+        fast/css/content/content-none.html asserts in
+        LineBuilder::CollapsibleContent::collapse() (Requested by
+        zalan on #webkit).
+
+        Reverted changeset:
+
+        "[LFC][IFC] Do not construct a dedicated run for the trailing
+        (fully) collapsed whitespace."
+        https://bugs.webkit.org/show_bug.cgi?id=206428
+        https://trac.webkit.org/changeset/254780
+
 2020-01-17  Cathie Chen  <cathiechen@igalia.com>
 
         Add support for scroll behavior parsing
diff --git a/Source/WebCore/layout/inlineformatting/InlineFormattingContextQuirks.cpp b/Source/WebCore/layout/inlineformatting/InlineFormattingContextQuirks.cpp
index 054b5dc4..0896972 100644
--- a/Source/WebCore/layout/inlineformatting/InlineFormattingContextQuirks.cpp
+++ b/Source/WebCore/layout/inlineformatting/InlineFormattingContextQuirks.cpp
@@ -47,15 +47,13 @@
         if (run.isContainerEnd() || layoutBox.style().verticalAlign() != VerticalAlign::Baseline)
             continue;
 
+        if (run.isLineBreak())
+            return false;
         if (run.isText()) {
             if (!run.isCollapsedToVisuallyEmpty())
                 return false;
             continue;
         }
-
-        if (run.isLineBreak())
-            return false;
-
         if (run.isContainerStart()) {
             auto& boxGeometry = formattingContext().geometryForBox(layoutBox);
             if (boxGeometry.horizontalBorder() || (boxGeometry.horizontalPadding() && boxGeometry.horizontalPadding().value()))
diff --git a/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp b/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp
index 478f484..7abf426 100644
--- a/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp
+++ b/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp
@@ -69,7 +69,7 @@
     ContinuousContent(const InlineItemRun&, bool textIsAlignJustify);
 
     bool isEligible(const InlineItemRun&) const;
-    void expand(const InlineItemRun&);
+    void append(const InlineItemRun&);
     LineBuilder::Run close();
 
     static bool canInlineItemRunBeExpanded(const InlineItemRun& run) { return run.isText() && !run.isCollapsed() && !run.isCollapsedToZeroAdvanceWidth(); }
@@ -96,18 +96,18 @@
 {
     if (!m_trailingRunCanBeExpanded)
         return false;
-    return inlineItemRun.isText() && &m_initialInlineRun.layoutBox() == &inlineItemRun.layoutBox();
+    // Only non-collapsed text runs with the same layout box can be added as continuous content.
+    return inlineItemRun.isText() && !inlineItemRun.isCollapsedToZeroAdvanceWidth() && &m_initialInlineRun.layoutBox() == &inlineItemRun.layoutBox();
 }
 
-void LineBuilder::ContinuousContent::expand(const InlineItemRun& inlineItemRun)
+void LineBuilder::ContinuousContent::append(const InlineItemRun& inlineItemRun)
 {
     // Merged content needs to be continuous.
     ASSERT(isEligible(inlineItemRun));
     m_trailingRunCanBeExpanded = canInlineItemRunBeExpanded(inlineItemRun);
 
     ASSERT(inlineItemRun.isText());
-    if (!inlineItemRun.isCollapsedToZeroAdvanceWidth())
-        m_expandedLength += inlineItemRun.textContext()->length();
+    m_expandedLength += inlineItemRun.textContext()->length();
     m_expandedWidth += inlineItemRun.logicalWidth();
 
     if (m_collectExpansionOpportunities) {
@@ -238,7 +238,8 @@
     visuallyCollapsePreWrapOverflowContent();
     auto hangingContent = collectHangingContent(isLastLineWithInlineContent);
 
-    auto mergedInlineItemRuns = [&] (auto& runList) {
+    auto mergedInlineItemRuns = [&] {
+        RunList runList;
         unsigned runIndex = 0;
         while (runIndex < m_inlineItemRuns.size()) {
             // Merge eligible runs.
@@ -250,13 +251,13 @@
             }
             auto mergedRuns = ContinuousContent { inlineItemRun, isTextAlignJustify() };
             for (runIndex = runIndex + 1; runIndex < m_inlineItemRuns.size() && mergedRuns.isEligible(m_inlineItemRuns[runIndex]); ++runIndex)
-                mergedRuns.expand(m_inlineItemRuns[runIndex]);
+                mergedRuns.append(m_inlineItemRuns[runIndex]);
             runList.append(mergedRuns.close());
         }
+        return runList;
     };
 
-    RunList runList;
-    mergedInlineItemRuns(runList);
+    auto runList = mergedInlineItemRuns();
     if (!m_isIntrinsicSizing) {
         for (auto& run : runList) {
             adjustBaselineAndLineHeight(run);
@@ -345,7 +346,7 @@
 
         switch (verticalAlign) {
         case VerticalAlign::Baseline:
-            if (run.isText() || run.isLineBreak())
+            if (run.isLineBreak() || run.isText())
                 logicalTop = baselineOffset() - ascent;
             else if (run.isContainerStart()) {
                 auto& boxGeometry = formattingContext().geometryForBox(layoutBox);
@@ -790,7 +791,7 @@
     ASSERT_NOT_REACHED();
 }
 
-inline InlineLayoutUnit LineBuilder::runContentHeight(const Run& run) const
+InlineLayoutUnit LineBuilder::runContentHeight(const Run& run) const
 {
     ASSERT(!m_isIntrinsicSizing);
     auto& fontMetrics = run.style().fontMetrics();
@@ -900,10 +901,14 @@
     for (auto index = *m_firstRunIndex; index < m_inlineitemRunList.size(); ++index) {
         auto& run = m_inlineitemRunList[index];
         run.moveHorizontally(-accumulatedCollapsedWidth);
+        if (!run.isText()) {
+            ASSERT(run.isContainerStart() || run.isContainerEnd() || run.isLineBreak());
+            continue;
+        }
         if (run.isWhitespace()) {
             accumulatedCollapsedWidth += run.logicalWidth();
             run.setCollapsesToZeroAdvanceWidth();
-        } else if (run.isText()) {
+        } else {
             ASSERT(!hasSeenNonWhitespaceTextContent);
 #if ASSERT_ENABLED
             hasSeenNonWhitespaceTextContent = true;
@@ -913,7 +918,6 @@
             accumulatedCollapsedWidth += run.trailingLetterSpacing();
             run.removeTrailingLetterSpacing();
         }
-        ASSERT(run.isContainerStart() || run.isContainerEnd() || run.isLineBreak());
     }
     ASSERT(accumulatedCollapsedWidth == width());
     reset();
