aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOriol Brufau <obrufau@igalia.com>2024-09-16 12:57:56 +0200
committerGitHub <noreply@github.com>2024-09-16 10:57:56 +0000
commit5b6a9110c7c79159c3150f7f9739f67f271cb0c0 (patch)
tree47d36d66448c47e2582e3f7d079f905bcba48641
parent10c64820e817ce47fae26b6a7925320f5fa9299d (diff)
downloadservo-5b6a9110c7c79159c3150f7f9739f67f271cb0c0.tar.gz
servo-5b6a9110c7c79159c3150f7f9739f67f271cb0c0.zip
Clear `self.pending_whitespace.max_content` in `forced_line_break()` (#33469)
If we encountered a preserved line break after some whitespace, we were including the space in the max-content size of the following line. So just like `line_break_opportunity()` was already clearing `self.pending_whitespace.min_content`, `forced_line_break()` needs to clear `self.pending_whitespace.max_content` too. Also some cosmetic refactoring. Signed-off-by: Oriol Brufau <obrufau@igalia.com>
-rw-r--r--components/layout_2020/flow/inline/mod.rs16
-rw-r--r--tests/wpt/meta/MANIFEST.json2
-rw-r--r--tests/wpt/tests/css/css-text/white-space/white-space-intrinsic-size-021.html24
3 files changed, 33 insertions, 9 deletions
diff --git a/components/layout_2020/flow/inline/mod.rs b/components/layout_2020/flow/inline/mod.rs
index f03fc94d407..8a0b86c1c7d 100644
--- a/components/layout_2020/flow/inline/mod.rs
+++ b/components/layout_2020/flow/inline/mod.rs
@@ -2354,7 +2354,6 @@ impl<'layout_data> ContentSizesComputation<'layout_data> {
// and start measuring from the inline origin once more.
if run.is_single_preserved_newline() {
self.forced_line_break();
- self.current_line = ContentSizes::zero();
continue;
}
if !matches!(
@@ -2430,18 +2429,19 @@ impl<'layout_data> ContentSizesComputation<'layout_data> {
// it needs to either hang or be removed. If that isn't the case,
// `commit_pending_whitespace()` should be called first.
self.pending_whitespace.min_content = Au::zero();
- self.paragraph.min_content =
- std::cmp::max(self.paragraph.min_content, self.current_line.min_content);
- self.current_line.min_content = Au::zero();
+ let current_min_content = mem::take(&mut self.current_line.min_content);
+ self.paragraph.min_content.max_assign(current_min_content);
self.had_content_yet_for_min_content = false;
}
fn forced_line_break(&mut self) {
+ // Handle the line break for min-content sizes.
self.line_break_opportunity();
- self.paragraph.max_content =
- std::cmp::max(self.paragraph.max_content, self.current_line.max_content);
- self.current_line.max_content = Au::zero();
- self.had_content_yet_for_min_content = false;
+
+ // Repeat the same logic, but now for max-content sizes.
+ self.pending_whitespace.max_content = Au::zero();
+ let current_max_content = mem::take(&mut self.current_line.max_content);
+ self.paragraph.max_content.max_assign(current_max_content);
self.had_content_yet_for_max_content = false;
}
diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json
index 66db19e3b25..e35446a99bd 100644
--- a/tests/wpt/meta/MANIFEST.json
+++ b/tests/wpt/meta/MANIFEST.json
@@ -567209,7 +567209,7 @@
]
],
"white-space-intrinsic-size-021.html": [
- "a209f72c30a5a48ed4c185f9d3962abeb68399fb",
+ "f9c246d4899b58dbcf2dc08655c8bc1f39995e5a",
[
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 a209f72c30a..f9c246d4899 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
@@ -26,6 +26,10 @@
hr {
clear: both;
}
+x-br::before {
+ content: "\a";
+ white-space: preserve-breaks;
+}
.collapse.wrap {
white-space: normal;
}
@@ -152,6 +156,16 @@ hr {
<div class="break-spaces wrap" data-expected-client-width="20" data-expected-client-height="20">X É</div>
<div class="break-spaces nowrap" data-expected-client-width="40" data-expected-client-height="10">X É</div>
</div>
+<div class="container narrow">
+ <div class="collapse wrap" data-expected-client-width="10" data-expected-client-height="20">X <x-br></x-br>É</div>
+ <div class="collapse nowrap" data-expected-client-width="10" data-expected-client-height="20">X <x-br></x-br>É</div>
+ <div class="preserve wrap" data-expected-client-width="10" data-expected-client-height="20">X <x-br></x-br>É</div>
+ <div class="preserve nowrap" data-expected-client-width="20" data-expected-client-height="20">X <x-br></x-br>É</div>
+ <div class="preserve-breaks wrap" data-expected-client-width="10" data-expected-client-height="20">X <x-br></x-br>É</div>
+ <div class="preserve-breaks nowrap" data-expected-client-width="10" data-expected-client-height="20">X <x-br></x-br>É</div>
+ <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>
<hr>
@@ -255,6 +269,16 @@ hr {
<div class="break-spaces wrap" data-expected-client-width="40" data-expected-client-height="10">X É</div>
<div class="break-spaces nowrap" data-expected-client-width="40" data-expected-client-height="10">X É</div>
</div>
+<div class="container wide">
+ <div class="collapse wrap" data-expected-client-width="10" data-expected-client-height="20">X <x-br></x-br>É</div>
+ <div class="collapse nowrap" data-expected-client-width="10" data-expected-client-height="20">X <x-br></x-br>É</div>
+ <div class="preserve wrap" data-expected-client-width="20" data-expected-client-height="20">X <x-br></x-br>É</div>
+ <div class="preserve nowrap" data-expected-client-width="20" data-expected-client-height="20">X <x-br></x-br>É</div>
+ <div class="preserve-breaks wrap" data-expected-client-width="10" data-expected-client-height="20">X <x-br></x-br>É</div>
+ <div class="preserve-breaks nowrap" data-expected-client-width="10" data-expected-client-height="20">X <x-br></x-br>É</div>
+ <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>
<hr>