diff options
-rw-r--r-- | components/layout/fragment.rs | 29 | ||||
-rw-r--r-- | components/layout/inline.rs | 3 | ||||
-rw-r--r-- | tests/wpt/mozilla/meta/MANIFEST.json | 48 | ||||
-rw-r--r-- | tests/wpt/mozilla/tests/css/incremental_trailing_whitespace_a.html | 27 | ||||
-rw-r--r-- | tests/wpt/mozilla/tests/css/incremental_trailing_whitespace_ref.html | 20 |
5 files changed, 121 insertions, 6 deletions
diff --git a/components/layout/fragment.rs b/components/layout/fragment.rs index ba7ff2f714e..82eaec1fe1c 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 cd2a822f317..228ef6c9f20 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 947e3ae93a5..7adc12efd39 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 00000000000..f59bd91d9ea --- /dev/null +++ b/tests/wpt/mozilla/tests/css/incremental_trailing_whitespace_a.html @@ -0,0 +1,27 @@ +<!doctype html> +<html> + <head> + <meta charset="utf-8"> + <title>incremental trailing whitespace test</title> + <link rel="match" href="incremental_trailing_whitespace_ref.html"> + <style> + #a { + border: 0 solid; + } + #a.go { + border-bottom-width: 4px !important; + } + </style> + </head> + <body> + <div style="display: inline-block; width: 33.3333%;"></div> + <div style="display: inline-block; width: 66.66%;"> + <div id="a" style="transition: all .1s ease-out;">Hello</div> + </div> + <script> + document.body.offsetWidth; // force layout + document.querySelector('#a').classList.add('go'); + // FIXME (#10245): Wait for the "transitionend" event. + </script> + </body> +</html> 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 00000000000..8eaec14a2fd --- /dev/null +++ b/tests/wpt/mozilla/tests/css/incremental_trailing_whitespace_ref.html @@ -0,0 +1,20 @@ +<!doctype html> +<html> + <head> + <meta charset="utf-8"> + <title>incremental trailing whitespace reference</title> + <link rel="match" href="incremental_trailing_whitespace_ref.html"> + <style> + #a { + border: 0 solid; + border-bottom-width: 4px !important; + } + </style> + </head> + <body> + <div style="display: inline-block; width: 33.3333%;"></div> + <div style="display: inline-block; width: 66.66%;"> + <div id="a">Hello</div> + </div> + </body> +</html> |