Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.cpp (283254 => 283255)
--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.cpp 2021-09-29 20:14:31 UTC (rev 283254)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.cpp 2021-09-29 20:16:10 UTC (rev 283255)
@@ -140,7 +140,7 @@
const InlineItem* trailingLineBreak() const { return m_trailingLineBreak; }
const InlineItem* trailingWordBreakOpportunity() const { return m_trailingWordBreakOpportunity; }
- void appendInlineItem(const InlineItem&, InlineLayoutUnit logicalWidth);
+ void appendInlineItem(const InlineItem&, const RenderStyle&, InlineLayoutUnit logicalWidth);
void appendTrailingLineBreak(const InlineItem& lineBreakItem) { m_trailingLineBreak = &lineBreakItem; }
void appendtrailingWordBreakOpportunity(const InlineItem& wordBreakItem) { m_trailingWordBreakOpportunity = &wordBreakItem; }
void reset();
@@ -175,7 +175,7 @@
{
}
-inline void LineCandidate::InlineContent::appendInlineItem(const InlineItem& inlineItem, InlineLayoutUnit logicalWidth)
+inline void LineCandidate::InlineContent::appendInlineItem(const InlineItem& inlineItem, const RenderStyle& style, InlineLayoutUnit logicalWidth)
{
ASSERT(inlineItem.isText() || inlineItem.isBox() || inlineItem.isInlineBoxStart() || inlineItem.isInlineBoxEnd());
auto collapsibleWidth = [&]() -> std::optional<InlineLayoutUnit> {
@@ -195,8 +195,7 @@
ASSERT(logicalWidth > letterSpacing);
return letterSpacing;
};
- // FIXME: While the line breaking related properties for atomic level boxes do not depend on the line index (first line style) it'd be great to figure out the correct style to pass in.
- m_continuousContent.append(inlineItem, !inlineItem.isBox() ? inlineItem.style() : inlineItem.layoutBox().parent().style(), logicalWidth, collapsibleWidth());
+ m_continuousContent.append(inlineItem, style, logicalWidth, collapsibleWidth());
m_hasInlineLevelBox = m_hasInlineLevelBox || inlineItem.isBox() || inlineItem.isInlineBoxStart();
}
@@ -267,7 +266,7 @@
LineBuilder::LineContent LineBuilder::layoutInlineContent(const InlineItemRange& needsLayoutRange, size_t partialLeadingContentLength, std::optional<InlineLayoutUnit> overflowLogicalWidth, const InlineRect& initialLineLogicalRect, bool isFirstLine)
{
- initialize(initialConstraintsForLine(initialLineLogicalRect, isFirstLine));
+ initialize(initialConstraintsForLine(initialLineLogicalRect, isFirstLine), isFirstLine);
auto committedContent = placeInlineContent(needsLayoutRange, partialLeadingContentLength, overflowLogicalWidth);
auto committedRange = close(needsLayoutRange, committedContent);
@@ -284,14 +283,15 @@
LineBuilder::IntrinsicContent LineBuilder::computedIntrinsicWidth(const InlineItemRange& needsLayoutRange, InlineLayoutUnit availableWidth)
{
- initialize({ { { }, { availableWidth, maxInlineLayoutUnit() } }, false });
+ initialize({ { { }, { availableWidth, maxInlineLayoutUnit() } }, false }, false);
auto committedContent = placeInlineContent(needsLayoutRange, { }, { });
auto committedRange = close(needsLayoutRange, committedContent);
return { committedRange, m_line.contentLogicalWidth(), m_floats };
}
-void LineBuilder::initialize(const UsedConstraints& lineConstraints)
+void LineBuilder::initialize(const UsedConstraints& lineConstraints, bool isFirstLine)
{
+ m_isFirstLine = isFirstLine;
m_floats.clear();
m_partialLeadingTextItem = { };
m_wrapOpportunityList.clear();
@@ -480,11 +480,12 @@
ASSERT(softWrapOpportunityIndex <= layoutRange.end);
if (partialLeadingContentLength) {
+ ASSERT(!m_isFirstLine);
// Handle leading partial content first (overflowing text from the previous line).
// Construct a partial leading inline item.
m_partialLeadingTextItem = downcast<InlineTextItem>(m_inlineItems[currentInlineItemIndex]).right(partialLeadingContentLength);
auto itemWidth = leadingLogicalWidth ? *std::exchange(leadingLogicalWidth, std::nullopt) : inlineItemWidth(*m_partialLeadingTextItem, currentLogicalRight);
- lineCandidate.inlineContent.appendInlineItem(*m_partialLeadingTextItem, itemWidth);
+ lineCandidate.inlineContent.appendInlineItem(*m_partialLeadingTextItem, m_partialLeadingTextItem->style(), itemWidth);
currentLogicalRight += itemWidth;
++currentInlineItemIndex;
}
@@ -491,6 +492,9 @@
for (auto index = currentInlineItemIndex; index < softWrapOpportunityIndex; ++index) {
auto& inlineItem = m_inlineItems[index];
+ auto& style = [&] () -> const RenderStyle& {
+ return m_isFirstLine ? inlineItem.firstLineStyle() : inlineItem.style();
+ }();
if (inlineItem.isFloat()) {
lineCandidate.floatItem = &inlineItem;
// This is a soft wrap opportunity, must be the only item in the list.
@@ -497,13 +501,20 @@
ASSERT(currentInlineItemIndex + 1 == softWrapOpportunityIndex);
continue;
}
- if (inlineItem.isText() || inlineItem.isInlineBoxStart() || inlineItem.isInlineBoxEnd() || inlineItem.isBox()) {
+ if (inlineItem.isText() || inlineItem.isInlineBoxStart() || inlineItem.isInlineBoxEnd()) {
ASSERT(!leadingLogicalWidth || inlineItem.isText());
auto logicalWidth = leadingLogicalWidth ? *std::exchange(leadingLogicalWidth, std::nullopt) : inlineItemWidth(inlineItem, currentLogicalRight);
- lineCandidate.inlineContent.appendInlineItem(inlineItem, logicalWidth);
+ lineCandidate.inlineContent.appendInlineItem(inlineItem, style, logicalWidth);
currentLogicalRight += logicalWidth;
continue;
}
+ if (inlineItem.isBox()) {
+ auto logicalWidth = inlineItemWidth(inlineItem, currentLogicalRight);
+ // FIXME: While the line breaking related properties for atomic level boxes do not depend on the line index (first line style) it'd be great to figure out the correct style to pass in.
+ lineCandidate.inlineContent.appendInlineItem(inlineItem, inlineItem.layoutBox().parent().style(), logicalWidth);
+ currentLogicalRight += logicalWidth;
+ continue;
+ }
if (inlineItem.isLineBreak() || inlineItem.isWordBreakOpportunity()) {
// Since both <br> and <wbr> are explicit word break opportunities they have to be trailing items in this candidate run list unless they are embedded in inline boxes.
// e.g. <span><wbr></span>
Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.h (283254 => 283255)
--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.h 2021-09-29 20:14:31 UTC (rev 283254)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.h 2021-09-29 20:16:10 UTC (rev 283255)
@@ -97,7 +97,7 @@
size_t rebuildLine(const InlineItemRange& needsLayoutRange, const InlineItem& lastInlineItemToAdd);
size_t rebuildLineForTrailingSoftHyphen(const InlineItemRange& layoutRange);
void commitPartialContent(const InlineContentBreaker::ContinuousContent::RunList&, const InlineContentBreaker::Result::PartialTrailingContent&);
- void initialize(const UsedConstraints&);
+ void initialize(const UsedConstraints&, bool isFirstLine);
struct CommittedContent {
size_t inlineItemCount { 0 };
size_t partialTrailingContentLength { 0 };
@@ -116,6 +116,8 @@
const ContainerBox& root() const;
const LayoutState& layoutState() const;
+private:
+ bool m_isFirstLine { false };
const InlineFormattingContext& m_inlineFormattingContext;
InlineFormattingState* m_inlineFormattingState { nullptr };
FloatingState* m_floatingState { nullptr };