Changeset 284678 in webkit
- Timestamp:
- Oct 22, 2021, 6:44:00 AM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
-
ChangeLog (modified) (1 diff)
-
layout/formattingContexts/inline/InlineContentBreaker.cpp (modified) (5 diffs)
-
layout/formattingContexts/inline/InlineContentBreaker.h (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r284677 r284678 1 2021-10-22 Alan Bujtas <zalan@apple.com> 2 3 [LFC][IFC] Add support for checking leading collapsible whitespace in InlineContentBreaker::processOverflowingContent 4 https://bugs.webkit.org/show_bug.cgi?id=232091 5 6 Reviewed by Antti Koivisto. 7 8 This patch ensures that the leading collapsible whitespace on the continuous run is taken 9 into account when checking if the otherwise overflowing content may fit the line. 10 e.g. 11 <span style="white-space: nowrap">no_wrap </span><span> yes_wrap</span> 12 The " yes_wrap" content has a collapsible leading whitespace here. 13 (This is also a preparation for fixing a regression and a WPT test.) 14 15 * layout/formattingContexts/inline/InlineContentBreaker.cpp: 16 (WebCore::Layout::isVisuallyEmptyWhitespaceContent): 17 (WebCore::Layout::InlineContentBreaker::processOverflowingContent const): 18 (WebCore::Layout::InlineContentBreaker::ContinuousContent::append): 19 (WebCore::Layout::InlineContentBreaker::ContinuousContent::reset): 20 * layout/formattingContexts/inline/InlineContentBreaker.h: 21 (WebCore::Layout::InlineContentBreaker::ContinuousContent::leadingCollapsibleWidth const): 22 (WebCore::Layout::InlineContentBreaker::ContinuousContent::trailingCollapsibleWidth const): 23 (WebCore::Layout::InlineContentBreaker::ContinuousContent::hasCollapsibleContent const): 24 (WebCore::Layout::InlineContentBreaker::ContinuousContent::isFullyCollapsible const): 25 (WebCore::Layout::InlineContentBreaker::ContinuousContent::collapsibleLogicalWidth const): Deleted. 26 (WebCore::Layout::InlineContentBreaker::ContinuousContent::nonCollapsibleLogicalWidth const): Deleted. 27 (WebCore::Layout::InlineContentBreaker::ContinuousContent::hasTrailingCollapsibleContent const): Deleted. 28 1 29 2021-10-22 Alan Bujtas <zalan@apple.com> 2 30 -
trunk/Source/WebCore/layout/formattingContexts/inline/InlineContentBreaker.cpp
r284530 r284678 98 98 // [<span></span> ] [<span> </span>] [ <span style="padding: 0px;"></span>] are all considered visually empty whitespace content. 99 99 // [<span style="border: 1px solid red"></span> ] while this is whitespace content only, it is not considered visually empty. 100 // Due to commit boundary rules, we just need to check the first non-typeless inline item (can't have both [img] and [text]) 100 ASSERT(!continuousContent.runs().isEmpty()); 101 auto hasWhitespace = false; 101 102 for (auto& run : continuousContent.runs()) { 102 103 auto& inlineItem = run.inlineItem; 103 // FIXME: check for padding border etc.104 // FIXME: check if visual decoration makes a difference here e.g. padding border. 104 105 if (inlineItem.isInlineBoxStart() || inlineItem.isInlineBoxEnd()) 105 106 continue; 106 return inlineItem.isText() && downcast<InlineTextItem>(inlineItem).isWhitespace(); 107 } 108 return false; 107 auto isWhitespace = inlineItem.isText() && downcast<InlineTextItem>(inlineItem).isWhitespace(); 108 if (!isWhitespace) 109 return false; 110 hasWhitespace = true; 111 } 112 return hasWhitespace; 109 113 } 110 114 … … 174 178 175 179 ASSERT(continuousContent.logicalWidth() > lineStatus.availableWidth); 176 if (continuousContent.hasTrailingCollapsibleContent()) { 177 ASSERT(hasTrailingTextContent(overflowContent)); 178 // First check if the content fits without the trailing collapsible part. 179 if (continuousContent.nonCollapsibleLogicalWidth() <= lineStatus.availableWidth) 180 return { Result::Action::Keep, IsEndOfLine::No }; 181 // Now check if we can trim the line too. 182 if (lineStatus.hasFullyCollapsibleTrailingRun && continuousContent.isFullyCollapsible()) { 180 if (continuousContent.hasCollapsibleContent()) { 181 if (lineStatus.hasFullyCollapsibleTrailingContent && continuousContent.isFullyCollapsible()) { 183 182 // If this new content is fully collapsible, it should surely fit. 184 183 return { Result::Action::Keep, IsEndOfLine::No }; 185 184 } 185 // Check if the content fits if we collapsed it. 186 auto spaceRequired = continuousContent.logicalWidth() - continuousContent.trailingCollapsibleWidth(); 187 if (lineStatus.hasFullyCollapsibleTrailingContent) 188 spaceRequired -= continuousContent.leadingCollapsibleWidth(); 189 if (spaceRequired <= lineStatus.availableWidth) 190 return { Result::Action::Keep, IsEndOfLine::No }; 186 191 } else if (lineStatus.collapsibleWidth && isNonContentRunsOnly(continuousContent)) { 187 192 // Let's see if the non-content runs fit when the line has trailing collapsible content. … … 650 655 { 651 656 ASSERT(inlineItem.isText() || inlineItem.isBox() || inlineItem.isInlineBoxStart() || inlineItem.isInlineBoxEnd()); 657 auto isLeadingCollapsible = collapsibleWidth && (m_runs.isEmpty() || isFullyCollapsible()); 652 658 m_runs.append({ inlineItem, style, logicalWidth }); 653 659 m_logicalWidth = clampTo<InlineLayoutUnit>(m_logicalWidth + logicalWidth); … … 655 661 if (inlineItem.isText() || inlineItem.isBox()) { 656 662 // Inline boxes do not prevent the trailing content from getting collapsed. 657 m_ collapsibleLogicalWidth = { };663 m_trailingCollapsibleWidth = { }; 658 664 } 659 665 return; 660 666 } 661 667 ASSERT(*collapsibleWidth <= logicalWidth); 662 if ( *collapsibleWidth == logicalWidth) {663 // Fully collapsible run.664 m_ collapsibleLogicalWidth += logicalWidth;668 if (isLeadingCollapsible) { 669 ASSERT(!m_trailingCollapsibleWidth); 670 m_leadingCollapsibleWidth += *collapsibleWidth; 665 671 return; 666 672 } 667 // Partially collapsible run. 668 m_collapsibleLogicalWidth = *collapsibleWidth; 673 m_trailingCollapsibleWidth = *collapsibleWidth == logicalWidth ? m_trailingCollapsibleWidth + logicalWidth : *collapsibleWidth; 669 674 } 670 675 … … 672 677 { 673 678 m_logicalWidth = { }; 674 m_collapsibleLogicalWidth = { }; 679 m_leadingCollapsibleWidth = { }; 680 m_trailingCollapsibleWidth = { }; 675 681 m_runs.clear(); 676 682 } -
trunk/Source/WebCore/layout/formattingContexts/inline/InlineContentBreaker.h
r284188 r284678 78 78 struct ContinuousContent { 79 79 InlineLayoutUnit logicalWidth() const { return m_logicalWidth; } 80 InlineLayoutUnit collapsibleLogicalWidth() const { return m_collapsibleLogicalWidth; }81 InlineLayoutUnit nonCollapsibleLogicalWidth() const { return logicalWidth() - collapsibleLogicalWidth(); }82 bool has TrailingCollapsibleContent() const { return !!collapsibleLogicalWidth(); }83 bool isFullyCollapsible() const { return logicalWidth() == collapsibleLogicalWidth(); }80 InlineLayoutUnit leadingCollapsibleWidth() const { return m_leadingCollapsibleWidth; } 81 InlineLayoutUnit trailingCollapsibleWidth() const { return m_trailingCollapsibleWidth; } 82 bool hasCollapsibleContent() const { return trailingCollapsibleWidth() > 0 || leadingCollapsibleWidth() > 0; } 83 bool isFullyCollapsible() const { return logicalWidth() == trailingCollapsibleWidth() + leadingCollapsibleWidth(); } 84 84 85 void append(const InlineItem&, const RenderStyle&, InlineLayoutUnit logicalWidth, std::optional<InlineLayoutUnit> collapsibleWidth );85 void append(const InlineItem&, const RenderStyle&, InlineLayoutUnit logicalWidth, std::optional<InlineLayoutUnit> collapsibleWidth = std::nullopt); 86 86 void reset(); 87 87 … … 101 101 RunList m_runs; 102 102 InlineLayoutUnit m_logicalWidth { 0 }; 103 InlineLayoutUnit m_collapsibleLogicalWidth { 0 }; 103 InlineLayoutUnit m_leadingCollapsibleWidth { 0 }; 104 InlineLayoutUnit m_trailingCollapsibleWidth { 0 }; 104 105 }; 105 106 … … 109 110 InlineLayoutUnit collapsibleWidth { 0 }; 110 111 std::optional<InlineLayoutUnit> trailingSoftHyphenWidth; 111 bool hasFullyCollapsibleTrailing Run{ false };112 bool hasFullyCollapsibleTrailingContent { false }; 112 113 bool hasContent { false }; 113 114 bool hasWrapOpportunityAtPreviousPosition { false };
Note:
See TracChangeset
for help on using the changeset viewer.