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>);