REGRESSION(r227577) Text on TV & Movies page doesn't wrap properly in iTunes
https://bugs.webkit.org/show_bug.cgi?id=188018
<rdar://problem/42517520>

Reviewed by Dean Jackson.

Source/WebCore:

Manual rollout of r227577.

Test: fast/overflow/line-clamp-with-text-shadow.html

* Sources.txt:
* WebCore.xcodeproj/project.pbxproj:
* css/CSSComputedStyleDeclaration.cpp:
(WebCore::ComputedStyleExtractor::valueForPropertyinStyle):
* css/CSSProperties.json:
* css/StyleBuilderCustom.h:
(WebCore::StyleBuilderCustom::applyValueWebkitLinesClamp): Deleted.
* css/parser/CSSParserContext.cpp:
(WebCore::CSSParserContext::CSSParserContext):
* css/parser/CSSParserContext.h:
(WebCore::CSSParserContextHash::hash):
* css/parser/CSSPropertyParser.cpp:
(WebCore::CSSPropertyParser::parseSingleValue):
(WebCore::consumeLinesClamp): Deleted.
* page/Settings.yaml:
* rendering/RenderBlockFlow.cpp:
(WebCore::RenderBlockFlow::willCreateColumns const):
(WebCore::getHeightForLineCount):
(WebCore::RenderBlockFlow::heightForLineCount):
(WebCore::RenderBlockFlow::layoutExcludedChildren):
(WebCore::RenderBlockFlow::logicalHeightForLineCount): Deleted.
(WebCore::RenderBlockFlow::logicalHeightExcludingLineCount): Deleted.
* rendering/RenderBlockFlow.h:
* rendering/RenderDeprecatedFlexibleBox.cpp:
(WebCore::RenderDeprecatedFlexibleBox::applyLineClamp):
* rendering/RenderFragmentContainer.cpp:
(WebCore::RenderFragmentContainer::pageLogicalHeightForOffset const): Deleted.
* rendering/RenderFragmentContainer.h:
* rendering/RenderFragmentedFlow.cpp:
(WebCore::RenderFragmentedFlow::validateFragments):
(WebCore::RenderFragmentedFlow::pageLogicalHeightForOffset const):
(WebCore::RenderFragmentedFlow::pageRemainingLogicalHeightForOffset const):
* rendering/RenderFragmentedFlow.h:
* rendering/RenderLinesClampFlow.cpp: Removed.
* rendering/RenderLinesClampFlow.h: Removed.
* rendering/RenderLinesClampSet.cpp: Removed.
* rendering/RenderLinesClampSet.h: Removed.
* rendering/RenderMultiColumnFlow.cpp:
(WebCore::RenderMultiColumnFlow::isColumnSpanningDescendant const): Deleted.
(WebCore::RenderMultiColumnFlow::createMultiColumnSet): Deleted.
* rendering/RenderMultiColumnFlow.h:
(WebCore::RenderMultiColumnFlow::multiColumnBlockFlow const): Deleted.
(WebCore::RenderMultiColumnFlow::hasColumnSpanner const): Deleted.
(WebCore::RenderMultiColumnFlow::findColumnSpannerPlaceholder const): Deleted.
(WebCore::RenderMultiColumnFlow::columnCount const): Deleted.
(WebCore::RenderMultiColumnFlow::columnWidth const): Deleted.
(WebCore::RenderMultiColumnFlow::columnHeightAvailable const): Deleted.
(WebCore::RenderMultiColumnFlow::setColumnHeightAvailable): Deleted.
(WebCore::RenderMultiColumnFlow::inBalancingPass const): Deleted.
(WebCore::RenderMultiColumnFlow::setInBalancingPass): Deleted.
(WebCore::RenderMultiColumnFlow::needsHeightsRecalculation const): Deleted.
(WebCore::RenderMultiColumnFlow::setNeedsHeightsRecalculation): Deleted.
(WebCore::RenderMultiColumnFlow::shouldRelayoutForPagination const): Deleted.
(WebCore::RenderMultiColumnFlow::setColumnCountAndWidth): Deleted.
(WebCore::RenderMultiColumnFlow::progressionIsInline const): Deleted.
(WebCore::RenderMultiColumnFlow::setProgressionIsInline): Deleted.
(WebCore::RenderMultiColumnFlow::progressionIsReversed const): Deleted.
(WebCore::RenderMultiColumnFlow::setProgressionIsReversed): Deleted.
(WebCore::RenderMultiColumnFlow::spannerMap): Deleted.
* rendering/RenderMultiColumnSet.cpp:
(WebCore::RenderMultiColumnSet::collectLayerFragments):
(WebCore::RenderMultiColumnSet::columnTranslationForOffset const):
* rendering/RenderMultiColumnSet.h:
(WebCore::RenderMultiColumnSet::multiColumnBlockFlow const): Deleted.
(WebCore::RenderMultiColumnSet::multiColumnFlow const): Deleted.
(WebCore::RenderMultiColumnSet::logicalTopInFragmentedFlow const): Deleted.
(WebCore::RenderMultiColumnSet::logicalBottomInFragmentedFlow const): Deleted.
(WebCore::RenderMultiColumnSet::logicalHeightInFragmentedFlow const): Deleted.
(WebCore::RenderMultiColumnSet::computedColumnCount const): Deleted.
(WebCore::RenderMultiColumnSet::computedColumnWidth const): Deleted.
(WebCore::RenderMultiColumnSet::computedColumnHeight const): Deleted.
(WebCore::RenderMultiColumnSet::columnHeightComputed const): Deleted.
(WebCore::RenderMultiColumnSet::setComputedColumnWidthAndCount): Deleted.
(WebCore::RenderMultiColumnSet::updateMinimumColumnHeight): Deleted.
(WebCore::RenderMultiColumnSet::minimumColumnHeight const): Deleted.
(WebCore::RenderMultiColumnSet::forcedBreaksCount const): Deleted.
(WebCore::RenderMultiColumnSet::hasBeenFlowed const): Deleted.
(WebCore::RenderMultiColumnSet::skipLayerFragmentCollectionForColumn const): Deleted.
(WebCore::RenderMultiColumnSet::customBlockProgressionAdjustmentForColumn const): Deleted.
(WebCore::RenderMultiColumnSet::ContentRun::ContentRun): Deleted.
(WebCore::RenderMultiColumnSet::ContentRun::assumedImplicitBreaks const): Deleted.
(WebCore::RenderMultiColumnSet::ContentRun::assumeAnotherImplicitBreak): Deleted.
(WebCore::RenderMultiColumnSet::ContentRun::breakOffset const): Deleted.
(WebCore::RenderMultiColumnSet::ContentRun::columnLogicalHeight const): Deleted.
* rendering/RenderObject.h:
(WebCore::RenderObject::isRenderLinesClampFlow const): Deleted.
(WebCore::RenderObject::isRenderLinesClampSet const): Deleted.
* rendering/style/LineClampValue.h:
(WebCore::LinesClampValue::LinesClampValue): Deleted.
(WebCore::LinesClampValue::isNone const): Deleted.
(WebCore::LinesClampValue::operator== const): Deleted.
(WebCore::LinesClampValue::operator!= const): Deleted.
(WebCore::LinesClampValue::start const): Deleted.
(WebCore::LinesClampValue::end const): Deleted.
(WebCore::LinesClampValue::center const): Deleted.
* rendering/style/RenderStyle.h:
(WebCore::RenderStyle::lineClamp const):
(WebCore::RenderStyle::setLineClamp):
(WebCore::RenderStyle::initialLineClamp):
(WebCore::RenderStyle::hasInlineColumnAxis const):
(WebCore::RenderStyle::linesClamp const): Deleted.
(WebCore::RenderStyle::hasLinesClamp const): Deleted.
(WebCore::RenderStyle::setLinesClamp): Deleted.
(WebCore::RenderStyle::initialLinesClamp): Deleted.
* rendering/style/StyleRareNonInheritedData.cpp:
(WebCore::StyleRareNonInheritedData::StyleRareNonInheritedData):
(WebCore::StyleRareNonInheritedData::operator== const):
* rendering/style/StyleRareNonInheritedData.h:
* rendering/updating/RenderTreeBuilderMultiColumn.cpp:
(WebCore::isValidColumnSpanner):
(WebCore::RenderTreeBuilder::MultiColumn::createFragmentedFlow):
(WebCore::RenderTreeBuilder::MultiColumn::processPossibleSpannerDescendant):

