servo: Merge #3841 - layout: Stop adding damage when removing whitespace (from pcwalton:removing-whitespace-damage); r=cgaebel
Avoids total reflow of the entire document on the maze solver. I have tested Wikipedia reflow and it still works. r? @cgaebel Source-Repo: https://github.com/servo/servo Source-Revision: c20bb66aef28e922c46aa69c9faaa94d83269e73
This commit is contained in:
@@ -306,15 +306,13 @@ impl<'a> FlowConstructor<'a> {
|
||||
match whitespace_stripping {
|
||||
NoWhitespaceStripping => {}
|
||||
StripWhitespaceFromStart => {
|
||||
flow::mut_base(flow.deref_mut()).restyle_damage.insert(
|
||||
strip_ignorable_whitespace_from_start(&mut fragments));
|
||||
strip_ignorable_whitespace_from_start(&mut fragments);
|
||||
if fragments.is_empty() {
|
||||
return
|
||||
};
|
||||
}
|
||||
StripWhitespaceFromEnd => {
|
||||
flow::mut_base(flow.deref_mut()).restyle_damage.insert(
|
||||
strip_ignorable_whitespace_from_end(&mut fragments));
|
||||
strip_ignorable_whitespace_from_end(&mut fragments);
|
||||
if fragments.is_empty() {
|
||||
return
|
||||
};
|
||||
@@ -1232,36 +1230,26 @@ impl FlowConstructionUtils for FlowRef {
|
||||
}
|
||||
|
||||
/// Strips ignorable whitespace from the start of a list of fragments.
|
||||
///
|
||||
/// Returns some damage that must be added to the `InlineFlow`.
|
||||
pub fn strip_ignorable_whitespace_from_start(this: &mut DList<Fragment>) -> RestyleDamage {
|
||||
pub fn strip_ignorable_whitespace_from_start(this: &mut DList<Fragment>) {
|
||||
if this.is_empty() {
|
||||
return RestyleDamage::empty() // Fast path.
|
||||
return // Fast path.
|
||||
}
|
||||
|
||||
let mut damage = RestyleDamage::empty();
|
||||
while !this.is_empty() && this.front().as_ref().unwrap().is_ignorable_whitespace() {
|
||||
debug!("stripping ignorable whitespace from start");
|
||||
damage = RestyleDamage::all();
|
||||
drop(this.pop_front());
|
||||
}
|
||||
damage
|
||||
}
|
||||
|
||||
/// Strips ignorable whitespace from the end of a list of fragments.
|
||||
///
|
||||
/// Returns some damage that must be added to the `InlineFlow`.
|
||||
pub fn strip_ignorable_whitespace_from_end(this: &mut DList<Fragment>) -> RestyleDamage {
|
||||
pub fn strip_ignorable_whitespace_from_end(this: &mut DList<Fragment>) {
|
||||
if this.is_empty() {
|
||||
return RestyleDamage::empty();
|
||||
return
|
||||
}
|
||||
|
||||
let mut damage = RestyleDamage::empty();
|
||||
while !this.is_empty() && this.back().as_ref().unwrap().is_ignorable_whitespace() {
|
||||
debug!("stripping ignorable whitespace from end");
|
||||
damage = RestyleDamage::all();
|
||||
drop(this.pop());
|
||||
}
|
||||
damage
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user