diff --git a/components/style/values/specified/length.rs b/components/style/values/specified/length.rs index 5aa839874b4..58c14b71376 100644 --- a/components/style/values/specified/length.rs +++ b/components/style/values/specified/length.rs @@ -909,15 +909,26 @@ impl ToCss for Percentage { } } +impl Percentage { + fn parse_internal(input: &mut Parser, context: AllowedNumericType) -> Result { + match try!(input.next()) { + Token::Percentage(ref value) if context.is_ok(value.unit_value) => { + Ok(Percentage(value.unit_value)) + } + _ => Err(()) + } + } + + /// Parses a percentage token, but rejects it if it's negative. + pub fn parse_non_negative(input: &mut Parser) -> Result { + Self::parse_internal(input, AllowedNumericType::NonNegative) + } +} + impl Parse for Percentage { #[inline] fn parse(_context: &ParserContext, input: &mut Parser) -> Result { - let context = AllowedNumericType::All; - match try!(input.next()) { - Token::Percentage(ref value) if context.is_ok(value.unit_value) => - Ok(Percentage(value.unit_value)), - _ => Err(()) - } + Self::parse_internal(input, AllowedNumericType::All) } } diff --git a/components/style/values/specified/mod.rs b/components/style/values/specified/mod.rs index 1a7fda7a673..1cea83d5329 100644 --- a/components/style/values/specified/mod.rs +++ b/components/style/values/specified/mod.rs @@ -538,8 +538,8 @@ impl Parse for Number { impl Number { fn parse_with_minimum(input: &mut Parser, min: CSSFloat) -> Result { match parse_number(input) { - Ok(value) if value < min => Err(()), - value => value.map(Number), + Ok(value) if value >= min => Ok(Number(value)), + _ => Err(()), } } @@ -585,13 +585,12 @@ pub enum NumberOrPercentage { no_viewport_percentage!(NumberOrPercentage); impl Parse for NumberOrPercentage { - fn parse(context: &ParserContext, input: &mut Parser) -> Result { - if let Ok(per) = input.try(|input| Percentage::parse(context, input)) { + fn parse(_context: &ParserContext, input: &mut Parser) -> Result { + if let Ok(per) = input.try(Percentage::parse_non_negative) { return Ok(NumberOrPercentage::Percentage(per)); } - let num = try!(Number::parse_non_negative(input)); - Ok(NumberOrPercentage::Number(num)) + Number::parse_non_negative(input).map(NumberOrPercentage::Number) } }