diff --git a/components/style/attr.rs b/components/style/attr.rs index af7cfa015f6..fc741d61575 100644 --- a/components/style/attr.rs +++ b/components/style/attr.rs @@ -92,17 +92,17 @@ pub fn parse_double(string: &str) -> Result { let trimmed = string.trim_matches(HTML_SPACE_CHARACTERS); let mut input = trimmed.chars().peekable(); - let (value, divisor) = match input.peek() { + let (value, divisor, chars_skipped) = match input.peek() { None => return Err(()), Some(&'-') => { input.next(); - (-1f64, -1f64) + (-1f64, -1f64, 1) } Some(&'+') => { input.next(); - (1f64, 1f64) + (1f64, 1f64, 1) } - _ => (1f64, 1f64) + _ => (1f64, 1f64, 0) }; let (value, value_digits) = if let Some(&'.') = input.peek() { @@ -112,11 +112,11 @@ pub fn parse_double(string: &str) -> Result { (value * read_val.and_then(|result| result.to_f64()).unwrap_or(1f64), read_digits) }; - let input = trimmed.chars().skip(value_digits).peekable(); + let input = trimmed.chars().skip(value_digits + chars_skipped).peekable(); let (mut value, fraction_digits) = read_fraction(input, divisor, value); - let input = trimmed.chars().skip(value_digits + fraction_digits).peekable(); + let input = trimmed.chars().skip(value_digits + chars_skipped + fraction_digits).peekable(); if let Some(exp) = read_exponent(input) { value *= 10f64.powi(exp) diff --git a/tests/unit/style/attr.rs b/tests/unit/style/attr.rs index 4ae614eae2d..0521df3a690 100644 --- a/tests/unit/style/attr.rs +++ b/tests/unit/style/attr.rs @@ -14,6 +14,24 @@ fn test_parse_double() { } } +#[test] +fn test_parse_double_negative_prefix() { + let value = String::from("-5.6"); + match AttrValue::from_double(value, 0.0) { + AttrValue::Double(_, num) => assert_eq!(num, -5.6f64), + _ => panic!("expected a double value") + } +} + +#[test] +fn test_parse_double_positive_prefix() { + let value = String::from("+5.6"); + match AttrValue::from_double(value, 0.0) { + AttrValue::Double(_, num) => assert_eq!(num, 5.6f64), + _ => panic!("expected a double value") + } +} + #[test] fn test_from_limited_i32_should_be_default_when_less_than_0() { let value = String::from("-1");