diff options
author | bors-servo <release+servo@mozilla.com> | 2014-06-11 16:05:04 -0400 |
---|---|---|
committer | bors-servo <release+servo@mozilla.com> | 2014-06-11 16:05:04 -0400 |
commit | baa97fe6e5a31a1e8d527eb1de0e163bb568714d (patch) | |
tree | 2008fd21dca39f6cf8e95bd2e449c689962e0d64 /src/components/script/dom/node.rs | |
parent | cc23f3c4360a37e4dc763d4eade779a411a6d97a (diff) | |
parent | 8c017d8830a31434365bf10694487ed4ab8748da (diff) | |
download | servo-baa97fe6e5a31a1e8d527eb1de0e163bb568714d.tar.gz servo-baa97fe6e5a31a1e8d527eb1de0e163bb568714d.zip |
auto merge of #2632 : brunoabinader/servo/document-queryselectorall, r=Ms2ger
Spec:
http://dom.spec.whatwg.org/#dom-parentnode-queryselectorall
Closes #851.
Diffstat (limited to 'src/components/script/dom/node.rs')
-rw-r--r-- | src/components/script/dom/node.rs | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/src/components/script/dom/node.rs b/src/components/script/dom/node.rs index a3d2132f601..d83d48b047f 100644 --- a/src/components/script/dom/node.rs +++ b/src/components/script/dom/node.rs @@ -399,6 +399,7 @@ pub trait NodeHelpers { fn get_content_boxes(&self) -> Vec<Rect<Au>>; fn query_selector(&self, selectors: DOMString) -> Fallible<Option<Temporary<Element>>>; + fn query_selector_all(&self, selectors: DOMString) -> Fallible<Temporary<NodeList>>; fn remove_self(&self); } @@ -569,9 +570,9 @@ impl<'a> NodeHelpers for JSRef<'a, Node> { None => return Err(Syntax), // Step 3. Some(ref selectors) => { + let root = self.ancestors().last().unwrap_or(self.clone()); for selector in selectors.iter() { assert!(selector.pseudo_element.is_none()); - let root = self.ancestors().last().unwrap_or(self.clone()); for node in root.traverse_preorder().filter(|node| node.is_element()) { let mut _shareable: bool = false; if matches_compound_selector(selector.compound_selectors.deref(), &node, &mut _shareable) { @@ -585,6 +586,32 @@ impl<'a> NodeHelpers for JSRef<'a, Node> { Ok(None) } + // http://dom.spec.whatwg.org/#dom-parentnode-queryselectorall + fn query_selector_all(&self, selectors: DOMString) -> Fallible<Temporary<NodeList>> { + // Step 1. + let mut nodes = vec!(); + let root = self.ancestors().last().unwrap_or(self.clone()); + let namespace = NamespaceMap::new(); + match parse_selector_list(tokenize(selectors.as_slice()).map(|(token, _)| token).collect(), &namespace) { + // Step 2. + None => return Err(Syntax), + // Step 3. + Some(ref selectors) => { + for selector in selectors.iter() { + assert!(selector.pseudo_element.is_none()); + for node in root.traverse_preorder().filter(|node| node.is_element()) { + let mut _shareable: bool = false; + if matches_compound_selector(selector.compound_selectors.deref(), &node, &mut _shareable) { + nodes.push(node.clone()) + } + } + } + } + } + let window = window_from_node(self).root(); + Ok(NodeList::new_simple_list(&window.root_ref(), nodes)) + } + fn ancestors(&self) -> AncestorIterator { AncestorIterator { current: self.parent_node.get().map(|node| (*node.root()).clone()), |