diff --git a/components/style/properties/longhand/effects.mako.rs b/components/style/properties/longhand/effects.mako.rs index a927e487a6a..96f832bb782 100644 --- a/components/style/properties/longhand/effects.mako.rs +++ b/components/style/properties/longhand/effects.mako.rs @@ -344,31 +344,45 @@ ${helpers.predefined_type("opacity", use std::ascii::AsciiExt; use values::specified::Length; + fn parse_argument(input: &mut Parser) -> Result, ()> { + if input.try(|input| input.expect_ident_matching("auto")).is_ok() { + Ok(None) + } else { + Length::parse(input).map(Some) + } + } + if input.try(|input| input.expect_ident_matching("auto")).is_ok() { return Ok(SpecifiedValue(None)) } if !try!(input.expect_function()).eq_ignore_ascii_case("rect") { return Err(()) } - let sides = try!(input.parse_nested_block(|input| { - input.parse_comma_separated(|input| { - if input.try(|input| input.expect_ident_matching("auto")).is_ok() { - Ok(None) - } else { - Length::parse(input).map(Some) - } - }) - })); - if sides.len() == 4 { + + input.parse_nested_block(|input| { + let top = try!(parse_argument(input)); + let right; + let bottom; + let left; + + if input.try(|input| input.expect_comma()).is_ok() { + right = try!(parse_argument(input)); + try!(input.expect_comma()); + bottom = try!(parse_argument(input)); + try!(input.expect_comma()); + left = try!(parse_argument(input)); + } else { + right = try!(parse_argument(input)); + bottom = try!(parse_argument(input)); + left = try!(parse_argument(input)); + } Ok(SpecifiedValue(Some(SpecifiedClipRect { - top: sides[0].unwrap_or(Length::Absolute(Au(0))), - right: sides[1], - bottom: sides[2], - left: sides[3].unwrap_or(Length::Absolute(Au(0))), + top: top.unwrap_or(Length::Absolute(Au(0))), + right: right, + bottom: bottom, + left: left.unwrap_or(Length::Absolute(Au(0))), }))) - } else { - Err(()) - } + }) }