diff --git a/components/style/traversal.rs b/components/style/traversal.rs index eb51f7d7763..a265f49ba2c 100644 --- a/components/style/traversal.rs +++ b/components/style/traversal.rs @@ -462,7 +462,11 @@ pub trait DomTraversal : Sync { let el = kid.as_element(); if el.as_ref().and_then(|el| el.borrow_data()) .map_or(false, |d| d.has_styles()) { - unsafe { parent.set_dirty_descendants(); } + if self.shared_context().traversal_flags.for_animation_only() { + unsafe { parent.set_animation_only_dirty_descendants(); } + } else { + unsafe { parent.set_dirty_descendants(); } + } } } f(thread_local, kid); diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index a3ad8344824..b099fd242e8 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -300,7 +300,9 @@ pub extern "C" fn Servo_TraverseSubtree(root: RawGeckoElementBorrowed, return false; } - element.has_dirty_descendants() || element.borrow_data().unwrap().restyle.contains_restyle_data() + element.has_dirty_descendants() || + element.has_animation_only_dirty_descendants() || + element.borrow_data().unwrap().restyle.contains_restyle_data() } /// Checks whether the rule tree has crossed its threshold for unused nodes, and @@ -2801,7 +2803,9 @@ pub extern "C" fn Servo_AssertTreeIsClean(root: RawGeckoElementBorrowed) { let root = GeckoElement(root); fn assert_subtree_is_clean<'le>(el: GeckoElement<'le>) { - debug_assert!(!el.has_dirty_descendants() && !el.has_animation_only_dirty_descendants()); + debug_assert!(!el.has_dirty_descendants() && !el.has_animation_only_dirty_descendants(), + "{:?} has still dirty bit {:?} or animation-only dirty bit {:?}", + el, el.has_dirty_descendants(), el.has_animation_only_dirty_descendants()); for child in el.as_node().traversal_children() { if let Some(child) = child.as_element() { assert_subtree_is_clean(child);