⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 285930 in webkit


Ignore:
Timestamp:
Nov 17, 2021, 7:10:51 AM (5 years ago)
Author:
Alan Bujtas
Message:

[LFC][IFC] break-word is not considered when calculating min-content intrinsic sizes.
https://bugs.webkit.org/show_bug.cgi?id=233222

Reviewed by Antti Koivisto.

See https://drafts.csswg.org/css-text/#overflow-wrap-property

  • layout/formattingContexts/inline/InlineContentBreaker.cpp:

(WebCore::Layout::InlineContentBreaker::InlineContentBreaker):
(WebCore::Layout::InlineContentBreaker::wordBreakBehavior const):

  • layout/formattingContexts/inline/InlineContentBreaker.h:

(WebCore::Layout::InlineContentBreaker::isIntrinsicWidthMode const):

  • layout/formattingContexts/inline/InlineLineBuilder.cpp:

(WebCore::Layout::LineBuilder::placeInlineContent):
(WebCore::Layout::LineBuilder::initialConstraintsForLine const):

  • layout/formattingContexts/inline/InlineLineBuilder.h:

(WebCore::Layout::LineBuilder::isIntrinsicWidthMode const):

Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r285927 r285930  
     12021-11-17  Alan Bujtas  <zalan@apple.com>
     2
     3        [LFC][IFC] break-word is not considered when calculating min-content intrinsic sizes.
     4        https://bugs.webkit.org/show_bug.cgi?id=233222
     5
     6        Reviewed by Antti Koivisto.
     7
     8        See https://drafts.csswg.org/css-text/#overflow-wrap-property
     9
     10        * layout/formattingContexts/inline/InlineContentBreaker.cpp:
     11        (WebCore::Layout::InlineContentBreaker::InlineContentBreaker):
     12        (WebCore::Layout::InlineContentBreaker::wordBreakBehavior const):
     13        * layout/formattingContexts/inline/InlineContentBreaker.h:
     14        (WebCore::Layout::InlineContentBreaker::isIntrinsicWidthMode const):
     15        * layout/formattingContexts/inline/InlineLineBuilder.cpp:
     16        (WebCore::Layout::LineBuilder::placeInlineContent):
     17        (WebCore::Layout::LineBuilder::initialConstraintsForLine const):
     18        * layout/formattingContexts/inline/InlineLineBuilder.h:
     19        (WebCore::Layout::LineBuilder::isIntrinsicWidthMode const):
     20
    1212021-11-17  Youenn Fablet  <youenn@apple.com>
    222
  • trunk/Source/WebCore/layout/formattingContexts/inline/InlineContentBreaker.cpp

    r284857 r285930  
    124124    }
    125125    return { };
     126}
     127
     128InlineContentBreaker::InlineContentBreaker(bool isInIntrinsicWidthMode)
     129    : m_isInIntrinsicWidthMode(isInIntrinsicWidthMode)
     130{
    126131}
    127132
     
    647652        return { };
    648653    };
     654
     655    // Soft wrap opportunities introduced by break-word are not considered when calculating min-content intrinsic sizes.
     656    auto breakWordIsApplicable = !isInIntrinsicWidthMode();
    649657    // For compatibility with legacy content, the word-break property also supports a deprecated break-word keyword.
    650658    // When specified, this has the same effect as word-break: normal and overflow-wrap: anywhere, regardless of the actual value of the overflow-wrap property.
    651     if (style.wordBreak() == WordBreak::BreakWord && !hasWrapOpportunityAtPreviousPosition)
     659    if ((breakWordIsApplicable && style.wordBreak() == WordBreak::BreakWord) && !hasWrapOpportunityAtPreviousPosition)
    652660        return includeHyphenationIfAllowed(WordBreakRule::AtArbitraryPosition);
    653661    // OverflowWrap::BreakWord/Anywhere An otherwise unbreakable sequence of characters may be broken at an arbitrary point if there are no otherwise-acceptable break points in the line.
    654662    // Note that this applies to content where CSS properties (e.g. WordBreak::KeepAll) make it unbreakable.
    655     if ((style.overflowWrap() == OverflowWrap::BreakWord || style.overflowWrap() == OverflowWrap::Anywhere) && !hasWrapOpportunityAtPreviousPosition)
     663    if (((breakWordIsApplicable && style.overflowWrap() == OverflowWrap::BreakWord) || style.overflowWrap() == OverflowWrap::Anywhere) && !hasWrapOpportunityAtPreviousPosition)
    656664        return includeHyphenationIfAllowed(WordBreakRule::AtArbitraryPosition);
    657665    // Breaking is forbidden within “words”.
  • trunk/Source/WebCore/layout/formattingContexts/inline/InlineContentBreaker.h

    r284678 r285930  
    3939class InlineContentBreaker {
    4040public:
     41    InlineContentBreaker(bool isInIntrinsicWidthMode);
     42
    4143    struct PartialRun {
    4244        size_t length { 0 };
     
    149151    OptionSet<WordBreakRule> wordBreakBehavior(const RenderStyle&, bool hasWrapOpportunityAtPreviousPosition) const;
    150152    bool shouldKeepEndOfLineWhitespace(const ContinuousContent&) const;
     153    bool isInIntrinsicWidthMode() const { return m_isInIntrinsicWidthMode; }
    151154
     155    bool m_isInIntrinsicWidthMode { false };
    152156    bool n_hyphenationIsDisabled { false };
    153157};
  • trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.cpp

    r285926 r285930  
    269269}
    270270
    271 LineBuilder::LineBuilder(InlineFormattingContext& inlineFormattingContext, FloatingState& floatingState, HorizontalConstraints rootHorizontalConstraints, const InlineItems& inlineItems, IsIntrinsicWidthMode isIntrinsicWidthMode)
    272     : m_isIntrinsicWidthMode(isIntrinsicWidthMode == IsIntrinsicWidthMode::Yes)
     271LineBuilder::LineBuilder(InlineFormattingContext& inlineFormattingContext, FloatingState& floatingState, HorizontalConstraints rootHorizontalConstraints, const InlineItems& inlineItems, IsInIntrinsicWidthMode isInIntrinsicWidthMode)
     272    : m_isInIntrinsicWidthMode(isInIntrinsicWidthMode == IsInIntrinsicWidthMode::Yes)
    273273    , m_inlineFormattingContext(inlineFormattingContext)
    274274    , m_inlineFormattingState(&inlineFormattingContext.formattingState())
     
    280280}
    281281
    282 LineBuilder::LineBuilder(const InlineFormattingContext& inlineFormattingContext, const InlineItems& inlineItems, IsIntrinsicWidthMode isIntrinsicWidthMode)
    283     : m_isIntrinsicWidthMode(isIntrinsicWidthMode == IsIntrinsicWidthMode::Yes)
     282LineBuilder::LineBuilder(const InlineFormattingContext& inlineFormattingContext, const InlineItems& inlineItems, IsInIntrinsicWidthMode isInIntrinsicWidthMode)
     283    : m_isInIntrinsicWidthMode(isInIntrinsicWidthMode == IsInIntrinsicWidthMode::Yes)
    284284    , m_inlineFormattingContext(inlineFormattingContext)
    285285    , m_line(inlineFormattingContext)
     
    393393{
    394394    auto lineCandidate = LineCandidate { layoutState().shouldIgnoreTrailingLetterSpacing() };
    395     auto inlineContentBreaker = InlineContentBreaker { };
     395    auto inlineContentBreaker = InlineContentBreaker { isInIntrinsicWidthMode() };
    396396
    397397    auto currentItemIndex = needsLayoutRange.start;
     
    551551        if (textIndent == RenderStyle::initialTextIndent())
    552552            return { };
    553         if (m_isIntrinsicWidthMode && textIndent.isPercent()) {
     553        if (isInIntrinsicWidthMode() && textIndent.isPercent()) {
    554554            // Percentages must be treated as 0 for the purpose of calculating intrinsic size contributions.
    555555            // https://drafts.csswg.org/css-text/#text-indent-property
  • trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.h

    r285860 r285930  
    4040class LineBuilder {
    4141public:
    42     enum class IsIntrinsicWidthMode { No, Yes };
    43     LineBuilder(InlineFormattingContext&, FloatingState&, HorizontalConstraints rootHorizontalConstraints, const InlineItems&, IsIntrinsicWidthMode = IsIntrinsicWidthMode::No);
    44     LineBuilder(const InlineFormattingContext&, const InlineItems&, IsIntrinsicWidthMode = IsIntrinsicWidthMode::Yes);
     42    enum class IsInIntrinsicWidthMode { No, Yes };
     43    LineBuilder(InlineFormattingContext&, FloatingState&, HorizontalConstraints rootHorizontalConstraints, const InlineItems&, IsInIntrinsicWidthMode = IsInIntrinsicWidthMode::No);
     44    LineBuilder(const InlineFormattingContext&, const InlineItems&, IsInIntrinsicWidthMode = IsInIntrinsicWidthMode::Yes);
    4545
    4646    struct InlineItemRange {
     
    113113    bool isLastLineWithInlineContent(const InlineItemRange& lineRange, size_t lastInlineItemIndex, bool hasPartialTrailingContent) const;
    114114
     115    bool isInIntrinsicWidthMode() const { return m_isInIntrinsicWidthMode; }
     116
    115117    const InlineFormattingContext& formattingContext() const { return m_inlineFormattingContext; }
    116118    InlineFormattingState* formattingState() { return m_inlineFormattingState; }
     
    122124private:
    123125    bool m_isFirstLine { false };
    124     bool m_isIntrinsicWidthMode { false };
     126    bool m_isInIntrinsicWidthMode { false };
    125127    const InlineFormattingContext& m_inlineFormattingContext;
    126128    InlineFormattingState* m_inlineFormattingState { nullptr };
Note: See TracChangeset for help on using the changeset viewer.