Title: [254827] trunk/Source/WebCore
Revision
254827
Author
[email protected]
Date
2020-01-20 08:06:28 -0800 (Mon, 20 Jan 2020)

Log Message

[LFC][IFC] Add support for the rare case of revert
https://bugs.webkit.org/show_bug.cgi?id=206486
<rdar://problem/58720638>

Reviewed by Antti Koivisto.

This patch re-introduces the support for revert when a previous wrap position turns out to be the line end position.

* layout/inlineformatting/InlineLineBuilder.cpp:
(WebCore::Layout::LineBuilder::initialize):
(WebCore::Layout::LineBuilder::clearContent):
* layout/inlineformatting/InlineLineBuilder.h:
* layout/inlineformatting/LineLayoutContext.cpp:
(WebCore::Layout::LineLayoutContext::layoutLine):
(WebCore::Layout::LineLayoutContext::rebuildLineForRevert):
* layout/inlineformatting/LineLayoutContext.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (254826 => 254827)


--- trunk/Source/WebCore/ChangeLog	2020-01-20 15:52:58 UTC (rev 254826)
+++ trunk/Source/WebCore/ChangeLog	2020-01-20 16:06:28 UTC (rev 254827)
@@ -1,3 +1,22 @@
+2020-01-20  Zalan Bujtas  <[email protected]>
+
+        [LFC][IFC] Add support for the rare case of revert
+        https://bugs.webkit.org/show_bug.cgi?id=206486
+        <rdar://problem/58720638>
+
+        Reviewed by Antti Koivisto.
+
+        This patch re-introduces the support for revert when a previous wrap position turns out to be the line end position.
+
+        * layout/inlineformatting/InlineLineBuilder.cpp:
+        (WebCore::Layout::LineBuilder::initialize):
+        (WebCore::Layout::LineBuilder::clearContent):
+        * layout/inlineformatting/InlineLineBuilder.h:
+        * layout/inlineformatting/LineLayoutContext.cpp:
+        (WebCore::Layout::LineLayoutContext::layoutLine):
+        (WebCore::Layout::LineLayoutContext::rebuildLineForRevert):
+        * layout/inlineformatting/LineLayoutContext.h:
+
 2020-01-20  Adrian Perez de Castro  <[email protected]>
 
         Invalid usage of ENABLE() before it's defined in WebCore/layout/integration/LayoutIntegrationBoxTree.cpp

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp (254826 => 254827)


--- trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp	2020-01-20 15:52:58 UTC (rev 254826)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp	2020-01-20 16:06:28 UTC (rev 254827)
@@ -96,6 +96,13 @@
     m_lineLogicalWidth = constraints.availableLogicalWidth;
     m_hasIntrusiveFloat = constraints.lineIsConstrainedByFloat;
 
