Bug 1344966 - Introduce a closure to replace rule nodes. r?heycam draft
authorHiroyuki Ikezoe <hikezoe@mozilla.com>
Sat, 25 Mar 2017 12:47:51 +0900
changeset 551274 a416429a2908492eb51471273d0ed2e970b955fc
parent 551273 cba84439b0abbe09655b59f8e4eaf0589e7712d1
child 551275 3c45d95cbb21a6ccf6270e1028c072de25425507
push id51006
push userhikezoe@mozilla.com
push dateSat, 25 Mar 2017 09:59:39 +0000
reviewersheycam
bugs1344966
milestone55.0a1
Bug 1344966 - Introduce a closure to replace rule nodes. r?heycam We need a scope to restore rule_node_changed that were borrowed by the closure. This closure function will be used for animation-only restyles as well. MozReview-Commit-ID: 4EXotZjfmr6
servo/components/style/matching.rs
--- a/servo/components/style/matching.rs
+++ b/servo/components/style/matching.rs
@@ -949,40 +949,42 @@ pub trait MatchMethods : TElement {
 
     /// Updates the rule nodes without re-running selector matching, using just
     /// the rule tree. Returns true if the rule nodes changed.
     fn cascade_with_replacements(&self,
                                  hint: RestyleHint,
                                  context: &StyleContext<Self>,
                                  data: &mut AtomicRefMut<ElementData>)
                                  -> bool {
+        use properties::PropertyDeclarationBlock;
+        use shared_lock::Locked;
+
         let primary_rules = &mut data.styles_mut().primary.rules;
         let mut rule_node_changed = false;
 
-        if hint.contains(RESTYLE_STYLE_ATTRIBUTE) {
-            let style_attribute = self.style_attribute();
+        {
+            let mut replace_rule_node = |level: CascadeLevel,
+                                         pdb: Option<&Arc<Locked<PropertyDeclarationBlock>>>,
+                                         path: &mut StrongRuleNode| {
+                let new_node = context.shared.stylist.rule_tree
+                    .update_rule_at_level(level, pdb, path, &context.shared.guards);
+                if let Some(n) = new_node {
+                    *path = n;
+                    rule_node_changed = true;
+                }
+            };
 
-            let new_node = context.shared.stylist.rule_tree
-                .update_rule_at_level(CascadeLevel::StyleAttributeNormal,
-                                      style_attribute,
-                                      primary_rules,
-                                      &context.shared.guards);
-            if let Some(n) = new_node {
-                *primary_rules = n;
-                rule_node_changed = true;
-            }
-
-            let new_node = context.shared.stylist.rule_tree
-                .update_rule_at_level(CascadeLevel::StyleAttributeImportant,
-                                      style_attribute,
-                                      primary_rules,
-                                      &context.shared.guards);
-            if let Some(n) = new_node {
-                *primary_rules = n;
-                rule_node_changed = true;
+            if hint.contains(RESTYLE_STYLE_ATTRIBUTE) {
+                let style_attribute = self.style_attribute();
+                replace_rule_node(CascadeLevel::StyleAttributeNormal,
+                                  style_attribute,
+                                  primary_rules);
+                replace_rule_node(CascadeLevel::StyleAttributeImportant,
+                                  style_attribute,
+                                  primary_rules);
             }
         }
 
         // The per-pseudo rule nodes never change in this path.
         rule_node_changed
     }
 
     /// Attempts to share a style with another node. This method is unsafe