mirror of
https://github.com/servo/servo.git
synced 2025-08-05 13:40:08 +01:00
layout: Rewrite whitespace stripping.
This patch makes Servo unconditionally strip whitespace before text run scanning (assuming that the `white-space` property allows it). Whitespace stripping during reflow is now only used for handling whitespace at the ends of lines; reflow now never attempts to handle ignorable whitespace. Many CSS tests pass now. There are some new failures, however. The following reference tests now fail due to a pre-existing bug whereby whitespace is used to calculate the position of inline hypothetical boxes for elements with `display: inline; position: absolute`: * `absolute-replaced-height-036.htm` * `vertical-align-sub-001.htm` * `vertical-align-super-001.htm` The following reference tests fail due to a pre-existing bug whereby we don't handle `font-size: 0` properly in inline reflow: * `font-size-zero-1.htm` * `font-size-zero-2.htm` The following reference test fails due to the fact that it relied on our incorrect insertion of whitespace to make room for the black background: * `inline-formatting-context-007.htm`
This commit is contained in:
parent
9c528c6382
commit
ae378a8c3e
34 changed files with 216 additions and 181 deletions
|
@ -90,7 +90,7 @@ impl TextRunScanner {
|
|||
// FIXME(pcwalton): We want to be sure not to allocate multiple times, since this is a
|
||||
// performance-critical spot, but this may overestimate and allocate too much memory.
|
||||
let mut new_fragments = Vec::with_capacity(fragments.len());
|
||||
let mut last_whitespace = true;
|
||||
let mut last_whitespace = false;
|
||||
let mut paragraph_bytes_processed = 0;
|
||||
|
||||
while !fragments.is_empty() {
|
||||
|
@ -142,7 +142,7 @@ impl TextRunScanner {
|
|||
debug_assert!(self.clump.len() == 1,
|
||||
"WAT: can't coalesce non-text nodes in flush_clump_to_list()!");
|
||||
out_fragments.push(self.clump.pop_front().unwrap());
|
||||
return last_whitespace
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -398,14 +398,13 @@ fn split_first_fragment_at_newline_if_necessary(fragments: &mut LinkedList<Fragm
|
|||
};
|
||||
|
||||
string_before =
|
||||
unscanned_text_fragment_info.text[..(position + 1)].to_owned().into_boxed_slice();
|
||||
unscanned_text_fragment_info.text[..(position + 1)].to_owned();
|
||||
unscanned_text_fragment_info.text =
|
||||
unscanned_text_fragment_info.text[(position + 1)..].to_owned().into_boxed_slice();
|
||||
}
|
||||
first_fragment.transform(first_fragment.border_box.size,
|
||||
SpecificFragmentInfo::UnscannedText(UnscannedTextFragmentInfo {
|
||||
text: string_before,
|
||||
}))
|
||||
SpecificFragmentInfo::UnscannedText(
|
||||
UnscannedTextFragmentInfo::from_text(string_before)))
|
||||
};
|
||||
|
||||
fragments.push_front(new_fragment);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue