summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Userland/Libraries/LibWeb/DOM/DOMImplementation.cpp45
-rw-r--r--Userland/Libraries/LibWeb/DOM/DOMImplementation.h5
-rw-r--r--Userland/Libraries/LibWeb/DOM/DOMImplementation.idl6
-rw-r--r--Userland/Libraries/LibWeb/DOM/DocumentType.h5
4 files changed, 58 insertions, 3 deletions
diff --git a/Userland/Libraries/LibWeb/DOM/DOMImplementation.cpp b/Userland/Libraries/LibWeb/DOM/DOMImplementation.cpp
index 04493eda8b..1b46a0d5f6 100644
--- a/Userland/Libraries/LibWeb/DOM/DOMImplementation.cpp
+++ b/Userland/Libraries/LibWeb/DOM/DOMImplementation.cpp
@@ -19,8 +19,40 @@ DOMImplementation::DOMImplementation(Document& document)
{
}
-const NonnullRefPtr<Document> DOMImplementation::create_html_document(const String& title) const
+// https://dom.spec.whatwg.org/#dom-domimplementation-createdocument
+NonnullRefPtr<Document> DOMImplementation::create_document(const String& namespace_, const String& qualified_name) const
{
+ // FIXME: This should specifically be an XML document.
+ auto xml_document = Document::create();
+
+ xml_document->set_ready_for_post_load_tasks(true);
+
+ RefPtr<Element> element;
+
+ if (!qualified_name.is_empty())
+ element = xml_document->create_element_ns(namespace_, qualified_name /* FIXME: and an empty dictionary */);
+
+ // FIXME: If doctype is non-null, append doctype to document.
+
+ if (element)
+ xml_document->append_child(element.release_nonnull());
+
+ xml_document->set_origin(m_document.origin());
+
+ if (namespace_ == Namespace::HTML)
+ m_document.set_content_type("application/xhtml+xml");
+ else if (namespace_ == Namespace::SVG)
+ m_document.set_content_type("image/svg+xml");
+ else
+ m_document.set_content_type("application/xml");
+
+ return xml_document;
+}
+
+// https://dom.spec.whatwg.org/#dom-domimplementation-createhtmldocument
+NonnullRefPtr<Document> DOMImplementation::create_html_document(const String& title) const
+{
+ // FIXME: This should specifically be a HTML document.
auto html_document = Document::create();
html_document->set_content_type("text/html");
@@ -52,4 +84,15 @@ const NonnullRefPtr<Document> DOMImplementation::create_html_document(const Stri
return html_document;
}
+// https://dom.spec.whatwg.org/#dom-domimplementation-createdocumenttype
+NonnullRefPtr<DocumentType> DOMImplementation::create_document_type(const String& qualified_name, const String& public_id, const String& system_id) const
+{
+ // FIXME: Validate qualified_name.
+ auto document_type = DocumentType::create(m_document);
+ document_type->set_name(qualified_name);
+ document_type->set_public_id(public_id);
+ document_type->set_system_id(system_id);
+ return document_type;
+}
+
}
diff --git a/Userland/Libraries/LibWeb/DOM/DOMImplementation.h b/Userland/Libraries/LibWeb/DOM/DOMImplementation.h
index 2635030adc..34762c3dd9 100644
--- a/Userland/Libraries/LibWeb/DOM/DOMImplementation.h
+++ b/Userland/Libraries/LibWeb/DOM/DOMImplementation.h
@@ -25,7 +25,10 @@ public:
return adopt_ref(*new DOMImplementation(document));
}
- const NonnullRefPtr<Document> create_html_document(const String& title) const;
+ // FIXME: Add optional DocumentType once supported by IDL
+ NonnullRefPtr<Document> create_document(const String&, const String&) const;
+ NonnullRefPtr<Document> create_html_document(const String& title) const;
+ NonnullRefPtr<DocumentType> create_document_type(const String&, const String&, const String&) const;
// https://dom.spec.whatwg.org/#dom-domimplementation-hasfeature
bool has_feature() const { return true; }
diff --git a/Userland/Libraries/LibWeb/DOM/DOMImplementation.idl b/Userland/Libraries/LibWeb/DOM/DOMImplementation.idl
index c979a587c3..40a35fd271 100644
--- a/Userland/Libraries/LibWeb/DOM/DOMImplementation.idl
+++ b/Userland/Libraries/LibWeb/DOM/DOMImplementation.idl
@@ -1,6 +1,10 @@
interface DOMImplementation {
- Document createHTMLDocument(optional DOMString title);
+ // FIXME: This is missing "optional DocumentType? doctype = null" at the end.
+ // FIXME: This should return XMLDocument instead of Document.
+ [NewObject] Document createDocument(DOMString? namespace, [LegacyNullToEmptyString] DOMString qualifiedName);
+ [NewObject] Document createHTMLDocument(optional DOMString title);
+ [NewObject] DocumentType createDocumentType(DOMString qualifiedName, DOMString publicId, DOMString systemId);
boolean hasFeature();
diff --git a/Userland/Libraries/LibWeb/DOM/DocumentType.h b/Userland/Libraries/LibWeb/DOM/DocumentType.h
index 0bb20f9cd5..e74494249e 100644
--- a/Userland/Libraries/LibWeb/DOM/DocumentType.h
+++ b/Userland/Libraries/LibWeb/DOM/DocumentType.h
@@ -15,6 +15,11 @@ class DocumentType final : public Node {
public:
using WrapperType = Bindings::DocumentTypeWrapper;
+ static NonnullRefPtr<DocumentType> create(Document& document)
+ {
+ return adopt_ref(*new DocumentType(document));
+ }
+
explicit DocumentType(Document&);
virtual ~DocumentType() override;