aboutsummaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
Diffstat (limited to 'components')
-rw-r--r--components/style/keyframes.rs43
-rw-r--r--components/style/stylist.rs14
2 files changed, 26 insertions, 31 deletions
diff --git a/components/style/keyframes.rs b/components/style/keyframes.rs
index 0eb0662c128..eca73f1f848 100644
--- a/components/style/keyframes.rs
+++ b/components/style/keyframes.rs
@@ -266,50 +266,51 @@ fn get_animated_properties(keyframe: &Keyframe) -> Vec<TransitionProperty> {
impl KeyframesAnimation {
/// Create a keyframes animation from a given list of keyframes.
///
- /// This will return `None` if the list of keyframes is empty, or there are
- /// no animated properties obtained from the keyframes.
+ /// This will return a keyframe animation with empty steps and
+ /// properties_changed if the list of keyframes is empty, or there are no
+ // animated properties obtained from the keyframes.
///
/// Otherwise, this will compute and sort the steps used for the animation,
/// and return the animation object.
- pub fn from_keyframes(keyframes: &[Arc<RwLock<Keyframe>>]) -> Option<Self> {
+ pub fn from_keyframes(keyframes: &[Arc<RwLock<Keyframe>>]) -> Self {
+ let mut result = KeyframesAnimation {
+ steps: vec![],
+ properties_changed: vec![],
+ };
+
if keyframes.is_empty() {
- return None;
+ return result;
}
- let animated_properties = get_animated_properties(&keyframes[0].read());
- if animated_properties.is_empty() {
- return None;
+ result.properties_changed = get_animated_properties(&keyframes[0].read());
+ if result.properties_changed.is_empty() {
+ return result;
}
- let mut steps = vec![];
-
for keyframe in keyframes {
let keyframe = keyframe.read();
for percentage in keyframe.selector.0.iter() {
- steps.push(KeyframesStep::new(*percentage, KeyframesStepValue::Declarations {
+ result.steps.push(KeyframesStep::new(*percentage, KeyframesStepValue::Declarations {
block: keyframe.block.clone(),
}));
}
}
// Sort by the start percentage, so we can easily find a frame.
- steps.sort_by_key(|step| step.start_percentage);
+ result.steps.sort_by_key(|step| step.start_percentage);
// Prepend autogenerated keyframes if appropriate.
- if steps[0].start_percentage.0 != 0. {
- steps.insert(0, KeyframesStep::new(KeyframePercentage::new(0.),
- KeyframesStepValue::ComputedValues));
+ if result.steps[0].start_percentage.0 != 0. {
+ result.steps.insert(0, KeyframesStep::new(KeyframePercentage::new(0.),
+ KeyframesStepValue::ComputedValues));
}
- if steps.last().unwrap().start_percentage.0 != 1. {
- steps.push(KeyframesStep::new(KeyframePercentage::new(1.),
- KeyframesStepValue::ComputedValues));
+ if result.steps.last().unwrap().start_percentage.0 != 1. {
+ result.steps.push(KeyframesStep::new(KeyframePercentage::new(1.),
+ KeyframesStepValue::ComputedValues));
}
- Some(KeyframesAnimation {
- steps: steps,
- properties_changed: animated_properties,
- })
+ result
}
}
diff --git a/components/style/stylist.rs b/components/style/stylist.rs
index 3d81e3897bc..313d2dae76e 100644
--- a/components/style/stylist.rs
+++ b/components/style/stylist.rs
@@ -182,6 +182,7 @@ impl Stylist {
self.precomputed_pseudo_element_decls = Default::default();
self.rules_source_order = 0;
self.state_deps.clear();
+ self.animations.clear();
self.sibling_affecting_selectors.clear();
self.non_common_style_affecting_attributes_selectors.clear();
@@ -274,16 +275,9 @@ impl Stylist {
CssRule::Keyframes(ref keyframes_rule) => {
let keyframes_rule = keyframes_rule.read();
debug!("Found valid keyframes rule: {:?}", *keyframes_rule);
- if let Some(animation) = KeyframesAnimation::from_keyframes(&keyframes_rule.keyframes) {
- debug!("Found valid keyframe animation: {:?}", animation);
- self.animations.insert(keyframes_rule.name.clone(),
- animation);
- } else {
- // If there's a valid keyframes rule, even if it doesn't
- // produce an animation, should shadow other animations
- // with the same name.
- self.animations.remove(&keyframes_rule.name);
- }
+ let animation = KeyframesAnimation::from_keyframes(&keyframes_rule.keyframes);
+ debug!("Found valid keyframe animation: {:?}", animation);
+ self.animations.insert(keyframes_rule.name.clone(), animation);
}
// We don't care about any other rule.
_ => {}