style: Have scale function and scale property accept percentage value.

Differential Revision: https://phabricator.services.mozilla.com/D55012
This commit is contained in:
enordin 2019-11-29 04:40:03 +00:00 committed by Emilio Cobos Álvarez
parent d06212c6c0
commit 001c511f9c
No known key found for this signature in database
GPG key ID: E1152D0994E4BF8A

View file

@ -12,7 +12,7 @@ use crate::values::generics::transform::{Matrix, Matrix3D};
use crate::values::specified::position::{ use crate::values::specified::position::{
HorizontalPositionKeyword, Side, VerticalPositionKeyword, 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 crate::Zero;
use cssparser::Parser; use cssparser::Parser;
use style_traits::{ParseError, StyleParseErrorKind}; use style_traits::{ParseError, StyleParseErrorKind};
@ -163,32 +163,32 @@ impl Transform {
Ok(generic::TransformOperation::Translate3D(tx, ty, tz)) Ok(generic::TransformOperation::Translate3D(tx, ty, tz))
}, },
"scale" => { "scale" => {
let sx = Number::parse(context, input)?; let sx = NumberOrPercentage::parse(context, input)?.to_number();
if input.try(|input| input.expect_comma()).is_ok() { 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)) Ok(generic::TransformOperation::Scale(sx, sy))
} else { } else {
Ok(generic::TransformOperation::Scale(sx, sx)) Ok(generic::TransformOperation::Scale(sx, sx))
} }
}, },
"scalex" => { "scalex" => {
let sx = Number::parse(context, input)?; let sx = NumberOrPercentage::parse(context, input)?.to_number();
Ok(generic::TransformOperation::ScaleX(sx)) Ok(generic::TransformOperation::ScaleX(sx))
}, },
"scaley" => { "scaley" => {
let sy = Number::parse(context, input)?; let sy = NumberOrPercentage::parse(context, input)?.to_number();
Ok(generic::TransformOperation::ScaleY(sy)) Ok(generic::TransformOperation::ScaleY(sy))
}, },
"scalez" => { "scalez" => {
let sz = Number::parse(context, input)?; let sz = NumberOrPercentage::parse(context, input)?.to_number();
Ok(generic::TransformOperation::ScaleZ(sz)) Ok(generic::TransformOperation::ScaleZ(sz))
}, },
"scale3d" => { "scale3d" => {
let sx = Number::parse(context, input)?; let sx = NumberOrPercentage::parse(context, input)?.to_number();
input.expect_comma()?; input.expect_comma()?;
let sy = Number::parse(context, input)?; let sy = NumberOrPercentage::parse(context, input)?.to_number();
input.expect_comma()?; input.expect_comma()?;
let sz = Number::parse(context, input)?; let sz = NumberOrPercentage::parse(context, input)?.to_number();
Ok(generic::TransformOperation::Scale3D(sx, sy, sz)) Ok(generic::TransformOperation::Scale3D(sx, sy, sz))
}, },
"rotate" => { "rotate" => {
@ -445,6 +445,9 @@ impl Parse for Translate {
pub type Scale = generic::Scale<Number>; pub type Scale = generic::Scale<Number>;
impl Parse for Scale { impl Parse for Scale {
/// Scale accepts <number> | <percentage>, 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>( fn parse<'i, 't>(
context: &ParserContext, context: &ParserContext,
input: &mut Parser<'i, 't>, input: &mut Parser<'i, 't>,
@ -453,11 +456,12 @@ impl Parse for Scale {
return Ok(generic::Scale::None); return Ok(generic::Scale::None);
} }
let sx = Number::parse(context, input)?; let sx = NumberOrPercentage::parse(context, input)?.to_number();
if let Ok(sy) = input.try(|i| Number::parse(context, i)) { if let Ok(sy) = input.try(|i| NumberOrPercentage::parse(context, i)) {
if let Ok(sz) = input.try(|i| Number::parse(context, i)) { let sy = sy.to_number();
if let Ok(sz) = input.try(|i| NumberOrPercentage::parse(context, i)) {
// 'scale: <number> <number> <number>' // 'scale: <number> <number> <number>'
return Ok(generic::Scale::Scale(sx, sy, sz)); return Ok(generic::Scale::Scale(sx, sy, sz.to_number()));
} }
// 'scale: <number> <number>' // 'scale: <number> <number>'