style: Unify invalidated_child with invalidated_descendants.

I think invalidated_descendants was buggy, and this fixes it.
This commit is contained in:
Emilio Cobos Álvarez 2017-10-12 17:30:41 +02:00
parent 557353c1f6
commit 9e61c1962b
No known key found for this signature in database
GPG key ID: 056B727BB9C1027C
2 changed files with 16 additions and 38 deletions

View file

@ -203,16 +203,20 @@ where
} }
} }
fn invalidated_child( fn invalidated_descendants(
&self, &self,
element: E, element: E,
_data: Option<&mut ElementData>, data: Option<&mut ElementData>,
child: E, child: E,
) { ) {
if child.get_data().is_none() { if child.get_data().is_none() {
return; return;
} }
if data.as_ref().map_or(true, |d| d.styles.is_display_none()) {
return;
}
// The child may not be a flattened tree child of the current element, // The child may not be a flattened tree child of the current element,
// but may be arbitrarily deep. // but may be arbitrarily deep.
// //
@ -220,24 +224,12 @@ where
// we need to propagate it as appropriate. // we need to propagate it as appropriate.
let mut current = child.traversal_parent(); let mut current = child.traversal_parent();
while let Some(parent) = current.take() { while let Some(parent) = current.take() {
unsafe { parent.set_dirty_descendants() };
current = parent.traversal_parent();
if parent == element { if parent == element {
break; break;
} }
unsafe { parent.set_dirty_descendants() };
current = parent.traversal_parent();
}
}
fn invalidated_descendants(
&self,
element: E,
data: Option<&mut ElementData>,
) {
// FIXME(emilio): We probably want to walk the flattened tree here too,
// and remove invalidated_child instead, or something like that.
if data.as_ref().map_or(false, |d| !d.styles.is_display_none()) {
unsafe { element.set_dirty_descendants() };
} }
} }

View file

@ -54,14 +54,6 @@ where
data: Option<&mut ElementData>, data: Option<&mut ElementData>,
); );
/// Executes an arbitrary action when a direct child is invalidated.
fn invalidated_child(
&self,
element: E,
data: Option<&mut ElementData>,
child: E,
);
/// Executes an action when `Self` is invalidated. /// Executes an action when `Self` is invalidated.
fn invalidated_self( fn invalidated_self(
&self, &self,
@ -74,6 +66,7 @@ where
&self, &self,
element: E, element: E,
data: Option<&mut ElementData>, data: Option<&mut ElementData>,
child: E,
); );
} }
@ -388,23 +381,23 @@ where
sibling_invalidations, sibling_invalidations,
); );
let invalidated_descendants = child_invalidator.invalidate_descendants(
&invalidations_for_descendants
);
// The child may not be a flattened tree child of the current element, // The child may not be a flattened tree child of the current element,
// but may be arbitrarily deep. // but may be arbitrarily deep.
// //
// Since we keep the traversal flags in terms of the flattened tree, // Since we keep the traversal flags in terms of the flattened tree,
// we need to propagate it as appropriate. // we need to propagate it as appropriate.
if invalidated_child { if invalidated_child || invalidated_descendants {
self.processor.invalidated_child( self.processor.invalidated_descendants(
self.element, self.element,
self.data.as_mut().map(|d| &mut **d), self.data.as_mut().map(|d| &mut **d),
child, child,
); );
} }
let invalidated_descendants = child_invalidator.invalidate_descendants(
&invalidations_for_descendants
);
invalidated_child || invalidated_descendants invalidated_child || invalidated_descendants
} }
@ -517,13 +510,6 @@ where
any_descendant |= self.invalidate_nac(invalidations); any_descendant |= self.invalidate_nac(invalidations);
if any_descendant {
self.processor.invalidated_descendants(
self.element,
self.data.as_mut().map(|d| &mut **d)
);
}
any_descendant any_descendant
} }