From 001c511f9c08fe31be97d7e95288f3ca5bc28776 Mon Sep 17 00:00:00 2001 From: enordin Date: Fri, 29 Nov 2019 04:40:03 +0000 Subject: [PATCH] style: Have scale function and scale property accept percentage value. Differential Revision: https://phabricator.services.mozilla.com/D55012 --- .../style/values/specified/transform.rs | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/components/style/values/specified/transform.rs b/components/style/values/specified/transform.rs index 6a33b665463..44f1afe83d1 100644 --- a/components/style/values/specified/transform.rs +++ b/components/style/values/specified/transform.rs @@ -12,7 +12,7 @@ use crate::values::generics::transform::{Matrix, Matrix3D}; use crate::values::specified::position::{ HorizontalPositionKeyword, Side, VerticalPositionKeyword, }; -use crate::values::specified::{self, Angle, Integer, Length, LengthPercentage, Number}; +use crate::values::specified::{self, Angle, Integer, Length, LengthPercentage, Number, NumberOrPercentage}; use crate::Zero; use cssparser::Parser; use style_traits::{ParseError, StyleParseErrorKind}; @@ -163,32 +163,32 @@ impl Transform { Ok(generic::TransformOperation::Translate3D(tx, ty, tz)) }, "scale" => { - let sx = Number::parse(context, input)?; + let sx = NumberOrPercentage::parse(context, input)?.to_number(); if input.try(|input| input.expect_comma()).is_ok() { - let sy = Number::parse(context, input)?; + let sy = NumberOrPercentage::parse(context, input)?.to_number(); Ok(generic::TransformOperation::Scale(sx, sy)) } else { Ok(generic::TransformOperation::Scale(sx, sx)) } }, "scalex" => { - let sx = Number::parse(context, input)?; + let sx = NumberOrPercentage::parse(context, input)?.to_number(); Ok(generic::TransformOperation::ScaleX(sx)) }, "scaley" => { - let sy = Number::parse(context, input)?; + let sy = NumberOrPercentage::parse(context, input)?.to_number(); Ok(generic::TransformOperation::ScaleY(sy)) }, "scalez" => { - let sz = Number::parse(context, input)?; + let sz = NumberOrPercentage::parse(context, input)?.to_number(); Ok(generic::TransformOperation::ScaleZ(sz)) }, "scale3d" => { - let sx = Number::parse(context, input)?; + let sx = NumberOrPercentage::parse(context, input)?.to_number(); input.expect_comma()?; - let sy = Number::parse(context, input)?; + let sy = NumberOrPercentage::parse(context, input)?.to_number(); input.expect_comma()?; - let sz = Number::parse(context, input)?; + let sz = NumberOrPercentage::parse(context, input)?.to_number(); Ok(generic::TransformOperation::Scale3D(sx, sy, sz)) }, "rotate" => { @@ -445,6 +445,9 @@ impl Parse for Translate { pub type Scale = generic::Scale; impl Parse for Scale { + /// Scale accepts | , so we parse it as NumberOrPercentage, + /// and then convert into an Number if it's a Percentage. + /// https://github.com/w3c/csswg-drafts/pull/4396 fn parse<'i, 't>( context: &ParserContext, input: &mut Parser<'i, 't>, @@ -453,11 +456,12 @@ impl Parse for Scale { return Ok(generic::Scale::None); } - let sx = Number::parse(context, input)?; - if let Ok(sy) = input.try(|i| Number::parse(context, i)) { - if let Ok(sz) = input.try(|i| Number::parse(context, i)) { + let sx = NumberOrPercentage::parse(context, input)?.to_number(); + if let Ok(sy) = input.try(|i| NumberOrPercentage::parse(context, i)) { + let sy = sy.to_number(); + if let Ok(sz) = input.try(|i| NumberOrPercentage::parse(context, i)) { // 'scale: ' - return Ok(generic::Scale::Scale(sx, sy, sz)); + return Ok(generic::Scale::Scale(sx, sy, sz.to_number())); } // 'scale: '