[LFC][IFC] Remove the previous version of inline content handling.
authorzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 19 Oct 2018 16:51:44 +0000 (16:51 +0000)
committerzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 19 Oct 2018 16:51:44 +0000 (16:51 +0000)
https://bugs.webkit.org/show_bug.cgi?id=190716

Reviewed by Antti Koivisto.

* Sources.txt:
* WebCore.xcodeproj/project.pbxproj:
* layout/Verification.cpp:
(WebCore::Layout::areEssentiallyEqual):
(WebCore::Layout::outputMismatchingSimpleLineInformationIfNeeded):
(WebCore::Layout::outputMismatchingComplexLineInformationIfNeeded):
* layout/inlineformatting/InlineFormattingState.h:
(WebCore::Layout::InlineFormattingState::inlineContent):
(WebCore::Layout::InlineFormattingState::addLayoutRuns): Deleted.
(WebCore::Layout::InlineFormattingState::layoutRuns const): Deleted.
* layout/inlineformatting/text/TextUtil.cpp: Renamed from Source/WebCore/layout/inlineformatting/textlayout/TextUtil.cpp.
(WebCore::Layout::TextUtil::TextUtil):
(WebCore::Layout::TextUtil::width const):
(WebCore::Layout::TextUtil::hyphenPositionBefore const):
(WebCore::Layout::TextUtil::textWidth const):
(WebCore::Layout::TextUtil::fixedPitchWidth const):
* layout/inlineformatting/text/TextUtil.h: Renamed from Source/WebCore/layout/inlineformatting/textlayout/TextUtil.h.
* layout/inlineformatting/textlayout/Runs.h: Removed.
* layout/inlineformatting/textlayout/TextContentProvider.cpp: Removed.
* layout/inlineformatting/textlayout/TextContentProvider.h: Removed.
* layout/inlineformatting/textlayout/simple/SimpleLineBreaker.cpp: Removed.
* layout/inlineformatting/textlayout/simple/SimpleLineBreaker.h: Removed.
* layout/inlineformatting/textlayout/simple/SimpleTextRunGenerator.cpp: Removed.
* layout/inlineformatting/textlayout/simple/SimpleTextRunGenerator.h: Removed.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@237289 268f45cc-cd09-0410-ab3c-d52691b4dbfc

14 files changed:
Source/WebCore/ChangeLog
Source/WebCore/Sources.txt
Source/WebCore/WebCore.xcodeproj/project.pbxproj
Source/WebCore/layout/Verification.cpp
Source/WebCore/layout/inlineformatting/InlineFormattingState.h
Source/WebCore/layout/inlineformatting/text/TextUtil.cpp [moved from Source/WebCore/layout/inlineformatting/textlayout/TextUtil.cpp with 100% similarity]
Source/WebCore/layout/inlineformatting/text/TextUtil.h [moved from Source/WebCore/layout/inlineformatting/textlayout/TextUtil.h with 100% similarity]
Source/WebCore/layout/inlineformatting/textlayout/Runs.h [deleted file]
Source/WebCore/layout/inlineformatting/textlayout/TextContentProvider.cpp [deleted file]
Source/WebCore/layout/inlineformatting/textlayout/TextContentProvider.h [deleted file]
Source/WebCore/layout/inlineformatting/textlayout/simple/SimpleLineBreaker.cpp [deleted file]
Source/WebCore/layout/inlineformatting/textlayout/simple/SimpleLineBreaker.h [deleted file]
Source/WebCore/layout/inlineformatting/textlayout/simple/SimpleTextRunGenerator.cpp [deleted file]
Source/WebCore/layout/inlineformatting/textlayout/simple/SimpleTextRunGenerator.h [deleted file]

index 0871587..3ec12ab 100644 (file)
@@ -1,5 +1,37 @@
 2018-10-19  Zalan Bujtas  <zalan@apple.com>
 
+        [LFC][IFC] Remove the previous version of inline content handling.
+        https://bugs.webkit.org/show_bug.cgi?id=190716
+
+        Reviewed by Antti Koivisto.
+
+        * Sources.txt:
+        * WebCore.xcodeproj/project.pbxproj:
+        * layout/Verification.cpp:
+        (WebCore::Layout::areEssentiallyEqual):
+        (WebCore::Layout::outputMismatchingSimpleLineInformationIfNeeded):
+        (WebCore::Layout::outputMismatchingComplexLineInformationIfNeeded):
+        * layout/inlineformatting/InlineFormattingState.h:
+        (WebCore::Layout::InlineFormattingState::inlineContent):
+        (WebCore::Layout::InlineFormattingState::addLayoutRuns): Deleted.
+        (WebCore::Layout::InlineFormattingState::layoutRuns const): Deleted.
+        * layout/inlineformatting/text/TextUtil.cpp: Renamed from Source/WebCore/layout/inlineformatting/textlayout/TextUtil.cpp.
+        (WebCore::Layout::TextUtil::TextUtil):
+        (WebCore::Layout::TextUtil::width const):
+        (WebCore::Layout::TextUtil::hyphenPositionBefore const):
+        (WebCore::Layout::TextUtil::textWidth const):
+        (WebCore::Layout::TextUtil::fixedPitchWidth const):
+        * layout/inlineformatting/text/TextUtil.h: Renamed from Source/WebCore/layout/inlineformatting/textlayout/TextUtil.h.
+        * layout/inlineformatting/textlayout/Runs.h: Removed.
+        * layout/inlineformatting/textlayout/TextContentProvider.cpp: Removed.
+        * layout/inlineformatting/textlayout/TextContentProvider.h: Removed.
+        * layout/inlineformatting/textlayout/simple/SimpleLineBreaker.cpp: Removed.
+        * layout/inlineformatting/textlayout/simple/SimpleLineBreaker.h: Removed.
+        * layout/inlineformatting/textlayout/simple/SimpleTextRunGenerator.cpp: Removed.
+        * layout/inlineformatting/textlayout/simple/SimpleTextRunGenerator.h: Removed.
+
+2018-10-19  Zalan Bujtas  <zalan@apple.com>
+
         [LFC][IFC] Add generic inline content handling.
         https://bugs.webkit.org/show_bug.cgi?id=190713
 
index 77645f1..0463d15 100644 (file)
@@ -1262,10 +1262,7 @@ layout/inlineformatting/InlineInvalidation.cpp
 layout/inlineformatting/InlineLineBreaker.cpp
 layout/inlineformatting/InlineRunProvider.cpp
 layout/inlineformatting/Line.cpp
-layout/inlineformatting/textlayout/TextContentProvider.cpp
-layout/inlineformatting/textlayout/TextUtil.cpp
-layout/inlineformatting/textlayout/simple/SimpleTextRunGenerator.cpp
-layout/inlineformatting/textlayout/simple/SimpleLineBreaker.cpp
+layout/inlineformatting/text/TextUtil.cpp
 layout/layouttree/LayoutBlockContainer.cpp
 layout/layouttree/LayoutBox.cpp
 layout/layouttree/LayoutContainer.cpp
index d4c1d75..ba15fcf 100644 (file)
                11CB2787203BA570004A1DC9 /* RenderTreeBuilderFullScreen.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RenderTreeBuilderFullScreen.h; sourceTree = "<group>"; };
                11E067EB1E62461300162D16 /* SimpleLineLayoutCoverage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SimpleLineLayoutCoverage.cpp; sourceTree = "<group>"; };
                11E067ED1E6246E500162D16 /* SimpleLineLayoutCoverage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleLineLayoutCoverage.h; sourceTree = "<group>"; };
-               11EA57FB20FFAFB600311EBB /* SimpleTextRunGenerator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SimpleTextRunGenerator.cpp; sourceTree = "<group>"; };
-               11EA57FC20FFAFB700311EBB /* SimpleTextRunGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleTextRunGenerator.h; sourceTree = "<group>"; };
                11FF02D520BA3C810083F25B /* Verification.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Verification.cpp; sourceTree = "<group>"; };
                12F75A9A86EA03DAF24B7971 /* ISOProtectionSystemSpecificHeaderBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ISOProtectionSystemSpecificHeaderBox.h; sourceTree = "<group>"; };
                1400D7A717136EA70077CE05 /* ScriptWrappableInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScriptWrappableInlines.h; sourceTree = "<group>"; };
                6F7CA3C5208C2956002F29AB /* LayoutContext.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = LayoutContext.cpp; sourceTree = "<group>"; };
                6F7CA3C8208C2B2E002F29AB /* InlineFormattingContext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = InlineFormattingContext.h; sourceTree = "<group>"; };
                6F7CA3C9208C2B2E002F29AB /* InlineFormattingContext.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = InlineFormattingContext.cpp; sourceTree = "<group>"; };
-               6F8304C920FBA5E1004AD5D1 /* SimpleLineBreaker.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = SimpleLineBreaker.cpp; sourceTree = "<group>"; };
-               6F8304CA20FBA5E1004AD5D1 /* SimpleLineBreaker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SimpleLineBreaker.h; sourceTree = "<group>"; };
                6F995A091A7070E600A735F4 /* WebGLQuery.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = WebGLQuery.idl; sourceTree = "<group>"; };
                6F995A0A1A7070E600A735F4 /* WebGLSampler.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = WebGLSampler.idl; sourceTree = "<group>"; };
                6F995A0B1A7070E600A735F4 /* WebGLSync.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = WebGLSync.idl; sourceTree = "<group>"; };
                6FB11B5921783FCF00E2A574 /* TextUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextUtil.h; sourceTree = "<group>"; };
                6FB11B5B21783FCF00E2A574 /* TextUtil.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TextUtil.cpp; sourceTree = "<group>"; };
                6FBB860520B464B600DAD938 /* FormattingContextGeometry.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = FormattingContextGeometry.cpp; sourceTree = "<group>"; };
-               6FCD19C120F9727A00FD4529 /* TextContentProvider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TextContentProvider.h; sourceTree = "<group>"; };
-               6FCD19C720F9727D00FD4529 /* TextContentProvider.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = TextContentProvider.cpp; sourceTree = "<group>"; };
-               6FCF975220F02B3500214960 /* Runs.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Runs.h; sourceTree = "<group>"; };
                6FE198132178397B00446F08 /* InlineLineBreaker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InlineLineBreaker.cpp; sourceTree = "<group>"; };
                6FE198152178397C00446F08 /* InlineLineBreaker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InlineLineBreaker.h; sourceTree = "<group>"; };
                6FE7CFA02177EEF1005B1573 /* InlineItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InlineItem.h; sourceTree = "<group>"; };
                115CFA9A208BC140001E6991 /* inlineformatting */ = {
                        isa = PBXGroup;
                        children = (
-                               6F219D742178D37100BB033C /* InlineRun.h */,
-                               6F219D762178D37100BB033C /* Line.cpp */,
-                               6FE198132178397B00446F08 /* InlineLineBreaker.cpp */,
-                               6FE198152178397C00446F08 /* InlineLineBreaker.h */,
-                               6FE7DDDD20EC6E8B008B5B4E /* textlayout */,
+                               6FE7DDDD20EC6E8B008B5B4E /* text */,
                                6F7CA3C9208C2B2E002F29AB /* InlineFormattingContext.cpp */,
                                6F7CA3C8208C2B2E002F29AB /* InlineFormattingContext.h */,
                                115CFA7D208B8E10001E6991 /* InlineFormattingState.cpp */,
                                1123AFDD209ABBBA00736ACC /* InlineInvalidation.cpp */,
                                1123AFDC209ABBBA00736ACC /* InlineInvalidation.h */,
                                6FE7CFA02177EEF1005B1573 /* InlineItem.h */,
+                               6FE198132178397B00446F08 /* InlineLineBreaker.cpp */,
+                               6FE198152178397C00446F08 /* InlineLineBreaker.h */,
+                               6F219D742178D37100BB033C /* InlineRun.h */,
                                6F5217C62177F5A6006583BB /* InlineRunProvider.cpp */,
                                6F5217C42177F5A6006583BB /* InlineRunProvider.h */,
+                               6F219D762178D37100BB033C /* Line.cpp */,
                        );
                        path = inlineformatting;
                        sourceTree = "<group>";
                        tabWidth = 4;
                        usesTabs = 0;
                };
