Skip to content

Commit

Permalink
LibWeb: Add createDocument and createDocumentType for DOMImplementation
Browse files Browse the repository at this point in the history
Both required for the acid3 test.
createDocument is used extensively in Web Platform Tests.
  • Loading branch information
Lubrsi authored and linusg committed May 4, 2021
1 parent 5952bc1 commit 7c6c7ca
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 3 deletions.
45 changes: 44 additions & 1 deletion Userland/Libraries/LibWeb/DOM/DOMImplementation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down Expand Up @@ -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;
}

}
5 changes: 4 additions & 1 deletion Userland/Libraries/LibWeb/DOM/DOMImplementation.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,10 @@ class DOMImplementation final
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; }
Expand Down
6 changes: 5 additions & 1 deletion Userland/Libraries/LibWeb/DOM/DOMImplementation.idl
Original file line number Diff line number Diff line change
@@ -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();

Expand Down
5 changes: 5 additions & 0 deletions Userland/Libraries/LibWeb/DOM/DocumentType.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down

0 comments on commit 7c6c7ca

Please sign in to comment.