From 9d93d37644f843015c514b14ad38af2a43abd28c Mon Sep 17 00:00:00 2001 From: Andrew Kaster Date: Fri, 18 Jul 2025 12:35:14 -0600 Subject: [PATCH] LibWeb: Listen for CDATASections and ProcessingInstructions in XML docs Using the new hooks in the XML Parser's listener interface, we now append DOM nodes for CDATASections and ProcessingInstructions to the document as they are encountered. This commit also fixes where comment nodes are appended, ensuring they are added to the current node instead of the document root. --- Libraries/LibWeb/XML/XMLDocumentBuilder.cpp | 25 +++++++++++++++++++-- Libraries/LibWeb/XML/XMLDocumentBuilder.h | 2 ++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/Libraries/LibWeb/XML/XMLDocumentBuilder.cpp b/Libraries/LibWeb/XML/XMLDocumentBuilder.cpp index 1316bce4e03..fbfb0d25d42 100644 --- a/Libraries/LibWeb/XML/XMLDocumentBuilder.cpp +++ b/Libraries/LibWeb/XML/XMLDocumentBuilder.cpp @@ -4,8 +4,10 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include #include #include +#include #include #include #include @@ -260,9 +262,28 @@ void XMLDocumentBuilder::text(StringView data) void XMLDocumentBuilder::comment(StringView data) { - if (m_has_error) + if (m_has_error || !m_current_node) return; - MUST(m_document->append_child(m_document->create_comment(MUST(String::from_utf8(data))))); + + MUST(m_current_node->append_child(m_document->create_comment(MUST(String::from_utf8(data))))); +} + +void XMLDocumentBuilder::cdata_section(StringView data) +{ + if (m_has_error || !m_current_node) + return; + + auto section = MUST(m_document->create_cdata_section(MUST(String::from_utf8(data)))); + MUST(m_current_node->append_child(section)); +} + +void XMLDocumentBuilder::processing_instruction(StringView target, StringView data) +{ + if (m_has_error || !m_current_node) + return; + + auto processing_instruction = MUST(m_document->create_processing_instruction(MUST(String::from_utf8(target)), MUST(String::from_utf8(data)))); + MUST(m_current_node->append_child(processing_instruction)); } void XMLDocumentBuilder::document_end() diff --git a/Libraries/LibWeb/XML/XMLDocumentBuilder.h b/Libraries/LibWeb/XML/XMLDocumentBuilder.h index edc3d779786..60899a7e932 100644 --- a/Libraries/LibWeb/XML/XMLDocumentBuilder.h +++ b/Libraries/LibWeb/XML/XMLDocumentBuilder.h @@ -36,6 +36,8 @@ private: virtual void element_end(XML::Name const& name) override; virtual void text(StringView data) override; virtual void comment(StringView data) override; + virtual void cdata_section(StringView data) override; + virtual void processing_instruction(StringView target, StringView data) override; virtual void document_end() override; Optional namespace_for_name(XML::Name const&);