+    resetContent();
+}
+
+void LineBuilder::resetContent()
+{
+    m_lineBox.setLogicalWidth({ });
+    m_lineBox.setIsConsideredEmpty();
     m_runs.clear();
     m_trimmableTrailingContent.reset();
     m_lineIsVisuallyEmptyBeforeTrimmableTrailingContent = { };
@@ -755,7 +762,7 @@
     , m_textContext({ inlineTextItem.start(), m_trailingWhitespaceType == TrailingWhitespace::Collapsed ? 1 : inlineTextItem.length(), inlineTextItem.layoutBox().textContext()->content })
 {
     if (m_trailingWhitespaceType != TrailingWhitespace::None) {
-        m_trailingWhitespaceWidth = logicalWidth; 
+        m_trailingWhitespaceWidth = logicalWidth;
         m_textContext->setExpansion({ ExpansionBehavior(DefaultExpansion), { } });
         if (!isWhitespacePreserved(inlineTextItem.style()))
             m_expansionOpportunityCount = 1;

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.h (254826 => 254827)


--- trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.h	2020-01-20 15:52:58 UTC (rev 254826)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.h	2020-01-20 16:06:28 UTC (rev 254827)
@@ -61,6 +61,7 @@
 
     void initialize(const Constraints&);
     void append(const InlineItem&, InlineLayoutUnit logicalWidth);
+    void resetContent();
     bool isVisuallyEmpty() const { return m_lineBox.isConsideredEmpty(); }
     bool hasIntrusiveFloat() const { return m_hasIntrusiveFloat; }
     InlineLayoutUnit availableWidth() const { return logicalWidth() - contentLogicalWidth(); }

Modified: trunk/Source/WebCore/layout/inlineformatting/LineLayoutContext.cpp (254826 => 254827)


--- trunk/Source/WebCore/layout/inlineformatting/LineLayoutContext.cpp	2020-01-20 15:52:58 UTC (rev 254826)
+++ trunk/Source/WebCore/layout/inlineformatting/LineLayoutContext.cpp	2020-01-20 16:06:28 UTC (rev 254827)
@@ -287,7 +287,7 @@
                 ASSERT(!result.committedCount);
                 ASSERT(result.isEndOfLine == LineBreaker::IsEndOfLine::Yes);
                 // An earlier line wrapping opportunity turned out to be the final breaking position.
-                ASSERT_NOT_IMPLEMENTED_YET();
+                rebuildLineForRevert(line, *result.revertTo, leadingInlineItemIndex);
             }
             committedInlineItemCount += result.committedCount;
             if (result.isEndOfLine == LineBreaker::IsEndOfLine::Yes) {
@@ -478,7 +478,32 @@
     }
 }
 
+void LineLayoutContext::rebuildLineForRevert(LineBuilder& line, const InlineItem& revertTo, unsigned leadingInlineItemIndex)
+{
+    // This is the rare case when the line needs to be reverted to an earlier position.
+    line.resetContent();
+    auto inlineItemIndex = leadingInlineItemIndex;
+    InlineLayoutUnit logicalRight = { };
+    if (m_partialLeadingTextItem) {
+        auto logicalWidth = inlineItemWidth(*m_partialLeadingTextItem, logicalRight);
+        line.append(*m_partialLeadingTextItem, logicalWidth);
+        logicalRight += logicalWidth;
+        if (&revertTo == &m_partialLeadingTextItem.value())
+            return;
+        ++inlineItemIndex;
+    }
+
+    for (; inlineItemIndex < m_inlineItems.size(); ++inlineItemIndex) {
+        auto& inlineItem = m_inlineItems[inlineItemIndex];
+        auto logicalWidth = inlineItemWidth(inlineItem, logicalRight);
+        line.append(inlineItem, logicalWidth);
+        logicalRight += logicalWidth;
+        if (&inlineItem == &revertTo)
+            break;
+    }
 }
+
 }
+}
 
 #endif

Modified: trunk/Source/WebCore/layout/inlineformatting/LineLayoutContext.h (254826 => 254827)


--- trunk/Source/WebCore/layout/inlineformatting/LineLayoutContext.h	2020-01-20 15:52:58 UTC (rev 254826)
+++ trunk/Source/WebCore/layout/inlineformatting/LineLayoutContext.h	2020-01-20 16:06:28 UTC (rev 254827)
@@ -63,6 +63,7 @@
     };
     Result tryAddingFloatItems(LineBuilder&, const FloatList&);
     Result tryAddingInlineItems(LineBreaker&, LineBuilder&, const LineCandidateContent&);
+    void rebuildLineForRevert(LineBuilder&, const InlineItem& revertTo, unsigned leadingInlineItemIndex);
     void commitPartialContent(LineBuilder&, const LineBreaker::RunList&, const LineBreaker::Result::PartialTrailingContent&);
     LineContent close(LineBuilder&, unsigned leadingInlineItemIndex, unsigned committedInlineItemCount, Optional<LineContent::PartialContent>);
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to