From 9b2ba3d7134b4ec33c5a57e69faf48408d44ee74 Mon Sep 17 00:00:00 2001 From: Corey Farwell Date: Sat, 4 Jul 2015 18:41:47 -0700 Subject: [PATCH 1/4] Join Atoms without requiring intermediate Vec Related to: https://github.com/servo/string-cache/pull/89 --- components/script/dom/attr.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/components/script/dom/attr.rs b/components/script/dom/attr.rs index 0c8e92f7d42..a8f4b897f15 100644 --- a/components/script/dom/attr.rs +++ b/components/script/dom/attr.rs @@ -49,7 +49,11 @@ impl AttrValue { } pub fn from_atomic_tokens(atoms: Vec) -> AttrValue { - let tokens = atoms.iter().map(|x| &**x).collect::>().connect("\x20"); + let tokens = atoms.iter().fold(String::new(), |mut s, atom| { + if !s.is_empty() { s.push('\x20'); } + s.push_str(atom); + s + }); AttrValue::TokenList(tokens, atoms) } From 91b0671e1d7b27b1b41c7b34597353386f3fbde6 Mon Sep 17 00:00:00 2001 From: Corey Farwell Date: Sat, 4 Jul 2015 18:44:29 -0700 Subject: [PATCH 2/4] Join tokens when stringifying DOMTokenList Previous, it would return the original String straight from the AttrValue, which might contain extraaneous whitespace. The spec specifies to just join the tokens together with \x20 https://dom.spec.whatwg.org/#stringification-behavior --- components/script/dom/domtokenlist.rs | 7 ++++++- .../metadata/dom/lists/DOMTokenList-stringifier.html.ini | 5 ----- tests/wpt/metadata/dom/nodes/Element-classlist.html.ini | 3 --- 3 files changed, 6 insertions(+), 9 deletions(-) delete mode 100644 tests/wpt/metadata/dom/lists/DOMTokenList-stringifier.html.ini diff --git a/components/script/dom/domtokenlist.rs b/components/script/dom/domtokenlist.rs index b3656ae4b7c..f863996e9ca 100644 --- a/components/script/dom/domtokenlist.rs +++ b/components/script/dom/domtokenlist.rs @@ -157,6 +157,11 @@ impl<'a> DOMTokenListMethods for &'a DOMTokenList { // https://dom.spec.whatwg.org/#stringification-behavior fn Stringifier(self) -> DOMString { - self.element.root().r().get_string_attribute(&self.local_name) + let tokenlist = self.element.root().r().get_tokenlist_attribute(&self.local_name); + tokenlist.iter().fold(String::new(), |mut s, atom| { + if !s.is_empty() { s.push('\x20'); } + s.push_str(atom); + s + }) } } diff --git a/tests/wpt/metadata/dom/lists/DOMTokenList-stringifier.html.ini b/tests/wpt/metadata/dom/lists/DOMTokenList-stringifier.html.ini deleted file mode 100644 index fa87a8bd09b..00000000000 --- a/tests/wpt/metadata/dom/lists/DOMTokenList-stringifier.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[DOMTokenList-stringifier.html] - type: testharness - [DOMTokenList stringifier] - expected: FAIL - diff --git a/tests/wpt/metadata/dom/nodes/Element-classlist.html.ini b/tests/wpt/metadata/dom/nodes/Element-classlist.html.ini index 2526f96f80b..de405c47bc8 100644 --- a/tests/wpt/metadata/dom/nodes/Element-classlist.html.ini +++ b/tests/wpt/metadata/dom/nodes/Element-classlist.html.ini @@ -3,9 +3,6 @@ [CSS .foo selectors must not match elements without any class] expected: FAIL - [empty classList should return the empty string since the ordered set parser skip the whitespaces] - expected: FAIL - [computed style must update when setting .className] expected: FAIL From c77b5aa8e21a5b18b078c6a8c4eed194800e3901 Mon Sep 17 00:00:00 2001 From: Corey Farwell Date: Wed, 8 Jul 2015 04:44:13 +0900 Subject: [PATCH 3/4] Update string_cache: 0.1.4 -> 0.1.5 --- components/servo/Cargo.lock | 16 ++++++++-------- ports/cef/Cargo.lock | 14 +++++++------- ports/gonk/Cargo.lock | 14 +++++++------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/components/servo/Cargo.lock b/components/servo/Cargo.lock index 0bbe543825d..78236a22a4b 100644 --- a/components/servo/Cargo.lock +++ b/components/servo/Cargo.lock @@ -437,7 +437,7 @@ dependencies = [ "script_traits 0.0.1", "skia 0.0.20130412 (git+https://github.com/servo/skia)", "smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "string_cache 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "string_cache 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "style 0.0.1", "time 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "url 0.2.35 (registry+https://github.com/rust-lang/crates.io-index)", @@ -561,7 +561,7 @@ dependencies = [ "mac 0.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "phf 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "phf_macros 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "string_cache 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "string_cache 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache_plugin 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "tendril 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", @@ -684,7 +684,7 @@ dependencies = [ "script_traits 0.0.1", "selectors 0.1.0 (git+https://github.com/servo/rust-selectors)", "smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "string_cache 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "string_cache 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache_plugin 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "style 0.0.1", "url 0.2.35 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1076,7 +1076,7 @@ dependencies = [ "script_traits 0.0.1", "selectors 0.1.0 (git+https://github.com/servo/rust-selectors)", "smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "string_cache 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "string_cache 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache_plugin 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "style 0.0.1", "tendril 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1120,7 +1120,7 @@ dependencies = [ "matches 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "quicksort 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "string_cache 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "string_cache 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache_plugin 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1157,7 +1157,7 @@ dependencies = [ [[package]] name = "string_cache" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1200,7 +1200,7 @@ dependencies = [ "rustc-serialize 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", "selectors 0.1.0 (git+https://github.com/servo/rust-selectors)", "smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "string_cache 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "string_cache 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache_plugin 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "url 0.2.35 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", @@ -1213,7 +1213,7 @@ dependencies = [ "cssparser 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "euclid 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "selectors 0.1.0 (git+https://github.com/servo/rust-selectors)", - "string_cache 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "string_cache 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache_plugin 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "style 0.0.1", "url 0.2.35 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/ports/cef/Cargo.lock b/ports/cef/Cargo.lock index 9af15d80c30..d79dbf5450b 100644 --- a/ports/cef/Cargo.lock +++ b/ports/cef/Cargo.lock @@ -436,7 +436,7 @@ dependencies = [ "script_traits 0.0.1", "skia 0.0.20130412 (git+https://github.com/servo/skia)", "smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "string_cache 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "string_cache 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "style 0.0.1", "time 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "url 0.2.35 (registry+https://github.com/rust-lang/crates.io-index)", @@ -553,7 +553,7 @@ dependencies = [ "mac 0.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "phf 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "phf_macros 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "string_cache 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "string_cache 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache_plugin 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "tendril 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", @@ -676,7 +676,7 @@ dependencies = [ "script_traits 0.0.1", "selectors 0.1.0 (git+https://github.com/servo/rust-selectors)", "smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "string_cache 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "string_cache 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache_plugin 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "style 0.0.1", "url 0.2.35 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1056,7 +1056,7 @@ dependencies = [ "script_traits 0.0.1", "selectors 0.1.0 (git+https://github.com/servo/rust-selectors)", "smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "string_cache 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "string_cache 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache_plugin 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "style 0.0.1", "tendril 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1092,7 +1092,7 @@ dependencies = [ "matches 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "quicksort 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "string_cache 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "string_cache 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache_plugin 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1155,7 +1155,7 @@ dependencies = [ [[package]] name = "string_cache" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1198,7 +1198,7 @@ dependencies = [ "rustc-serialize 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", "selectors 0.1.0 (git+https://github.com/servo/rust-selectors)", "smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "string_cache 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "string_cache 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache_plugin 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "url 0.2.35 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", diff --git a/ports/gonk/Cargo.lock b/ports/gonk/Cargo.lock index 387c69785bf..88eee3bc717 100644 --- a/ports/gonk/Cargo.lock +++ b/ports/gonk/Cargo.lock @@ -415,7 +415,7 @@ dependencies = [ "script_traits 0.0.1", "skia 0.0.20130412 (git+https://github.com/servo/skia)", "smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "string_cache 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "string_cache 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "style 0.0.1", "time 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "url 0.2.35 (registry+https://github.com/rust-lang/crates.io-index)", @@ -487,7 +487,7 @@ dependencies = [ "mac 0.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "phf 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "phf_macros 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "string_cache 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "string_cache 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache_plugin 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "tendril 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", @@ -610,7 +610,7 @@ dependencies = [ "script_traits 0.0.1", "selectors 0.1.0 (git+https://github.com/servo/rust-selectors)", "smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "string_cache 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "string_cache 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache_plugin 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "style 0.0.1", "url 0.2.35 (registry+https://github.com/rust-lang/crates.io-index)", @@ -964,7 +964,7 @@ dependencies = [ "script_traits 0.0.1", "selectors 0.1.0 (git+https://github.com/servo/rust-selectors)", "smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "string_cache 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "string_cache 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache_plugin 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "style 0.0.1", "tendril 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1000,7 +1000,7 @@ dependencies = [ "matches 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "quicksort 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "string_cache 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "string_cache 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache_plugin 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1053,7 +1053,7 @@ dependencies = [ [[package]] name = "string_cache" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1096,7 +1096,7 @@ dependencies = [ "rustc-serialize 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", "selectors 0.1.0 (git+https://github.com/servo/rust-selectors)", "smallvec 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "string_cache 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "string_cache 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache_plugin 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "url 0.2.35 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", From 7159fe749f59931d09cedcffcb3d2ff52432cbcc Mon Sep 17 00:00:00 2001 From: Corey Farwell Date: Wed, 8 Jul 2015 05:18:07 +0900 Subject: [PATCH 4/4] Create and utilize utility for joining strs --- components/script/dom/attr.rs | 8 ++------ components/script/dom/domtokenlist.rs | 8 ++------ components/util/str.rs | 8 ++++++++ 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/components/script/dom/attr.rs b/components/script/dom/attr.rs index a8f4b897f15..782ab3fd884 100644 --- a/components/script/dom/attr.rs +++ b/components/script/dom/attr.rs @@ -14,7 +14,7 @@ use dom::window::Window; use dom::virtualmethods::vtable_for; use devtools_traits::AttrInfo; -use util::str::{DOMString, parse_unsigned_integer, split_html_space_chars}; +use util::str::{DOMString, parse_unsigned_integer, split_html_space_chars, str_join}; use string_cache::{Atom, Namespace}; @@ -49,11 +49,7 @@ impl AttrValue { } pub fn from_atomic_tokens(atoms: Vec) -> AttrValue { - let tokens = atoms.iter().fold(String::new(), |mut s, atom| { - if !s.is_empty() { s.push('\x20'); } - s.push_str(atom); - s - }); + let tokens = str_join(&atoms, "\x20"); AttrValue::TokenList(tokens, atoms) } diff --git a/components/script/dom/domtokenlist.rs b/components/script/dom/domtokenlist.rs index f863996e9ca..f7a02cdf572 100644 --- a/components/script/dom/domtokenlist.rs +++ b/components/script/dom/domtokenlist.rs @@ -13,7 +13,7 @@ use dom::bindings::utils::{Reflector, reflect_dom_object}; use dom::element::{Element, AttributeHandlers}; use dom::node::window_from_node; -use util::str::{DOMString, HTML_SPACE_CHARACTERS}; +use util::str::{DOMString, HTML_SPACE_CHARACTERS, str_join}; use string_cache::Atom; use std::borrow::ToOwned; @@ -158,10 +158,6 @@ impl<'a> DOMTokenListMethods for &'a DOMTokenList { // https://dom.spec.whatwg.org/#stringification-behavior fn Stringifier(self) -> DOMString { let tokenlist = self.element.root().r().get_tokenlist_attribute(&self.local_name); - tokenlist.iter().fold(String::new(), |mut s, atom| { - if !s.is_empty() { s.push('\x20'); } - s.push_str(atom); - s - }) + str_join(&tokenlist, "\x20") } } diff --git a/components/util/str.rs b/components/util/str.rs index b82f46598b7..fe6127e1106 100644 --- a/components/util/str.rs +++ b/components/util/str.rs @@ -327,3 +327,11 @@ impl Deref for LowercaseString { pub unsafe fn c_str_to_string(s: *const c_char) -> String { from_utf8(CStr::from_ptr(s).to_bytes()).unwrap().to_owned() } + +pub fn str_join>(strs: &[T], join: &str) -> String { + strs.iter().fold(String::new(), |mut acc, s| { + if !acc.is_empty() { acc.push_str(join); } + acc.push_str(s.as_ref()); + acc + }) +}