Diff
Modified: trunk/Source/WebCore/ChangeLog (286533 => 286534)
--- trunk/Source/WebCore/ChangeLog 2021-12-04 16:08:56 UTC (rev 286533)
+++ trunk/Source/WebCore/ChangeLog 2021-12-04 16:51:39 UTC (rev 286534)
@@ -1,3 +1,22 @@
+2021-12-04 Alan Bujtas <za...@apple.com>
+
+ [LFC][IFC] Compute isFirstBox/isLastBox for text content
+ https://bugs.webkit.org/show_bug.cgi?id=233850
+
+ Reviewed by Antti Koivisto.
+
+ This is in preparation for helping the iterator interface to compute renderer (layout box) boundaries for text content.
+
+ * layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp:
+ (WebCore::Layout::InlineDisplayContentBuilder::appendTextDisplayBox):
+ (WebCore::Layout::InlineDisplayContentBuilder::computeIsFirstIsLastBoxForInlineContent):
+ * layout/formattingContexts/inline/InlineDisplayContentBuilder.h:
+ * layout/formattingContexts/inline/InlineFormattingContext.cpp:
+ (WebCore::Layout::InlineFormattingContext::layoutInFlowContent):
+ (WebCore::Layout::InlineFormattingContext::lineLayoutForIntergration):
+ * layout/formattingContexts/inline/display/InlineDisplayBox.h:
+ (WebCore::InlineDisplay::Box::setIsFirstBox):
+
2021-12-04 Antoine Quint <grao...@webkit.org>
CSS animation sorting may crash due to AnimationList copy upon CSS Animation removal
Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp (286533 => 286534)
--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp 2021-12-04 16:08:56 UTC (rev 286533)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp 2021-12-04 16:51:39 UTC (rev 286534)
@@ -123,7 +123,9 @@
, textRunRect
, inkOverflow()
, lineRun.expansion()
- , InlineDisplay::Box::Text { text->start, text->length, content, adjustedContentToRender(), text->needsHyphen } });
+ , InlineDisplay::Box::Text { text->start, text->length, content, adjustedContentToRender(), text->needsHyphen }
+ , true
+ , { } });
}
void InlineDisplayContentBuilder::appendSoftLineBreakDisplayBox(const Line::Run& lineRun, const InlineRect& softLineBreakRunRect, DisplayBoxes& boxes)
@@ -649,7 +651,25 @@
}
}
+void InlineDisplayContentBuilder::computeIsFirstIsLastBoxForInlineContent(DisplayBoxes& boxes)
+{
+ HashMap<const Box*, size_t> lastDisplayBoxForInlineTextBoxIndexes;
+ ASSERT(boxes[0].isRootInlineBox());
+ for (size_t index = 1; index < boxes.size(); ++index) {
+ auto& displayBox = boxes[index];
+ // FIXME: Transition the inline box isFirst/isLast computation here as well.
+ if (!displayBox.isText())
+ continue;
+ auto& layoutBox = displayBox.layoutBox();
+ if (!lastDisplayBoxForInlineTextBoxIndexes.contains(&layoutBox))
+ displayBox.setIsFirstBox(true);
+ lastDisplayBoxForInlineTextBoxIndexes.set(&layoutBox, index);
+ }
+ for (auto lastDisplayBoxForInlineTextBoxIndex : lastDisplayBoxForInlineTextBoxIndexes)
+ boxes[lastDisplayBoxForInlineTextBoxIndex.value].setIsLastBox(true);
}
+
}
+}
#endif
Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.h (286533 => 286534)
--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.h 2021-12-04 16:08:56 UTC (rev 286533)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.h 2021-12-04 16:51:39 UTC (rev 286534)
@@ -43,6 +43,8 @@
DisplayBoxes build(const LineBuilder::LineContent&, const LineBox&, const InlineRect& lineBoxLogicalRect, const size_t lineIndex);
+ static void computeIsFirstIsLastBoxForInlineContent(DisplayBoxes&);
+
private:
void processNonBidiContent(const LineBuilder::LineContent&, const LineBox&, const InlineLayoutPoint& lineBoxLogicalTopLeft, DisplayBoxes&);
void processBidiContent(const LineBuilder::LineContent&, const LineBox&, const InlineLayoutPoint& lineBoxLogicalTopLeft, DisplayBoxes&);
Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.cpp (286533 => 286534)
--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.cpp 2021-12-04 16:08:56 UTC (rev 286533)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.cpp 2021-12-04 16:51:39 UTC (rev 286534)
@@ -145,6 +145,7 @@
auto& inlineItems = formattingState().inlineItems();
lineLayout(inlineItems, { 0, inlineItems.size() }, constraints);
computeStaticPositionForOutOfFlowContent(formattingState().outOfFlowBoxes());
+ InlineDisplayContentBuilder::computeIsFirstIsLastBoxForInlineContent(formattingState().boxes());
LOG_WITH_STREAM(FormattingContextLayout, stream << "[End] -> inline formatting context -> formatting root(" << &root() << ")");
}
@@ -155,6 +156,7 @@
auto& inlineItems = formattingState().inlineItems();
lineLayout(inlineItems, { 0, inlineItems.size() }, constraints);
computeStaticPositionForOutOfFlowContent(formattingState().outOfFlowBoxes());
+ InlineDisplayContentBuilder::computeIsFirstIsLastBoxForInlineContent(formattingState().boxes());
}
IntrinsicWidthConstraints InlineFormattingContext::computedIntrinsicWidthConstraintsForIntegration()
Modified: trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayBox.h (286533 => 286534)
--- trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayBox.h 2021-12-04 16:08:56 UTC (rev 286533)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayBox.h 2021-12-04 16:51:39 UTC (rev 286534)
@@ -130,6 +130,7 @@
bool isLastBox() const { return m_isLastWithinInlineLevelBox; }
void setIsLastBox(bool isLastBox) { m_isLastWithinInlineLevelBox = isLastBox; }
+ void setIsFirstBox(bool isFirstBox) { m_isFirstWithinInlineLevelBox = isFirstBox; }
private:
const size_t m_lineIndex { 0 };