diff --git a/components/style/traversal.rs b/components/style/traversal.rs index f1f1a26342d..63c7dfd68e9 100644 --- a/components/style/traversal.rs +++ b/components/style/traversal.rs @@ -37,6 +37,10 @@ bitflags! { const ANIMATION_ONLY = 0x02, /// Traverse without generating any change hints. const FOR_RECONSTRUCT = 0x04, + /// Traverse triggered by CSS rule changes. + /// Traverse and update all elements with CSS animations since + /// @keyframes rules may have changed + const FOR_CSS_RULE_CHANGES = 0x08, } } @@ -55,6 +59,11 @@ impl TraversalFlags { pub fn for_reconstruct(&self) -> bool { self.contains(FOR_RECONSTRUCT) } + + /// Returns true if the traversal is triggered by CSS rule changes. + pub fn for_css_rule_changes(&self) -> bool { + self.contains(FOR_CSS_RULE_CHANGES) + } } /// This structure exists to enforce that callers invoke pre_traverse, and also diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index a78a43ef395..bc4db3e7204 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -103,7 +103,7 @@ use style::stylesheets::StylesheetLoader as StyleStylesheetLoader; use style::supports::parse_condition_or_declaration; use style::thread_state; use style::timer::Timer; -use style::traversal::{ANIMATION_ONLY, FOR_RECONSTRUCT, UNSTYLED_CHILDREN_ONLY}; +use style::traversal::{ANIMATION_ONLY, FOR_CSS_RULE_CHANGES, FOR_RECONSTRUCT, UNSTYLED_CHILDREN_ONLY}; use style::traversal::{resolve_style, DomTraversal, TraversalDriver, TraversalFlags}; use style::values::{CustomIdent, KeyframesName}; use style_traits::ToCss; @@ -252,10 +252,11 @@ pub extern "C" fn Servo_TraverseSubtree(root: RawGeckoElementBorrowed, let traversal_flags = match (root_behavior, restyle_behavior) { (Root::Normal, Restyle::Normal) | (Root::Normal, Restyle::ForAnimationOnly) - => TraversalFlags::empty(), + => TraversalFlags::empty(), (Root::UnstyledChildrenOnly, Restyle::Normal) | (Root::UnstyledChildrenOnly, Restyle::ForAnimationOnly) - => UNSTYLED_CHILDREN_ONLY, + => UNSTYLED_CHILDREN_ONLY, + (Root::Normal, Restyle::ForCSSRuleChanges) => FOR_CSS_RULE_CHANGES, (Root::Normal, Restyle::ForReconstruct) => FOR_RECONSTRUCT, _ => panic!("invalid combination of TraversalRootBehavior and TraversalRestyleBehavior"), };