Implement Document::head()

Implementation details according to the specification below:
http://www.whatwg.org/specs/web-apps/current-work/#dom-document-head

This patch is for:
https://github.com/mozilla/servo/issues/1465
This commit is contained in:
Bruno de Oliveira Abinader 2014-01-07 10:15:49 -04:00
parent 608ee006ab
commit 17b35d52ff
4 changed files with 48 additions and 5 deletions

View file

@ -101,7 +101,7 @@ partial interface Document {
attribute DOMString title;
// attribute DOMString dir;
attribute HTMLElement? body;
//(HTML only)readonly attribute HTMLHeadElement? head;
readonly attribute HTMLHeadElement? head;
//(HTML only)readonly attribute HTMLCollection images;
//(HTML only)readonly attribute HTMLCollection embeds;
//(HTML only)readonly attribute HTMLCollection plugins;

View file

@ -303,6 +303,15 @@ impl Document {
}
}
// http://www.whatwg.org/specs/web-apps/current-work/#dom-document-head
pub fn GetHead(&self) -> Option<AbstractNode> {
self.get_html_element().and_then(|root| {
root.traverse_preorder().find(|child| {
child.type_id() == ElementNodeTypeId(HTMLHeadElementTypeId)
})
})
}
pub fn GetBody(&self, _: AbstractDocument) -> Option<AbstractNode> {
match self.get_html_element() {
None => None,

View file

@ -34,12 +34,11 @@ impl HTMLDocument {
impl HTMLDocument {
pub fn GetHead(&self) -> Option<AbstractNode> {
match self.parent.GetDocumentElement() {
None => None,
Some(root) => root.traverse_preorder().find(|child| {
self.parent.GetDocumentElement().and_then(|root| {
root.traverse_preorder().find(|child| {
child.type_id() == ElementNodeTypeId(HTMLHeadElementTypeId)
})
}
})
}
pub fn Images(&self) -> @mut HTMLCollection {

View file

@ -0,0 +1,35 @@
<html>
<head>
<script src="harness.js"></script>
</head>
<body>
<script>
// test1: existing document's head
{
isnot(document.head, null, "test1-0, existing document's head");
is_a(document.head, HTMLHeadElement, "test1-1, exising document's head");
is(document.head && document.head.tagName, "HEAD", "test1-2, existing document's head");
}
// test2: append head to a new document
{
let new_document = new Document();
new_document.appendChild(new_document.createElement("html"));
let new_head = new_document.createElement("head");
isnot(new_head, null, "test2-0, append head to a new document");
is_a(new_head, HTMLHeadElement, "test2-1, append head to a new document");
is(new_head && new_head.tagName, "HEAD", "test2-2, append head to a new document");
// Document::head is read-only.
new_document.head = new_head;
is(new_document.head, null, "test2-3, append head to a new document");
new_document.documentElement.appendChild(new_head);
is(new_document.head, new_head, "test2-4, append head to a new document");
}
finish();
</script>
</body>
</html>