diff options
-rw-r--r-- | components/style/matching.rs | 2 | ||||
-rw-r--r-- | components/style/properties/gecko.mako.rs | 13 | ||||
-rw-r--r-- | components/style/properties/longhand/box.mako.rs | 24 | ||||
-rw-r--r-- | components/style/properties/properties.mako.rs | 8 | ||||
-rw-r--r-- | tests/unit/style/lib.rs | 2 | ||||
-rw-r--r-- | tests/unit/style/parsing/animation.rs | 16 |
6 files changed, 53 insertions, 12 deletions
diff --git a/components/style/matching.rs b/components/style/matching.rs index 129b4884cbe..dd7719bdb17 100644 --- a/components/style/matching.rs +++ b/components/style/matching.rs @@ -398,7 +398,7 @@ impl<E: TElement> StyleSharingCandidateCache<E> { return; } - if box_style.animation_name_count() > 0 { + if box_style.specifies_animations() { debug!("Failing to insert to the cache: animations"); return; } diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs index d1f06601bb5..240a0926799 100644 --- a/components/style/properties/gecko.mako.rs +++ b/components/style/properties/gecko.mako.rs @@ -1727,15 +1727,14 @@ fn static_assert() { pub fn set_animation_name(&mut self, v: longhands::animation_name::computed_value::T) { use nsstring::nsCString; + + debug_assert!(!v.0.is_empty()); unsafe { self.gecko.mAnimations.ensure_len(v.0.len()) }; - if v.0.len() > 0 { - self.gecko.mAnimationNameCount = v.0.len() as u32; - for (servo, gecko) in v.0.into_iter().zip(self.gecko.mAnimations.iter_mut()) { - gecko.mName.assign_utf8(&nsCString::from(servo.0.to_string())); - } - } else { - unsafe { self.gecko.mAnimations[0].mName.truncate(); } + self.gecko.mAnimationNameCount = v.0.len() as u32; + for (servo, gecko) in v.0.into_iter().zip(self.gecko.mAnimations.iter_mut()) { + // TODO This is inefficient. We should fix this in bug 1329169. + gecko.mName.assign_utf8(&nsCString::from(servo.0.to_string())); } } pub fn animation_name_at(&self, index: usize) diff --git a/components/style/properties/longhand/box.mako.rs b/components/style/properties/longhand/box.mako.rs index 696d9038353..9cd443838ae 100644 --- a/components/style/properties/longhand/box.mako.rs +++ b/components/style/properties/longhand/box.mako.rs @@ -776,7 +776,6 @@ ${helpers.single_keyword("overflow-x", "visible hidden scroll auto", </%helpers:vector_longhand> <%helpers:vector_longhand name="animation-name" - allow_empty="True" need_index="True" animatable="False", extra_prefixes="moz webkit" @@ -797,6 +796,16 @@ ${helpers.single_keyword("overflow-x", "visible hidden scroll auto", #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub struct SpecifiedValue(pub Atom); + #[inline] + pub fn get_initial_value() -> computed_value::T { + get_initial_specified_value() + } + + #[inline] + pub fn get_initial_specified_value() -> SpecifiedValue { + SpecifiedValue(atom!("")) + } + impl fmt::Display for SpecifiedValue { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { self.0.fmt(f) @@ -805,7 +814,11 @@ ${helpers.single_keyword("overflow-x", "visible hidden scroll auto", impl ToCss for SpecifiedValue { fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { - dest.write_str(&*self.0.to_string()) + if self.0 == atom!("") { + dest.write_str("none") + } else { + dest.write_str(&*self.0.to_string()) + } } } @@ -813,7 +826,12 @@ ${helpers.single_keyword("overflow-x", "visible hidden scroll auto", fn parse(_context: &ParserContext, input: &mut ::cssparser::Parser) -> Result<Self, ()> { use cssparser::Token; Ok(match input.next() { - Ok(Token::Ident(ref value)) if value != "none" => SpecifiedValue(Atom::from(&**value)), + Ok(Token::Ident(ref value)) => SpecifiedValue(if value == "none" { + // FIXME We may want to support `@keyframes ""` at some point. + atom!("") + } else { + Atom::from(&**value) + }), Ok(Token::QuotedString(value)) => SpecifiedValue(Atom::from(&*value)), _ => return Err(()), }) diff --git a/components/style/properties/properties.mako.rs b/components/style/properties/properties.mako.rs index 8b9ab40a4dc..e0a2b24b6cc 100644 --- a/components/style/properties/properties.mako.rs +++ b/components/style/properties/properties.mako.rs @@ -1295,6 +1295,14 @@ pub mod style_structs { } % endif % endfor + + % if style_struct.name == "Box": + /// Returns whether there is any animation specified with + /// animation-name other than `none`. + pub fn specifies_animations(&self) -> bool { + self.animation_name_iter().any(|name| name.0 != atom!("")) + } + % endif } % for longhand in style_struct.longhands: diff --git a/tests/unit/style/lib.rs b/tests/unit/style/lib.rs index 184ff4e1579..bb88a538a73 100644 --- a/tests/unit/style/lib.rs +++ b/tests/unit/style/lib.rs @@ -14,7 +14,7 @@ extern crate parking_lot; extern crate rayon; extern crate rustc_serialize; extern crate selectors; -extern crate servo_atoms; +#[macro_use] extern crate servo_atoms; extern crate servo_config; extern crate servo_url; extern crate style; diff --git a/tests/unit/style/parsing/animation.rs b/tests/unit/style/parsing/animation.rs index ed746790920..bf9f3b3e2ee 100644 --- a/tests/unit/style/parsing/animation.rs +++ b/tests/unit/style/parsing/animation.rs @@ -5,12 +5,28 @@ use cssparser::Parser; use media_queries::CSSErrorReporterTest; use parsing::parse; +use servo_atoms::Atom; use style::parser::{Parse, ParserContext}; use style::properties::longhands::animation_iteration_count::single_value::computed_value::T as AnimationIterationCount; +use style::properties::longhands::animation_name; use style::stylesheets::Origin; use style_traits::ToCss; #[test] +fn test_animation_name() { + use self::animation_name::single_value::SpecifiedValue as SingleValue; + let other_name = Atom::from("other-name"); + assert_eq!(parse_longhand!(animation_name, "none"), + animation_name::SpecifiedValue(vec![SingleValue(atom!(""))])); + assert_eq!(parse_longhand!(animation_name, "other-name, none, 'other-name', \"other-name\""), + animation_name::SpecifiedValue( + vec![SingleValue(other_name.clone()), + SingleValue(atom!("")), + SingleValue(other_name.clone()), + SingleValue(other_name.clone())])); +} + +#[test] fn test_animation_iteration() { assert_roundtrip_with_context!(AnimationIterationCount::parse, "0", "0"); assert_roundtrip_with_context!(AnimationIterationCount::parse, "0.1", "0.1"); |