auto merge of #2072 : brunoabinader/servo/domimpl-createdocument, r=Ms2ger

Spec:
http://dom.spec.whatwg.org/#dom-domimplementation-createdocument

Closes #1509.
This commit is contained in:
bors-servo 2014-04-21 15:58:27 -04:00
commit f864d21212
3 changed files with 63 additions and 3 deletions

View file

@ -8,7 +8,7 @@ use dom::bindings::js::JS;
use dom::bindings::utils::{Reflector, Reflectable, reflect_dom_object}; use dom::bindings::utils::{Reflector, Reflectable, reflect_dom_object};
use dom::bindings::error::{Fallible, InvalidCharacter, NamespaceError}; use dom::bindings::error::{Fallible, InvalidCharacter, NamespaceError};
use dom::bindings::utils::{QName, Name, InvalidXMLName, xml_name_type}; use dom::bindings::utils::{QName, Name, InvalidXMLName, xml_name_type};
use dom::document::{Document, HTMLDocument}; use dom::document::{Document, HTMLDocument, NonHTMLDocument};
use dom::documenttype::DocumentType; use dom::documenttype::DocumentType;
use dom::htmlbodyelement::HTMLBodyElement; use dom::htmlbodyelement::HTMLBodyElement;
use dom::htmlheadelement::HTMLHeadElement; use dom::htmlheadelement::HTMLHeadElement;
@ -63,6 +63,42 @@ impl DOMImplementation {
} }
} }
// http://dom.spec.whatwg.org/#dom-domimplementation-createdocument
pub fn CreateDocument(&self, namespace: Option<DOMString>, qname: DOMString,
maybe_doctype: Option<JS<DocumentType>>) -> Fallible<JS<Document>> {
// Step 1.
let doc = Document::new(&self.owner, None, NonHTMLDocument, None);
let mut doc_node: JS<Node> = NodeCast::from(&doc);
// Step 2-3.
let maybe_elem = if qname.is_empty() {
None
} else {
match doc.get().CreateElementNS(&doc, namespace, qname) {
Err(error) => return Err(error),
Ok(elem) => Some(elem)
}
};
// Step 4.
match maybe_doctype {
None => (),
Some(ref doctype) => assert!(doc_node.AppendChild(&mut NodeCast::from(doctype)).is_ok())
}
// Step 5.
match maybe_elem {
None => (),
Some(ref elem) => assert!(doc_node.AppendChild(&mut NodeCast::from(elem)).is_ok())
}
// Step 6.
// FIXME: https://github.com/mozilla/servo/issues/1522
// Step 7.
Ok(doc)
}
// http://dom.spec.whatwg.org/#dom-domimplementation-createhtmldocument // http://dom.spec.whatwg.org/#dom-domimplementation-createhtmldocument
pub fn CreateHTMLDocument(&self, title: Option<DOMString>) -> JS<Document> { pub fn CreateHTMLDocument(&self, title: Option<DOMString>) -> JS<Document> {
// Step 1-2. // Step 1-2.

View file

@ -17,10 +17,10 @@ interface DOMImplementation {
[Creator, Throws] [Creator, Throws]
DocumentType createDocumentType(DOMString qualifiedName, DOMString publicId, DocumentType createDocumentType(DOMString qualifiedName, DOMString publicId,
DOMString systemId); DOMString systemId);
/*[Throws] [Creator, Throws]
Document createDocument(DOMString? namespace, Document createDocument(DOMString? namespace,
[TreatNullAs=EmptyString] DOMString qualifiedName, [TreatNullAs=EmptyString] DOMString qualifiedName,
optional DocumentType? doctype = null);*/ optional DocumentType? doctype = null);
[Creator] [Creator]
Document createHTMLDocument(optional DOMString title); Document createHTMLDocument(optional DOMString title);
}; };

View file

@ -51,6 +51,30 @@
is(htmldoc.body.childNodes.length, 0, "test3-19, createHTMLDocument"); is(htmldoc.body.childNodes.length, 0, "test3-19, createHTMLDocument");
} }
// test4: createDocument
{
var doc = document.implementation.createDocument('http://www.w3.org/1999/xhtml', 'html', null);
is_not(doc, null, "test4-0, createDocument");
is_a(doc, Document, "test4-1, createDocument");
is(doc.childNodes.length, 1, "test4-2, createDocument");
is(doc.doctype, null, "test4-3, createDocument");
is_a(doc.documentElement, HTMLHtmlElement, "test4-4, createDocument");
var doctype = document.implementation.createDocumentType("html", null, null);
doc = document.implementation.createDocument('http://www.w3.org/1999/xhtml', 'html', doctype);
is(doc.childNodes.length, 2, "test4-5, createDocument");
is(doc.doctype, doctype, "test4-6, createDocument");
is_a(doc.documentElement, HTMLHtmlElement, "test4-7, createDocument");
doctype = document.implementation.createDocumentType(
'svg:svg', '-//W3C//DTD SVG 1.1//EN',
'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd');
doc = document.implementation.createDocument('http://www.w3.org/2000/svg', 'svg:svg', doctype);
is(doc.childNodes.length, 2, "test4-8, createDocument");
is(doc.doctype, doctype, "test4-9, createDocument");
is_a(doc.documentElement, Element, "test4-10, createDocument");
}
finish(); finish();
</script> </script>
</head> </head>