From 8fbf72b5bfb9f110ba1495cce2f569fc830f5656 Mon Sep 17 00:00:00 2001 From: Shannon Booth Date: Sat, 4 Nov 2023 11:26:44 +1300 Subject: [PATCH] LibWeb: Port HTMLToken prefix and namespace to Optional Previously these were DeprecatedStrings that contained a null state. After the null state was removed, the nullability of these members was broken. This doesn't seem to cause any problems currently as the HTML parser is not inserting attributes with their full qualified name, but after we fix that problem, this bug surfaces. --- .../LibWeb/HTML/Parser/HTMLParser.cpp | 23 ++++++++++--------- .../Libraries/LibWeb/HTML/Parser/HTMLParser.h | 2 +- .../Libraries/LibWeb/HTML/Parser/HTMLToken.h | 6 ++--- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/Userland/Libraries/LibWeb/HTML/Parser/HTMLParser.cpp b/Userland/Libraries/LibWeb/HTML/Parser/HTMLParser.cpp index 65051540d5..7133108547 100644 --- a/Userland/Libraries/LibWeb/HTML/Parser/HTMLParser.cpp +++ b/Userland/Libraries/LibWeb/HTML/Parser/HTMLParser.cpp @@ -2298,21 +2298,22 @@ void HTMLParser::adjust_svg_attributes(HTMLToken& token) token.adjust_attribute_name("zoomandpan"_fly_string, "zoomAndPan"_fly_string); } +// https://html.spec.whatwg.org/multipage/parsing.html#adjust-foreign-attributes void HTMLParser::adjust_foreign_attributes(HTMLToken& token) { - token.adjust_foreign_attribute("xlink:actuate"_fly_string, "xlink", "actuate"_fly_string, Namespace::XLink); - token.adjust_foreign_attribute("xlink:arcrole"_fly_string, "xlink", "arcrole"_fly_string, Namespace::XLink); - token.adjust_foreign_attribute("xlink:href"_fly_string, "xlink", "href"_fly_string, Namespace::XLink); - token.adjust_foreign_attribute("xlink:role"_fly_string, "xlink", "role"_fly_string, Namespace::XLink); - token.adjust_foreign_attribute("xlink:show"_fly_string, "xlink", "show"_fly_string, Namespace::XLink); - token.adjust_foreign_attribute("xlink:title"_fly_string, "xlink", "title"_fly_string, Namespace::XLink); - token.adjust_foreign_attribute("xlink:type"_fly_string, "xlink", "type"_fly_string, Namespace::XLink); + token.adjust_foreign_attribute("xlink:actuate"_fly_string, "xlink"_fly_string, "actuate"_fly_string, Namespace::XLink); + token.adjust_foreign_attribute("xlink:arcrole"_fly_string, "xlink"_fly_string, "arcrole"_fly_string, Namespace::XLink); + token.adjust_foreign_attribute("xlink:href"_fly_string, "xlink"_fly_string, "href"_fly_string, Namespace::XLink); + token.adjust_foreign_attribute("xlink:role"_fly_string, "xlink"_fly_string, "role"_fly_string, Namespace::XLink); + token.adjust_foreign_attribute("xlink:show"_fly_string, "xlink"_fly_string, "show"_fly_string, Namespace::XLink); + token.adjust_foreign_attribute("xlink:title"_fly_string, "xlink"_fly_string, "title"_fly_string, Namespace::XLink); + token.adjust_foreign_attribute("xlink:type"_fly_string, "xlink"_fly_string, "type"_fly_string, Namespace::XLink); - token.adjust_foreign_attribute("xml:lang"_fly_string, "xml", "lang"_fly_string, Namespace::XML); - token.adjust_foreign_attribute("xml:space"_fly_string, "xml", "space"_fly_string, Namespace::XML); + token.adjust_foreign_attribute("xml:lang"_fly_string, "xml"_fly_string, "lang"_fly_string, Namespace::XML); + token.adjust_foreign_attribute("xml:space"_fly_string, "xml"_fly_string, "space"_fly_string, Namespace::XML); - token.adjust_foreign_attribute("xmlns"_fly_string, "", "xmlns"_fly_string, Namespace::XMLNS); - token.adjust_foreign_attribute("xmlns:xlink"_fly_string, "xmlns", "xlink"_fly_string, Namespace::XMLNS); + token.adjust_foreign_attribute("xmlns"_fly_string, {}, "xmlns"_fly_string, Namespace::XMLNS); + token.adjust_foreign_attribute("xmlns:xlink"_fly_string, "xmlns"_fly_string, "xlink"_fly_string, Namespace::XMLNS); } void HTMLParser::increment_script_nesting_level() diff --git a/Userland/Libraries/LibWeb/HTML/Parser/HTMLParser.h b/Userland/Libraries/LibWeb/HTML/Parser/HTMLParser.h index 4f691c9dd8..b0229a9e30 100644 --- a/Userland/Libraries/LibWeb/HTML/Parser/HTMLParser.h +++ b/Userland/Libraries/LibWeb/HTML/Parser/HTMLParser.h @@ -150,7 +150,7 @@ private: void adjust_mathml_attributes(HTMLToken&); void adjust_svg_tag_names(HTMLToken&); void adjust_svg_attributes(HTMLToken&); - void adjust_foreign_attributes(HTMLToken&); + static void adjust_foreign_attributes(HTMLToken&); enum AdoptionAgencyAlgorithmOutcome { DoNothing, diff --git a/Userland/Libraries/LibWeb/HTML/Parser/HTMLToken.h b/Userland/Libraries/LibWeb/HTML/Parser/HTMLToken.h index 9a9d3f1749..33739f7dcc 100644 --- a/Userland/Libraries/LibWeb/HTML/Parser/HTMLToken.h +++ b/Userland/Libraries/LibWeb/HTML/Parser/HTMLToken.h @@ -42,9 +42,9 @@ public: }; struct Attribute { - DeprecatedString prefix; + Optional prefix; FlyString local_name; - FlyString namespace_; + Optional namespace_; String value; Position name_start_position; Position value_start_position; @@ -290,7 +290,7 @@ public: }); } - void adjust_foreign_attribute(FlyString const& old_name, DeprecatedFlyString const& prefix, FlyString const& local_name, FlyString const& namespace_) + void adjust_foreign_attribute(FlyString const& old_name, Optional const& prefix, FlyString const& local_name, Optional const& namespace_) { VERIFY(is_start_tag() || is_end_tag()); for_each_attribute([&](Attribute& attribute) {