From d8bd29292e32f8398d90ce942d23c363f9adef43 Mon Sep 17 00:00:00 2001 From: Boris Chiou Date: Mon, 12 Nov 2018 19:21:32 +0000 Subject: [PATCH] style: Parse any order of number and angle for Rotate. Rotate accepts rotate axis and angle in any order (i.e. {3} or {3}), so we rewrite the parser. Differential Revision: https://phabricator.services.mozilla.com/D11417 --- .../style/values/specified/transform.rs | 31 +++++++++++++------ 1 file changed, 21 insertions(+), 10 deletions(-) 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), + }) } }