mirror of
https://github.com/servo/servo.git
synced 2025-06-24 09:04:33 +01:00
Rewrite Document::create_collection to work better with createNodeList.
This commit is contained in:
parent
cd1d81e402
commit
7ecc39e9ba
1 changed files with 33 additions and 18 deletions
|
@ -405,8 +405,13 @@ impl Document {
|
|||
|
||||
// http://www.whatwg.org/specs/web-apps/current-work/#dom-document-getelementsbyname
|
||||
pub fn GetElementsByName(&self, name: DOMString) -> JS<NodeList> {
|
||||
self.createNodeList(|elem| {
|
||||
elem.get().get_attribute(Null, "name").map_default(false, |attr| {
|
||||
self.createNodeList(|node| {
|
||||
if !node.is_element() {
|
||||
return false;
|
||||
}
|
||||
|
||||
let element: JS<Element> = ElementCast::to(node);
|
||||
element.get().get_attribute(Null, "name").map_default(false, |attr| {
|
||||
attr.get().value_ref() == name
|
||||
})
|
||||
})
|
||||
|
@ -451,36 +456,46 @@ impl Document {
|
|||
self.createHTMLCollection(|elem| "applet" == elem.get().tag_name)
|
||||
}
|
||||
|
||||
pub fn create_collection(&self, callback: |elem: &JS<Element>| -> bool) -> ~[JS<Element>] {
|
||||
let mut elements = ~[];
|
||||
pub fn create_collection<T>(&self, callback: |elem: &JS<Node>| -> Option<JS<T>>) -> ~[JS<T>] {
|
||||
let mut nodes = ~[];
|
||||
match self.GetDocumentElement() {
|
||||
None => {},
|
||||
Some(root) => {
|
||||
let root: JS<Node> = NodeCast::from(&root);
|
||||
for child in root.traverse_preorder() {
|
||||
if child.is_element() {
|
||||
let elem: JS<Element> = ElementCast::to(&child);
|
||||
if callback(&elem) {
|
||||
elements.push(elem);
|
||||
}
|
||||
match callback(&child) {
|
||||
Some(node) => nodes.push(node),
|
||||
None => (),
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
elements
|
||||
nodes
|
||||
}
|
||||
|
||||
pub fn createHTMLCollection(&self, callback: |elem: &JS<Element>| -> bool) -> JS<HTMLCollection> {
|
||||
HTMLCollection::new(&self.window, self.create_collection(callback))
|
||||
HTMLCollection::new(&self.window, self.create_collection(|node| {
|
||||
if !node.is_element() {
|
||||
return None;
|
||||
}
|
||||
|
||||
let element: JS<Element> = ElementCast::to(node);
|
||||
if !callback(&element) {
|
||||
return None;
|
||||
}
|
||||
|
||||
Some(element)
|
||||
}))
|
||||
}
|
||||
|
||||
pub fn createNodeList(&self, callback: |elem: &JS<Element>| -> bool) -> JS<NodeList> {
|
||||
let elements = self.create_collection(callback);
|
||||
let nodes = elements.map(|element| {
|
||||
let node: JS<Node> = NodeCast::from(element);
|
||||
node
|
||||
});
|
||||
NodeList::new_simple_list(&self.window, nodes)
|
||||
pub fn createNodeList(&self, callback: |node: &JS<Node>| -> bool) -> JS<NodeList> {
|
||||
NodeList::new_simple_list(&self.window, self.create_collection(|node| {
|
||||
if !callback(node) {
|
||||
return None;
|
||||
}
|
||||
|
||||
Some(node.clone())
|
||||
}))
|
||||
}
|
||||
|
||||
pub fn content_changed(&self) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue