From aa6372d99df8ebdf8cff890d342059731d02b26a Mon Sep 17 00:00:00 2001 From: Hiroyuki Ikezoe Date: Sat, 28 Jan 2017 18:57:27 +0900 Subject: [PATCH] Bug 1328787 - Part 9: Set Keyframe.mPropertyValues for the case where keyframe is specified. r=heycam MozReview-Commit-ID: Ayt7IsYShl4 --- components/style/properties/helpers.mako.rs | 17 ++++++++++ .../helpers/animated_properties.mako.rs | 20 +++++++++++ .../style/properties/properties.mako.rs | 24 ++++--------- ports/geckolib/glue.rs | 34 +++++++++++++++++-- 4 files changed, 75 insertions(+), 20 deletions(-) diff --git a/components/style/properties/helpers.mako.rs b/components/style/properties/helpers.mako.rs index e268c89f593..b2c52e1e868 100644 --- a/components/style/properties/helpers.mako.rs +++ b/components/style/properties/helpers.mako.rs @@ -665,3 +665,20 @@ } % endif + +<%def name="alias_to_nscsspropertyid(alias)"> + <% + if alias == "word-wrap": + return "nsCSSPropertyID_eCSSPropertyAlias_WordWrap" + return "nsCSSPropertyID::eCSSPropertyAlias_%s" % to_camel_case(alias) + %> + + +<%def name="to_nscsspropertyid(ident)"> + <% + if ident == "float": + ident = "float_" + return "nsCSSPropertyID::eCSSProperty_%s" % ident + %> + + diff --git a/components/style/properties/helpers/animated_properties.mako.rs b/components/style/properties/helpers/animated_properties.mako.rs index addaf94c7b0..9b32c26c35b 100644 --- a/components/style/properties/helpers/animated_properties.mako.rs +++ b/components/style/properties/helpers/animated_properties.mako.rs @@ -2,9 +2,12 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +<%namespace name="helpers" file="/helpers.mako.rs" /> + use app_units::Au; use cssparser::{Color as CSSParserColor, Parser, RGBA}; use euclid::{Point2D, Size2D}; +#[cfg(feature = "gecko")] use gecko_bindings::structs::nsCSSPropertyID; use properties::{DeclaredValue, PropertyDeclaration}; use properties::longhands; use properties::longhands::background_position_x::computed_value::T as BackgroundPositionX; @@ -101,6 +104,23 @@ impl ToCss for TransitionProperty { } } +/// Convert to nsCSSPropertyID. +#[cfg(feature = "gecko")] +#[allow(non_upper_case_globals)] +impl From for nsCSSPropertyID { + fn from(transition_property: TransitionProperty) -> nsCSSPropertyID { + match transition_property { + % for prop in data.longhands: + % if prop.animatable: + TransitionProperty::${prop.camel_case} + => ${helpers.to_nscsspropertyid(prop.ident)}, + % endif + % endfor + TransitionProperty::All => nsCSSPropertyID::eCSSPropertyExtra_all_properties, + } + } +} + /// An animated property interpolation between two computed values for that /// property. #[derive(Clone, Debug, PartialEq)] diff --git a/components/style/properties/properties.mako.rs b/components/style/properties/properties.mako.rs index a914f7e643f..6e8eee38134 100644 --- a/components/style/properties/properties.mako.rs +++ b/components/style/properties/properties.mako.rs @@ -737,16 +737,6 @@ enum StaticId { Shorthand(ShorthandId), } include!(concat!(env!("OUT_DIR"), "/static_ids.rs")); -<% - def alias_to_nscsspropertyid(alias): - if alias == "word-wrap": - return "nsCSSPropertyID_eCSSPropertyAlias_WordWrap" - return "nsCSSPropertyID::eCSSPropertyAlias_%s" % to_camel_case(alias) - def to_nscsspropertyid(ident): - if ident == "float": - ident = "float_" - return "nsCSSPropertyID::eCSSProperty_%s" % ident -%> impl PropertyId { /// Returns a given property from the string `s`. /// @@ -771,21 +761,21 @@ impl PropertyId { use gecko_bindings::structs::*; match id { % for property in data.longhands: - ${to_nscsspropertyid(property.ident)} => { + ${helpers.to_nscsspropertyid(property.ident)} => { Ok(PropertyId::Longhand(LonghandId::${property.camel_case})) } % for alias in property.alias: - ${alias_to_nscsspropertyid(alias)} => { + ${helpers.alias_to_nscsspropertyid(alias)} => { Ok(PropertyId::Longhand(LonghandId::${property.camel_case})) } % endfor % endfor % for property in data.shorthands: - ${to_nscsspropertyid(property.ident)} => { + ${helpers.to_nscsspropertyid(property.ident)} => { Ok(PropertyId::Shorthand(ShorthandId::${property.camel_case})) } % for alias in property.alias: - ${alias_to_nscsspropertyid(alias)} => { + ${helpers.alias_to_nscsspropertyid(alias)} => { Ok(PropertyId::Shorthand(ShorthandId::${property.camel_case})) } % endfor @@ -804,14 +794,14 @@ impl PropertyId { PropertyId::Longhand(id) => match id { % for property in data.longhands: LonghandId::${property.camel_case} => { - Ok(${to_nscsspropertyid(property.ident)}) + Ok(${helpers.to_nscsspropertyid(property.ident)}) } % endfor }, PropertyId::Shorthand(id) => match id { % for property in data.shorthands: ShorthandId::${property.camel_case} => { - Ok(${to_nscsspropertyid(property.ident)}) + Ok(${helpers.to_nscsspropertyid(property.ident)}) } % endfor }, @@ -921,7 +911,7 @@ impl ToCss for PropertyDeclaration { pref_ident = "float_" %> if structs::root::mozilla::SERVO_PREF_ENABLED_${pref_ident} { - let id = structs::${to_nscsspropertyid(property.ident)}; + let id = structs::${helpers.to_nscsspropertyid(property.ident)}; let enabled = unsafe { bindings::Gecko_PropertyId_IsPrefEnabled(id) }; if !enabled { return PropertyDeclarationParseResult::ExperimentalProperty diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index 8ccc2f901d4..069f6f6d6dc 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -58,12 +58,13 @@ use style::gecko_bindings::structs::nsresult; use style::gecko_bindings::sugar::ownership::{FFIArcHelpers, HasArcFFI, HasBoxFFI}; use style::gecko_bindings::sugar::ownership::{HasSimpleFFI, Strong}; use style::gecko_bindings::sugar::refptr::{GeckoArcPrincipal, GeckoArcURI}; +use style::keyframes::KeyframesStepValue; use style::parallel; use style::parser::{ParserContext, ParserContextExtraData}; use style::properties::{CascadeFlags, ComputedValues, Importance, PropertyDeclaration}; use style::properties::{PropertyDeclarationParseResult, PropertyDeclarationBlock, PropertyId}; use style::properties::{apply_declarations, parse_one_declaration}; -use style::properties::animated_properties::{AnimationValue, Interpolate}; +use style::properties::animated_properties::{AnimationValue, Interpolate, TransitionProperty}; use style::restyle_hints::RestyleHint; use style::selector_parser::PseudoElementCascadeType; use style::sequential; @@ -1162,12 +1163,39 @@ pub extern "C" fn Servo_StyleSet_FillKeyframesForName(raw_data: RawServoStyleSet *style_timing_function }; - let _keyframe = unsafe { + let keyframe = unsafe { Gecko_AnimationAppendKeyframe(keyframes, step.start_percentage.0 as f32, &timing_function) }; - // Set each PropertyValuePair. + + match step.value { + KeyframesStepValue::ComputedValues => { + unimplemented!(); + }, + KeyframesStepValue::Declarations { ref block } => { + let guard = block.read(); + // Filter out non-animatable properties. + let animatable = + guard.declarations + .iter() + .filter(|&&(ref declaration, _)| { + declaration.is_animatable() + }); + for (index, &(ref declaration, _)) in animatable.enumerate() { + unsafe { + (*keyframe).mPropertyValues.set_len((index + 1) as u32); + (*keyframe).mPropertyValues[index].mProperty = + TransitionProperty::from_declaration(declaration).unwrap().into(); + (*keyframe).mPropertyValues[index].mServoDeclarationBlock.set_arc_leaky( + Arc::new(RwLock::new( + PropertyDeclarationBlock { declarations: vec![ (declaration.clone(), + Importance::Normal) ], + important_count: 0 }))); + } + } + }, + } } return true }