From 576f51f598982a608caf52b9aa74eb397bd762ec Mon Sep 17 00:00:00 2001 From: glowe Date: Sat, 30 Nov 2019 23:29:09 -0500 Subject: [PATCH] Add DOMString floating point string test and fix Fixes an issue where DOMString::is_valid_floating_point_number_string was returning true for strings that began with whitespace characters- TAB, LF, FF, or CR. Also added a unit test to cover this since the corresponding web-platform-tests are incomplete. --- components/script/dom/bindings/str.rs | 10 +++++----- tests/unit/script/domstring.rs | 20 ++++++++++++++++++++ tests/unit/script/lib.rs | 2 ++ 3 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 tests/unit/script/domstring.rs diff --git a/components/script/dom/bindings/str.rs b/components/script/dom/bindings/str.rs index 38091fcf19e..2b4830dccfc 100644 --- a/components/script/dom/bindings/str.rs +++ b/components/script/dom/bindings/str.rs @@ -3,11 +3,11 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ //! The `ByteString` struct. - use chrono::prelude::{Utc, Weekday}; use chrono::{Datelike, TimeZone}; use cssparser::CowRcStr; use html5ever::{LocalName, Namespace}; +use regex::Regex; use servo_atoms::Atom; use std::borrow::{Borrow, Cow, ToOwned}; use std::default::Default; @@ -337,11 +337,11 @@ impl DOMString { /// https://html.spec.whatwg.org/multipage/#valid-floating-point-number pub fn is_valid_floating_point_number_string(&self) -> bool { - // for the case that `parse_floating_point_number` cannot handle - if self.0.contains(" ") { - return false; + lazy_static! { + static ref RE: Regex = + Regex::new(r"^-?(?:\d+\.\d+|\d+|\.\d+)(?:(e|E)(\+|\-)?\d+)?$").unwrap(); } - parse_floating_point_number(&self.0).is_ok() + RE.is_match(&self.0) && parse_floating_point_number(&self.0).is_ok() } /// https://html.spec.whatwg.org/multipage/#best-representation-of-the-number-as-a-floating-point-number diff --git a/tests/unit/script/domstring.rs b/tests/unit/script/domstring.rs new file mode 100644 index 00000000000..08af9c69062 --- /dev/null +++ b/tests/unit/script/domstring.rs @@ -0,0 +1,20 @@ +// Copyright 2013 The Servo Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +use script::test::DOMString; + +#[test] +fn test_domstring_is_valid_floating_point_number_string_leading_whitespace() { + assert!(!DOMString::from("\t1").is_valid_floating_point_number_string()); + assert!(!DOMString::from("\n1").is_valid_floating_point_number_string()); + // \x0C - form feed + assert!(!DOMString::from("\x0C1").is_valid_floating_point_number_string()); + assert!(!DOMString::from("\r1").is_valid_floating_point_number_string()); + assert!(!DOMString::from(" 1").is_valid_floating_point_number_string()); +} diff --git a/tests/unit/script/lib.rs b/tests/unit/script/lib.rs index 4b258ede7d0..434992ad954 100644 --- a/tests/unit/script/lib.rs +++ b/tests/unit/script/lib.rs @@ -2,6 +2,8 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ +#[cfg(test)] +mod domstring; #[cfg(test)] mod headers; #[cfg(test)]