-               6F13A12320F9949C001C025A /* simple */ = {
-                       isa = PBXGroup;
-                       children = (
-                               6F8304C920FBA5E1004AD5D1 /* SimpleLineBreaker.cpp */,
-                               6F8304CA20FBA5E1004AD5D1 /* SimpleLineBreaker.h */,
-                               11EA57FB20FFAFB600311EBB /* SimpleTextRunGenerator.cpp */,
-                               11EA57FC20FFAFB700311EBB /* SimpleTextRunGenerator.h */,
-                       );
-                       path = simple;
-                       sourceTree = "<group>";
-               };
                6FCFC055212DACC2007695D2 /* floats */ = {
                        isa = PBXGroup;
                        children = (
                        path = floats;
                        sourceTree = "<group>";
                };
-               6FE7DDDD20EC6E8B008B5B4E /* textlayout */ = {
+               6FE7DDDD20EC6E8B008B5B4E /* text */ = {
                        isa = PBXGroup;
                        children = (
                                6FB11B5B21783FCF00E2A574 /* TextUtil.cpp */,
                                6FB11B5921783FCF00E2A574 /* TextUtil.h */,
-                               6F13A12320F9949C001C025A /* simple */,
-                               6FCF975220F02B3500214960 /* Runs.h */,
-                               6FCD19C720F9727D00FD4529 /* TextContentProvider.cpp */,
-                               6FCD19C120F9727A00FD4529 /* TextContentProvider.h */,
                        );
-                       path = textlayout;
+                       path = text;
                        sourceTree = "<group>";
                };
                71025EC11F99F096004A250C /* animation */ = {
                                11310CF820BA4A6A0065A8D0 /* InlineInvalidation.h in Headers */,
                                6FE7CFA22177EEF2005B1573 /* InlineItem.h in Headers */,
                                BCE789161120D6080060ECE5 /* InlineIterator.h in Headers */,
+                               6FE198172178397C00446F08 /* InlineLineBreaker.h in Headers */,
+                               6F219D772178D37200BB033C /* InlineRun.h in Headers */,
                                6F5217C72177F5A7006583BB /* InlineRunProvider.h in Headers */,
                                AA4C3A770B2B1679002334A2 /* InlineStyleSheetOwner.h in Headers */,
                                BCEA485A097D93020094C9E4 /* InlineTextBox.h in Headers */,
                                A84EBD830CB8C97700079609 /* JSStyleSheetList.h in Headers */,
                                571F21891DA57C54005C9EFD /* JSSubtleCrypto.h in Headers */,
                                B20111080AB7740500DB0E68 /* JSSVGAElement.h in Headers */,
-                               6FB11B5C21783FD000E2A574 /* TextUtil.h in Headers */,
                                24D9129213CA951E00D21915 /* JSSVGAltGlyphDefElement.h in Headers */,
                                6515EC920D9723FF0063D49A /* JSSVGAltGlyphElement.h in Headers */,
                                24D9129613CA956100D21915 /* JSSVGAltGlyphItemElement.h in Headers */,
                                A88DD4870B4629A300C02990 /* PathTraversalState.h in Headers */,
                                2D5002FC1B56D7990020AAF7 /* PathUtilities.h in Headers */,
                                A8FA6E5D0E4CFDED00D5CF49 /* Pattern.h in Headers */,
-                               6FE198172178397C00446F08 /* InlineLineBreaker.h in Headers */,
                                B22279710D00BF220071B782 /* PatternAttributes.h in Headers */,
                                A1677E08213E024C00A08C34 /* PayerErrorFields.h in Headers */,
                                1A8A643A1D19FC5300D0E00F /* Payment.h in Headers */,
                                A10BB5851484E3A700B2E87A /* RenderSVGRect.h in Headers */,
                                436708CD12D9CA4B00044234 /* RenderSVGResource.h in Headers */,
                                436708CF12D9CA4B00044234 /* RenderSVGResourceClipper.h in Headers */,
-                               6F219D772178D37200BB033C /* InlineRun.h in Headers */,
                                436708D112D9CA4B00044234 /* RenderSVGResourceContainer.h in Headers */,
                                436708D312D9CA4B00044234 /* RenderSVGResourceFilter.h in Headers */,
                                436708D512D9CA4B00044234 /* RenderSVGResourceFilterPrimitive.h in Headers */,
                                29FAF4B6195AB08900A522DC /* TextUndoInsertionMarkupMac.h in Headers */,
                                498770F11242C535002226BA /* Texture.h in Headers */,
                                CD9D82761C7AE535006FF066 /* TextureCacheCV.h in Headers */,
+                               6FB11B5C21783FD000E2A574 /* TextUtil.h in Headers */,
                                BCE658FF0EA9248A007E4533 /* Theme.h in Headers */,
                                310D71961B335C9E009C7B73 /* ThemeCocoa.h in Headers */,
                                44C9919F0F3D210E00586670 /* ThemeIOS.h in Headers */,
index 5cbc8cf..180d248 100644 (file)
 namespace WebCore {
 namespace Layout {
 
+static bool areEssentiallyEqual(float a, LayoutUnit b)
+{
+    if (a == b.toFloat())
+        return true;
+
+    return ::abs(a - b.toFloat()) <= 4 * LayoutUnit::epsilon();
+}
+
 static bool outputMismatchingSimpleLineInformationIfNeeded(TextStream& stream, const LayoutContext& layoutContext, const RenderBlockFlow& blockFlow, const Container& inlineFormattingRoot)
 {
     auto* lineLayoutData = blockFlow.simpleLineLayout();
@@ -48,12 +56,12 @@ static bool outputMismatchingSimpleLineInformationIfNeeded(TextStream& stream, c
         return true;
     }
 
-    auto& inlineFormattingState = const_cast<LayoutContext&>(layoutContext).establishedFormattingState(inlineFormattingRoot);
+    auto& inlineFormattingState = layoutContext.establishedFormattingState(inlineFormattingRoot);
     ASSERT(is<InlineFormattingState>(inlineFormattingState));
-    auto& layoutRuns = downcast<InlineFormattingState>(inlineFormattingState).layoutRuns();
+    auto& inlineRunList = downcast<InlineFormattingState>(inlineFormattingState).inlineRuns();
 
-    if (layoutRuns.size() != lineLayoutData->runCount()) {
-        stream << "Mismatching number of runs: simple runs(" << lineLayoutData->runCount() << ") layout runs(" << layoutRuns.size() << ")";
+    if (inlineRunList.size() != lineLayoutData->runCount()) {
+        stream << "Mismatching number of runs: simple runs(" << lineLayoutData->runCount() << ") inline runs(" << inlineRunList.size() << ")";
         stream.nextLine();
         return true;
     }
@@ -61,12 +69,15 @@ static bool outputMismatchingSimpleLineInformationIfNeeded(TextStream& stream, c
     auto mismatched = false;
     for (unsigned i = 0; i < lineLayoutData->runCount(); ++i) {
         auto& simpleRun = lineLayoutData->runAt(i);
-        auto& layoutRun = layoutRuns[i];
+        auto& inlineRun = inlineRunList[i];
 
-        if (simpleRun.start == layoutRun.start() && simpleRun.end == layoutRun.end() && simpleRun.logicalLeft == layoutRun.left() && simpleRun.logicalRight == layoutRun.right())
+        auto matchingRuns = areEssentiallyEqual(simpleRun.logicalLeft, inlineRun.logicalLeft()) && areEssentiallyEqual(simpleRun.logicalRight, inlineRun.logicalRight());
+        if (matchingRuns)
+            matchingRuns = (simpleRun.start == inlineRun.textContext()->position() && simpleRun.end == (inlineRun.textContext()->position() + inlineRun.textContext()->length()));
+        if (matchingRuns)
             continue;
 
-        stream << "Mismatching: simple run(" << simpleRun.start << ", " << simpleRun.end << ") (" << simpleRun.logicalLeft << ", " << simpleRun.logicalRight << ") layout run(" << layoutRun.start() << ", " << layoutRun.end() << ") (" << layoutRun.left() << ", " << layoutRun.right() << ")";
+        stream << "Mismatching: simple run(" << simpleRun.start << ", " << simpleRun.end << ") (" << simpleRun.logicalLeft << ", " << simpleRun.logicalRight << ") layout run(" << inlineRun.textContext()->position() << ", " << inlineRun.textContext()->position() + inlineRun.textContext()->length() << ") (" << inlineRun.logicalLeft() << ", " << inlineRun.logicalRight() << ")";
         stream.nextLine();
         mismatched = true;
     }
@@ -75,32 +86,45 @@ static bool outputMismatchingSimpleLineInformationIfNeeded(TextStream& stream, c
 
 static bool outputMismatchingComplexLineInformationIfNeeded(TextStream& stream, const LayoutContext& layoutContext, const RenderBlockFlow& blockFlow, const Container& inlineFormattingRoot)
 {
-    auto& inlineFormattingState = const_cast<LayoutContext&>(layoutContext).establishedFormattingState(inlineFormattingRoot);
+    auto& inlineFormattingState = layoutContext.establishedFormattingState(inlineFormattingRoot);
     ASSERT(is<InlineFormattingState>(inlineFormattingState));
-    auto& layoutRuns = downcast<InlineFormattingState>(inlineFormattingState).layoutRuns();
+    auto& inlineRunList = downcast<InlineFormattingState>(inlineFormattingState).inlineRuns();
 
     auto mismatched = false;
-    unsigned layoutRunIndex = 0;
+    unsigned runIndex = 0;
     for (auto* rootLine = blockFlow.firstRootBox(); rootLine; rootLine = rootLine->nextRootBox()) {
         for (auto* lineBox = rootLine->firstChild(); lineBox; lineBox = lineBox->nextOnLine()) {
-            if (!is<InlineTextBox>(lineBox))
-                continue;
-
-            if (layoutRunIndex >= layoutRuns.size()) {
+            if (runIndex >= inlineRunList.size()) {
                 // FIXME: <span>foobar</span>foobar generates 2 inline text boxes while we only generate one layout run (which is much better, since it enables us to do kerning across inline elements).
-                stream << "Mismatching number of runs: layout runs(" << layoutRuns.size() << ")";
+                stream << "Mismatching number of runs: inline runs(" << inlineRunList.size() << ")";
                 stream.nextLine();
                 return true;
             }
 
-            auto& layoutRun = layoutRuns[layoutRunIndex];
-            auto& inlineTextBox = downcast<InlineTextBox>(*lineBox);
-            if (inlineTextBox.start() == layoutRun.start() && inlineTextBox.end() == layoutRun.end() && inlineTextBox.logicalLeft() == layoutRun.left() && inlineTextBox.logicalRight() == layoutRun.right()) {
-                stream << "Mismatching: simple run(" << inlineTextBox.start() << ", " << inlineTextBox.end() << ") (" << inlineTextBox.logicalLeft() << ", " << inlineTextBox.logicalRight() << ") layout run(" << layoutRun.start() << ", " << layoutRun.end() << ") (" << layoutRun.left() << ", " << layoutRun.right() << ")";
+            auto& inlineRun = inlineRunList[runIndex];
+            auto* inlineTextBox = is<InlineTextBox>(lineBox) ? downcast<InlineTextBox>(lineBox) : nullptr;
+
+            auto matchingRuns = areEssentiallyEqual(lineBox->logicalLeft(), inlineRun.logicalLeft()) && areEssentiallyEqual(lineBox->logicalRight(), inlineRun.logicalRight());
+            if (matchingRuns && inlineTextBox) {
+                ASSERT(inlineRun.textContext());
+                matchingRuns = inlineTextBox->start() == inlineRun.textContext()->position() && inlineTextBox->end() + 1 == (inlineRun.textContext()->position() + inlineRun.textContext()->length());
+            }
+
+            if (!matchingRuns) {
+                stream << "Mismatching: run ";
+
+                if (inlineTextBox)
+                    stream << "(" << inlineTextBox->start() << ", " << inlineTextBox->end() + 1 << ")";
+                stream << " (" << lineBox->logicalLeft() << ", " << lineBox->logicalRight() << ") ";
+
+                stream << "layout run ";
+                if (inlineRun.textContext())
+                    stream << "(" << inlineRun.textContext()->position() << ", " << inlineRun.textContext()->position() + inlineRun.textContext()->length() << ") ";
+                stream << "(" << inlineRun.logicalLeft() << ", " << inlineRun.logicalRight() << ")";
                 stream.nextLine();
                 mismatched = true;
             }
-            ++layoutRunIndex;
+            ++runIndex;
         }
     }
     return mismatched;
index dc6c9e8..86cc7e3 100644 (file)
@@ -30,7 +30,6 @@
 #include "FormattingState.h"
 #include "InlineItem.h"
 #include "InlineRun.h"
-#include "Runs.h"
 #include <wtf/IsoMalloc.h>
 
 namespace WebCore {
@@ -44,17 +43,12 @@ public:
     virtual ~InlineFormattingState();
 
     InlineContent& inlineContent() { return m_inlineContent; }
-    // This is temporary. We need to construct a display tree context for inlines.
-    void addLayoutRuns(Vector<LayoutRun>&& layoutRuns) { m_layoutRuns = WTFMove(layoutRuns); }
-    const Vector<LayoutRun>& layoutRuns() const { return m_layoutRuns; }
-
     // Temp
     InlineRuns& inlineRuns() { return m_inlineRuns; }
     void appendInlineRun(InlineRun inlineRun) { m_inlineRuns.append(inlineRun); }
 
 private:
     InlineContent m_inlineContent;
-    Vector<LayoutRun> m_layoutRuns;
     InlineRuns m_inlineRuns;
 };
 
diff --git a/Source/WebCore/layout/inlineformatting/textlayout/Runs.h b/Source/WebCore/layout/inlineformatting/textlayout/Runs.h
deleted file mode 100644 (file)
index 9a4c1f2..0000000
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * Copyright (C) 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. AND ITS CONTRIBUTORS ``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 ITS 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
-
-#if ENABLE(LAYOUT_FORMATTING_CONTEXT)
-
-#include "TextFlags.h"
-
-namespace WebCore {
-namespace Layout {
-
-using ContentPosition = unsigned;
-using ItemPosition = unsigned;
-
-struct TextRun {
-public:
-    enum class Type {
-        Whitespace,
-        NonWhitespace,
-        SoftLineBreak,
-        HardLineBreak,
-        Invalid
-    };
-    static TextRun createWhitespaceRun(ContentPosition start, ContentPosition end, float width, bool isCollapsed);
-    static TextRun createNonWhitespaceRun(ContentPosition start, ContentPosition end, float width);
-    static TextRun createNonWhitespaceRunWithHyphen(ContentPosition start, ContentPosition end, float width);
-    static TextRun createSoftLineBreakRun(ContentPosition);
-    static TextRun createHardLineBreakRun(ContentPosition);
-
-    TextRun() = default;
-    TextRun(ContentPosition start, ContentPosition end, Type, float width = 0, bool isCollapsed = false, bool hasHyphen = false);
-
-    ContentPosition start() const;
-    ContentPosition end() const;
-    unsigned length() const;
-
-    float width() const;
-
-    bool isWhitespace() const { return m_type == Type::Whitespace; }
-    bool isNonWhitespace() const { return m_type == Type::NonWhitespace; }
-    bool isLineBreak() const { return isSoftLineBreak() || isHardLineBreak(); }
-    bool isSoftLineBreak() const { return m_type == Type::SoftLineBreak; }
-    bool isHardLineBreak() const { return m_type == Type::HardLineBreak; }
-    bool isValid() const { return m_type != Type::Invalid; }
-    bool isCollapsed() const { return m_isCollapsed; }
-    Type type() const { return m_type; }
-
-    void setIsCollapsed(bool isCollapsed) { m_isCollapsed = isCollapsed; }
-    bool hasHyphen() const { return m_hasHyphen; }
-    void setWidth(float width) { m_width = width; }
-
-private:
-    ContentPosition m_start { 0 };
-    ContentPosition m_end { 0 };
-    Type m_type { Type::Invalid };
-    float m_width { 0 };
-    bool m_isCollapsed { false };
-    bool m_hasHyphen { false };
-};
-
-struct LayoutRun {
-public:
-    LayoutRun(ContentPosition start, ContentPosition end, float left, float right, bool hasHyphen);
-
-    ContentPosition start() const { return m_start; }
-    ContentPosition end() const { return m_end; }
-    unsigned length() const { return end() - start(); }
-
-    float left() const { return m_left; }
-    float right() const { return m_right; }
-    float width() const { return right() - left(); }
-
-    bool isEndOfLine() const { return m_isEndOfLine; }
-
-    void setEnd(ContentPosition end) { m_end = end; }
-    void setLeft(float left) { m_left = left; }
-    void setRight(float right) { m_right = right; }
-    void setIsEndOfLine() { m_isEndOfLine = true; }
-
-    void setExpansion(ExpansionBehavior, float expansion);
-    void setHasHyphen() { m_hasHyphen = true; }
-    bool hasHyphen() const { return m_hasHyphen; }
-
-private:
-    ContentPosition m_start { 0 };
-    ContentPosition m_end { 0 };
-    float m_left { 0 };
-    float m_right { 0 };
-    bool m_isEndOfLine { false };
-    bool m_hasHyphen { false };
-    float m_expansion { 0 };
-    ExpansionBehavior m_expansionBehavior { ForbidLeadingExpansion | ForbidTrailingExpansion };
-};
-
-template<typename T>
-class ConstVectorIterator {
-public:
-    ConstVectorIterator(const Vector<T>&);
-
-    const T* current() const;
-    ConstVectorIterator<T>& operator++();
-    void reset() { m_index = 0; }
-
-private:
-    const Vector<T>& m_content;
-    unsigned m_index { 0 };
-};
-
-template<typename T>
-inline ConstVectorIterator<T>::ConstVectorIterator(const Vector<T>& content)
-    : m_content(content)
-{
-}
-
-template<typename T>
-inline const T* ConstVectorIterator<T>::current() const
-{
-    if (m_index == m_content.size())
-        return nullptr;
-    return &m_content[m_index];
-}
-
-template<typename T>
-inline ConstVectorIterator<T>& ConstVectorIterator<T>::operator++()
-{
-    ++m_index;
-    return *this;
-}
-
-inline LayoutRun::LayoutRun(ContentPosition start, ContentPosition end, float left, float right, bool hasHyphen)
-    : m_start(start)
-    , m_end(end)
-    , m_left(left)
-    , m_right(right)
-    , m_hasHyphen(hasHyphen)
-{
-}
-
-inline void LayoutRun::setExpansion(ExpansionBehavior expansionBehavior, float expansion)
-{
-    m_expansionBehavior = expansionBehavior;
-    m_expansion = expansion;
-}
-
-inline TextRun TextRun::createWhitespaceRun(ContentPosition start, ContentPosition end, float width, bool isCollapsed)
-{
-    return { start, end, Type::Whitespace, width, isCollapsed };
-}
-
-inline TextRun TextRun::createNonWhitespaceRun(ContentPosition start, ContentPosition end, float width)
-{
-    return { start, end, Type::NonWhitespace, width };
-}
-
-inline TextRun TextRun::createNonWhitespaceRunWithHyphen(ContentPosition start, ContentPosition end, float width)
-{
-    return { start, end, Type::NonWhitespace, width, false, true };
-}
-
-inline TextRun TextRun::createSoftLineBreakRun(ContentPosition position)
-{
-    return { position, position + 1, Type::SoftLineBreak };
-}
-
-inline TextRun TextRun::createHardLineBreakRun(ContentPosition position)
-{
-    return { position, position, Type::HardLineBreak };
-}
-
-inline TextRun::TextRun(ContentPosition start, ContentPosition end, Type type, float width, bool isCollapsed, bool hasHyphen)
-    : m_start(start)
-    , m_end(end)
-    , m_type(type)
-    , m_width(width)
-    , m_isCollapsed(isCollapsed)
-    , m_hasHyphen(hasHyphen)
-{
-}
-
-inline ContentPosition TextRun::start() const
-{
-    ASSERT(type() != Type::Invalid);
-    return m_start;
-}
-
-inline ContentPosition TextRun::end() const
-{
-    ASSERT(type() != Type::Invalid);
-    return m_end;
-}
-
-inline unsigned TextRun::length() const
-{
-    ASSERT(type() != Type::Invalid);
-    return m_end - m_start;
-}
-
-inline float TextRun::width() const
-{
-    ASSERT(type() != Type::Invalid);
-    return m_width;
-}
-
-}
-}
-#endif
diff --git a/Source/WebCore/layout/inlineformatting/textlayout/TextContentProvider.cpp b/Source/WebCore/layout/inlineformatting/textlayout/TextContentProvider.cpp
deleted file mode 100644 (file)
index b7b0e7f..0000000
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- * Copyright (C) 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. AND ITS CONTRIBUTORS ``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 ITS 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 "TextContentProvider.h"
-
-#if ENABLE(LAYOUT_FORMATTING_CONTEXT)
-
-#include "FontCascade.h"
-#include "Hyphenation.h"
-#include "RenderStyle.h"
-#include "SimpleTextRunGenerator.h"
-#include <wtf/IsoMallocInlines.h>
-
-namespace WebCore {
-namespace Layout {
-
-WTF_MAKE_ISO_ALLOCATED_IMPL(TextContentProvider);
-
-TextContentProvider::TextItem::Style::Style(const RenderStyle& style)
-    : font(style.fontCascade())
-    , collapseWhitespace(style.collapseWhiteSpace())
-    , hasKerningOrLigatures(font.enableKerning() || font.requiresShaping())
-    , wordSpacing(font.wordSpacing())
-    , tabWidth(collapseWhitespace ? 0 : style.tabSize())
-    , preserveNewline(style.preserveNewline())
-    , breakNBSP(style.autoWrap() && style.nbspMode() == NBSPMode::Space)
-    , keepAllWordsForCJK(style.wordBreak() == WordBreak::KeepAll)
-    , locale(style.locale())
-{
-}
-
-TextContentProvider::TextContentProvider()
-    : m_textContentIterator(m_textContent)
-{
-}
-
-TextContentProvider::~TextContentProvider()
-{
-}
-
-void TextContentProvider::appendText(String text, const RenderStyle& style, bool canUseSimplifiedMeasure)
-{
-    ASSERT(text.length());
-
-    auto start = length();
-    auto end = start + text.length();
-    m_textContent.append({ text, start, end, TextItem::Style(style), canUseSimplifiedMeasure });
-}
-
-void TextContentProvider::appendLineBreak()
-{
-    m_hardLineBreaks.append(length());
-}
-
-static bool contains(ContentPosition position, const TextContentProvider::TextItem& textItem)
-{
-    return textItem.start <= position && position < textItem.end;
-}
-
-const TextContentProvider::TextItem* TextContentProvider::findTextItemSlow(ContentPosition position) const
-{
-    // Since this is an iterator like class, check the next item first (instead of starting the search from the beginning).
-    if (auto* textItem = (++m_textContentIterator).current()) {
-        if (contains(position, *textItem))
-            return textItem;
-    }
-
-    m_textContentIterator.reset();
-    while (auto* textItem = m_textContentIterator.current()) {
-        if (contains(position, *textItem))
-            return textItem;
-        ++m_textContentIterator;
-    }
-
-    ASSERT_NOT_REACHED();
-    return nullptr;
-}
-
-float TextContentProvider::width(ContentPosition from, ContentPosition to, float xPosition) const
-{
-    if (from >= to) {
-        ASSERT_NOT_REACHED();
-        return 0;
-    }
-
-    auto contentLength = length();
-    if (from >= contentLength || to > contentLength) {
-        ASSERT_NOT_REACHED();
-        return 0;
-    }
-
-    float width = 0;
-    auto length = to - from;
-    auto* textItem = m_textContentIterator.current();
-    auto startPosition = from - (textItem && contains(from, *textItem) ? textItem->start : findTextItemSlow(from)->start);
-
-    while (length) {
-        textItem = m_textContentIterator.current();
-        if (!textItem) {
-            ASSERT_NOT_REACHED();
-            break;
-        }
-
-        auto endPosition = std::min<ItemPosition>(startPosition + length, textItem->text.length());
-        ASSERT(endPosition >= startPosition);
-        auto textWidth = this->textWidth(*textItem, startPosition, endPosition, xPosition);
-
-        xPosition += textWidth;
-        width += textWidth;
-        length -= (endPosition - startPosition);
-
-        startPosition = 0;
-        if (length)
-            ++m_textContentIterator;
-    }
-
-    return width;
-}
-
-float TextContentProvider::textWidth(const TextItem& textItem, ItemPosition from, ItemPosition to, float xPosition) const
-{
-    if (from > to || to > textItem.end - textItem.start) {
-        ASSERT_NOT_REACHED();
-        return 0;
-    }
-
-    auto& style = textItem.style;
-    auto& font = style.font;
-    if (!font.size() || from == to)
-        return 0;
-
-    if (font.isFixedPitch())
-        return fixedPitchWidth(textItem.text, style, from, to, xPosition);
-
-    auto measureWithEndSpace = style.hasKerningOrLigatures && to < textItem.text.length() && textItem.text[to] == ' ';
-    if (measureWithEndSpace)
-        ++to;
-    float width = 0;
-    if (textItem.canUseSimplifiedMeasure)
-        width = font.widthForSimpleText(StringView(textItem.text).substring(from, to - from));
-    else  {
-        WebCore::TextRun run(StringView(textItem.text).substring(from, to - from), xPosition);
-        if (style.tabWidth)
-            run.setTabSize(true, style.tabWidth);
-        width = font.width(run);
-    }
-
-    if (measureWithEndSpace)
-        width -= (font.spaceWidth() + style.wordSpacing);
-
-    return std::max<float>(0, width);
-}
-
-float TextContentProvider::fixedPitchWidth(String text, const TextItem::Style& style, ItemPosition from, ItemPosition to, float xPosition) const
-{
-    auto monospaceCharacterWidth = style.font.spaceWidth();
-    float width = 0;
-    for (auto i = from; i < to; ++i) {
-        auto character = text[i];
-        if (character >= ' ' || character == '\n')
-            width += monospaceCharacterWidth;
-        else if (character == '\t')
-            width += style.collapseWhitespace ? monospaceCharacterWidth : style.font.tabWidth(style.tabWidth, xPosition + width);
-
-        if (i > from && (character == ' ' || character == '\t' || character == '\n'))
-            width += style.font.wordSpacing();
-    }
-
-    return width;
-}
-
-std::optional<ContentPosition> TextContentProvider::hyphenPositionBefore(ContentPosition from, ContentPosition to, ContentPosition before) const
-{
-    auto contentLength = length();
-    if (before >= contentLength || before < from || before > to) {
-        ASSERT_NOT_REACHED();
-        return { };
-    }
-
-    auto* textItem = m_textContentIterator.current();
-    if (!textItem || !contains(before, *textItem))
-        textItem = findTextItemSlow(before);
-
-    auto fromItemPosition = from - textItem->start;
-    auto stringForHyphenLocation = StringView(textItem->text).substring(fromItemPosition, to - from);
-
-    // adjustedBefore -> ContentPosition -> ItemPosition -> run position.
-    auto adjustedBefore = before - from;
-    auto hyphenLocation = lastHyphenLocation(stringForHyphenLocation, adjustedBefore, textItem->style.locale);
-    if (!hyphenLocation)
-        return { };
-
-    return from + hyphenLocation;
-}
-
-unsigned TextContentProvider::length() const
-{
-    if (!m_textContent.size())
-        return 0;
-    return m_textContent.last().end;
-}
-
-TextContentProvider::Iterator TextContentProvider::iterator()
-{
-    // TODO: This is where we decide whether we need a simple or a more complex provider.
-    if (!m_simpleTextRunGenerator)
-        m_simpleTextRunGenerator = std::make_unique<SimpleTextRunGenerator>(*this);
-    else
-        m_simpleTextRunGenerator->reset();
-
-    m_simpleTextRunGenerator->findNextRun();
-    return Iterator(*this);
-}
-
-TextContentProvider::TextRunList TextContentProvider::textRuns()
-{
-    TextRunList textRunList;
-
-    auto textRunIterator = iterator();
-    while (auto textRum = textRunIterator.current()) {
-        textRunList.append(*textRum);
-        ++textRunIterator;
-    }
-    return textRunList;
-}
-
-void TextContentProvider::findNextRun()
-{
-    m_simpleTextRunGenerator->findNextRun();
-}
-
-std::optional<TextRun> TextContentProvider::current() const
-{
-    return m_simpleTextRunGenerator->current();
-}
-
-}
-}
-#endif
diff --git a/Source/WebCore/layout/inlineformatting/textlayout/TextContentProvider.h b/Source/WebCore/layout/inlineformatting/textlayout/TextContentProvider.h
deleted file mode 100644 (file)
index a16c3cf..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (C) 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. AND ITS CONTRIBUTORS ``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 ITS 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
-
-#if ENABLE(LAYOUT_FORMATTING_CONTEXT)
-
-#include "Runs.h"
-#include <wtf/IsoMalloc.h>
-
-namespace WebCore {
-
-class FontCascade;
-class RenderStyle;
-
-namespace Layout {
-
-class SimpleTextRunGenerator;
-
-class TextContentProvider {
-    WTF_MAKE_ISO_ALLOCATED(TextContentProvider);
-public:
-    TextContentProvider();
-    ~TextContentProvider();
-
-    void appendText(String, const RenderStyle&, bool canUseSimplifiedMeasure);
-    void appendLineBreak();
-
-    struct TextItem {
-        struct Style {
-            explicit Style(const RenderStyle&);
-
-            const FontCascade& font;
-            bool collapseWhitespace { false };
-            bool hasKerningOrLigatures { false };
-            float wordSpacing { 0 };
-            float tabWidth { 0 };
-            bool preserveNewline { false };
-            bool breakNBSP { false };
-            bool keepAllWordsForCJK { false };
-            AtomicString locale;
-        };
-
-        const String text;
-        const ContentPosition start { 0 };
-        const ContentPosition end { 0 };
-        const Style style;
-        const bool canUseSimplifiedMeasure { false };
-    };
-    using TextContent = Vector<TextItem>;
-    const TextContent& textContent() const { return m_textContent; }
-
-    using HardLineBreaks = Vector<ContentPosition>;
-    const HardLineBreaks& hardLineBreaks() const { return m_hardLineBreaks; }
-
-    unsigned length() const;
-    float width(ContentPosition from, ContentPosition to, float xPosition) const;
-    std::optional<ContentPosition> hyphenPositionBefore(ContentPosition from, ContentPosition to, ContentPosition before) const;
-
-    class Iterator {
-    public:
-        Iterator& operator++();
-        std::optional<TextRun> current() const { return m_contentProvider.current(); };
-
-    private:
-        friend class TextContentProvider;
-        Iterator(TextContentProvider&);
-
-        TextContentProvider& m_contentProvider;
-    };
-    Iterator iterator();
-
-    using TextRunList = Vector<TextRun>;
-    TextRunList textRuns();
-
-private:
-    friend class Iterator;
-
-    const TextItem* findTextItemSlow(ContentPosition) const;
-    float textWidth(const TextItem&, ItemPosition from, ItemPosition to, float xPosition) const;
-    float fixedPitchWidth(String, const TextItem::Style&, ItemPosition from, ItemPosition to, float xPosition) const;
-
-    void findNextRun();
-    std::optional<TextRun> current() const;
-
-    TextContent m_textContent;
-    mutable ConstVectorIterator<TextItem> m_textContentIterator;
-    HardLineBreaks m_hardLineBreaks;
-    std::unique_ptr<SimpleTextRunGenerator> m_simpleTextRunGenerator;
-};
-
-inline TextContentProvider::Iterator::Iterator(TextContentProvider& contentProvider)
-    : m_contentProvider(contentProvider)
-{
-}
-
-inline TextContentProvider::Iterator& TextContentProvider::Iterator::operator++()
-{
-    m_contentProvider.findNextRun();
-    return *this;
-}
-
-}
-}
-#endif
diff --git a/Source/WebCore/layout/inlineformatting/textlayout/simple/SimpleLineBreaker.cpp b/Source/WebCore/layout/inlineformatting/textlayout/simple/SimpleLineBreaker.cpp
deleted file mode 100644 (file)
index a2a74e7..0000000
+++ /dev/null
@@ -1,675 +0,0 @@
-/*
- * Copyright (C) 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. AND ITS CONTRIBUTORS ``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 ITS 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 "SimpleLineBreaker.h"
-
-#if ENABLE(LAYOUT_FORMATTING_CONTEXT)
-
-#include "FontCascade.h"
-#include "Hyphenation.h"
-#include "InlineFormattingContext.h"
-#include "LayoutContext.h"
-#include "RenderStyle.h"
-#include "TextContentProvider.h"
-#include <wtf/IsoMallocInlines.h>
-
-namespace WebCore {
-namespace Layout {
-
-WTF_MAKE_ISO_ALLOCATED_IMPL(SimpleLineBreaker);
-
-struct TextRunSplitPair {
-    TextRun left;
-    TextRun right;
-};
-
-SimpleLineBreaker::TextRunList::TextRunList(const Vector<TextRun>& textRuns)
-    : m_textRuns(textRuns)
-{
-}
-
-SimpleLineBreaker::Line::Line(Vector<LayoutRun>& layoutRuns)
-    : m_layoutRuns(layoutRuns)
-    , m_firstRunIndex(m_layoutRuns.size())
-{
-}
-
-static inline unsigned adjustedEndPosition(const TextRun& textRun)
-{
-    if (textRun.isCollapsed())
-        return textRun.start() + 1;
-    return textRun.end();
-}
-
-void SimpleLineBreaker::Line::setTextAlign(TextAlignMode textAlign)
-{
-    m_style.textAlign = textAlign;
-    m_collectExpansionOpportunities = textAlign == TextAlignMode::Justify;
-}
-
-float SimpleLineBreaker::Line::adjustedLeftForTextAlign(TextAlignMode textAlign) const
-{
-    float remainingWidth = availableWidth();
-    float left = m_left;
-    switch (textAlign) {
-    case TextAlignMode::Left:
-    case TextAlignMode::WebKitLeft:
-    case TextAlignMode::Start:
-        return left;
-    case TextAlignMode::Right:
-    case TextAlignMode::WebKitRight:
-    case TextAlignMode::End:
-        return left + std::max<float>(remainingWidth, 0);
-    case TextAlignMode::Center:
-    case TextAlignMode::WebKitCenter:
-        return left + std::max<float>(remainingWidth / 2, 0);
-    case TextAlignMode::Justify:
-        ASSERT_NOT_REACHED();
-        break;
-    }
-    ASSERT_NOT_REACHED();
-    return left;
-}
-
-void SimpleLineBreaker::Line::justifyRuns()
-{
-    auto widthToDistribute = availableWidth();
-    if (widthToDistribute <= 0)
-        return;
-
-    unsigned expansionOpportunities = 0;
-    for (auto& expansionEntry : m_expansionOpportunityList)
-        expansionOpportunities += expansionEntry.count;
-
-    if (!expansionOpportunities)
-        return;
-
-    auto expansion = widthToDistribute / expansionOpportunities;
-    float accumulatedExpansion = 0;
-    unsigned runIndex = m_firstRunIndex;
-    for (auto& expansionEntry : m_expansionOpportunityList) {
-        if (runIndex >= m_layoutRuns.size()) {
-            ASSERT_NOT_REACHED();
-            return;
-        }
-        auto& layoutRun = m_layoutRuns.at(runIndex++);
-        auto expansionForRun = expansionEntry.count * expansion;
-
-        layoutRun.setExpansion(expansionEntry.behavior, expansionForRun);
-        layoutRun.setLeft(layoutRun.left() + accumulatedExpansion);
-        layoutRun.setRight(layoutRun.right() + accumulatedExpansion + expansionForRun);
-        accumulatedExpansion += expansionForRun;
-    }
-}
-
-void SimpleLineBreaker::Line::adjustRunsForTextAlign(bool lastLine)
-{
-    // Fallback to TextAlignMode::Left (START) alignment for non-collapsable content or for the last line before a forced break/the end of the block.
-    auto textAlign = m_style.textAlign;
-    if (textAlign == TextAlignMode::Justify && (!m_style.collapseWhitespace || lastLine))
-        textAlign = TextAlignMode::Left;
-
-    if (textAlign == TextAlignMode::Justify) {
-        justifyRuns();
-        return;
-    }
-
-    auto adjustedLeft = adjustedLeftForTextAlign(textAlign);
-    if (adjustedLeft == m_left)
-        return;
-
-    for (auto i = m_firstRunIndex; i < m_layoutRuns.size(); ++i) {
-        auto& layoutRun = m_layoutRuns.at(i);
-        layoutRun.setLeft(layoutRun.left() + adjustedLeft);
-        layoutRun.setRight(layoutRun.right() + adjustedLeft);
-    }
-}
-
-static bool expansionOpportunity(TextRun::Type current, TextRun::Type previous)
-{
-    return current == TextRun::Type::Whitespace || (current == TextRun::Type::NonWhitespace && previous == TextRun::Type::NonWhitespace);
-}
-
-static ExpansionBehavior expansionBehavior(bool isAtExpansionOpportunity)
-{
-    ExpansionBehavior expansionBehavior = AllowTrailingExpansion;
-    expansionBehavior |= isAtExpansionOpportunity ? ForbidLeadingExpansion : AllowLeadingExpansion;
-    return expansionBehavior;
-}
-
-void SimpleLineBreaker::Line::collectExpansionOpportunities(const TextRun& textRun, bool textRunCreatesNewLayoutRun)
-{
-    if (textRunCreatesNewLayoutRun) {
-        // Create an entry for this new layout run.
-        m_expansionOpportunityList.append({ });
-    }
-
-    if (!textRun.length())
-        return;
-
-    auto isAtExpansionOpportunity = expansionOpportunity(textRun.type(), m_lastTextRun ? m_lastTextRun->type() : TextRun::Type::Invalid);
-    m_expansionOpportunityList.last().behavior = expansionBehavior(isAtExpansionOpportunity);
-    if (isAtExpansionOpportunity)
-        ++m_expansionOpportunityList.last().count;
-
-    if (textRun.isNonWhitespace())
-        m_lastNonWhitespaceExpansionOppportunity = m_expansionOpportunityList.last();
-}
-
-void SimpleLineBreaker::Line::closeLastRun()
-{
-    if (!m_layoutRuns.size())
-        return;
-
-    m_layoutRuns.last().setIsEndOfLine();
-
-    // Forbid trailing expansion for the last run on line.
-    if (!m_collectExpansionOpportunities || m_expansionOpportunityList.isEmpty())
-        return;
-
-    auto& lastExpansionEntry = m_expansionOpportunityList.last();
-    auto expansionBehavior = lastExpansionEntry.behavior;
-    // Remove allow and add forbid.
-    expansionBehavior ^= AllowTrailingExpansion;
-    expansionBehavior |= ForbidTrailingExpansion;
-    lastExpansionEntry.behavior = expansionBehavior;
-}
-
-void SimpleLineBreaker::Line::append(const TextRun& textRun)
-{
-    auto start = textRun.start();
-    auto end = adjustedEndPosition(textRun);
-    auto previousLogicalRight = m_left + m_runsWidth;
-    bool textRunCreatesNewLayoutRun = !m_lastTextRun || m_lastTextRun->isCollapsed();
-
-    m_runsWidth += textRun.width();
-    if (textRun.isNonWhitespace()) {
-        m_trailingWhitespaceWidth = 0;
-        m_lastNonWhitespaceTextRun = textRun;
-    } else if (textRun.isWhitespace())
-        m_trailingWhitespaceWidth += textRun.width();
-
-    if (m_collectExpansionOpportunities)
-        collectExpansionOpportunities(textRun, textRunCreatesNewLayoutRun);
-
-    // New line needs new run.
-    if (textRunCreatesNewLayoutRun)
-        m_layoutRuns.append({ start, end, previousLogicalRight, previousLogicalRight + textRun.width(), textRun.hasHyphen() });
-    else {
-        auto& lastRun = m_layoutRuns.last();
-        lastRun.setEnd(end);
-        lastRun.setRight(lastRun.right() + textRun.width());
-        if (textRun.hasHyphen())
-            lastRun.setHasHyphen();
-    }
-
-    m_lastTextRun = textRun;
-}
-
-void SimpleLineBreaker::Line::collapseTrailingWhitespace()
-{
-    if (!m_lastTextRun || !m_lastTextRun->isWhitespace())
-        return;
-
-    if (!m_lastNonWhitespaceTextRun) {
-        // This essentially becomes an empty line.
-        reset();
-        return;
-    }
-
-    m_runsWidth -= m_trailingWhitespaceWidth;
-    m_lastTextRun = m_lastNonWhitespaceTextRun;
-
-    while (m_trailingWhitespaceWidth) {
-        auto& lastLayoutRun = m_layoutRuns.last();
-
-        if (lastLayoutRun.end() <= m_lastNonWhitespaceTextRun->end())
-            break;
-
-        // Full remove.
-        if (lastLayoutRun.start() >= m_lastNonWhitespaceTextRun->end()) {
-            m_trailingWhitespaceWidth -= lastLayoutRun.width();
-            m_layoutRuns.removeLast();
-            continue;
-        }
-        // Partial remove.
-        lastLayoutRun.setRight(lastLayoutRun.right() - m_trailingWhitespaceWidth);
-        lastLayoutRun.setEnd(m_lastNonWhitespaceTextRun->end());
-        m_trailingWhitespaceWidth = 0;
-    }
-
-    if (m_collectExpansionOpportunities) {
-        ASSERT(m_lastNonWhitespaceExpansionOppportunity);
-        ASSERT(!m_expansionOpportunityList.isEmpty());
-        m_expansionOpportunityList.last() = *m_lastNonWhitespaceExpansionOppportunity;
-    }
-}
-
-void SimpleLineBreaker::Line::reset()
-{
-    m_runsWidth = 0;
-    m_firstRunIndex = m_layoutRuns.size();
-    m_availableWidth = 0;
-    m_trailingWhitespaceWidth  = 0;
-    m_expansionOpportunityList.clear();
-    m_lastNonWhitespaceExpansionOppportunity = { };
-    m_lastTextRun = std::nullopt;
-    m_lastNonWhitespaceTextRun = std::nullopt;
-}
-
-// FIXME: Use variable style based on the current text run.
-SimpleLineBreaker::Style::Style(const RenderStyle& style)
-    : font(style.fontCascade())
-    , wrapLines(style.autoWrap())
-    , breakAnyWordOnOverflow(style.wordBreak() == WordBreak::BreakAll && wrapLines)
-    , breakFirstWordOnOverflow(breakAnyWordOnOverflow || (style.breakWords() && (wrapLines || style.preserveNewline())))
-    , collapseWhitespace(style.collapseWhiteSpace())
-    , preWrap(wrapLines && !collapseWhitespace)
-    , preserveNewline(style.preserveNewline())
-    , textAlign(style.textAlign())
-    , shouldHyphenate(style.hyphens() == Hyphens::Auto && canHyphenate(style.locale()))
-    , hyphenStringWidth(shouldHyphenate ? font.width(WebCore::TextRun(String(style.hyphenString()))) : 0)
-    , hyphenLimitBefore(style.hyphenationLimitBefore() < 0 ? 2 : style.hyphenationLimitBefore())
-    , hyphenLimitAfter(style.hyphenationLimitAfter() < 0 ? 2 : style.hyphenationLimitAfter())
-    , locale(style.locale())
-{
-    if (style.hyphenationLimitLines() > -1)
-        hyphenLimitLines = style.hyphenationLimitLines();
-}
-
-SimpleLineBreaker::SimpleLineBreaker(const Vector<TextRun>& textRuns, const TextContentProvider& contentProvider, LineConstraintList&& lineConstraintList, const RenderStyle& style)
-    : m_contentProvider(contentProvider)
-    , m_style(style)
-    , m_textRunList(textRuns)
-    , m_currentLine(m_layoutRuns)
-    , m_lineConstraintList(WTFMove(lineConstraintList))
-    , m_lineConstraintIterator(m_lineConstraintList)
-{
-    ASSERT(m_lineConstraintList.size());
-    // Since the height of the content is undefined, the last vertical position in the constraint list should always be infinite.
-    ASSERT(!m_lineConstraintList.last().verticalPosition);
-}
-
-Vector<LayoutRun> SimpleLineBreaker::runs()
-{
-    while (m_textRunList.current()) {
-        handleLineStart();
-        createRunsForLine();
-        handleLineEnd();
-    }
-
-    return m_layoutRuns;
-}
-
-void SimpleLineBreaker::handleLineEnd()
-{
-    auto lineHasContent = m_currentLine.hasContent();
-    if (lineHasContent) {
-        ASSERT(m_layoutRuns.size());
-        ++m_numberOfLines;
-        m_currentLine.closeLastRun();
-
-        auto lastLine = !m_textRunList.current();
-        m_currentLine.adjustRunsForTextAlign(lastLine);
-    }
-    // Check if we need to disable hyphenation.
-    if (m_style.hyphenLimitLines) {
-        if (!lineHasContent || (m_layoutRuns.size() && !m_layoutRuns.last().hasHyphen()))
-            m_numberOfPrecedingLinesWithHyphen = 0;
-        else
-            ++m_numberOfPrecedingLinesWithHyphen;
-        m_hyphenationIsDisabled = m_numberOfPrecedingLinesWithHyphen >= *m_style.hyphenLimitLines;
-    }
-
-    m_previousLineHasNonForcedContent = lineHasContent && m_currentLine.availableWidth() >= 0;
-    m_currentLine.reset();
-}
-
-void SimpleLineBreaker::handleLineStart()
-{
-    auto lineConstraint = this->lineConstraint(verticalPosition());
-    m_currentLine.setLeft(lineConstraint.left);
-    m_currentLine.setTextAlign(m_style.textAlign);
-    m_currentLine.setCollapseWhitespace(m_style.collapseWhitespace);
-    m_currentLine.setAvailableWidth(lineConstraint.right - lineConstraint.left);
-}
-
-static bool isTextAlignRight(TextAlignMode textAlign)
-{
-    return textAlign == TextAlignMode::Right || textAlign == TextAlignMode::WebKitRight;
-}
-
-void SimpleLineBreaker::createRunsForLine()
-{
-    collapseLeadingWhitespace();
-
-    while (auto textRun = m_textRunList.current()) {
-
-        if (!textRun->isLineBreak() && (!wrapContentOnOverflow() || m_currentLine.availableWidth() >= textRun->width())) {
-            m_currentLine.append(*textRun);
-            ++m_textRunList;
-            continue;
-        }
-
-        // This run is either a linebreak or it does not fit the current line.
-        if (textRun->isLineBreak()) {
-            // Add the new line only if there's nothing on the line. (otherwise the extra new line character would show up at the end of the content.)
-            if (textRun->isHardLineBreak() || !m_currentLine.hasContent()) {
-                if (isTextAlignRight(m_style.textAlign))
-                    m_currentLine.collapseTrailingWhitespace();
-                m_currentLine.append(*textRun);
-            }
-            ++m_textRunList;
-            break;
-        }
-
-        // Overflow wrapping behaviour:
-        // 1. Whitesapce collapse on: whitespace is skipped. Jump to next line.
-        // 2. Whitespace collapse off: whitespace is wrapped.
-        // 3. First, non-whitespace run is either wrapped or kept on the line. (depends on overflow-wrap)
-        // 4. Non-whitespace run when there's already another run on the line either gets wrapped (word-break: break-all) or gets pushed to the next line.
-
-        // Whitespace run.
-        if (textRun->isWhitespace()) {
-            // Process collapsed whitespace again for the next line.
-            if (textRun->isCollapsed())
-                break;
-            // Try to split the whitespace; left part stays on this line, right is pushed to next line.
-            if (!splitTextRun(*textRun))
-                ++m_textRunList;
-            break;
-        }
-
-        // Non-whitespace run. (!style.wrapLines: bug138102(preserve existing behavior)
-        if (((!m_currentLine.hasContent() && m_style.breakFirstWordOnOverflow) || m_style.breakAnyWordOnOverflow) || !m_style.wrapLines) {
-            // Try to split the run; left side stays on this line, right side is pushed to next line.
-            if (!splitTextRun(*textRun))
-                ++m_textRunList;
-            break;
-        }
-
-        ASSERT(textRun->isNonWhitespace());
-        // Find out if this non-whitespace fragment has a hyphen where we can break.
-        if (m_style.shouldHyphenate && !m_hyphenationIsDisabled) {
-            if (!splitTextRun(*textRun)) {
-                ++m_textRunList;
-                break;
-            }
-        }
-
-        // Non-breakable non-whitespace first run. Add it to the current line. -it overflows though.
-        if (!m_currentLine.hasContent()) {
-            handleOverflownRun();
-            break;
-        }
-        // Non-breakable non-whitespace run when there's already content on the line. Process it on the next line.
-        break;
-    }
-
-    collapseTrailingWhitespace();
-}
-
-void SimpleLineBreaker::handleOverflownRun()
-{
-    auto textRun = m_textRunList.current();
-    ASSERT(textRun);
-
-    m_currentLine.append(*textRun);
-    ++m_textRunList;
-
-    // If the forced run is followed by a line break, we need to process it on this line, otherwise the next line would start with a line break (double line break).
-    // "foobarlongtext<br>foobar" should produce
-    // foobarlongtext
-    // foobar
-    // and not
-    // foobarlongtext
-    //
-    // foobar
-
-    // First check for collapsable whitespace.
-    textRun = m_textRunList.current();
-    if (!textRun)
-        return;
-
-    if (textRun->isWhitespace() && m_style.collapseWhitespace) {
-        ++m_textRunList;
-        textRun = m_textRunList.current();
-        if (!textRun)
-            return;
-    }
-
-    if (textRun->isHardLineBreak()) {
-        // <br> always produces a run. (required by testing output)
-        m_currentLine.append(*textRun);
-        ++m_textRunList;
-        return;
-    }
-
-    if (textRun->isSoftLineBreak() && !m_style.preserveNewline)
-        ++m_textRunList;
-}
-
-void SimpleLineBreaker::collapseLeadingWhitespace()
-{
-    auto textRun = m_textRunList.current();
-    if (!textRun || !textRun->isWhitespace())
-        return;
-
-    // Special overflow pre-wrap whitespace/newline handling for overflow whitespace: skip the leading whitespace/newline (even when style says not-collapsible)
-    // if we managed to put some content on the previous line.
-    if (m_textRunList.isCurrentOverridden()) {
-        auto collapseWhitespace = m_style.collapseWhitespace || m_style.preWrap;
-        if (collapseWhitespace && m_previousLineHasNonForcedContent) {
-            ++m_textRunList;
-            // If collapsing the whitespace puts us on a newline, skip the soft newline too as we already wrapped the line.
-            textRun = m_textRunList.current();
-            // <br> always produces a run. (required by testing output).
-            if (!textRun || textRun->isHardLineBreak())
-                return;
-            auto collapseSoftLineBreak = textRun->isSoftLineBreak() && (!m_style.preserveNewline || m_style.preWrap);
-            if (collapseSoftLineBreak) {
-                ++m_textRunList;
-                textRun = m_textRunList.current();
-            }
-        }
-    }
-
-    // Collapse leading whitespace if the style says so.
-    if (!m_style.collapseWhitespace)
-        return;
-
-    if (!textRun || !textRun->isWhitespace())
-        return;
-
-    ++m_textRunList;
-}
-
-void SimpleLineBreaker::collapseTrailingWhitespace()
-{
-    if (!m_currentLine.hasTrailingWhitespace())
-        return;
-
-    // Remove collapsed whitespace, or non-collapsed pre-wrap whitespace, unless it's the only content on the line -so removing the whitesapce would produce an empty line.
-    bool collapseWhitespace = m_style.collapseWhitespace || m_style.preWrap;
-    if (!collapseWhitespace)
-        return;
-
-    // pre-wrap?
-    if (m_currentLine.isWhitespaceOnly() && m_style.preWrap)
-        return;
-
-    m_currentLine.collapseTrailingWhitespace();
-}
-
-std::optional<ContentPosition> SimpleLineBreaker::hyphenPositionBefore(const TextRun& textRun, ContentPosition before) const
-{
-    // Enough characters before the split position?
-    if (before <= textRun.start() + m_style.hyphenLimitBefore)
-        return { };
-
-    // Adjust before to accommodate the limit-after value (this is the last potential hyphen location).
-    before = std::min(before, textRun.end() - m_style.hyphenLimitAfter + 1);
-
-    auto hyphenLocation = m_contentProvider.hyphenPositionBefore(textRun.start(), textRun.end(), before);
-    if (!hyphenLocation)
-        return { };
-
-    ASSERT(hyphenLocation >= textRun.start() && hyphenLocation <= textRun.end());
-    // Check if there are enough characters before and after the hyphen.
-    if (*hyphenLocation < textRun.start() + m_style.hyphenLimitBefore || m_style.hyphenLimitAfter > (textRun.end() - *hyphenLocation))
-        return { };
-
-    return hyphenLocation;
-}
-
-std::optional<ContentPosition> SimpleLineBreaker::adjustSplitPositionWithHyphenation(const TextRun& textRun, ContentPosition splitPosition, float leftSideWidth) const
-{
-    ASSERT(textRun.isNonWhitespace());
-
-    // Use hyphen?
-    if (!m_style.shouldHyphenate || m_hyphenationIsDisabled)
-        return { };
-
-    // Check if there are enough characters in the run.
-    auto runLength = textRun.length();
-    if (m_style.hyphenLimitBefore >= runLength || m_style.hyphenLimitAfter >= runLength || m_style.hyphenLimitBefore + m_style.hyphenLimitAfter > runLength)
-        return { };
-
-    // FIXME: This is a workaround for webkit.org/b/169613. See maxPrefixWidth computation in tryHyphenating().
-    // It does not work properly with non-collapsed leading tabs when font is enlarged.
-    auto adjustedAvailableWidth = m_currentLine.availableWidth() - m_style.hyphenStringWidth;
-    if (m_currentLine.hasContent())
-        adjustedAvailableWidth += m_style.font.spaceWidth();
-
-    if (!enoughWidthForHyphenation(adjustedAvailableWidth, m_style.font.pixelSize()))
-        return { };
-
-    // Find the split position where hyphen surely fits (we might be able to fit the hyphen at the split position).
-    auto left = textRun.start();
-    auto right = splitPosition;
-    while (leftSideWidth + m_style.hyphenStringWidth > m_currentLine.availableWidth()) {
-        if (--right <= left)
-            return { }; // No space for hyphen.
-        // FIXME: for correctness (kerning) we should instead measure the left side.
-        leftSideWidth -= m_contentProvider.width(right, right + 1, 0);
-    }
-
-    // Find out if there's an actual hyphen opportinity at this position (or before).
-    return hyphenPositionBefore(textRun, right + 1);
-}
-
-bool SimpleLineBreaker::splitTextRun(const TextRun& textRun)
-{
-    // Single character handling.
-    if (textRun.start() + 1 == textRun.end()) {
-        // Keep at least one character on empty lines.
-        if (!m_currentLine.hasContent()) {
-            m_currentLine.append(textRun);
-            return false;
-        }
-        m_textRunList.overrideCurrent(textRun);
-        return true;
-    }
-
-    auto splitPair = split(textRun, m_currentLine.availableWidth());
-    m_currentLine.append(splitPair.left);
-    m_textRunList.overrideCurrent(splitPair.right);
-    return true;
-}
-
-TextRunSplitPair SimpleLineBreaker::split(const TextRun& textRun, float leftSideMaximumWidth) const
-{
-    // Preserve the left width for the final split position so that we don't need to remeasure the left side again.
-    float leftSideWidth = 0;
-    auto left = textRun.start();
-
-    // Pathological case of (extremely)long string and narrow lines.
-    // Adjust the range so that we can pick a reasonable midpoint.
-    auto averageCharacterWidth = textRun.width() / textRun.length();
-    auto right = std::min<unsigned>(left + (2 * leftSideMaximumWidth / averageCharacterWidth), textRun.end() - 1);
-    while (left < right) {
-        auto middle = (left + right) / 2;
-        auto width = m_contentProvider.width(textRun.start(), middle + 1, 0);
-        if (width < leftSideMaximumWidth) {
-            left = middle + 1;
-            leftSideWidth = width;
-        } else if (width > leftSideMaximumWidth)
-            right = middle;
-        else {
-            right = middle + 1;
-            leftSideWidth = width;
-            break;
-        }
-    }
-
-    // Keep at least one character on empty lines.
-    bool splitHasHypen = false;
-    left = textRun.start();
-    if (left >= right && !m_currentLine.hasContent()) {
-        right = left + 1;
-        leftSideWidth = m_contentProvider.width(left, right, 0);
-    } else if (textRun.isNonWhitespace()) {
-        if (auto hyphenPosition = adjustSplitPositionWithHyphenation(textRun, right, leftSideWidth)) {
-            splitHasHypen = true;
-            right = *hyphenPosition;
-            leftSideWidth = m_contentProvider.width(left, right, 0) + m_style.hyphenStringWidth;
-        }
-    }
-
-    auto rightSideWidth = m_contentProvider.width(right, textRun.end(), 0);
-    if (textRun.isNonWhitespace())
-        return { splitHasHypen ? TextRun::createNonWhitespaceRunWithHyphen(left, right, leftSideWidth) : TextRun::createNonWhitespaceRun(left, right, leftSideWidth),
-            TextRun::createNonWhitespaceRun(right, textRun.end(), rightSideWidth) };
-
-    // We never split collapsed whitespace.
-    ASSERT(textRun.isWhitespace());
-    ASSERT(!textRun.isCollapsed());
-    return { TextRun::createWhitespaceRun(left, right, leftSideWidth, false), TextRun::createWhitespaceRun(right, textRun.end(), rightSideWidth, false) };
-}
-
-SimpleLineBreaker::LineConstraint SimpleLineBreaker::lineConstraint(float verticalPosition)
-{
-    auto* lineConstraint = m_lineConstraintIterator.current();
-    if (!lineConstraint) {
-        ASSERT_NOT_REACHED();
-        return { };
-    }
-
-    while (lineConstraint->verticalPosition && verticalPosition > *lineConstraint->verticalPosition) {
-        lineConstraint = (++m_lineConstraintIterator).current();
-        if (!lineConstraint) {
-            // The vertical position of the last entry in the constraint list is supposed to be infinite.
-            ASSERT_NOT_REACHED();
-            return { };
-        }
-    }
-
-    return *lineConstraint;
-}
-
-}
-}
-#endif
diff --git a/Source/WebCore/layout/inlineformatting/textlayout/simple/SimpleLineBreaker.h b/Source/WebCore/layout/inlineformatting/textlayout/simple/SimpleLineBreaker.h
deleted file mode 100644 (file)
index 31ca2c9..0000000
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Copyright (C) 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. AND ITS CONTRIBUTORS ``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 ITS 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
-
-#if ENABLE(LAYOUT_FORMATTING_CONTEXT)
-
-#include "RenderStyleConstants.h"
-#include "Runs.h"
-#include <wtf/IsoMalloc.h>
-
-namespace WebCore {
-
-class FontCascade;
-class RenderStyle;
-
-namespace Layout {
-
-class TextContentProvider;
-struct TextRunSplitPair;
-
-class SimpleLineBreaker {
-    WTF_MAKE_ISO_ALLOCATED(SimpleLineBreaker);
-public:
-    struct LineConstraint {
-        // verticalPosition sets the bottom edge for this constraint. Last entry in the list
-        // should always be std::nullopt indicating that left/right pair is set for the rest of the lines
-        // (Normally there's only one entry with the left/right block edges).
-        std::optional<float> verticalPosition;
-        float left { 0 };
-        float right { 0 };
-    };
-    using LineConstraintList = Vector<LineConstraint>;
-    SimpleLineBreaker(const Vector<TextRun>&, const TextContentProvider&, LineConstraintList&&, const RenderStyle&);
-
-    void setLineHeight(float lineHeight) { m_lineHeight = lineHeight; }
-
-    Vector<LayoutRun> runs();
-
-private:
-    struct Style {
-        explicit Style(const RenderStyle&);
-
-        const FontCascade& font;
-        bool wrapLines { false };
-        bool breakAnyWordOnOverflow { false };
-        bool breakFirstWordOnOverflow { false };
-        bool collapseWhitespace { false };
-        bool preWrap { false };
-        bool preserveNewline { false };
-        TextAlignMode textAlign { TextAlignMode::Left };
-        bool shouldHyphenate;
-        float hyphenStringWidth;
-        ItemPosition hyphenLimitBefore;
-        ItemPosition hyphenLimitAfter;
-        AtomicString locale;
-        std::optional<unsigned> hyphenLimitLines;
-    };
-
-    class TextRunList {
-    public:
-        TextRunList(const Vector<TextRun>& textRuns);
-
-        std::optional<TextRun> current() const;
-        TextRunList& operator++();
-
-        void overrideCurrent(TextRun textRun) { m_overrideTextRun = textRun; }
-        bool isCurrentOverridden() const { return m_overrideTextRun.has_value(); }
-
-    private:
-        const Vector<TextRun>& m_textRuns;
-        unsigned m_currentIndex { 0 };
-        std::optional<TextRun> m_overrideTextRun;
-    };
-
-    class Line {
-    public:
-        Line(Vector<LayoutRun>& layoutRuns);
-
-        void append(const TextRun&);
-        float availableWidth() const { return m_availableWidth - m_runsWidth; }
-        bool hasContent() const { return m_runsWidth; }
-
-        void reset();
-        bool hasTrailingWhitespace() const { return m_trailingWhitespaceWidth; }
-        bool isWhitespaceOnly() const { return m_runsWidth == m_trailingWhitespaceWidth; }
-        void collapseTrailingWhitespace();
-
-        void setAvailableWidth(float availableWidth) { m_availableWidth = availableWidth; }
-        void setLeft(float left) { m_left = left; }
-        void setTextAlign(TextAlignMode);
-        void setCollapseWhitespace(bool collapseWhitespace) { m_style.collapseWhitespace = collapseWhitespace; }
-
-        void closeLastRun();
-        void adjustRunsForTextAlign(bool lastLine);
-
-    private:
-        struct Style {
-            bool collapseWhitespace { false };
-            TextAlignMode textAlign { TextAlignMode::Left };
-        };
-
-        float adjustedLeftForTextAlign(TextAlignMode) const;
-        void justifyRuns();
-        void collectExpansionOpportunities(const TextRun&, bool textRunCreatesNewLayoutRun);
-
-        Vector<LayoutRun>& m_layoutRuns;
-        Style m_style;
-
-        float m_runsWidth { 0 };
-        float m_availableWidth { 0 };
-        float m_left { 0 };
-        float m_trailingWhitespaceWidth { 0 };
-        unsigned m_firstRunIndex { 0 };
-        std::optional<TextRun> m_lastTextRun;
-        std::optional<TextRun> m_lastNonWhitespaceTextRun;
-        bool m_collectExpansionOpportunities { false };
-        struct ExpansionOpportunity {
-            unsigned count { 0 };
-            ExpansionBehavior behavior { DefaultExpansion };
-        };
-        Vector<ExpansionOpportunity> m_expansionOpportunityList;
-        std::optional<ExpansionOpportunity> m_lastNonWhitespaceExpansionOppportunity;
-    };
-
-    void handleLineStart();
-    void handleLineEnd();
-    bool wrapContentOnOverflow() const { return m_style.wrapLines || m_style.breakFirstWordOnOverflow || m_style.breakAnyWordOnOverflow; }
-    void collectRuns();
-    void createRunsForLine();
-    void handleOverflownRun();
-    void collapseLeadingWhitespace();
-    void collapseTrailingWhitespace();
-    bool splitTextRun(const TextRun&);
-    TextRunSplitPair split(const TextRun&, float leftSideMaximumWidth) const;
-    std::optional<ContentPosition> hyphenPositionBefore(const TextRun&, ContentPosition before) const;
-    std::optional<ContentPosition> adjustSplitPositionWithHyphenation(const TextRun&, ContentPosition splitPosition, float leftSideWidth) const;
-    LineConstraint lineConstraint(float verticalPosition);
-    float verticalPosition() const { return m_numberOfLines * m_lineHeight; }
-
-    const TextContentProvider& m_contentProvider;
-    const Style m_style;
-
-    TextRunList m_textRunList;
-
-    Vector<LayoutRun> m_layoutRuns;
-    Line m_currentLine;
-
-    LineConstraintList m_lineConstraintList;
-    ConstVectorIterator<LineConstraint> m_lineConstraintIterator;
-
-    unsigned m_numberOfLines { 0 };
-    bool m_previousLineHasNonForcedContent { false };
-    float m_lineHeight { 0 };
-    bool m_hyphenationIsDisabled { false };
-    unsigned m_numberOfPrecedingLinesWithHyphen { 0 };
-};
-
-inline std::optional<TextRun> SimpleLineBreaker::TextRunList::current() const
-{
-    if (m_overrideTextRun)
-        return m_overrideTextRun;
-
-    if (m_currentIndex < m_textRuns.size())
-        return m_textRuns[m_currentIndex];
-
-    return { };
-}
-
-inline SimpleLineBreaker::TextRunList& SimpleLineBreaker::TextRunList::operator++()
-{
-    m_overrideTextRun = { };
-    ++m_currentIndex;
-    return *this;
-}
-
-}
-}
-#endif
diff --git a/Source/WebCore/layout/inlineformatting/textlayout/simple/SimpleTextRunGenerator.cpp b/Source/WebCore/layout/inlineformatting/textlayout/simple/SimpleTextRunGenerator.cpp
deleted file mode 100644 (file)
index 4fe6623..0000000
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Copyright (C) 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. AND ITS CONTRIBUTORS ``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 ITS 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 "SimpleTextRunGenerator.h"
-
-#if ENABLE(LAYOUT_FORMATTING_CONTEXT)
-
-#include "BreakLines.h"
-#include "RenderStyle.h"
-#include "TextContentProvider.h"
-#include <wtf/IsoMallocInlines.h>
-
-namespace WebCore {
-namespace Layout {
-
-WTF_MAKE_ISO_ALLOCATED_IMPL(SimpleTextRunGenerator);
-
-SimpleTextRunGenerator::SimpleTextRunGenerator(const TextContentProvider& contentProvider)
-    : m_contentProvider(contentProvider)
-    , m_textIterator(m_contentProvider.textContent())
-    , m_hardLineBreakIterator(contentProvider.hardLineBreaks())
-{
-}
-
-std::optional<TextRun> SimpleTextRunGenerator::current() const
-{
-    // A run can either be
-    // 1. whitespace (collasped, non-collapsed multi or single)
-    // 2. non-whitespace
-    // 3. soft line break
-    // 4. hard line break
-    // 5. invalid
-    return m_currentRun;
-}
-
-void SimpleTextRunGenerator::reset()
-{
-    m_xPosition = 0;
-    m_currentRun = { };
-    m_currentPosition = { };
-}
-
-void SimpleTextRunGenerator::findNextRun()
-{
-    // End of content -not even trailing linebreaks?
-    if (m_currentPosition == m_contentProvider.length() && !m_hardLineBreakIterator.current()) {
-        m_currentRun = { };
-        return;
-    }
-
-    // Check if we are at a <br>.
-    while (auto* hardLineBreak = m_hardLineBreakIterator.current()) {
-        if (m_currentPosition < *hardLineBreak)
-            break;
-        if (m_currentPosition == *hardLineBreak) {
-            ++m_hardLineBreakIterator;
-            m_currentRun = TextRun::createHardLineBreakRun(m_currentPosition);
-            return;
-        }
-        ASSERT_NOT_REACHED();
-    }
-
-    // Soft linebreak?
-    if (isAtSoftLineBreak()) {
-        m_currentRun = TextRun::createSoftLineBreakRun(m_currentPosition);
-        ++m_currentPosition;
-        return;
-    }
-
-    auto startPosition = m_currentPosition;
-    auto isWhitespaceCollapsed = moveToNextNonWhitespacePosition();
-    // Whitespace?
-    if (m_currentPosition > startPosition) {
-        auto width = m_contentProvider.width(startPosition, isWhitespaceCollapsed ? startPosition + 1 : m_currentPosition, m_xPosition);
-        m_currentRun = TextRun::createWhitespaceRun(startPosition, m_currentPosition, width, isWhitespaceCollapsed);
-        m_xPosition += width;
-        return;
-    }
-
-    moveToNextBreakablePosition();
-    // nextBreakablePosition returns the same position for certain characters such as hyphens. Call next again with modified position.
-    auto skipCurrentPosition = m_currentPosition == startPosition;
-    if (skipCurrentPosition) {
-        ++m_currentPosition;
-        moveToNextBreakablePosition();
-    }
-    auto width = m_contentProvider.width(startPosition, m_currentPosition, m_xPosition);
-    m_currentRun = TextRun::createNonWhitespaceRun(startPosition, m_currentPosition, width);
-    m_xPosition += width;
-}
-
-void SimpleTextRunGenerator::moveToNextBreakablePosition()
-{
-    auto findNextBreakablePosition = [&](const TextContentProvider::TextItem& textItem, ItemPosition startPosition) {
-        // Swap iterator's content if we advanced to a new string.
-        auto iteratorText = m_lineBreakIterator.stringView();
-        if (iteratorText != textItem.text) {
-            auto textLength = iteratorText.length();
-            auto lastCharacter = textLength > 0 ? iteratorText[textLength - 1] : 0;
-            auto secondToLastCharacter = textLength > 1 ? iteratorText[textLength - 2] : 0;
-            m_lineBreakIterator.setPriorContext(lastCharacter, secondToLastCharacter);
-            m_lineBreakIterator.resetStringAndReleaseIterator(textItem.text, textItem.style.locale, LineBreakIteratorMode::Default);
-        }
-
-        if (textItem.style.keepAllWordsForCJK) {
-            if (textItem.style.breakNBSP)
-                return nextBreakablePositionKeepingAllWords(m_lineBreakIterator, startPosition);
-            return nextBreakablePositionKeepingAllWordsIgnoringNBSP(m_lineBreakIterator, startPosition);
-        }
-
-        if (m_lineBreakIterator.mode() == LineBreakIteratorMode::Default) {
-            if (textItem.style.breakNBSP)
-                return WebCore::nextBreakablePosition(m_lineBreakIterator, startPosition);
-            return nextBreakablePositionIgnoringNBSP(m_lineBreakIterator, startPosition);
-        }
-
-        if (textItem.style.breakNBSP)
-            return nextBreakablePositionWithoutShortcut(m_lineBreakIterator, startPosition);
-        return nextBreakablePositionIgnoringNBSPWithoutShortcut(m_lineBreakIterator, startPosition);
-    };
-
-    while (auto* textItem = m_textIterator.current()) {
-        auto currentItemPosition = m_currentPosition.itemPosition();
-        auto nextBreakablePosition = findNextBreakablePosition(*textItem, currentItemPosition);
-        ASSERT(nextBreakablePosition >= currentItemPosition);
-        m_currentPosition += (nextBreakablePosition - currentItemPosition);
-        // Is the next breakable position still in this text?
-        auto textItemLength = textItem->end - textItem->start;
-        if (m_currentPosition.itemPosition() < textItemLength)
-            break;
-
-        // Hard line break inbetween?
-        if (isAtLineBreak())
-            break;
-
-        // Move over to the next text item.
-        m_currentPosition.resetItemPosition();
-        ++m_textIterator;
-    }
-}
-
-bool SimpleTextRunGenerator::moveToNextNonWhitespacePosition()
-{
-    auto startPosition = m_currentPosition;
-    auto collapseWhitespace = false;
-    while (auto* textItem = m_textIterator.current()) {
-        auto string = textItem->text;
-        auto preserveNewline = textItem->style.preserveNewline;
-        collapseWhitespace = textItem->style.collapseWhitespace;
-        for (; m_currentPosition.itemPosition() < string.length(); ++m_currentPosition) {
-            auto character = string[m_currentPosition.itemPosition()];
-            bool isWhitespace = character == ' ' || character == '\t' || (!preserveNewline && character == '\n');
-            if (!isWhitespace)
-                return collapseWhitespace && m_currentPosition - startPosition > 1;
-        }
-        // Check if there's a hard linebreak between text content.
-        if (isAtLineBreak())
-            break;
-
-        // Move over to the next text item.
-        m_currentPosition.resetItemPosition();
-        ++m_textIterator;
-    }
-
-    return collapseWhitespace && m_currentPosition - startPosition > 1;
-}
-
-bool SimpleTextRunGenerator::isAtLineBreak() const
-{
-    if (auto* currentHardLineBreakPosition = m_hardLineBreakIterator.current())
-        return *currentHardLineBreakPosition == m_currentPosition;
-    return isAtSoftLineBreak();
-}
-
-bool SimpleTextRunGenerator::isAtSoftLineBreak() const
-{
-    auto* textItem = m_textIterator.current();
-    if (!textItem)
-        return false;
-
-    if (!textItem->style.preserveNewline)
-        return false;
-
-    return textItem->text[m_currentPosition.itemPosition()] == '\n';
-}
-
-}
-}
-#endif
diff --git a/Source/WebCore/layout/inlineformatting/textlayout/simple/SimpleTextRunGenerator.h b/Source/WebCore/layout/inlineformatting/textlayout/simple/SimpleTextRunGenerator.h
deleted file mode 100644 (file)
index 3e77440..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 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. AND ITS CONTRIBUTORS ``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 ITS 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
-
-#if ENABLE(LAYOUT_FORMATTING_CONTEXT)
-
-#include "TextContentProvider.h"
-#include <wtf/IsoMalloc.h>
-#include <wtf/text/TextBreakIterator.h>
-
-namespace WebCore {
-
-class RenderStyle;
-
-namespace Layout {
-
-class SimpleTextRunGenerator {
-    WTF_MAKE_ISO_ALLOCATED(SimpleTextRunGenerator);
-public:
-    SimpleTextRunGenerator(const TextContentProvider&);
-
-    void findNextRun();
-    std::optional<TextRun> current() const;
-    void reset();
-
-private:
-    void moveToNextBreakablePosition();
-    bool moveToNextNonWhitespacePosition();
-    bool isAtLineBreak() const;
-    bool isAtSoftLineBreak() const;
-    ItemPosition toItemPosition(ContentPosition) const;
-
-    struct Position {
-        Position() = default;
-
-        bool operator==(ContentPosition position) const { return m_contentPosition == position; }
-        bool operator<(ContentPosition position) const { return m_contentPosition < position; }
-        operator ContentPosition() const { return contentPosition(); }
-        Position& operator++();
-        Position& operator+=(unsigned);
-
-        void resetItemPosition() { m_itemPosition = 0; }
-
-        ContentPosition contentPosition() const { return m_contentPosition; }
-        ItemPosition itemPosition() const { return m_itemPosition; }
-
-    private:
-        ContentPosition m_contentPosition { 0 };
-        ItemPosition m_itemPosition { 0 };
-    };
-
-    const TextContentProvider& m_contentProvider;
-    ConstVectorIterator<TextContentProvider::TextItem> m_textIterator;
-    ConstVectorIterator<ContentPosition> m_hardLineBreakIterator;
-
-    Position m_currentPosition;
-    std::optional<TextRun> m_currentRun;
-    float m_xPosition { 0 };
-
-    LazyLineBreakIterator m_lineBreakIterator;
-};
-
-inline SimpleTextRunGenerator::Position& SimpleTextRunGenerator::Position::operator++()
-{
-    ++m_contentPosition;
-    ++m_itemPosition;
-    return *this;
-}
-
-inline SimpleTextRunGenerator::Position& SimpleTextRunGenerator::Position::operator+=(unsigned advance)
-{
-    m_contentPosition += advance;
-    m_itemPosition += advance;
-    return *this;
-}
-
-}
-}
-#endif