LibWeb/XML: Make namespace getter reject invalid qualified names

Names like ":hi", "wow:", or "a🅱️c" are invalid, so early-out instead
of searching our namespace stack for matching prefixes.

And also rename the function because it's relevant to attributes too.
This commit is contained in:
Sam Atkins 2025-04-11 15:36:53 +01:00
parent 8257788a20
commit 6828169c06
2 changed files with 12 additions and 5 deletions

View file

@ -116,7 +116,7 @@ void XMLDocumentBuilder::element_start(const XML::Name& name, HashMap<XML::Name,
m_namespace_stack.last().depth += 1;
}
auto namespace_ = namespace_for_element(name);
auto namespace_ = namespace_for_name(name);
auto qualified_name_or_error = DOM::validate_and_extract(m_document->realm(), namespace_, FlyString(MUST(String::from_byte_string(name))));
@ -358,10 +358,17 @@ void XMLDocumentBuilder::document_end()
m_document->set_ready_for_post_load_tasks(true);
}
Optional<FlyString> XMLDocumentBuilder::namespace_for_element(XML::Name const& element_name)
Optional<FlyString> XMLDocumentBuilder::namespace_for_name(XML::Name const& name)
{
Optional<ByteString> prefix;
if (auto parts = element_name.split_limit(':', 2); parts.size() == 2) {
Optional<StringView> prefix;
auto parts = name.split_limit(':', 3);
if (parts.size() > 2)
return {};
if (parts.size() == 2) {
if (parts[0].is_empty() || parts[1].is_empty())
return {};
prefix = parts[0];
}

View file

@ -38,7 +38,7 @@ private:
virtual void comment(StringView data) override;
virtual void document_end() override;
Optional<FlyString> namespace_for_element(XML::Name const& element_name);
Optional<FlyString> namespace_for_name(XML::Name const&);
GC::Ref<DOM::Document> m_document;
GC::Ptr<DOM::Node> m_current_node;