Skip to content

Commit

Permalink
Disable text-wrap: balance when not supported
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=260351
rdar://114031168

Reviewed by Alan Baradlay.

This patch disables `text-wrap: balance` when it encounters something
that it cannot balance. This includes:
- soft hyphens
- preserved tabs
- box-decoration-break: clone

* Source/WebCore/layout/formattingContexts/inline/InlineContentBalancer.cpp:
(WebCore::Layout::containsTrailingSoftHyphen):
(WebCore::Layout::containsPreservedTab):
(WebCore::Layout::cannotBalanceInlineItem):
(WebCore::Layout::InlineContentBalancer::initialize):

Canonical link: https://commits.webkit.org/267025@main
  • Loading branch information
RWDavid authored and sammygill committed Aug 18, 2023
1 parent 95c4d7e commit fbfd1da
Showing 1 changed file with 45 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,50 @@ static float computeCost(InlineLayoutUnit candidateLineWidth, InlineLayoutUnit i
return difference * difference;
};

static bool containsTrailingSoftHyphen(const InlineItem& inlineItem)
{
if (inlineItem.style().hyphens() == Hyphens::None)
return false;
if (!inlineItem.isText())
return false;
return downcast<InlineTextItem>(inlineItem).hasTrailingSoftHyphen();
}

static bool containsPreservedTab(const InlineItem& inlineItem)
{
if (!inlineItem.isText())
return false;
const auto& textItem = downcast<InlineTextItem>(inlineItem);
if (!textItem.isWhitespace())
return false;
const auto& textBox = textItem.inlineTextBox();
if (!TextUtil::shouldPreserveSpacesAndTabs(textBox))
return false;
auto start = textItem.start();
auto length = textItem.length();
const auto& textContent = textBox.content();
for (size_t index = start; index < start + length; index++) {
if (textContent[index] == tabCharacter)
return true;
}
return false;
}

static bool cannotBalanceInlineItem(const InlineItem& inlineItem)
{
if (!inlineItem.layoutBox().isInlineLevelBox())
return true;
if (containsTrailingSoftHyphen(inlineItem))
return true;
if (containsPreservedTab(inlineItem))
return true;
#if ENABLE(CSS_BOX_DECORATION_BREAK)
if (inlineItem.style().boxDecorationBreak() == BoxDecorationBreak::Clone)
return true;
#endif
return false;
}

InlineContentBalancer::InlineContentBalancer(const InlineFormattingContext& inlineFormattingContext, const InlineLayoutState& inlineLayoutState, const InlineItems& inlineItems, const HorizontalConstraints& horizontalConstraints)
: m_inlineFormattingContext(inlineFormattingContext)
, m_inlineLayoutState(inlineLayoutState)
Expand All @@ -80,7 +124,7 @@ void InlineContentBalancer::initialize()
m_inlineItemWidths.reserveCapacity(m_numberOfInlineItems);
for (size_t i = 0; i < m_numberOfInlineItems; i++) {
const auto& item = m_inlineItems[i];
if (!item.layoutBox().isInlineLevelBox()) {
if (cannotBalanceInlineItem(item)) {
m_cannotBalanceContent = true;
return;
}
Expand Down

0 comments on commit fbfd1da

Please sign in to comment.