Source/WebKit:

* WebProcess/WebPage/WebPage.cpp:
(WebKit::m_credentialsMessenger):

LayoutTests:

* fast/block/lines-clamp-advanced-expected.html: Removed.
* fast/block/lines-clamp-advanced-rl-expected.html: Removed.
* fast/block/lines-clamp-advanced-rl.html: Removed.
* fast/block/lines-clamp-advanced.html: Removed.
* fast/block/lines-clamp-basic-expected.html: Removed.
* fast/block/lines-clamp-basic-rl-expected.html: Removed.
* fast/block/lines-clamp-basic-rl.html: Removed.
* fast/block/lines-clamp-basic.html: Removed.
* fast/css/lines-clamp-parsing-expected.txt: Removed.
* fast/css/lines-clamp-parsing.html: Removed.
* fast/overflow/line-clamp-with-text-shadow-expected.html: Added.
* fast/overflow/line-clamp-with-text-shadow.html: Added.
* platform/ios-simulator-wk2/fast/overflow/line-clamp-expected.txt: Removed.


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@234215 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/rendering/RenderBlockFlow.cpp b/Source/WebCore/rendering/RenderBlockFlow.cpp
index e81d0a2..132dc8f 100644
--- a/Source/WebCore/rendering/RenderBlockFlow.cpp
+++ b/Source/WebCore/rendering/RenderBlockFlow.cpp
@@ -424,11 +424,7 @@
     // If overflow-y is set to paged-x or paged-y on the body or html element, we'll handle the paginating in the RenderView instead.
     if ((style().overflowY() == Overflow::PagedX || style().overflowY() == Overflow::PagedY) && !(isDocumentElementRenderer() || isBody()))
         return true;
-    
-    // Lines clamping creates columns.
-    if (style().hasLinesClamp())
-        return true;
-    
+
     if (!style().specifiesColumns())
         return false;
 
@@ -3212,54 +3208,37 @@
     return count;
 }
 
-static int getHeightForLineCount(const RenderBlockFlow& block, int lineCount, bool includeEdgeBorderPadding, bool forward, int& count)
+static int getHeightForLineCount(const RenderBlockFlow& block, int lineCount, bool includeBottom, int& count)
 {
     if (block.style().visibility() != Visibility::Visible)
         return -1;
 
-    // FIXME: Orthogonal writing modes don't work here, but it's not even clear how they should behave anyway.
     if (block.childrenInline()) {
-        for (auto* box = forward ? block.firstRootBox() : block.lastRootBox(); box; box = forward ? box->nextRootBox() : box->prevRootBox()) {
-            if (++count == lineCount) {
-                // Matches the pagination rules in adjustLinePositionsForPagination.
-                LayoutRect logicalVisualOverflow = box->logicalVisualOverflowRect(box->lineTop(), box->lineBottom());
-                LayoutUnit logicalTop = std::min(box->lineTopWithLeading(), logicalVisualOverflow.y());
-                LayoutUnit logicalBottom = std::max(box->lineBottomWithLeading(), logicalVisualOverflow.maxY());
-                if (forward)
-                    return logicalBottom + (includeEdgeBorderPadding ? (block.borderAndPaddingAfter()) : LayoutUnit());
-                return logicalTop + (includeEdgeBorderPadding ? (block.borderAndPaddingBefore()) : LayoutUnit());
-            }
+        for (auto* box = block.firstRootBox(); box; box = box->nextRootBox()) {
+            if (++count == lineCount)
+                return box->lineBottom() + (includeBottom ? (block.borderBottom() + block.paddingBottom()) : LayoutUnit());
         }
     } else {
         RenderBox* normalFlowChildWithoutLines = nullptr;
-        for (auto* obj = forward ? block.firstChildBox() : block.lastChildBox(); obj; obj = forward ? obj->nextSiblingBox() : obj->previousSiblingBox()) {
+        for (auto* obj = block.firstChildBox(); obj; obj = obj->nextSiblingBox()) {
             if (is<RenderBlockFlow>(*obj) && shouldCheckLines(downcast<RenderBlockFlow>(*obj))) {
-                int result = getHeightForLineCount(downcast<RenderBlockFlow>(*obj), lineCount, false, forward, count);
-                if (result != -1) {
-                    if (forward)
-                        return result + block.logicalTopForChild(*obj) + (includeEdgeBorderPadding ? (block.borderAndPaddingAfter()) : LayoutUnit());
-                    return result + block.logicalTopForChild(*obj) + (includeEdgeBorderPadding ? (block.borderAndPaddingBefore()) : LayoutUnit());
-                }
+                int result = getHeightForLineCount(downcast<RenderBlockFlow>(*obj), lineCount, false, count);
+                if (result != -1)
+                    return result + obj->y() + (includeBottom ? (block.borderBottom() + block.paddingBottom()) : LayoutUnit());
             } else if (!obj->isFloatingOrOutOfFlowPositioned())
                 normalFlowChildWithoutLines = obj;
         }
         if (normalFlowChildWithoutLines && !lineCount)
-            return block.logicalTopForChild(*normalFlowChildWithoutLines) + block.logicalHeightForChild(*normalFlowChildWithoutLines);
+            return normalFlowChildWithoutLines->y() + normalFlowChildWithoutLines->height();
     }
     
     return -1;
 }
 
-int RenderBlockFlow::logicalHeightForLineCount(int lineCount)
+int RenderBlockFlow::heightForLineCount(int lineCount)
 {
     int count = 0;
-    return getHeightForLineCount(*this, lineCount, true, true, count);
-}
-
-int RenderBlockFlow::logicalHeightExcludingLineCount(int lineCount)
-{
-    int count = 0;
-    return getHeightForLineCount(*this, lineCount, true, false, count);
+    return getHeightForLineCount(*this, lineCount, true, count);
 }
 
 void RenderBlockFlow::clearTruncation()
@@ -3838,8 +3817,6 @@
         fragmentedFlow->setNeedsHeightsRecalculation(false);
     }
     determineLogicalLeftPositionForChild(*fragmentedFlow);
-    
-    fragmentedFlow->layoutFlowExcludedObjects(relayoutChildren);
 }
 
 void RenderBlockFlow::checkForPaginationLogicalHeightChange(bool& relayoutChildren, LayoutUnit& pageLogicalHeight, bool& pageLogicalHeightChanged)
