diff --git a/components/style/values/specified/transform.rs b/components/style/values/specified/transform.rs index c1ffe202a79..38ac07edf63 100644 --- a/components/style/values/specified/transform.rs +++ b/components/style/values/specified/transform.rs @@ -357,17 +357,28 @@ impl Parse for Rotate { return Ok(generic::Rotate::None); } - if let Ok(rx) = input.try(|i| Number::parse(context, i)) { - // 'rotate: {3} ' - let ry = Number::parse(context, input)?; - let rz = Number::parse(context, input)?; - let angle = specified::Angle::parse(context, input)?; - return Ok(generic::Rotate::Rotate3D(rx, ry, rz, angle)); - } + // Parse or [ x | y | z | {3} ] && . + // TODO: Bug 1504327: Parse [x|y|z] keywords. + // + // The rotate axis and angle could be in any order, so we parse angle twice to cover + // two cases. i.e. `{3} ` or ` {3}` + let angle = input.try(|i| specified::Angle::parse(context, i)).ok(); + let axis = input.try(|i| -> Result<_, ParseError> { + Ok(( + Number::parse(context, i)?, + Number::parse(context, i)?, + Number::parse(context, i)?, + )) + }).ok(); + let angle = match angle { + Some(a) => a, + None => specified::Angle::parse(context, input)?, + }; - // 'rotate: ' - let angle = specified::Angle::parse(context, input)?; - Ok(generic::Rotate::Rotate(angle)) + Ok(match axis { + Some((x, y, z)) => generic::Rotate::Rotate3D(x, y, z, angle), + None => generic::Rotate::Rotate(angle), + }) } }