diff --git a/components/layout/animation.rs b/components/layout/animation.rs index b79121a0573..337855599e6 100644 --- a/components/layout/animation.rs +++ b/components/layout/animation.rs @@ -12,9 +12,8 @@ use msg::constellation_msg::PipelineId; use script_layout_interface::restyle_damage::RestyleDamage; use script_traits::{AnimationState, LayoutMsg as ConstellationMsg}; use std::collections::HashMap; -use std::collections::hash_map::Entry; use std::sync::mpsc::Receiver; -use style::animation::{Animation, KeyframesAnimationState, KeyframesIterationState, update_style_for_animation}; +use style::animation::{Animation, KeyframesIterationState, update_style_for_animation}; use time; /// Processes any new animations that were discovered after style recalculation. diff --git a/components/style/animation.rs b/components/style/animation.rs index 367dcb99b66..9afea17b213 100644 --- a/components/style/animation.rs +++ b/components/style/animation.rs @@ -6,26 +6,24 @@ use app_units::Au; use bezier::Bezier; -use euclid::point::Point2D; +use context::SharedStyleContext; use dom::{OpaqueNode, TRestyleDamage}; -use keyframes::KeyframesAnimation; +use euclid::point::Point2D; use keyframes::KeyframesStep; use properties::animated_properties::{AnimatedProperty, TransitionProperty}; +use properties::longhands::animation_iteration_count::computed_value::AnimationIterationCount; +use properties::longhands::animation_play_state::computed_value::AnimationPlayState; use properties::longhands::transition_timing_function::computed_value::StartEnd; use properties::longhands::transition_timing_function::computed_value::TransitionTimingFunction; -use properties::longhands::animation_play_state::computed_value::AnimationPlayState; -use properties::longhands::animation_iteration_count::computed_value::AnimationIterationCount; use properties::style_struct_traits::Box; -use properties::{ComputedValues, ServoComputedValues}; +use properties::{self, ComputedValues}; +use selector_impl::SelectorImplExt; +use selectors::matching::DeclarationBlock; use std::sync::mpsc::Sender; use std::sync::{Arc, Mutex}; +use string_cache::Atom; use time; use values::computed::Time; -use selector_impl::SelectorImplExt; -use context::SharedStyleContext; -use selectors::matching::DeclarationBlock; -use string_cache::Atom; -use properties; /// This structure represents a keyframes animation current iteration state. /// @@ -392,7 +390,8 @@ where Impl: SelectorImplExt, total_progress = 1.; } - debug!("update_style_for_animation: anim \"{}\", steps: {:?}, state: {:?}, progress: {}", name, animation.steps, state, total_progress); + debug!("update_style_for_animation: anim \"{}\", steps: {:?}, state: {:?}, progress: {}", + name, animation.steps, state, total_progress); let mut last_keyframe_position = None; let mut target_keyframe_position = None; @@ -410,14 +409,16 @@ where Impl: SelectorImplExt, } } - debug!("update_style_for_animation: keyframe from {:?} to {:?}", last_keyframe_position, target_keyframe_position); + debug!("update_style_for_animation: keyframe from {:?} to {:?}", + last_keyframe_position, target_keyframe_position); let target_keyframe = match target_keyframe_position { Some(target) => &animation.steps[target], None => { // TODO: The 0. case falls here, maybe we should just resort // to the first keyframe instead. - warn!("update_style_for_animation: No current keyframe found for animation \"{}\" at progress {}", name, total_progress); + warn!("update_style_for_animation: No current keyframe found for animation \"{}\" at progress {}", + name, total_progress); return; } }; @@ -425,12 +426,14 @@ where Impl: SelectorImplExt, let last_keyframe = match last_keyframe_position { Some(last) => &animation.steps[last], None => { - warn!("update_style_for_animation: No last keyframe found for animation \"{}\" at progress {}", name, total_progress); + warn!("update_style_for_animation: No last keyframe found for animation \"{}\" at progress {}", + name, total_progress); return; } }; - let relative_duration = (target_keyframe.start_percentage.0 - last_keyframe.start_percentage.0) as f64 * duration; + let relative_timespan = target_keyframe.start_percentage.0 - last_keyframe.start_percentage.0; + let relative_duration = relative_timespan as f64 * duration; let last_keyframe_ended_at = state.started_at + (total_duration * last_keyframe.start_percentage.0 as f64); let relative_progress = (now - last_keyframe_ended_at) / relative_duration; @@ -446,25 +449,32 @@ where Impl: SelectorImplExt, timing_function = from_style.as_servo().get_box().animation_timing_function.0[0]; } - let mut target_style = compute_style_for_animation_step(context, - target_keyframe, - &from_style); + let target_style = compute_style_for_animation_step(context, + target_keyframe, + &from_style); let mut new_style = (*style).clone(); let mut style_changed = false; for transition_property in &animation.properties_changed { - debug!("update_style_for_animation: scanning prop {:?} for animation \"{}\"", transition_property, name); - if let Some(property_animation) = PropertyAnimation::from_transition_property(*transition_property, - timing_function, - Time(relative_duration as f32), - &from_style, - &target_style) { + debug!("update_style_for_animation: scanning prop {:?} for animation \"{}\"", + transition_property, name); + match PropertyAnimation::from_transition_property(*transition_property, + timing_function, + Time(relative_duration as f32), + &from_style, + &target_style) { + Some(property_animation) => { debug!("update_style_for_animation: got property animation for prop {:?}", transition_property); debug!("update_style_for_animation: {:?}", property_animation); property_animation.update(Arc::make_mut(&mut new_style), relative_progress); style_changed = true; } + None => { + debug!("update_style_for_animation: property animation {:?} not animating", + transition_property); + } + } } if style_changed { diff --git a/components/style/keyframes.rs b/components/style/keyframes.rs index 501e3863960..07e504a5988 100644 --- a/components/style/keyframes.rs +++ b/components/style/keyframes.rs @@ -3,10 +3,9 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use cssparser::{Parser, Delimiter}; -use selectors::matching::DeclarationBlock; use parser::ParserContext; -use properties::{ComputedValues, PropertyDeclaration, PropertyDeclarationBlock, parse_property_declaration_list}; use properties::animated_properties::TransitionProperty; +use properties::{PropertyDeclaration, parse_property_declaration_list}; use std::sync::Arc; /// Parses a keyframes list, like: @@ -165,7 +164,7 @@ impl KeyframesAnimation { debug_assert!(keyframes.len() > 1); let mut steps = vec![]; - let mut animated_properties = get_animated_properties(&keyframes[0]); + let animated_properties = get_animated_properties(&keyframes[0]); if animated_properties.is_empty() { return None; } diff --git a/components/style/matching.rs b/components/style/matching.rs index 8e1a04577c4..3d6d2bd147e 100644 --- a/components/style/matching.rs +++ b/components/style/matching.rs @@ -27,8 +27,6 @@ use util::arc_ptr_eq; use util::cache::{LRUCache, SimpleHashCache}; use util::opts; use util::vec::ForgetfulSink; -use properties::longhands::animation_play_state::computed_value::AnimationPlayState; -use properties::style_struct_traits::Box; fn create_common_style_affecting_attributes_from_element(element: &E) -> CommonStyleAffectingAttributes { @@ -662,7 +660,8 @@ pub trait MatchMethods : TNode { local_context: &LocalStyleContext, parent: Option, applicable_declarations: &ApplicableDeclarations<::Impl>) - where ::Impl: SelectorImplExt { + where ::Impl: SelectorImplExt + { // Get our parent's style. This must be unsafe so that we don't touch the parent's // borrow flags. // diff --git a/components/style/properties/data.py b/components/style/properties/data.py index eb16f986319..e778baf095b 100644 --- a/components/style/properties/data.py +++ b/components/style/properties/data.py @@ -19,36 +19,36 @@ def to_camel_case(ident): # https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_animated_properties def is_known_animatable_property(name): return name in [ - "-moz-outline-radius", "-moz-outline-radius-bottomleft", - "-moz-outline-radius-bottomright", "-moz-outline-radius-topleft", - "-moz-outline-radius-topright", "-webkit-text-fill-color", - "-webkit-text-stroke", "-webkit-text-stroke-color", - "-webkit-touch-callout", "all", "backdrop-filter", "background", - "background-color", "background-position", "background-size", "border", - "border-bottom", "border-bottom-color", "border-bottom-left-radius", - "border-bottom-right-radius", "border-bottom-width", "border-color", - "border-left", "border-left-color", "border-left-width", "border-radius", - "border-right", "border-right-color", "border-right-width", "border-top", - "border-top-color", "border-top-left-radius", "border-top-right-radius", - "border-top-width", "border-width", "bottom", "box-shadow", "clip", - "clip-path", "color", "column-count", "column-gap", "column-rule", - "column-rule-color", "column-rule-width", "column-width", "columns", - "filter", "flex", "flex-basis", "flex-grow", "flex-shrink", "font", - "font-size", "font-size-adjust", "font-stretch", "font-weight", - "grid-column-gap", "grid-gap", "grid-row-gap", "height", "left", - "letter-spacing", "line-height", "margin", "margin-bottom", - "margin-left", "margin-right", "margin-top", "mask", "mask-position", - "mask-size", "max-height", "max-width", "min-height", "min-width", - "motion-offset", "motion-rotation", "object-position", "opacity", - "order", "outline", "outline-color", "outline-offset", "outline-width", - "padding", "padding-bottom", "padding-left", "padding-right", - "padding-top", "perspective", "perspective-origin", "right", - "scroll-snap-coordinate", "scroll-snap-destination", - "shape-image-threshold", "shape-margin", "shape-outside", - "text-decoration", "text-decoration-color", "text-emphasis", - "text-emphasis-color", "text-indent", "text-shadow", "top", "transform", - "transform-origin", "vertical-align", "visibility", "width", - "word-spacing", "z-index" + "-moz-outline-radius", "-moz-outline-radius-bottomleft", + "-moz-outline-radius-bottomright", "-moz-outline-radius-topleft", + "-moz-outline-radius-topright", "-webkit-text-fill-color", + "-webkit-text-stroke", "-webkit-text-stroke-color", + "-webkit-touch-callout", "all", "backdrop-filter", "background", + "background-color", "background-position", "background-size", "border", + "border-bottom", "border-bottom-color", "border-bottom-left-radius", + "border-bottom-right-radius", "border-bottom-width", "border-color", + "border-left", "border-left-color", "border-left-width", "border-radius", + "border-right", "border-right-color", "border-right-width", "border-top", + "border-top-color", "border-top-left-radius", "border-top-right-radius", + "border-top-width", "border-width", "bottom", "box-shadow", "clip", + "clip-path", "color", "column-count", "column-gap", "column-rule", + "column-rule-color", "column-rule-width", "column-width", "columns", + "filter", "flex", "flex-basis", "flex-grow", "flex-shrink", "font", + "font-size", "font-size-adjust", "font-stretch", "font-weight", + "grid-column-gap", "grid-gap", "grid-row-gap", "height", "left", + "letter-spacing", "line-height", "margin", "margin-bottom", + "margin-left", "margin-right", "margin-top", "mask", "mask-position", + "mask-size", "max-height", "max-width", "min-height", "min-width", + "motion-offset", "motion-rotation", "object-position", "opacity", + "order", "outline", "outline-color", "outline-offset", "outline-width", + "padding", "padding-bottom", "padding-left", "padding-right", + "padding-top", "perspective", "perspective-origin", "right", + "scroll-snap-coordinate", "scroll-snap-destination", + "shape-image-threshold", "shape-margin", "shape-outside", + "text-decoration", "text-decoration-color", "text-emphasis", + "text-emphasis-color", "text-indent", "text-shadow", "top", "transform", + "transform-origin", "vertical-align", "visibility", "width", + "word-spacing", "z-index" ] @@ -56,11 +56,12 @@ def is_known_animatable_property(name): # following list, and can be implemented removing it from the list and # implementing the Interpolate trait in helpers/animated_properties.mako.rs def is_not_supported_animatable_property(name): - return name in [ + return name in [ "flex-basis", "column-width", "column-height", "column-count", "column-gap", "box-shadow", "clip", "filter", "transform-origin", - "perspective-origin", "font-stretch", "letter-spacing", "word-spacing", - "text-decoration" ] + "perspective-origin", "font-stretch", "letter-spacing", "word-spacing", + "text-decoration" + ] class Keyword(object): diff --git a/components/style/properties/helpers/animated_properties.mako.rs b/components/style/properties/helpers/animated_properties.mako.rs index 2b33e137f00..ffd89b52244 100644 --- a/components/style/properties/helpers/animated_properties.mako.rs +++ b/components/style/properties/helpers/animated_properties.mako.rs @@ -3,9 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use app_units::Au; -use bezier::Bezier; use cssparser::{Color as CSSParserColor, Parser, RGBA, ToCss}; -use dom::{OpaqueNode, TRestyleDamage}; use euclid::{Point2D, Size2D}; use properties::PropertyDeclaration; use properties::longhands; @@ -20,9 +18,6 @@ use properties::longhands::text_shadow::computed_value::TextShadow; use properties::longhands::transform::computed_value::ComputedMatrix; use properties::longhands::transform::computed_value::ComputedOperation as TransformOperation; use properties::longhands::transform::computed_value::T as TransformList; -use properties::longhands::transition_property; -use properties::longhands::transition_timing_function::computed_value::StartEnd; -use properties::longhands::transition_timing_function::computed_value::TransitionTimingFunction; use properties::longhands::vertical_align::computed_value::T as VerticalAlign; use properties::longhands::visibility::computed_value::T as Visibility; use properties::longhands::z_index::computed_value::T as ZIndex; @@ -33,7 +28,7 @@ use std::iter::repeat; use super::ComputedValues; use values::computed::{Angle, LengthOrPercentageOrAuto, LengthOrPercentageOrNone}; use values::computed::{BorderRadiusSize, LengthOrNone}; -use values::computed::{CalcLengthOrPercentage, Length, LengthOrPercentage, Time}; +use values::computed::{CalcLengthOrPercentage, LengthOrPercentage}; // NB: This needs to be here because it needs all the longhands generated // beforehand. @@ -143,8 +138,9 @@ impl AnimatedProperty { % for prop in data.longhands: % if prop.animatable: TransitionProperty::${prop.camel_case} => { - AnimatedProperty::${prop.camel_case}(old_style.get_${prop.style_struct.ident.strip("_")}().${prop.ident}.clone(), - new_style.get_${prop.style_struct.ident.strip("_")}().${prop.ident}.clone()) + AnimatedProperty::${prop.camel_case}( + old_style.get_${prop.style_struct.ident.strip("_")}().${prop.ident}.clone(), + new_style.get_${prop.style_struct.ident.strip("_")}().${prop.ident}.clone()) } % endif % endfor diff --git a/components/style/properties/properties.mako.rs b/components/style/properties/properties.mako.rs index c35566165f1..e1a21572a85 100644 --- a/components/style/properties/properties.mako.rs +++ b/components/style/properties/properties.mako.rs @@ -12,7 +12,7 @@ use std::ascii::AsciiExt; use std::boxed::Box as StdBox; -use std::collections::{HashMap, HashSet}; +use std::collections::HashSet; use std::fmt; use std::fmt::Write; use std::sync::Arc; @@ -22,7 +22,6 @@ use cssparser::Color as CSSParserColor; use cssparser::{Parser, RGBA, AtRuleParser, DeclarationParser, Delimiter, DeclarationListParser, parse_important, ToCss, TokenSerializationType}; use error_reporting::ParseErrorReporter; -use keyframes::Keyframe; use url::Url; use euclid::side_offsets::SideOffsets2D; use euclid::size::Size2D; diff --git a/components/style/selector_matching.rs b/components/style/selector_matching.rs index a4895e91ecb..fc9c2eb6600 100644 --- a/components/style/selector_matching.rs +++ b/components/style/selector_matching.rs @@ -7,7 +7,6 @@ use dom::PresentationalHintsSynthetizer; use element_state::*; use error_reporting::StdoutErrorReporter; -use keyframes::Keyframe; use keyframes::KeyframesAnimation; use media_queries::{Device, MediaType}; use parser::ParserContextExtraData;