aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/script/dom/node.rs
diff options
context:
space:
mode:
authorbors-servo <release+servo@mozilla.com>2014-06-11 16:05:04 -0400
committerbors-servo <release+servo@mozilla.com>2014-06-11 16:05:04 -0400
commitbaa97fe6e5a31a1e8d527eb1de0e163bb568714d (patch)
tree2008fd21dca39f6cf8e95bd2e449c689962e0d64 /src/components/script/dom/node.rs
parentcc23f3c4360a37e4dc763d4eade779a411a6d97a (diff)
parent8c017d8830a31434365bf10694487ed4ab8748da (diff)
downloadservo-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.rs29
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()),