mirror of
https://github.com/servo/servo.git
synced 2025-06-24 17:14:33 +01:00
auto merge of #1819 : Ms2ger/servo/createHTMLCollection-JS, r=jdm
This commit is contained in:
commit
81ef420e3f
1 changed files with 44 additions and 28 deletions
|
@ -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) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue