aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <release+servo@mozilla.com>2014-01-20 11:25:08 -0800
committerbors-servo <release+servo@mozilla.com>2014-01-20 11:25:08 -0800
commit539cf58f732e62be3fd23a86603d78e53f33c82e (patch)
tree6cd93e0c641eb02d2b3e0ae149936ba7e2df4fd9
parent733162e217739f5a01d580ff57c5e592a74e000d (diff)
parenta58838e14ba83e89a6414480322033cca8e9606d (diff)
downloadservo-539cf58f732e62be3fd23a86603d78e53f33c82e.tar.gz
servo-539cf58f732e62be3fd23a86603d78e53f33c82e.zip
auto merge of #1523 : brunoabinader/servo/domimpl-createhtmldocument, r=Ms2ger
Spec: http://dom.spec.whatwg.org/#dom-domimplementation-createhtmldocument Closes #1510.
-rw-r--r--src/components/script/dom/bindings/codegen/DOMImplementation.webidl26
-rw-r--r--src/components/script/dom/domimplementation.rs64
-rw-r--r--src/components/script/dom/webidls/DOMImplementation.webidl4
-rw-r--r--src/test/html/content/test_document_implementation.html30
4 files changed, 95 insertions, 29 deletions
diff --git a/src/components/script/dom/bindings/codegen/DOMImplementation.webidl b/src/components/script/dom/bindings/codegen/DOMImplementation.webidl
deleted file mode 100644
index 5df67f981ba..00000000000
--- a/src/components/script/dom/bindings/codegen/DOMImplementation.webidl
+++ /dev/null
@@ -1,26 +0,0 @@
-/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this file,
- * You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * The origin of this IDL file is
- * http://dom.spec.whatwg.org/#interface-domimplementation
- *
- * Copyright:
- * To the extent possible under law, the editors have waived all copyright and
- * related or neighboring rights to this work.
- */
-
-interface DOMImplementation {
- /*boolean hasFeature(DOMString feature,
- [TreatNullAs=EmptyString] DOMString version);*/
- [Creator, Throws]
- DocumentType createDocumentType(DOMString qualifiedName, DOMString publicId,
- DOMString systemId);
- /*[Throws]
- Document createDocument(DOMString? namespace,
- [TreatNullAs=EmptyString] DOMString qualifiedName,
- optional DocumentType? doctype = null);*/
- /*[Throws]
- Document createHTMLDocument(optional DOMString title);*/
-};
diff --git a/src/components/script/dom/domimplementation.rs b/src/components/script/dom/domimplementation.rs
index cee3f1957e0..2cbed7cdfee 100644
--- a/src/components/script/dom/domimplementation.rs
+++ b/src/components/script/dom/domimplementation.rs
@@ -6,8 +6,15 @@ use dom::bindings::codegen::DOMImplementationBinding;
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::document::{AbstractDocument, HTML, HTMLDocumentTypeId};
use dom::documenttype::DocumentType;
-use dom::node::AbstractNode;
+use dom::htmldocument::HTMLDocument;
+use dom::htmlbodyelement::HTMLBodyElement;
+use dom::htmlheadelement::HTMLHeadElement;
+use dom::htmlhtmlelement::HTMLHtmlElement;
+use dom::htmltitleelement::HTMLTitleElement;
+use dom::node::{AbstractNode, DocumentNodeTypeId};
+use dom::text::Text;
use dom::window::Window;
pub struct DOMImplementation {
@@ -52,4 +59,59 @@ impl DOMImplementation {
QName => Ok(DocumentType::new(qname, Some(pubid), Some(sysid), self.owner.Document()))
}
}
+
+ // http://dom.spec.whatwg.org/#dom-domimplementation-createhtmldocument
+ pub fn CreateHTMLDocument(&self, title: Option<DOMString>) -> AbstractDocument {
+ // Step 1.
+ let abstract_doc = HTMLDocument::new(self.owner);
+ assert!(abstract_doc.document().doctype == HTML);
+
+ let abstract_node = AbstractNode::from_document(abstract_doc);
+ assert!(abstract_node.type_id() == DocumentNodeTypeId(HTMLDocumentTypeId));
+
+ // Step 2.
+ // FIXME: https://github.com/mozilla/servo/pull/1519
+
+ {
+ // Step 3.
+ let doc_type = DocumentType::new(~"html", None, None, abstract_doc);
+ abstract_node.AppendChild(doc_type);
+ }
+
+ {
+ // Step 4.
+ let doc_html = HTMLHtmlElement::new(~"html", abstract_doc);
+ abstract_node.AppendChild(doc_html);
+
+ {
+ // Step 5.
+ let doc_head = HTMLHeadElement::new(~"head", abstract_doc);
+ doc_html.AppendChild(doc_head);
+
+ // Step 6.
+ match title {
+ None => (),
+ Some(title_str) => {
+ // Step 6.1.
+ let doc_title = HTMLTitleElement::new(~"title", abstract_doc);
+ doc_head.AppendChild(doc_title);
+
+ // Step 6.2.
+ let title_text = Text::new(title_str, abstract_doc);
+ doc_title.AppendChild(title_text);
+ }
+ }
+ }
+
+ // Step 7.
+ let doc_body = HTMLBodyElement::new(~"body", abstract_doc);
+ doc_html.AppendChild(doc_body);
+ }
+
+ // Step 8.
+ // FIXME: https://github.com/mozilla/servo/issues/1522
+
+ // Step 9.
+ abstract_doc
+ }
}
diff --git a/src/components/script/dom/webidls/DOMImplementation.webidl b/src/components/script/dom/webidls/DOMImplementation.webidl
index 5df67f981ba..aeb6049ff72 100644
--- a/src/components/script/dom/webidls/DOMImplementation.webidl
+++ b/src/components/script/dom/webidls/DOMImplementation.webidl
@@ -21,6 +21,6 @@ interface DOMImplementation {
Document createDocument(DOMString? namespace,
[TreatNullAs=EmptyString] DOMString qualifiedName,
optional DocumentType? doctype = null);*/
- /*[Throws]
- Document createHTMLDocument(optional DOMString title);*/
+ [Creator]
+ Document createHTMLDocument(optional DOMString title);
};
diff --git a/src/test/html/content/test_document_implementation.html b/src/test/html/content/test_document_implementation.html
index ed866187899..6f7ac8a89ab 100644
--- a/src/test/html/content/test_document_implementation.html
+++ b/src/test/html/content/test_document_implementation.html
@@ -22,6 +22,36 @@
is_a(doctype && doctype, DocumentType, "test2-2, createDocumentType");
}
+ // test3: createHTMLDocument
+ {
+ var htmldoc = document.implementation.createHTMLDocument("example title");
+ isnot(htmldoc, null, "test3-0, createHTMLDocument");
+ is_a(htmldoc, Document, "test3-1, createHTMLDocument");
+ is_a(htmldoc, HTMLDocument, "test3-2, createHTMLDocument");
+ is(htmldoc.childNodes.length, 2, "test3-3, createHTMLDocument");
+
+ is_a(htmldoc.doctype && htmldoc.doctype, DocumentType, "test3-4, createHTMLDocument");
+ is(htmldoc.doctype.name, "html", "test3-5, createHTMLDocument");
+
+ is_a(htmldoc.documentElement && htmldoc.documentElement, HTMLHtmlElement, "test3-6, createHTMLDocument");
+ is(htmldoc.documentElement.childNodes.length, 2, "test3-7, createHTMLDocument");
+ is(htmldoc.documentElement.tagName, "HTML", "test3-8, createHTMLDocument");
+
+ is_a(htmldoc.head && htmldoc.head, HTMLHeadElement, "test3-9, createHTMLDocument");
+ is(htmldoc.head.tagName, "HEAD", "test3-10, createHTMLDocument");
+ is(htmldoc.head, htmldoc.documentElement.childNodes[0], "test3-11, createHTMLDocument");
+ is(htmldoc.head.childNodes.length, 1, "test3-12, createHTMLDocument");
+
+ is_a(htmldoc.head.childNodes[0], HTMLTitleElement, "test3-13, createHTMLDocument");
+ is(htmldoc.head.childNodes[0].tagName, "TITLE", "test3-14, createHTMLDocument");
+ is(htmldoc.title, "example title", "test3-15, createHTMLDocument");
+
+ is_a(htmldoc.body && htmldoc.body, HTMLBodyElement, "test3-16, createHTMLDocument");
+ is(htmldoc.body.tagName, "BODY", "test3-17, createHTMLDocument");
+ is(htmldoc.body, htmldoc.documentElement.childNodes[1], "test3-18, createHTMLDocument");
+ is(htmldoc.body.childNodes.length, 0, "test3-19, createHTMLDocument");
+ }
+
finish();
</script>
</head>