aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOriol Brufau <obrufau@igalia.com>2024-10-16 12:22:11 +0200
committerGitHub <noreply@github.com>2024-10-16 10:22:11 +0000
commit103d3aa7bb6341957c31a1aae4f925068e39e951 (patch)
treebc64904e03706f235ba2990bc4623016e6186ef3
parent0a71c736f08fafb68d453133379dcc458fe4ac85 (diff)
downloadservo-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.rs8
-rw-r--r--tests/wpt/meta/MANIFEST.json2
-rw-r--r--tests/wpt/tests/css/css-text/white-space/white-space-intrinsic-size-021.html20
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>