diff --git a/Libraries/LibWeb/XML/XMLDocumentBuilder.cpp b/Libraries/LibWeb/XML/XMLDocumentBuilder.cpp index 1add993223b..e4db8390cd5 100644 --- a/Libraries/LibWeb/XML/XMLDocumentBuilder.cpp +++ b/Libraries/LibWeb/XML/XMLDocumentBuilder.cpp @@ -92,7 +92,7 @@ void XMLDocumentBuilder::set_doctype(XML::Doctype doctype) m_document->insert_before(document_type, m_document->first_child(), false); } -void XMLDocumentBuilder::element_start(const XML::Name& name, HashMap const& attributes) +void XMLDocumentBuilder::element_start(const XML::Name& name, OrderedHashMap const& attributes) { if (m_has_error) return; diff --git a/Libraries/LibWeb/XML/XMLDocumentBuilder.h b/Libraries/LibWeb/XML/XMLDocumentBuilder.h index 77653d0bdaf..4a145728eb2 100644 --- a/Libraries/LibWeb/XML/XMLDocumentBuilder.h +++ b/Libraries/LibWeb/XML/XMLDocumentBuilder.h @@ -32,7 +32,7 @@ public: private: virtual void set_source(ByteString) override; virtual void set_doctype(XML::Doctype) override; - virtual void element_start(XML::Name const& name, HashMap const& attributes) override; + virtual void element_start(XML::Name const& name, OrderedHashMap const& attributes) override; virtual void element_end(XML::Name const& name) override; virtual void text(StringView data) override; virtual void comment(StringView data) override; diff --git a/Libraries/LibXML/DOM/Node.h b/Libraries/LibXML/DOM/Node.h index ed6d803611d..184b5e43aa6 100644 --- a/Libraries/LibXML/DOM/Node.h +++ b/Libraries/LibXML/DOM/Node.h @@ -29,7 +29,7 @@ struct Node { }; struct Element { Name name; - HashMap attributes; + OrderedHashMap attributes; Vector> children; }; diff --git a/Libraries/LibXML/Parser/Parser.cpp b/Libraries/LibXML/Parser/Parser.cpp index d79be4ed728..589dba32a79 100644 --- a/Libraries/LibXML/Parser/Parser.cpp +++ b/Libraries/LibXML/Parser/Parser.cpp @@ -700,7 +700,7 @@ ErrorOr, ParseError> Parser::parse_empty_element_tag() TRY(expect("<"sv)); auto name = TRY(parse_name()); - HashMap attributes; + OrderedHashMap attributes; while (true) { if (auto result = skip_whitespace(Required::Yes); result.is_error()) @@ -854,7 +854,7 @@ ErrorOr, ParseError> Parser::parse_start_tag() auto accept = accept_rule(); auto name = TRY(parse_name()); - HashMap attributes; + OrderedHashMap attributes; while (true) { if (auto result = skip_whitespace(Required::Yes); result.is_error()) diff --git a/Libraries/LibXML/Parser/Parser.h b/Libraries/LibXML/Parser/Parser.h index f0c786be979..76b04c5502e 100644 --- a/Libraries/LibXML/Parser/Parser.h +++ b/Libraries/LibXML/Parser/Parser.h @@ -37,7 +37,7 @@ struct Listener { virtual void set_doctype(XML::Doctype) { } virtual void document_start() { } virtual void document_end() { } - virtual void element_start(Name const&, HashMap const&) { } + virtual void element_start(Name const&, OrderedHashMap const&) { } virtual void element_end(Name const&) { } virtual void text(StringView) { } virtual void cdata_section(StringView) { } diff --git a/Tests/LibWeb/Text/expected/XML/attribute-order.txt b/Tests/LibWeb/Text/expected/XML/attribute-order.txt new file mode 100644 index 00000000000..94053253394 --- /dev/null +++ b/Tests/LibWeb/Text/expected/XML/attribute-order.txt @@ -0,0 +1,5 @@ +a +b +c +d +e diff --git a/Tests/LibWeb/Text/input/XML/attribute-order.html b/Tests/LibWeb/Text/input/XML/attribute-order.html new file mode 100644 index 00000000000..d01227f70f3 --- /dev/null +++ b/Tests/LibWeb/Text/input/XML/attribute-order.html @@ -0,0 +1,11 @@ + + +