Bug 1347053 - Part 2: Handle none transition in set_transition_timing_function. draft
authorBoris Chiou <boris.chiou@gmail.com>
Wed, 15 Mar 2017 18:31:12 +0800
changeset 499025 a09480877acc493ce3611f147640b65e7f9b7fe0
parent 499024 db5561bc8496a04e5bb0337fafb70d62158a731e
child 549261 c2f3f28c23ca255bb23a61c1d32df1eb122345b7
push id49316
push userbmo:boris.chiou@gmail.com
push dateWed, 15 Mar 2017 10:49:11 +0000
bugs1347053
milestone55.0a1
Bug 1347053 - Part 2: Handle none transition in set_transition_timing_function. We split impl_animation_or_transition_timing_function() into two functions, set_transition_timing_function and set_animation_timing_function, and then do the same things as those of time values. MozReview-Commit-ID: Iysu0vjeOEz
servo/components/style/properties/gecko.mako.rs
--- a/servo/components/style/properties/gecko.mako.rs
+++ b/servo/components/style/properties/gecko.mako.rs
@@ -1303,35 +1303,16 @@ fn static_assert() {
 
 <%def name="impl_animation_or_transition_count(type, ident, gecko_ffi_name)">
     #[allow(non_snake_case)]
     pub fn ${type}_${ident}_count(&self) -> usize {
         self.gecko.m${type.capitalize()}${gecko_ffi_name}Count as usize
     }
 </%def>
 
-<%def name="impl_animation_or_transition_timing_function(type)">
-    pub fn set_${type}_timing_function(&mut self, v: longhands::${type}_timing_function::computed_value::T) {
-        debug_assert!(!v.0.is_empty());
-        let input_len = v.0.len();
-        unsafe { self.gecko.m${type.capitalize()}s.ensure_len(input_len) };
-
-        self.gecko.m${type.capitalize()}TimingFunctionCount = input_len as u32;
-        for (i, gecko) in self.gecko.m${type.capitalize()}s.iter_mut().enumerate() {
-            gecko.mTimingFunction = v.0[i % input_len].into();
-        }
-    }
-    ${impl_animation_or_transition_count(type, 'timing_function', 'TimingFunction')}
-    ${impl_copy_animation_or_transition_value(type, 'timing_function', 'TimingFunction')}
-    pub fn ${type}_timing_function_at(&self, index: usize)
-        -> longhands::${type}_timing_function::computed_value::SingleComputedValue {
-        self.gecko.m${type.capitalize()}s[index].mTimingFunction.into()
-    }
-</%def>
-
 <%def name="impl_transition_time_value(ident, gecko_ffi_name)">
     #[allow(non_snake_case)]
     pub fn set_transition_${ident}(&mut self, v: longhands::transition_${ident}::computed_value::T) {
         if !v.0.is_empty() {
             let input_len = v.0.len();
             unsafe { self.gecko.mTransitions.ensure_len(input_len) };
 
             self.gecko.mTransition${gecko_ffi_name}Count = input_len as u32;
@@ -1359,17 +1340,38 @@ fn static_assert() {
     ${impl_animation_or_transition_count('transition', ident, gecko_ffi_name)}
 </%def>
 
 <%def name="impl_copy_animation_value(ident, gecko_ffi_name)">
     ${impl_copy_animation_or_transition_value('animation', ident, gecko_ffi_name)}
 </%def>
 
 <%def name="impl_transition_timing_function()">
-    ${impl_animation_or_transition_timing_function('transition')}
+    pub fn set_transition_timing_function(&mut self, v: longhands::transition_timing_function::computed_value::T) {
+        if !v.0.is_empty() {
+            let input_len = v.0.len();
+            unsafe { self.gecko.mTransitions.ensure_len(input_len) };
+
+            self.gecko.mTransitionTimingFunctionCount = input_len as u32;
+            for (i, gecko) in self.gecko.mTransitions.iter_mut().enumerate() {
+                gecko.mTimingFunction = v.0[i % input_len].into();
+            }
+        } else {
+            // An empty vector means this is a none transition, so we need one item in mTransition
+            // which represents a none transition with initial/unset values.
+            self.gecko.mTransitions[0].mTimingFunction =
+                longhands::transition_timing_function::single_value::get_initial_value().into();
+        }
+    }
+    pub fn transition_timing_function_at(&self, index: usize)
+        -> longhands::transition_timing_function::computed_value::SingleComputedValue {
+        self.gecko.mTransitions[index].mTimingFunction.into()
+    }
+    ${impl_animation_or_transition_count('transition', 'timing_function', 'TimingFunction')}
+    ${impl_copy_animation_or_transition_value('transition', 'timing_function', 'TimingFunction')}
 </%def>
 
 <%def name="impl_animation_count(ident, gecko_ffi_name)">
     ${impl_animation_or_transition_count('animation', ident, gecko_ffi_name)}
 </%def>
 
 <%def name="impl_animation_time_value(ident, gecko_ffi_name)">
     #[allow(non_snake_case)]
@@ -1389,17 +1391,32 @@ fn static_assert() {
         use values::specified::Time;
         Time(self.gecko.mAnimations[index].m${gecko_ffi_name} / 1000.)
     }
     ${impl_animation_or_transition_count('animation', ident, gecko_ffi_name)}
     ${impl_copy_animation_or_transition_value('animation', ident, gecko_ffi_name)}
 </%def>
 
 <%def name="impl_animation_timing_function()">
-    ${impl_animation_or_transition_timing_function('animation')}
+    pub fn set_animation_timing_function(&mut self, v: longhands::animation_timing_function::computed_value::T) {
+        debug_assert!(!v.0.is_empty());
+        let input_len = v.0.len();
+        unsafe { self.gecko.mAnimations.ensure_len(input_len) };
+
+        self.gecko.mAnimationTimingFunctionCount = input_len as u32;
+        for (i, gecko) in self.gecko.mAnimations.iter_mut().enumerate() {
+            gecko.mTimingFunction = v.0[i % input_len].into();
+        }
+    }
+    pub fn animation_timing_function_at(&self, index: usize)
+        -> longhands::animation_timing_function::computed_value::SingleComputedValue {
+        self.gecko.mAnimations[index].mTimingFunction.into()
+    }
+    ${impl_animation_or_transition_count('animation', 'timing_function', 'TimingFunction')}
+    ${impl_copy_animation_or_transition_value('animation', 'timing_function', 'TimingFunction')}
 </%def>
 
 <%def name="impl_animation_keyword(ident, gecko_ffi_name, keyword, cast_type='u8')">
     #[allow(non_snake_case)]
     pub fn set_animation_${ident}(&mut self, v: longhands::animation_${ident}::computed_value::T) {
         use properties::longhands::animation_${ident}::single_value::computed_value::T as Keyword;
         use gecko_bindings::structs;