diff --git a/Source/WebCore/rendering/RenderBlockFlow.h b/Source/WebCore/rendering/RenderBlockFlow.h
index a5d24cf..af68ba0 100644
--- a/Source/WebCore/rendering/RenderBlockFlow.h
+++ b/Source/WebCore/rendering/RenderBlockFlow.h
@@ -347,9 +347,7 @@
     // Helper methods for computing line counts and heights for line counts.
     RootInlineBox* lineAtIndex(int) const;
     int lineCount(const RootInlineBox* = nullptr, bool* = nullptr) const;
-    int logicalHeightForLineCount(int);
-    int logicalHeightExcludingLineCount(int);
-    
+    int heightForLineCount(int);
     void clearTruncation();
 
     void setHasMarkupTruncation(bool b) { setRenderBlockFlowHasMarkupTruncation(b); }
@@ -391,8 +389,6 @@
     // unbreakable content, between orphans and widows, etc.). This will be used as a hint to the
     // column balancer to help set a good minimum column height.
     void updateMinimumPageHeight(LayoutUnit offset, LayoutUnit minHeight);
-    
-    void determineLogicalLeftPositionForChild(RenderBox& child, ApplyLayoutDeltaMode = DoNotApplyLayoutDelta);
 
     void addFloatsToNewParent(RenderBlockFlow& toBlockFlow) const;
 
@@ -458,7 +454,8 @@
     virtual void computeColumnCountAndWidth();
 
     virtual void cachePriorCharactersIfNeeded(const LazyLineBreakIterator&) {};
-
+    
+protected:
     // Called to lay out the legend for a fieldset or the ruby text of a ruby run. Also used by multi-column layout to handle
     // the flow thread child.
     void layoutExcludedChildren(bool relayoutChildren) override;
@@ -506,6 +503,8 @@
     bool hasOverhangingFloats() { return parent() && containsFloats() && lowestFloatLogicalBottom() > logicalHeight(); }
     LayoutUnit getClearDelta(RenderBox& child, LayoutUnit yPos);
 
+    void determineLogicalLeftPositionForChild(RenderBox& child, ApplyLayoutDeltaMode = DoNotApplyLayoutDelta);
+    
     bool hitTestFloats(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset) override;
     bool hitTestInlineChildren(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction) override;
 
diff --git a/Source/WebCore/rendering/RenderDeprecatedFlexibleBox.cpp b/Source/WebCore/rendering/RenderDeprecatedFlexibleBox.cpp
index 4e8fc92..875ff3b 100644
--- a/Source/WebCore/rendering/RenderDeprecatedFlexibleBox.cpp
+++ b/Source/WebCore/rendering/RenderDeprecatedFlexibleBox.cpp
@@ -967,7 +967,7 @@
         if (lineCount <= numVisibleLines)
             continue;
 
-        LayoutUnit newHeight = blockChild.logicalHeightForLineCount(numVisibleLines);
+        LayoutUnit newHeight = blockChild.heightForLineCount(numVisibleLines);
         if (newHeight == child->height())
             continue;
 
diff --git a/Source/WebCore/rendering/RenderFragmentContainer.cpp b/Source/WebCore/rendering/RenderFragmentContainer.cpp
index 4a82c7e..0d446d4 100644
--- a/Source/WebCore/rendering/RenderFragmentContainer.cpp
+++ b/Source/WebCore/rendering/RenderFragmentContainer.cpp
@@ -178,11 +178,6 @@
     return fragmentedFlow()->isHorizontalWritingMode() ? fragmentedFlowPortionRect().y() : fragmentedFlowPortionRect().x();
 }
 
