render: preserve framework inline SVG markup

This commit is contained in:
SGavrl committed 2026-07-26 11:07:51 +00:00
1 parent 228a5723ce
commit 7618b3276a
1 file changed
+27
+27
View File
@@ -1391,6 +1391,15 @@ fn serialize_svg_node(tree: &DomTree, nid: obscura_dom::tree::NodeId, is_root: b
// `href`): resvg reads both, and a bare local avoids needing an
// `xmlns:xlink` declaration in the standalone document.
let aname = attr.name.local.as_ref();
// HTML frameworks commonly stamp hydration attributes such as
// `q:id` onto inline SVG. In an HTML document that name is fine,
// but our standalone XML serialization has no matching `xmlns:q`,
// so one irrelevant attribute makes usvg reject the entire logo.
// Namespace-aware attributes arrive with a clean local name;
// discard only literal, unbound colon names from the HTML parser.
if aname.contains(':') {
continue;
}
if aname == "xmlns" {
has_xmlns = true;
}
@@ -2005,6 +2014,24 @@ mod tests {
assert!(found_red, "expected inline svg <rect> to paint red");
}
#[test]
fn paints_inline_svg_with_framework_colon_attribute() {
let tree = obscura_dom::parse_html(
r##"<html><body><svg q:id="f" width="40" height="40" viewBox="0 0 40 40"><rect width="40" height="40" fill="#18b6f6"/></svg></body></html>"##,
);
let output = paint_dom(&tree, (80.0, 80.0), None).expect("pixmap");
let found_blue = (0..80).any(|y| {
(0..80).any(|x| {
let pixel = output.pixel(x, y).expect("pixel");
pixel.blue() > 200 && pixel.green() > 120 && pixel.red() < 80
})
});
assert!(
found_blue,
"framework hydration attributes must not invalidate inline SVG XML"
);
}
#[test]
fn paints_inline_svg_use_reference() {
// The icon-sprite pattern: <use href="#id"> resolves against a <defs>