geckolib: Don't panic when attempting to restyle an element with newly applied XBL bindings. draft
authorCameron McCormack <cam@mcc.id.au>
Sun, 11 Jun 2017 19:11:50 +0800
changeset 592212 888b6ee5ef1b27c2725a1070758849574dfd8070
parent 592211 779f0ea289f935a4890c1b5ae9b7c94503d17c2e
child 592213 6905d928e6674a194c36039fd74137e27921018a
push id63309
push userbmo:cam@mcc.id.au
push dateSun, 11 Jun 2017 11:13:33 +0000
milestone55.0a1
geckolib: Don't panic when attempting to restyle an element with newly applied XBL bindings. MozReview-Commit-ID: 7oT67rjN6Va
servo/ports/geckolib/glue.rs
--- a/servo/ports/geckolib/glue.rs
+++ b/servo/ports/geckolib/glue.rs
@@ -257,19 +257,21 @@ pub extern "C" fn Servo_TraverseSubtree(
     use self::structs::TraversalRootBehavior as Root;
     debug_assert!(!snapshots.is_null());
 
     let element = GeckoElement(root);
     debug!("Servo_TraverseSubtree: {:?}", element);
 
     let traversal_flags = match (root_behavior, restyle_behavior) {
         (Root::Normal, Restyle::Normal) |
+        (Root::Normal, Restyle::ForNewlyBoundElement) |
         (Root::Normal, Restyle::ForAnimationOnly)
             => TraversalFlags::empty(),
         (Root::UnstyledChildrenOnly, Restyle::Normal) |
+        (Root::UnstyledChildrenOnly, Restyle::ForNewlyBoundElement) |
         (Root::UnstyledChildrenOnly, Restyle::ForAnimationOnly)
             => UNSTYLED_CHILDREN_ONLY,
         (Root::Normal, Restyle::ForCSSRuleChanges) => FOR_CSS_RULE_CHANGES,
         (Root::Normal, Restyle::ForReconstruct) => FOR_RECONSTRUCT,
         _ => panic!("invalid combination of TraversalRootBehavior and TraversalRestyleBehavior"),
     };
 
     let needs_animation_only_restyle = element.has_animation_only_dirty_descendants() ||
@@ -285,17 +287,18 @@ pub extern "C" fn Servo_TraverseSubtree(
         return needs_animation_only_restyle;
     }
 
     traverse_subtree(element,
                      raw_data,
                      traversal_flags,
                      unsafe { &*snapshots });
 
-    element.has_dirty_descendants() || element.borrow_data().unwrap().has_restyle()
+    restyle_behavior != Restyle::ForNewlyBoundElement &&
+        (element.has_dirty_descendants() || element.borrow_data().unwrap().has_restyle())
 }
 
 #[no_mangle]
 pub extern "C" fn Servo_AnimationValues_Interpolate(from: RawServoAnimationValueBorrowed,
                                                     to: RawServoAnimationValueBorrowed,
                                                     progress: f64)
      -> RawServoAnimationValueStrong
 {