WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Patch
bug-230924-20210928164909.patch (text/plain), 10.06 KB, created by
alan
on 2021-09-28 16:49:10 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
alan
Created:
2021-09-28 16:49:10 PDT
Size:
10.06 KB
patch
obsolete
>Subversion Revision: 283178 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 7830f8c103bd9514e65c22480f5ec2601d0d18c2..e0d3d0ea5b73a69da62cb65568a64b144dc6c13e 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,22 @@ >+2021-09-28 Alan Bujtas <zalan@apple.com> >+ >+ [LFC][IFC] Pass in the first-line style to the InlineContentBreaker::ContinuousContent runs if applicable >+ https://bugs.webkit.org/show_bug.cgi?id=230924 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Now the inline content breaker has the correct set of style values when first-line style is set. >+ >+ * layout/formattingContexts/inline/InlineItem.h: >+ (WebCore::Layout::InlineItem::firstLineStyle const): >+ * layout/formattingContexts/inline/InlineLineBuilder.cpp: >+ (WebCore::Layout::LineCandidate::InlineContent::appendInlineItem): >+ (WebCore::Layout::LineBuilder::layoutInlineContent): >+ (WebCore::Layout::LineBuilder::computedIntrinsicWidth): >+ (WebCore::Layout::LineBuilder::initialize): >+ (WebCore::Layout::LineBuilder::candidateContentForLine): >+ * layout/formattingContexts/inline/InlineLineBuilder.h: >+ > 2021-09-28 Alan Bujtas <zalan@apple.com> > > [LFC][IFC] Layout::Box should be able to return the first-line style when applicable >diff --git a/Source/WebCore/layout/formattingContexts/inline/InlineItem.h b/Source/WebCore/layout/formattingContexts/inline/InlineItem.h >index c2ae24a61268458874c720994382bab8291ddc4d..69355a331ca7cf75a96b5e30d6b893937cd57494 100644 >--- a/Source/WebCore/layout/formattingContexts/inline/InlineItem.h >+++ b/Source/WebCore/layout/formattingContexts/inline/InlineItem.h >@@ -41,6 +41,7 @@ public: > Type type() const { return m_type; } > const Box& layoutBox() const { return *m_layoutBox; } > const RenderStyle& style() const { return layoutBox().style(); } >+ const RenderStyle& firstLineStyle() const { return layoutBox().firstLineStyle(); } > > bool isText() const { return type() == Type::Text; } > bool isBox() const { return type() == Type::Box; } >diff --git a/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.cpp b/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.cpp >index af129fbd76755ce389cf909a34a1e600b3f65af8..382c764282c21a7bfa3ccdb392f676785767ae1f 100644 >--- a/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.cpp >+++ b/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.cpp >@@ -140,7 +140,7 @@ struct LineCandidate { > 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 @@ LineCandidate::InlineContent::InlineContent(bool ignoreTrailingLetterSpacing) > { > } > >-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 @@ inline void LineCandidate::InlineContent::appendInlineItem(const InlineItem& inl > 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::LineBuilder(const InlineFormattingContext& inlineFormattingContext, > > 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::LineContent LineBuilder::layoutInlineContent(const InlineItemRange& > > 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,27 +480,38 @@ void LineBuilder::candidateContentForLine(LineCandidate& lineCandidate, size_t c > 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; > } > > 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. > 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; > } >diff --git a/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.h b/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.h >index b1e794d7e3ba081bd78b59491a925174dd54bd31..62d75ea83d048c922c5f1e17a325410b9aeabbae 100644 >--- a/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.h >+++ b/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.h >@@ -97,7 +97,7 @@ private: > 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 @@ private: > 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 };
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 230924
: 439545