-LayoutUnit RenderFragmentContainer::pageLogicalHeightForOffset(LayoutUnit /* offset */) const
-{
-    return pageLogicalHeight();
-}
-
 bool RenderFragmentContainer::isFirstFragment() const
 {
     ASSERT(isValid());
diff --git a/Source/WebCore/rendering/RenderFragmentContainer.h b/Source/WebCore/rendering/RenderFragmentContainer.h
index a072e10..b05bada 100644
--- a/Source/WebCore/rendering/RenderFragmentContainer.h
+++ b/Source/WebCore/rendering/RenderFragmentContainer.h
@@ -93,7 +93,6 @@
     // flow thread portion we contain. For sets, we have to figure out the top of the nearest column or
     // page.
     virtual LayoutUnit pageLogicalTopForOffset(LayoutUnit offset) const;
-    virtual LayoutUnit pageLogicalHeightForOffset(LayoutUnit offset) const;
 
     // Whether or not this fragment is a set.
     virtual bool isRenderFragmentContainerSet() const { return false; }
diff --git a/Source/WebCore/rendering/RenderFragmentedFlow.cpp b/Source/WebCore/rendering/RenderFragmentedFlow.cpp
index 7bb5bfc..3db6be9 100644
--- a/Source/WebCore/rendering/RenderFragmentedFlow.cpp
+++ b/Source/WebCore/rendering/RenderFragmentedFlow.cpp
@@ -108,7 +108,7 @@
     if (m_fragmentsInvalidated) {
         m_fragmentsInvalidated = false;
         m_fragmentsHaveUniformLogicalWidth = true;
-        m_fragmentsHaveUniformLogicalHeight = singleFragmentHasUniformLogicalHeight();
+        m_fragmentsHaveUniformLogicalHeight = true;
 
         if (hasFragments()) {
             LayoutUnit previousFragmentLogicalWidth = 0;
@@ -345,7 +345,7 @@
     if (!fragment)
         return 0;
 
-    return fragment->pageLogicalHeightForOffset(offset);
+    return fragment->pageLogicalHeight();
 }
 
 LayoutUnit RenderFragmentedFlow::pageRemainingLogicalHeightForOffset(LayoutUnit offset, PageBoundaryRule pageBoundaryRule) const
@@ -355,7 +355,7 @@
         return 0;
 
     LayoutUnit pageLogicalTop = fragment->pageLogicalTopForOffset(offset);
-    LayoutUnit pageLogicalHeight = fragment->pageLogicalHeightForOffset(offset);
+    LayoutUnit pageLogicalHeight = fragment->pageLogicalHeight();
     LayoutUnit pageLogicalBottom = pageLogicalTop + pageLogicalHeight;
     LayoutUnit remainingHeight = pageLogicalBottom - offset;
     if (pageBoundaryRule == IncludePageBoundary) {
diff --git a/Source/WebCore/rendering/RenderFragmentedFlow.h b/Source/WebCore/rendering/RenderFragmentedFlow.h
index f73ca0d..f14d085 100644
--- a/Source/WebCore/rendering/RenderFragmentedFlow.h
+++ b/Source/WebCore/rendering/RenderFragmentedFlow.h
@@ -83,14 +83,10 @@
     void validateFragments();
     void invalidateFragments(MarkingBehavior = MarkContainingBlockChain);
     bool hasValidFragmentInfo() const { return !m_fragmentsInvalidated && !m_fragmentList.isEmpty(); }
-
-    virtual bool singleFragmentHasUniformLogicalHeight() const { return true; }
     
     // Called when a descendant box's layout is finished and it has been positioned within its container.
     virtual void fragmentedFlowDescendantBoxLaidOut(RenderBox*) { }
 
-    virtual void layoutFlowExcludedObjects(bool) { }
-
     void styleDidChange(StyleDifference, const RenderStyle* oldStyle) override;
 
     void repaintRectangleInFragments(const LayoutRect&) const;
diff --git a/Source/WebCore/rendering/RenderLinesClampFlow.cpp b/Source/WebCore/rendering/RenderLinesClampFlow.cpp
deleted file mode 100644
index 33ccd1e..0000000
--- a/Source/WebCore/rendering/RenderLinesClampFlow.cpp
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2017,2018 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS IN..0TERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "RenderLinesClampFlow.h"
-
-#include "RenderChildIterator.h"
-#include "RenderLinesClampSet.h"
-#include <wtf/IsoMallocInlines.h>
-
-namespace WebCore {
-
-WTF_MAKE_ISO_ALLOCATED_IMPL(RenderLinesClampFlow);
-
-RenderLinesClampFlow::RenderLinesClampFlow(Document& document, RenderStyle&& style)
-    : RenderMultiColumnFlow(document, WTFMove(style))
-{
-}
-
-RenderLinesClampFlow::~RenderLinesClampFlow() = default;
-
-const char* RenderLinesClampFlow::renderName() const
-{    
-    return "RenderLinesClampFlow";
-}
-
-RenderPtr<RenderMultiColumnSet> RenderLinesClampFlow::createMultiColumnSet(RenderStyle&& style)
-{
-    return createRenderer<RenderLinesClampSet>(*this, WTFMove(style));
-}
-
-bool RenderLinesClampFlow::isChildAllowedInFragmentedFlow(const RenderBlockFlow& parent, const RenderElement& renderElement) const
-{
-    const auto& idAttr = renderElement.element() ? renderElement.element()->getIdAttribute() : nullAtom();
-    const auto& clampAttr = parent.style().linesClamp().center();
-    return clampAttr == nullAtom() || clampAttr != idAttr;
-}
-
-void RenderLinesClampFlow::layoutFlowExcludedObjects(bool relayoutChildren)
-{
-    auto* clampContainer = multiColumnBlockFlow();
-    if (!clampContainer)
-        return;
-    auto* clampSet = firstMultiColumnSet();
-    if (!clampSet || !is<RenderLinesClampSet>(clampSet))
-        return;
-    auto& linesClampSet = downcast<RenderLinesClampSet>(*clampSet);
-    
-    for (auto& sibling : childrenOfType<RenderElement>(*clampContainer)) {
-        if (isChildAllowedInFragmentedFlow(*clampContainer, sibling) || !is<RenderBox>(sibling))
-            continue;
-
-        auto& siblingBox = downcast<RenderBox>(sibling);
-        
-        siblingBox.setIsExcludedFromNormalLayout(true);
-        
-        auto marginBefore = clampContainer->marginBeforeForChild(siblingBox);
-        auto marginAfter = clampContainer->marginAfterForChild(siblingBox);
-        
-        setLogicalTopForChild(siblingBox, clampContainer->borderAndPaddingBefore() + linesClampSet.startPageHeight() + marginBefore);
-        
-        if (relayoutChildren)
-            siblingBox.setChildNeedsLayout(MarkOnlyThis);
-        
-        if (siblingBox.needsLayout())
-            siblingBox.layout();
-        clampContainer->determineLogicalLeftPositionForChild(siblingBox);
-        
-        linesClampSet.setMiddleObjectHeight(marginBefore + marginAfter + clampContainer->logicalHeightForChild(siblingBox));
-    }
-}
-
-}
diff --git a/Source/WebCore/rendering/RenderLinesClampFlow.h b/Source/WebCore/rendering/RenderLinesClampFlow.h
deleted file mode 100644
index e41b9b8..0000000
--- a/Source/WebCore/rendering/RenderLinesClampFlow.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2017,2018 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include "RenderMultiColumnFlow.h"
-#include <wtf/HashMap.h>
-
-namespace WebCore {
-
-class RenderLinesClampFlow final : public RenderMultiColumnFlow {
-    WTF_MAKE_ISO_ALLOCATED(RenderLinesClampFlow);
-public:
-    RenderLinesClampFlow(Document&, RenderStyle&&);
-    ~RenderLinesClampFlow();
-
-    bool isChildAllowedInFragmentedFlow(const RenderBlockFlow&, const RenderElement&) const;
-
-    bool isRenderLinesClampFlow() const override { return true; }
-
-    void layoutFlowExcludedObjects(bool relayoutChildren) override;
-    
-    bool singleFragmentHasUniformLogicalHeight() const override { return false; }
-    
-private:
-    RenderPtr<RenderMultiColumnSet> createMultiColumnSet(RenderStyle&&) override;
-    
-    // Disable spans and breaks.
-    bool isColumnSpanningDescendant(const RenderBox&) const override { return false; }
-    bool addForcedFragmentBreak(const RenderBlock*, LayoutUnit, RenderBox*, bool, LayoutUnit* = 0) override { return false; }
-    
-private:
-    const char* renderName() const override;
-};
-
-} // namespace WebCore
-
-SPECIALIZE_TYPE_TRAITS_RENDER_OBJECT(RenderLinesClampFlow, isRenderLinesClampFlow())
diff --git a/Source/WebCore/rendering/RenderLinesClampSet.cpp b/Source/WebCore/rendering/RenderLinesClampSet.cpp
deleted file mode 100644
index 4ad248a..0000000
--- a/Source/WebCore/rendering/RenderLinesClampSet.cpp
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Copyright (C) 2017,2018 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "RenderLinesClampSet.h"
-
-#include "RenderBoxFragmentInfo.h"
-#include "RenderLinesClampFlow.h"
-#include <wtf/IsoMallocInlines.h>
-
-namespace WebCore {
-
-WTF_MAKE_ISO_ALLOCATED_IMPL(RenderLinesClampSet);
-
-RenderLinesClampSet::RenderLinesClampSet(RenderFragmentedFlow& fragmentedFlow, RenderStyle&& style)
-    : RenderMultiColumnSet(fragmentedFlow, WTFMove(style))
-{
-}
-
-bool RenderLinesClampSet::recalculateColumnHeight(bool initial)
-{
-    if (!initial && m_endPageHeight)
-        return false;
-
-    auto* fragmentedFlow = multiColumnFlow();
-    if (!fragmentedFlow)
-        return false;
-    
-    auto* blockFlow = multiColumnBlockFlow();
-    auto endClamp = blockFlow->style().linesClamp().end();
-    
-    int maxLineCount = fragmentedFlow->lineCount();
-    auto startClamp = blockFlow->style().linesClamp().start();
-    int startLines = startClamp.isPercentage() ? std::max(1, maxLineCount * startClamp.value() / 100) : startClamp.value();
-    
-    auto bottom = logicalBottomInFragmentedFlow();
-    
-    if (initial) {
-        if (startLines >= maxLineCount)
-            m_startPageHeight = bottom;
-        else
-            m_startPageHeight = fragmentedFlow->logicalHeightForLineCount(startLines);
-        m_endPageHeight = 0;
-        m_middlePageHeight = bottom - m_startPageHeight;
-        if (m_startPageHeight < bottom) {
-            m_computedColumnHeight = m_startPageHeight;
-            m_columnHeightComputed = true;
-            updateLogicalWidth();
-            return true;
-        }
-        return false;
-    }
-    
-    if (!m_endPageHeight) {
-        int endLines = endClamp.isPercentage() ? std::max(1, maxLineCount * endClamp.value() / 100) : endClamp.value();
-        maxLineCount -= startLines;
-        if (endClamp.isNone() || endLines >= maxLineCount)
-            m_endPageHeight = bottom - m_startPageHeight;
-        else
-            m_endPageHeight = bottom - fragmentedFlow->logicalHeightExcludingLineCount(endLines);
-        m_middlePageHeight = bottom - (m_endPageHeight + m_startPageHeight);
-        if (m_endPageHeight > 0) {
-            m_computedColumnHeight = m_startPageHeight;
-            m_columnHeightComputed = true;
-            updateLogicalWidth();
-            return true;
-        }
-    }
-
-    return false;
-}
-
-RenderBox::LogicalExtentComputedValues RenderLinesClampSet::computeLogicalHeight(LayoutUnit, LayoutUnit logicalTop) const
-{
-    return { m_startPageHeight + m_middleObjectHeight + m_endPageHeight, logicalTop, ComputedMarginValues() };
-}
-
-unsigned RenderLinesClampSet::columnCount() const
-{
-    if (m_endPageHeight)
-        return 3;
-    if (m_startPageHeight)
-        return 2;
-    return 1;
-}
-
-LayoutRect RenderLinesClampSet::columnRectAt(unsigned index) const
-{
-    LayoutUnit colLogicalWidth = computedColumnWidth();
-    if (!index)
-        return LayoutRect(columnLogicalLeft(0), columnLogicalTop(0), colLogicalWidth, m_startPageHeight);
-    if (index == 1)
-        return LayoutRect(columnLogicalLeft(0), columnLogicalTop(0), colLogicalWidth, 0);
-    return LayoutRect(columnLogicalLeft(0), columnLogicalTop(0) + m_startPageHeight + m_middleObjectHeight, colLogicalWidth, m_endPageHeight);
-}
-
-unsigned RenderLinesClampSet::columnIndexAtOffset(LayoutUnit offset, ColumnIndexCalculationMode) const
-{
-    if (offset < m_startPageHeight)
-        return 0;
-    if (offset < m_startPageHeight + m_middlePageHeight)
-        return 1;
-    return 2;
-}
-
-LayoutUnit RenderLinesClampSet::pageLogicalTopForOffset(LayoutUnit offset) const
-{
-    unsigned colIndex = columnIndexAtOffset(offset);
-    if (!colIndex)
-        return 0;
-    if (colIndex == 1)
-        return m_startPageHeight;
-    return m_startPageHeight + m_middlePageHeight;
-}
-
-LayoutUnit RenderLinesClampSet::pageLogicalHeightForOffset(LayoutUnit offset) const
-{
-    unsigned colIndex = columnIndexAtOffset(offset);
-    if (!colIndex)
-        return m_startPageHeight;
-    if (colIndex == 1)
-        return m_middlePageHeight;
-    return m_endPageHeight;
-}
-
-LayoutRect RenderLinesClampSet::fragmentedFlowPortionRectAt(unsigned index) const
-{
-    LayoutUnit logicalTop;
-    LayoutUnit logicalHeight;
-    if (!index) {
-        logicalTop = 0;
-        logicalHeight = m_startPageHeight;
-    } else if (index == 1) {
-        logicalTop = m_startPageHeight;
-        logicalHeight = m_middlePageHeight;
-    } else {
-        logicalTop = m_startPageHeight + m_middlePageHeight;
-        logicalHeight = m_endPageHeight;
-    }
-
-    LayoutRect portionRect = fragmentedFlowPortionRect();
-    if (isHorizontalWritingMode())
-        portionRect = LayoutRect(portionRect.x(), portionRect.y() + logicalTop, portionRect.width(), logicalHeight);
-    else
-        portionRect = LayoutRect(portionRect.x() + logicalTop, portionRect.y(), logicalHeight, portionRect.height());
-    return portionRect;
-}
-
-LayoutRect RenderLinesClampSet::fragmentedFlowPortionOverflowRect(const LayoutRect& portionRect, unsigned index, unsigned colCount, LayoutUnit /* colGap */)
-{
-    bool isFirstColumn = !index;
-    bool isLastColumn = index == colCount - 1;
-    
-    LayoutRect overflowRect = overflowRectForFragmentedFlowPortion(portionRect, isFirstColumn, isLastColumn, VisualOverflow);
-    
-    if (isHorizontalWritingMode()) {
-        if (!isFirstColumn)
-            overflowRect.shiftYEdgeTo(portionRect.y());
-        if (!isLastColumn)
-            overflowRect.shiftMaxYEdgeTo(portionRect.maxY());
-    } else {
-        if (!isFirstColumn)
-            overflowRect.shiftXEdgeTo(portionRect.x());
-        if (!isLastColumn)
-            overflowRect.shiftMaxXEdgeTo(portionRect.maxX());
-    }
-    return overflowRect;
-}
-
-LayoutUnit RenderLinesClampSet::customBlockProgressionAdjustmentForColumn(unsigned index) const
-{
-    if (index == 2)
-        return m_middleObjectHeight - m_middlePageHeight;
-    return 0;
-}
-
-const char* RenderLinesClampSet::renderName() const
-{    
-    return "RenderLinesClampSet";
-}
-
-}
diff --git a/Source/WebCore/rendering/RenderLinesClampSet.h b/Source/WebCore/rendering/RenderLinesClampSet.h
deleted file mode 100644
index 56dda69..0000000
--- a/Source/WebCore/rendering/RenderLinesClampSet.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 2017,2018 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include "LayerFragment.h"
-#include "RenderLinesClampFlow.h"
-#include "RenderMultiColumnSet.h"
-
-namespace WebCore {
-
-class RenderLinesClampSet final : public RenderMultiColumnSet {
-    WTF_MAKE_ISO_ALLOCATED(RenderLinesClampSet);
-public:
-    RenderLinesClampSet(RenderFragmentedFlow&, RenderStyle&&);
-    
-    bool requiresBalancing() const override { return true; }
-
-    LayoutUnit startPageHeight() const { return m_startPageHeight; }
-    LayoutUnit middlePageHeight() const { return m_middlePageHeight; }
-    LayoutUnit endPageHeight() const { return m_endPageHeight; }
-
-    LayoutUnit middleObjectHeight() const { return m_middleObjectHeight; }
-    void setMiddleObjectHeight(LayoutUnit height) { m_middleObjectHeight = height; }
-
-private:
-    bool isRenderLinesClampSet() const override { return true; }
-
-    // Overridden to figure out how to break up the flow into the start/middle/end
-    // areas.
-    bool recalculateColumnHeight(bool initial) override;
-
-    const char* renderName() const override;
-    
-    LogicalExtentComputedValues computeLogicalHeight(LayoutUnit logicalHeight, LayoutUnit logicalTop) const override;
-
-    // Lines clamp doesn't support gaps or rules.
-    LayoutUnit columnGap() const override { return 0; }
-    void paintColumnRules(PaintInfo&, const LayoutPoint&) override { }
-
-    LayoutRect columnRectAt(unsigned index) const override;
-    unsigned columnCount() const override;
-    unsigned columnIndexAtOffset(LayoutUnit, ColumnIndexCalculationMode = ClampToExistingColumns) const override;
-    
-    LayoutRect fragmentedFlowPortionRectAt(unsigned index) const override;
-    LayoutRect fragmentedFlowPortionOverflowRect(const LayoutRect& fragmentedFlowPortion, unsigned index, unsigned colCount, LayoutUnit colGap) override;
-
-    bool skipLayerFragmentCollectionForColumn(unsigned index) const override { return index == 1; }
-
-    LayoutUnit customBlockProgressionAdjustmentForColumn(unsigned) const override;
-    
-    LayoutUnit pageLogicalTopForOffset(LayoutUnit) const override;
-    LayoutUnit pageLogicalHeightForOffset(LayoutUnit) const override;
-
-private:
-    LayoutUnit m_startPageHeight; // Where to clamp the first N lines inside the fragmented flow
-    LayoutUnit m_middlePageHeight; // The middle portion of the fragmented flow (does not render).
-    LayoutUnit m_endPageHeight; // Where to clamp the last N lines inside the fragmented flow
-    
-    LayoutUnit m_middleObjectHeight; // The middle object's height plus margins.
-};
-    
-} // namespace WebCore
-
-SPECIALIZE_TYPE_TRAITS_RENDER_OBJECT(RenderLinesClampSet, isRenderLinesClampSet())
diff --git a/Source/WebCore/rendering/RenderMultiColumnFlow.cpp b/Source/WebCore/rendering/RenderMultiColumnFlow.cpp
index 776d508..6afa0dd 100644
--- a/Source/WebCore/rendering/RenderMultiColumnFlow.cpp
+++ b/Source/WebCore/rendering/RenderMultiColumnFlow.cpp
@@ -133,11 +133,6 @@
     m_lastSetWorkedOn = nullptr;
 }
 
-bool RenderMultiColumnFlow::isColumnSpanningDescendant(const RenderBox& descendantBox) const
-{
-    return descendantBox.style().columnSpan() == ColumnSpan::All;
-}
-
 void RenderMultiColumnFlow::addFragmentToThread(RenderFragmentContainer* RenderFragmentContainer)
 {
     auto* columnSet = downcast<RenderMultiColumnSet>(RenderFragmentContainer);
@@ -160,11 +155,6 @@
     RenderFragmentedFlow::willBeRemovedFromTree();
 }
 
-RenderPtr<RenderMultiColumnSet> RenderMultiColumnFlow::createMultiColumnSet(RenderStyle&& style)
-{
-    return createRenderer<RenderMultiColumnSet>(*this, WTFMove(style));
-}
-
 void RenderMultiColumnFlow::fragmentedFlowDescendantBoxLaidOut(RenderBox* descendant)
 {
     if (!is<RenderMultiColumnSpannerPlaceholder>(*descendant))
diff --git a/Source/WebCore/rendering/RenderMultiColumnFlow.h b/Source/WebCore/rendering/RenderMultiColumnFlow.h
index a00b559..a48a789 100644
--- a/Source/WebCore/rendering/RenderMultiColumnFlow.h
+++ b/Source/WebCore/rendering/RenderMultiColumnFlow.h
@@ -33,7 +33,7 @@
 class RenderMultiColumnSet;
 class RenderMultiColumnSpannerPlaceholder;
 
-class RenderMultiColumnFlow : public RenderFragmentedFlow {
+class RenderMultiColumnFlow final : public RenderFragmentedFlow {
     WTF_MAKE_ISO_ALLOCATED(RenderMultiColumnFlow);
 public:
     RenderMultiColumnFlow(Document&, RenderStyle&&);
@@ -98,10 +98,6 @@
     typedef HashMap<RenderBox*, WeakPtr<RenderMultiColumnSpannerPlaceholder>> SpannerMap;
     SpannerMap& spannerMap() { return *m_spannerMap; }
 
-    virtual bool isColumnSpanningDescendant(const RenderBox&) const;
-
-    virtual RenderPtr<RenderMultiColumnSet> createMultiColumnSet(RenderStyle&&);
-
 private:
     bool isRenderMultiColumnFlow() const override { return true; }
     const char* renderName() const override;
diff --git a/Source/WebCore/rendering/RenderMultiColumnSet.cpp b/Source/WebCore/rendering/RenderMultiColumnSet.cpp
index f0b881a..751e810 100644
--- a/Source/WebCore/rendering/RenderMultiColumnSet.cpp
+++ b/Source/WebCore/rendering/RenderMultiColumnSet.cpp
@@ -770,9 +770,6 @@
     LayoutUnit initialBlockOffset = initialBlockOffsetForPainting();
     
     for (unsigned i = startColumn; i <= endColumn; i++) {
-        if (skipLayerFragmentCollectionForColumn(i))
-            continue;
-
         // Get the portion of the flow thread that corresponds to this column.
         LayoutRect fragmentedFlowPortion = fragmentedFlowPortionRectAt(i);
         
@@ -801,7 +798,7 @@
         LayoutUnit blockOffset = initialBlockOffset + logicalTop() - fragmentedFlow()->logicalTop() + (isHorizontalWritingMode() ? -fragmentedFlowPortion.y() : -fragmentedFlowPortion.x());
         if (!progressionIsInline) {
             if (!progressionReversed)
-                blockOffset = i * colGap + customBlockProgressionAdjustmentForColumn(i);
+                blockOffset = i * colGap;
             else
                 blockOffset -= i * (computedColumnHeight() + colGap);
         }
@@ -853,7 +850,7 @@
     LayoutUnit blockOffset = initialBlockOffset - (isHorizontalWritingMode() ? fragmentedFlowPortion.y() : fragmentedFlowPortion.x());
     if (!progressionIsInline) {
         if (!progressionReversed)
-            blockOffset = startColumn * colGap + customBlockProgressionAdjustmentForColumn(startColumn);
+            blockOffset = startColumn * colGap;
         else
             blockOffset -= startColumn * (computedColumnHeight() + colGap);
     }
diff --git a/Source/WebCore/rendering/RenderMultiColumnSet.h b/Source/WebCore/rendering/RenderMultiColumnSet.h
index f7ad473..375081b 100644
--- a/Source/WebCore/rendering/RenderMultiColumnSet.h
+++ b/Source/WebCore/rendering/RenderMultiColumnSet.h
@@ -42,7 +42,7 @@
 //
 // Column spans result in the creation of new column sets as well, since a spanning fragment has to be placed in between the column sets that
 // come before and after the span.
-class RenderMultiColumnSet : public RenderFragmentContainerSet {
+class RenderMultiColumnSet final : public RenderFragmentContainerSet {
     WTF_MAKE_ISO_ALLOCATED(RenderMultiColumnSet);
 public:
     RenderMultiColumnSet(RenderFragmentedFlow&, RenderStyle&&);
@@ -92,7 +92,7 @@
     // multicol container's height is constrained. If |initial| is set, and we are to balance, guess
     // an initial column height; otherwise, stretch the column height a tad. Return true if column
     // height changed and another layout pass is required.
-    virtual bool recalculateColumnHeight(bool initial);
+    bool recalculateColumnHeight(bool initial);
 
     // Record space shortage (the amount of space that would have been enough to prevent some
     // element from being moved to the next column) at a column break. The smallest amount of space
@@ -112,7 +112,7 @@
     // Has this set been flowed in this layout pass?
     bool hasBeenFlowed() const { return logicalBottomInFragmentedFlow() != RenderFragmentedFlow::maxLogicalHeight(); }
 
-    virtual bool requiresBalancing() const;
+    bool requiresBalancing() const;
 
     LayoutPoint columnTranslationForOffset(const LayoutUnit&) const;
     
@@ -126,23 +126,24 @@
 
     void updateHitTestResult(HitTestResult&, const LayoutPoint&) override;
     
-    virtual LayoutRect columnRectAt(unsigned index) const;
-    virtual unsigned columnCount() const;
+    LayoutRect columnRectAt(unsigned index) const;
+    unsigned columnCount() const;
 
 protected:
     void addOverflowFromChildren() override;
-    LogicalExtentComputedValues computeLogicalHeight(LayoutUnit logicalHeight, LayoutUnit logicalTop) const override;
-
+    
+private:
     bool isRenderMultiColumnSet() const override { return true; }
     void layout() override;
 
+    LogicalExtentComputedValues computeLogicalHeight(LayoutUnit logicalHeight, LayoutUnit logicalTop) const override;
+
     void paintObject(PaintInfo&, const LayoutPoint&) override { }
 
     LayoutUnit pageLogicalWidth() const override { return m_computedColumnWidth; }
     LayoutUnit pageLogicalHeight() const override { return m_computedColumnHeight; }
 
     LayoutUnit pageLogicalTopForOffset(LayoutUnit offset) const override;
-    LayoutUnit pageLogicalHeightForOffset(LayoutUnit) const override { return m_computedColumnHeight; }
 
     LayoutUnit logicalHeightOfAllFragmentedFlowContent() const override { return logicalHeightInFragmentedFlow(); }
 
@@ -157,24 +158,21 @@
     const char* renderName() const override;
 
     LayoutUnit calculateMaxColumnHeight() const;
-    virtual LayoutUnit columnGap() const;
+    LayoutUnit columnGap() const;
 
     LayoutUnit columnLogicalLeft(unsigned) const;
     LayoutUnit columnLogicalTop(unsigned) const;
 
-    virtual LayoutRect fragmentedFlowPortionRectAt(unsigned index) const;
-    virtual LayoutRect fragmentedFlowPortionOverflowRect(const LayoutRect& fragmentedFlowPortion, unsigned index, unsigned colCount, LayoutUnit colGap);
+    LayoutRect fragmentedFlowPortionRectAt(unsigned index) const;
+    LayoutRect fragmentedFlowPortionOverflowRect(const LayoutRect& fragmentedFlowPortion, unsigned index, unsigned colCount, LayoutUnit colGap);
 
     LayoutUnit initialBlockOffsetForPainting() const;
 
-    virtual bool skipLayerFragmentCollectionForColumn(unsigned) const { return false; }
-    virtual LayoutUnit customBlockProgressionAdjustmentForColumn(unsigned) const { return 0; }
-    
     enum ColumnIndexCalculationMode {
         ClampToExistingColumns, // Stay within the range of already existing columns.
         AssumeNewColumns // Allow column indices outside the range of already existing columns.
     };
-    virtual unsigned columnIndexAtOffset(LayoutUnit, ColumnIndexCalculationMode = ClampToExistingColumns) const;
+    unsigned columnIndexAtOffset(LayoutUnit, ColumnIndexCalculationMode = ClampToExistingColumns) const;
 
     void setAndConstrainColumnHeight(LayoutUnit);
 
diff --git a/Source/WebCore/rendering/RenderObject.h b/Source/WebCore/rendering/RenderObject.h
index bb3f35e..2516258 100644
--- a/Source/WebCore/rendering/RenderObject.h
+++ b/Source/WebCore/rendering/RenderObject.h
@@ -285,9 +285,6 @@
     virtual bool isRenderMultiColumnFlow() const { return false; }
     virtual bool isRenderMultiColumnSpannerPlaceholder() const { return false; }
 
-    virtual bool isRenderLinesClampFlow() const { return false; }
-    virtual bool isRenderLinesClampSet() const { return false; }
-
     virtual bool isRenderScrollbarPart() const { return false; }
 
     bool isDocumentElementRenderer() const { return document().documentElement() == &m_node; }
diff --git a/Source/WebCore/rendering/style/LineClampValue.h b/Source/WebCore/rendering/style/LineClampValue.h
index e540d81..25db4e3 100644
--- a/Source/WebCore/rendering/style/LineClampValue.h
+++ b/Source/WebCore/rendering/style/LineClampValue.h
@@ -25,7 +25,6 @@
 #pragma once
 
 #include "RenderStyleConstants.h"
-#include <wtf/text/AtomicString.h>
 
 namespace WebCore {
     
@@ -63,38 +62,5 @@
     LineClamp m_type;
     int m_value;
 };
-
-class LinesClampValue {
-public:
-    LinesClampValue()
-    { }
-
-    LinesClampValue(const LineClampValue& start, const LineClampValue& end, const AtomicString& center)
-        : m_start(start)
-        , m_end(end)
-        , m_center(center)
-    { }
     
-    bool isNone() const { return m_start.isNone(); }
-
-    bool operator==(const LinesClampValue& o) const
-    {
-        return m_start == o.start() && m_end == o.end() && m_center == o.center();
-    }
-    
-    bool operator!=(const LinesClampValue& o) const
-    {
-        return !(*this == o);
-    }
-    
-    LineClampValue start() const { return m_start; }
-    LineClampValue end() const { return m_end; }
-    AtomicString center() const { return m_center; }
-
-private:
-    LineClampValue m_start;
-    LineClampValue m_end;
-    AtomicString m_center;
-};
-
 } // namespace WebCore
diff --git a/Source/WebCore/rendering/style/RenderStyle.h b/Source/WebCore/rendering/style/RenderStyle.h
index 0ce33cd..327dd2b3 100644
--- a/Source/WebCore/rendering/style/RenderStyle.h
+++ b/Source/WebCore/rendering/style/RenderStyle.h
@@ -683,8 +683,6 @@
     
     LineBoxContain lineBoxContain() const { return m_rareInheritedData->lineBoxContain; }
     const LineClampValue& lineClamp() const { return m_rareNonInheritedData->lineClamp; }
-    const LinesClampValue& linesClamp() const { return m_rareNonInheritedData->linesClamp; }
-    bool hasLinesClamp() const { return !linesClamp().start().isNone(); }
     const IntSize& initialLetter() const { return m_rareNonInheritedData->initialLetter; }
     int initialLetterDrop() const { return initialLetter().width(); }
     int initialLetterHeight() const { return initialLetter().height(); }
@@ -1201,7 +1199,6 @@
 
     void setLineBoxContain(LineBoxContain c) { SET_VAR(m_rareInheritedData, lineBoxContain, c); }
     void setLineClamp(LineClampValue c) { SET_VAR(m_rareNonInheritedData, lineClamp, c); }
-    void setLinesClamp(const LinesClampValue& c) { SET_VAR(m_rareNonInheritedData, linesClamp, c); }
     
     void setInitialLetter(const IntSize& size) { SET_VAR(m_rareNonInheritedData, initialLetter, size); }
     
@@ -1647,7 +1644,6 @@
 
     static IntSize initialInitialLetter() { return IntSize(); }
     static LineClampValue initialLineClamp() { return LineClampValue(); }
-    static LinesClampValue initialLinesClamp() { return LinesClampValue(); }
     static TextSecurity initialTextSecurity() { return TextSecurity::None; }
 
 #if PLATFORM(IOS)
@@ -2050,7 +2046,7 @@
 inline bool RenderStyle::hasInlineColumnAxis() const
 {
     auto axis = columnAxis();
-    return (axis == ColumnAxis::Auto || isHorizontalWritingMode() == (axis == ColumnAxis::Horizontal)) && !hasLinesClamp();
+    return axis == ColumnAxis::Auto || isHorizontalWritingMode() == (axis == ColumnAxis::Horizontal);
 }
 
 inline ImageOrientationEnum RenderStyle::imageOrientation() const
diff --git a/Source/WebCore/rendering/style/StyleRareNonInheritedData.cpp b/Source/WebCore/rendering/style/StyleRareNonInheritedData.cpp
index aa37b66..d925fc6 100644
--- a/Source/WebCore/rendering/style/StyleRareNonInheritedData.cpp
+++ b/Source/WebCore/rendering/style/StyleRareNonInheritedData.cpp
@@ -44,7 +44,6 @@
     , perspectiveOriginX(RenderStyle::initialPerspectiveOriginX())
     , perspectiveOriginY(RenderStyle::initialPerspectiveOriginY())
     , lineClamp(RenderStyle::initialLineClamp())
-    , linesClamp(RenderStyle::initialLinesClamp())
     , initialLetter(RenderStyle::initialInitialLetter())
     , deprecatedFlexibleBox(StyleDeprecatedFlexibleBoxData::create())
     , flexibleBox(StyleFlexibleBoxData::create())
@@ -121,7 +120,6 @@
     , perspectiveOriginX(o.perspectiveOriginX)
     , perspectiveOriginY(o.perspectiveOriginY)
     , lineClamp(o.lineClamp)
-    , linesClamp(o.linesClamp)
     , initialLetter(o.initialLetter)
     , deprecatedFlexibleBox(o.deprecatedFlexibleBox)
     , flexibleBox(o.flexibleBox)
@@ -220,7 +218,6 @@
         && perspectiveOriginX == o.perspectiveOriginX
         && perspectiveOriginY == o.perspectiveOriginY
         && lineClamp == o.lineClamp
-        && linesClamp == o.linesClamp
         && initialLetter == o.initialLetter
 #if ENABLE(DASHBOARD_SUPPORT)
         && dashboardRegions == o.dashboardRegions
diff --git a/Source/WebCore/rendering/style/StyleRareNonInheritedData.h b/Source/WebCore/rendering/style/StyleRareNonInheritedData.h
index 12363af..089ccfa 100644
--- a/Source/WebCore/rendering/style/StyleRareNonInheritedData.h
+++ b/Source/WebCore/rendering/style/StyleRareNonInheritedData.h
@@ -102,7 +102,6 @@
     Length perspectiveOriginY;
 
     LineClampValue lineClamp; // An Apple extension.
-    LinesClampValue linesClamp; // An Apple extension.
     
     IntSize initialLetter;
 
diff --git a/Source/WebCore/rendering/updating/RenderTreeBuilderMultiColumn.cpp b/Source/WebCore/rendering/updating/RenderTreeBuilderMultiColumn.cpp
index 57216eb..c9d289a9 100644
--- a/Source/WebCore/rendering/updating/RenderTreeBuilderMultiColumn.cpp
+++ b/Source/WebCore/rendering/updating/RenderTreeBuilderMultiColumn.cpp
@@ -26,7 +26,6 @@
 
 #include "RenderBlockFlow.h"
 #include "RenderChildIterator.h"
-#include "RenderLinesClampFlow.h"
 #include "RenderMultiColumnFlow.h"
 #include "RenderMultiColumnSet.h"
 #include "RenderMultiColumnSpannerPlaceholder.h"
@@ -81,7 +80,7 @@
     if (descendantBox.isFloatingOrOutOfFlowPositioned())
         return false;
 
-    if (!fragmentedFlow.isColumnSpanningDescendant(descendantBox))
+    if (descendantBox.style().columnSpan() != ColumnSpan::All)
         return false;
 
     auto* parent = descendantBox.parent();
@@ -166,7 +165,7 @@
         }
     }
 
-    auto newFragmentedFlow = !flow.style().hasLinesClamp() ? WebCore::createRenderer<RenderMultiColumnFlow>(flow.document(), RenderStyle::createAnonymousStyleWithDisplay(flow.style(), DisplayType::Block)) :  WebCore::createRenderer<RenderLinesClampFlow>(flow.document(), RenderStyle::createAnonymousStyleWithDisplay(flow.style(), DisplayType::Block));
+    auto newFragmentedFlow = WebCore::createRenderer<RenderMultiColumnFlow>(flow.document(), RenderStyle::createAnonymousStyleWithDisplay(flow.style(), DisplayType::Block));
     newFragmentedFlow->initializeStyle();
     auto& fragmentedFlow = *newFragmentedFlow;
     m_builder.blockBuilder().attach(flow, WTFMove(newFragmentedFlow), nullptr);
@@ -181,14 +180,6 @@
         }
     }
 
-    if (flow.style().hasLinesClamp()) {
-        // Keep the middle block out of the flow thread.
-        for (auto& element : childrenOfType<RenderElement>(fragmentedFlow)) {
-            if (!downcast<RenderLinesClampFlow>(fragmentedFlow).isChildAllowedInFragmentedFlow(flow, element))
-                m_builder.move(fragmentedFlow, flow, element, RenderTreeBuilder::NormalizeAfterInsertion::Yes);
-        }
-    }
-
     flow.setMultiColumnFlow(fragmentedFlow);
 }
 
@@ -352,7 +343,7 @@
     // Need to create a new column set when there's no set already created. We also always insert
     // another column set after a spanner. Even if it turns out that there are no renderers
     // following the spanner, there may be bottom margins there, which take up space.
-    auto newSet = flow.createMultiColumnSet(RenderStyle::createAnonymousStyleWithDisplay(multicolContainer->style(), DisplayType::Block));
+    auto newSet = createRenderer<RenderMultiColumnSet>(flow, RenderStyle::createAnonymousStyleWithDisplay(multicolContainer->style(), DisplayType::Block));
     newSet->initializeStyle();
     auto& set = *newSet;
     m_builder.blockBuilder().attach(*multicolContainer, WTFMove(newSet), insertBeforeMulticolChild);