diff --git a/rust/common/tests/mod.rs b/rust/common/tests/mod.rs index 7e721b5..c27737f 100644 --- a/rust/common/tests/mod.rs +++ b/rust/common/tests/mod.rs @@ -517,3 +517,15 @@ fn test_style_element_minification() { b"", ); } + +#[test] +fn test_self_closing_svg() { + eval( + b"", + b"", + ); + eval( + b"", + b"", + ); +} diff --git a/rust/main/src/parse/element.rs b/rust/main/src/parse/element.rs index 1bea497..84e3e13 100644 --- a/rust/main/src/parse/element.rs +++ b/rust/main/src/parse/element.rs @@ -132,6 +132,13 @@ pub fn parse_element(code: &mut Code, ns: Namespace, parent: &[u8]) -> NodeData self_closing, } = parse_tag(code); + // Embedded svg tags are immediately in the svg namespace and must be parsed as such. + let ns = if elem_name == b"svg" { + Namespace::Svg + } else { + ns + }; + // Only foreign elements can be self closed. if self_closing && ns != Namespace::Html { return NodeData::Element { @@ -154,14 +161,6 @@ pub fn parse_element(code: &mut Code, ns: Namespace, parent: &[u8]) -> NodeData }; }; - // TODO Is "svg" itself in the SVG namespace? Does it matter? - // If it is and does, we need to update `namespace:` property of this function's return values. - let child_ns = if elem_name == b"svg" { - Namespace::Svg - } else { - ns - }; - let ParsedContent { closing_tag_omitted, children, @@ -175,7 +174,7 @@ pub fn parse_element(code: &mut Code, ns: Namespace, parent: &[u8]) -> NodeData b"style" => parse_style_content(code), b"textarea" => parse_textarea_content(code), b"title" => parse_title_content(code), - _ => parse_content(code, child_ns, parent, &elem_name), + _ => parse_content(code, ns, parent, &elem_name), }; if !closing_tag_omitted {