diff options
author | Oriol Brufau <obrufau@igalia.com> | 2024-10-16 12:22:11 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-16 10:22:11 +0000 |
commit | 103d3aa7bb6341957c31a1aae4f925068e39e951 (patch) | |
tree | bc64904e03706f235ba2990bc4623016e6186ef3 | |
parent | 0a71c736f08fafb68d453133379dcc458fe4ac85 (diff) | |
download | servo-103d3aa7bb6341957c31a1aae4f925068e39e951.tar.gz servo-103d3aa7bb6341957c31a1aae4f925068e39e951.zip |
Avoid wrapping line at the start of text run with `text-wrap-mode: nowrap` (#33848)
When computing the min-content size of an inline formatting context,
we could allow a soft wrap opportunity at the start of a text run.
This shouldn't happen with `text-wrap-mode: nowrap`.
Signed-off-by: Oriol Brufau <obrufau@igalia.com>
-rw-r--r-- | components/layout_2020/flow/inline/mod.rs | 8 | ||||
-rw-r--r-- | tests/wpt/meta/MANIFEST.json | 2 | ||||
-rw-r--r-- | tests/wpt/tests/css/css-text/white-space/white-space-intrinsic-size-021.html | 20 |
3 files changed, 25 insertions, 5 deletions
diff --git a/components/layout_2020/flow/inline/mod.rs b/components/layout_2020/flow/inline/mod.rs index 21be242f35b..4bad4293e5a 100644 --- a/components/layout_2020/flow/inline/mod.rs +++ b/components/layout_2020/flow/inline/mod.rs @@ -2245,17 +2245,17 @@ impl<'layout_data> ContentSizesComputation<'layout_data> { }, InlineItem::TextRun(text_run) => { for segment in text_run.shaped_text.iter() { + let style_text = text_run.parent_style.get_inherited_text(); + let can_wrap = style_text.text_wrap_mode == TextWrapMode::Wrap; + // TODO: This should take account whether or not the first and last character prevent // linebreaks after atomics as in layout. - if segment.break_at_start { + if can_wrap && segment.break_at_start { self.line_break_opportunity() } for run in segment.runs.iter() { let advance = run.glyph_store.total_advance(); - let style_text = text_run.parent_style.get_inherited_text(); - let can_wrap = style_text.text_wrap_mode == TextWrapMode::Wrap; - if run.glyph_store.is_whitespace() { // If this run is a forced line break, we *must* break the line // and start measuring from the inline origin once more. diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json index dc18d6f9780..f19ef328fdd 100644 --- a/tests/wpt/meta/MANIFEST.json +++ b/tests/wpt/meta/MANIFEST.json @@ -570815,7 +570815,7 @@ ] ], "white-space-intrinsic-size-021.html": [ - "f9c246d4899b58dbcf2dc08655c8bc1f39995e5a", + "9c63117d087932fb7c4788ff58c251d60dc1bf17", [ null, {} diff --git a/tests/wpt/tests/css/css-text/white-space/white-space-intrinsic-size-021.html b/tests/wpt/tests/css/css-text/white-space/white-space-intrinsic-size-021.html index f9c246d4899..9c63117d087 100644 --- a/tests/wpt/tests/css/css-text/white-space/white-space-intrinsic-size-021.html +++ b/tests/wpt/tests/css/css-text/white-space/white-space-intrinsic-size-021.html @@ -166,6 +166,16 @@ x-br::before { <div class="break-spaces wrap" data-expected-client-width="20" data-expected-client-height="20">X <x-br></x-br>É</div> <div class="break-spaces nowrap" data-expected-client-width="20" data-expected-client-height="20">X <x-br></x-br>É</div> </div> +<div class="container narrow"> + <div class="collapse wrap" data-expected-client-width="10" data-expected-client-height="20">X <a>É</a></div> + <div class="collapse nowrap" data-expected-client-width="30" data-expected-client-height="10">X <a>É</a></div> + <div class="preserve wrap" data-expected-client-width="10" data-expected-client-height="20">X <a>É</a></div> + <div class="preserve nowrap" data-expected-client-width="30" data-expected-client-height="10">X <a>É</a></div> + <div class="preserve-breaks wrap" data-expected-client-width="10" data-expected-client-height="20">X <a>É</a></div> + <div class="preserve-breaks nowrap" data-expected-client-width="30" data-expected-client-height="10">X <a>É</a></div> + <div class="break-spaces wrap" data-expected-client-width="20" data-expected-client-height="20">X <a>É</a></div> + <div class="break-spaces nowrap" data-expected-client-width="30" data-expected-client-height="10">X <a>É</a></div> +</div> <hr> @@ -279,6 +289,16 @@ x-br::before { <div class="break-spaces wrap" data-expected-client-width="20" data-expected-client-height="20">X <x-br></x-br>É</div> <div class="break-spaces nowrap" data-expected-client-width="20" data-expected-client-height="20">X <x-br></x-br>É</div> </div> +<div class="container wide"> + <div class="collapse wrap" data-expected-client-width="30" data-expected-client-height="10">X <a>É</a></div> + <div class="collapse nowrap" data-expected-client-width="30" data-expected-client-height="10">X <a>É</a></div> + <div class="preserve wrap" data-expected-client-width="30" data-expected-client-height="10">X <a>É</a></div> + <div class="preserve nowrap" data-expected-client-width="30" data-expected-client-height="10">X <a>É</a></div> + <div class="preserve-breaks wrap" data-expected-client-width="30" data-expected-client-height="10">X <a>É</a></div> + <div class="preserve-breaks nowrap" data-expected-client-width="30" data-expected-client-height="10">X <a>É</a></div> + <div class="break-spaces wrap" data-expected-client-width="30" data-expected-client-height="10">X <a>É</a></div> + <div class="break-spaces nowrap" data-expected-client-width="30" data-expected-client-height="10">X <a>É</a></div> +</div> <hr> |