mirror of
https://github.com/servo/servo.git
synced 2025-08-04 21:20:23 +01:00
Added Node's query_selector_all helper function
This commit is contained in:
parent
1d35650d4f
commit
b0e8f7cebf
1 changed files with 28 additions and 1 deletions
|
@ -398,6 +398,7 @@ pub trait NodeHelpers {
|
||||||
fn get_content_boxes(&self) -> Vec<Rect<Au>>;
|
fn get_content_boxes(&self) -> Vec<Rect<Au>>;
|
||||||
|
|
||||||
fn query_selector(&self, selectors: DOMString) -> Fallible<Option<Temporary<Element>>>;
|
fn query_selector(&self, selectors: DOMString) -> Fallible<Option<Temporary<Element>>>;
|
||||||
|
fn query_selector_all(&self, selectors: DOMString) -> Fallible<Temporary<NodeList>>;
|
||||||
|
|
||||||
fn remove_self(&self);
|
fn remove_self(&self);
|
||||||
}
|
}
|
||||||
|
@ -568,9 +569,9 @@ impl<'a> NodeHelpers for JSRef<'a, Node> {
|
||||||
None => return Err(Syntax),
|
None => return Err(Syntax),
|
||||||
// Step 3.
|
// Step 3.
|
||||||
Some(ref selectors) => {
|
Some(ref selectors) => {
|
||||||
|
let root = self.ancestors().last().unwrap_or(self.clone());
|
||||||
for selector in selectors.iter() {
|
for selector in selectors.iter() {
|
||||||
assert!(selector.pseudo_element.is_none());
|
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()) {
|
for node in root.traverse_preorder().filter(|node| node.is_element()) {
|
||||||
let mut _shareable: bool = false;
|
let mut _shareable: bool = false;
|
||||||
if matches_compound_selector(selector.compound_selectors.deref(), &node, &mut _shareable) {
|
if matches_compound_selector(selector.compound_selectors.deref(), &node, &mut _shareable) {
|
||||||
|
@ -584,6 +585,32 @@ impl<'a> NodeHelpers for JSRef<'a, Node> {
|
||||||
Ok(None)
|
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 {
|
fn ancestors(&self) -> AncestorIterator {
|
||||||
AncestorIterator {
|
AncestorIterator {
|
||||||
current: self.parent_node.get().map(|node| (*node.root()).clone()),
|
current: self.parent_node.get().map(|node| (*node.root()).clone()),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue