diff --git a/src/components/script/dom/bindings/codegen/DOMImplementation.webidl b/src/components/script/dom/bindings/codegen/DOMImplementation.webidl index 8ce96554c99..5df67f981ba 100644 --- a/src/components/script/dom/bindings/codegen/DOMImplementation.webidl +++ b/src/components/script/dom/bindings/codegen/DOMImplementation.webidl @@ -14,9 +14,9 @@ interface DOMImplementation { /*boolean hasFeature(DOMString feature, [TreatNullAs=EmptyString] DOMString version);*/ - /*[Throws] + [Creator, Throws] DocumentType createDocumentType(DOMString qualifiedName, DOMString publicId, - DOMString systemId);*/ + DOMString systemId); /*[Throws] Document createDocument(DOMString? namespace, [TreatNullAs=EmptyString] DOMString qualifiedName, diff --git a/src/components/script/dom/domimplementation.rs b/src/components/script/dom/domimplementation.rs index e0b3617d1b1..d11a15c24e6 100644 --- a/src/components/script/dom/domimplementation.rs +++ b/src/components/script/dom/domimplementation.rs @@ -3,7 +3,11 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use dom::bindings::codegen::DOMImplementationBinding; -use dom::bindings::utils::{Reflector, Reflectable, reflect_dom_object}; +use dom::bindings::utils::{DOMString, Reflector, Reflectable, reflect_dom_object}; +use dom::bindings::utils::{Fallible, InvalidCharacter, NamespaceError}; +use dom::bindings::utils::{QName, Name, InvalidXMLName, xml_name_type}; +use dom::documenttype::DocumentType; +use dom::node::AbstractNode; use dom::window::Window; pub struct DOMImplementation { @@ -34,3 +38,20 @@ impl Reflectable for DOMImplementation { &mut self.reflector_ } } + +// http://dom.spec.whatwg.org/#domimplementation +impl DOMImplementation { + // http://dom.spec.whatwg.org/#dom-domimplementation-createdocumenttype + pub fn CreateDocumentType(&self, qname: DOMString, pubid: DOMString, sysid: DOMString) -> Fallible { + // FIXME: To be removed in https://github.com/mozilla/servo/issues/1498 + let force_quirks : bool = false; + match xml_name_type(qname) { + // Step 1. + InvalidXMLName => Err(InvalidCharacter), + // Step 2. + Name => Err(NamespaceError), + // Step 3. + QName => Ok(DocumentType::new(qname, Some(pubid), Some(sysid), force_quirks, self.owner.Document())) + } + } +} diff --git a/src/test/html/content/test_document_implementation.html b/src/test/html/content/test_document_implementation.html index eddfb23de0c..ed866187899 100644 --- a/src/test/html/content/test_document_implementation.html +++ b/src/test/html/content/test_document_implementation.html @@ -11,6 +11,17 @@ is(document.implementation, implementation, "test1-2, basic test"); } + // test2: createDocumentType + { + is(document.doctype, null, "test2-0, createDocumentType"); + + var doctype = document.implementation.createDocumentType("html", null, null); + is_a(doctype && doctype, DocumentType, "test2-1, createDocumentType"); + + doctype = document.implementation.createDocumentType("html:html", null, null); + is_a(doctype && doctype, DocumentType, "test2-2, createDocumentType"); + } + finish();