зеркало из https://github.com/mozilla/gecko-dev.git
servo: Merge #10246 - Restore stripped whitespace before reflowing text fragments (from mbrubeck:strip-leading); r=pcwalton
Fixes #10200. r? @pcwalton Note: The reftest uses a transition of non-zero duration, because I couldn't find any other way to reproduce the bug. Unfortunately this makes it unreliable in debug builds. I tried to fix this using reftest-wait with setTimeout and requestAnimationFrame, but it still wouldn't complete the animation consistently. To make the test work in debug builds we may need `transitionend` events (#10245) or a different way to reproduce the bug. Source-Repo: https://github.com/servo/servo Source-Revision: 159be44193ef7d60a5c35629d791323e5357e7db
This commit is contained in:
Родитель
38a13b3488
Коммит
610e3a8057
|
@ -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) {
|
||||
|
|
|
@ -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.
|
||||
|
|
Загрузка…
Ссылка в новой задаче