auto merge of #1819 : Ms2ger/servo/createHTMLCollection-JS, r=jdm

This commit is contained in:
bors-servo 2014-03-05 10:19:31 -05:00
commit 81ef420e3f

View file

@ -213,7 +213,7 @@ impl Document {
// http://dom.spec.whatwg.org/#dom-document-getelementsbytagname // http://dom.spec.whatwg.org/#dom-document-getelementsbytagname
pub fn GetElementsByTagName(&self, tag: DOMString) -> JS<HTMLCollection> { pub fn GetElementsByTagName(&self, tag: DOMString) -> JS<HTMLCollection> {
self.createHTMLCollection(|elem| elem.tag_name == tag) self.createHTMLCollection(|elem| elem.get().tag_name == tag)
} }
// http://dom.spec.whatwg.org/#dom-nonelementparentnode-getelementbyid // http://dom.spec.whatwg.org/#dom-nonelementparentnode-getelementbyid
@ -405,19 +405,24 @@ impl Document {
// http://www.whatwg.org/specs/web-apps/current-work/#dom-document-getelementsbyname // http://www.whatwg.org/specs/web-apps/current-work/#dom-document-getelementsbyname
pub fn GetElementsByName(&self, name: DOMString) -> JS<NodeList> { pub fn GetElementsByName(&self, name: DOMString) -> JS<NodeList> {
self.createNodeList(|elem| { self.createNodeList(|node| {
elem.get_attribute(Null, "name").map_default(false, |attr| { 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 attr.get().value_ref() == name
}) })
}) })
} }
pub fn Images(&self) -> JS<HTMLCollection> { pub fn Images(&self) -> JS<HTMLCollection> {
self.createHTMLCollection(|elem| "img" == elem.tag_name) self.createHTMLCollection(|elem| "img" == elem.get().tag_name)
} }
pub fn Embeds(&self) -> JS<HTMLCollection> { pub fn Embeds(&self) -> JS<HTMLCollection> {
self.createHTMLCollection(|elem| "embed" == elem.tag_name) self.createHTMLCollection(|elem| "embed" == elem.get().tag_name)
} }
pub fn Plugins(&self) -> JS<HTMLCollection> { pub fn Plugins(&self) -> JS<HTMLCollection> {
@ -426,60 +431,71 @@ impl Document {
pub fn Links(&self) -> JS<HTMLCollection> { pub fn Links(&self) -> JS<HTMLCollection> {
self.createHTMLCollection(|elem| { self.createHTMLCollection(|elem| {
("a" == elem.tag_name || "area" == elem.tag_name) && ("a" == elem.get().tag_name || "area" == elem.get().tag_name) &&
elem.get_attribute(Null, "href").is_some() elem.get().get_attribute(Null, "href").is_some()
}) })
} }
pub fn Forms(&self) -> JS<HTMLCollection> { pub fn Forms(&self) -> JS<HTMLCollection> {
self.createHTMLCollection(|elem| "form" == elem.tag_name) self.createHTMLCollection(|elem| "form" == elem.get().tag_name)
} }
pub fn Scripts(&self) -> JS<HTMLCollection> { pub fn Scripts(&self) -> JS<HTMLCollection> {
self.createHTMLCollection(|elem| "script" == elem.tag_name) self.createHTMLCollection(|elem| "script" == elem.get().tag_name)
} }
pub fn Anchors(&self) -> JS<HTMLCollection> { pub fn Anchors(&self) -> JS<HTMLCollection> {
self.createHTMLCollection(|elem| { self.createHTMLCollection(|elem| {
"a" == elem.tag_name && elem.get_attribute(Null, "name").is_some() "a" == elem.get().tag_name &&
elem.get().get_attribute(Null, "name").is_some()
}) })
} }
pub fn Applets(&self) -> JS<HTMLCollection> { pub fn Applets(&self) -> JS<HTMLCollection> {
// FIXME: This should be return OBJECT elements containing applets. // FIXME: This should be return OBJECT elements containing applets.
self.createHTMLCollection(|elem| "applet" == elem.tag_name) self.createHTMLCollection(|elem| "applet" == elem.get().tag_name)
} }
pub fn create_collection(&self, callback: |elem: &Element| -> bool) -> ~[JS<Element>] { pub fn create_collection<T>(&self, callback: |elem: &JS<Node>| -> Option<JS<T>>) -> ~[JS<T>] {
let mut elements = ~[]; let mut nodes = ~[];
match self.GetDocumentElement() { match self.GetDocumentElement() {
None => {}, None => {},
Some(root) => { Some(root) => {
let root: JS<Node> = NodeCast::from(&root); let root: JS<Node> = NodeCast::from(&root);
for child in root.traverse_preorder() { for child in root.traverse_preorder() {
if child.is_element() { match callback(&child) {
let elem: JS<Element> = ElementCast::to(&child); Some(node) => nodes.push(node),
if callback(elem.get()) { None => (),
elements.push(elem);
}
} }
} }
} }
} }
elements nodes
} }
pub fn createHTMLCollection(&self, callback: |elem: &Element| -> bool) -> JS<HTMLCollection> { 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: &Element| -> bool) -> JS<NodeList> { pub fn createNodeList(&self, callback: |node: &JS<Node>| -> bool) -> JS<NodeList> {
let elements = self.create_collection(callback); NodeList::new_simple_list(&self.window, self.create_collection(|node| {
let nodes = elements.map(|element| { if !callback(node) {
let node: JS<Node> = NodeCast::from(element); return None;
node }
});
NodeList::new_simple_list(&self.window, nodes) Some(node.clone())
}))
} }
pub fn content_changed(&self) { pub fn content_changed(&self) {