diff --git a/components/layout/fragment.rs b/components/layout/fragment.rs index ba7ff2f714e4..82eaec1fe1c2 100644 --- a/components/layout/fragment.rs +++ b/components/layout/fragment.rs @@ -1692,22 +1692,39 @@ impl Fragment { (&mut SpecificFragmentInfo::ScannedText(ref mut this_info), &SpecificFragmentInfo::ScannedText(ref other_info)) => { debug_assert!(util::arc_ptr_eq(&this_info.run, &other_info.run)); - this_info.range.extend_to(other_info.range_end_including_stripped_whitespace); - this_info.content_size.inline = - this_info.run.metrics_for_range(&this_info.range).advance_width; + this_info.range_end_including_stripped_whitespace = + other_info.range_end_including_stripped_whitespace; if other_info.requires_line_break_afterward_if_wrapping_on_newlines() { this_info.flags.insert(REQUIRES_LINE_BREAK_AFTERWARD_IF_WRAPPING_ON_NEWLINES); } self.border_padding.inline_end = next_fragment.border_padding.inline_end; - self.border_box.size.inline = this_info.content_size.inline + - self.border_padding.inline_start_end(); } _ => panic!("Can only merge two scanned-text fragments!"), } - + self.reset_text_range_and_inline_size(); self.meld_with_next_inline_fragment(&next_fragment); } + /// Restore any whitespace that was stripped from a text fragment, and recompute inline metrics + /// if necessary. + pub fn reset_text_range_and_inline_size(&mut self) { + match &mut self.specific { + &mut SpecificFragmentInfo::ScannedText(ref mut info) => { + // FIXME (mbrubeck): Do we need to restore leading too? + let range_end = info.range_end_including_stripped_whitespace; + if info.range.end() == range_end { + return + } + info.range.extend_to(range_end); + info.content_size.inline = info.run.metrics_for_range(&info.range).advance_width; + self.border_box.size.inline = info.content_size.inline + + self.border_padding.inline_start_end(); + } + _ => {} + } + } + + /// Assigns replaced inline-size, padding, and margins for this fragment only if it is replaced /// content per CSS 2.1 ยง 10.3.2. pub fn assign_replaced_inline_size_if_necessary(&mut self, container_inline_size: Au) { diff --git a/components/layout/inline.rs b/components/layout/inline.rs index cd2a822f3173..228ef6c9f20d 100644 --- a/components/layout/inline.rs +++ b/components/layout/inline.rs @@ -527,6 +527,9 @@ impl LineBreaker { mut fragment: Fragment, flow: &InlineFlow, layout_context: &LayoutContext) { + // Undo any whitespace stripping from previous reflows. + fragment.reset_text_range_and_inline_size(); + // Determine initial placement for the fragment if we need to. // // Also, determine whether we can legally break the line before, or inside, this fragment. diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json index 947e3ae93a5f..7adc12efd394 100644 --- a/tests/wpt/mozilla/meta/MANIFEST.json +++ b/tests/wpt/mozilla/meta/MANIFEST.json @@ -2084,6 +2084,30 @@ "url": "/_mozilla/css/incremental_text_color_a.html" } ], + "css/incremental_trailing_whitespace_a.html": [ + { + "path": "css/incremental_trailing_whitespace_a.html", + "references": [ + [ + "/_mozilla/css/incremental_trailing_whitespace_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/incremental_trailing_whitespace_a.html" + } + ], + "css/incremental_trailing_whitespace_ref.html": [ + { + "path": "css/incremental_trailing_whitespace_ref.html", + "references": [ + [ + "/_mozilla/css/incremental_trailing_whitespace_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/incremental_trailing_whitespace_ref.html" + } + ], "css/incremental_visibility_a.html": [ { "path": "css/incremental_visibility_a.html", @@ -8422,6 +8446,30 @@ "url": "/_mozilla/css/incremental_text_color_a.html" } ], + "css/incremental_trailing_whitespace_a.html": [ + { + "path": "css/incremental_trailing_whitespace_a.html", + "references": [ + [ + "/_mozilla/css/incremental_trailing_whitespace_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/incremental_trailing_whitespace_a.html" + } + ], + "css/incremental_trailing_whitespace_ref.html": [ + { + "path": "css/incremental_trailing_whitespace_ref.html", + "references": [ + [ + "/_mozilla/css/incremental_trailing_whitespace_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/incremental_trailing_whitespace_ref.html" + } + ], "css/incremental_visibility_a.html": [ { "path": "css/incremental_visibility_a.html", diff --git a/tests/wpt/mozilla/tests/css/incremental_trailing_whitespace_a.html b/tests/wpt/mozilla/tests/css/incremental_trailing_whitespace_a.html new file mode 100644 index 000000000000..f59bd91d9ea2 --- /dev/null +++ b/tests/wpt/mozilla/tests/css/incremental_trailing_whitespace_a.html @@ -0,0 +1,27 @@ + + + + + incremental trailing whitespace test + + + + +
+
+
Hello
+
+ + + diff --git a/tests/wpt/mozilla/tests/css/incremental_trailing_whitespace_ref.html b/tests/wpt/mozilla/tests/css/incremental_trailing_whitespace_ref.html new file mode 100644 index 000000000000..8eaec14a2fd8 --- /dev/null +++ b/tests/wpt/mozilla/tests/css/incremental_trailing_whitespace_ref.html @@ -0,0 +1,20 @@ + + + + + incremental trailing whitespace reference + + + + +
+
+
Hello
+
+ +