Bug 1346663 - Add a function that returns new rules by removing transition and animation level rules. r?emilio draft
authorHiroyuki Ikezoe <hikezoe@mozilla.com>
Thu, 23 Mar 2017 20:31:52 +0900
changeset 503593 1da8d0ddacf66e8cb14efb39f53bb48d7e5b460e
parent 503592 e0d0334ac1ab3ff0b4f48c78805eb9feb191ed3e
child 503594 b9818780bef95544a992032795540a5cc0fc772d
push id50638
push userhikezoe@mozilla.com
push dateThu, 23 Mar 2017 11:38:51 +0000
reviewersemilio
bugs1346663
milestone55.0a1
Bug 1346663 - Add a function that returns new rules by removing transition and animation level rules. r?emilio This will be used for additive animations and SMIL. MozReview-Commit-ID: JR1u8z9pLB8
servo/components/style/rule_tree/mod.rs
--- a/servo/components/style/rule_tree/mod.rs
+++ b/servo/components/style/rule_tree/mod.rs
@@ -245,16 +245,40 @@ impl RuleTree {
     pub fn remove_transition_rule(&self, path: &StrongRuleNode) -> StrongRuleNode {
         // Return a clone if there is no transition level.
         if path.cascade_level() != CascadeLevel::Transitions {
             return path.clone();
         }
 
         path.parent().unwrap().clone()
     }
+
+    /// Returns new rule node without Animations and Transitions level rules.
+    /// Note: this funciton supposes that rule nodes have been already ordered.
+    pub fn remove_animation_rules(&self, path: &StrongRuleNode) -> StrongRuleNode {
+        // Return a clone if there is neither animation nor transition level.
+        if !path.self_and_ancestors().take_while(|node| node.cascade_level() >= CascadeLevel::Animations)
+                                     .any(|node| node.cascade_level() == CascadeLevel::Animations ||
+                                                 node.cascade_level() == CascadeLevel::Transitions ) {
+            return path.clone();
+        }
+
+        let iter = path.self_and_ancestors().take_while(|node| node.cascade_level() >= CascadeLevel::Animations);
+        let mut last = path;
+        let mut children = vec![];
+        for node in iter {
+            if node.cascade_level() != CascadeLevel::Animations &&
+               node.cascade_level() != CascadeLevel::Transitions {
+                children.push((node.get().source.clone().unwrap(), node.cascade_level()));
+            }
+            last = node;
+        }
+
+        self.insert_ordered_rules_from(last.parent().unwrap().clone(), children.into_iter().rev())
+    }
 }
 
 /// The number of RuleNodes added to the free list before we will consider
 /// doing a GC when calling maybe_gc().  (The value is copied from Gecko,
 /// where it likely did not result from a rigorous performance analysis.)
 const RULE_TREE_GC_INTERVAL: usize = 300;
 
 /// The cascade level these rules are relevant at, as per[1].