浏览代码

LibWeb: Add createDocument and createDocumentType for DOMImplementation

Both required for the acid3 test.
createDocument is used extensively in Web Platform Tests.
Luke 4 年之前
父节点
当前提交
7c6c7ca542

+ 44 - 1
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();
     auto html_document = Document::create();
 
 
     html_document->set_content_type("text/html");
     html_document->set_content_type("text/html");
@@ -52,4 +84,15 @@ const NonnullRefPtr<Document> DOMImplementation::create_html_document(const Stri
     return html_document;
     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;
+}
+
 }
 }

+ 4 - 1
Userland/Libraries/LibWeb/DOM/DOMImplementation.h

@@ -25,7 +25,10 @@ public:
         return adopt_ref(*new DOMImplementation(document));
         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
     // https://dom.spec.whatwg.org/#dom-domimplementation-hasfeature
     bool has_feature() const { return true; }
     bool has_feature() const { return true; }

+ 5 - 1
Userland/Libraries/LibWeb/DOM/DOMImplementation.idl

@@ -1,6 +1,10 @@
 interface DOMImplementation {
 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();
     boolean hasFeature();
 
 

+ 5 - 0
Userland/Libraries/LibWeb/DOM/DocumentType.h

@@ -15,6 +15,11 @@ class DocumentType final : public Node {
 public:
 public:
     using WrapperType = Bindings::DocumentTypeWrapper;
     using WrapperType = Bindings::DocumentTypeWrapper;
 
 
+    static NonnullRefPtr<DocumentType> create(Document& document)
+    {
+        return adopt_ref(*new DocumentType(document));
+    }
+
     explicit DocumentType(Document&);
     explicit DocumentType(Document&);
     virtual ~DocumentType() override;
     virtual ~DocumentType() override;