fix svgElement + allow base tags

This commit is contained in:
Muki Kiboigo
2025-11-27 13:10:35 -08:00
parent 8ce8c7a0f3
commit 34c10e1e48
2 changed files with 22 additions and 18 deletions

View File

@@ -241,18 +241,23 @@ pub fn htmlElement(self: *Factory, child: anytype) !*@TypeOf(child) {
pub fn svgElement(self: *Factory, tag_name: []const u8, child: anytype) !*@TypeOf(child) { pub fn svgElement(self: *Factory, tag_name: []const u8, child: anytype) !*@TypeOf(child) {
const allocator = self._slab.allocator(); const allocator = self._slab.allocator();
const ChildT = @TypeOf(child);
// will never allocate, can't fail if (ChildT == Element.Svg) {
const tag_name_str = String.init(self._page.arena, tag_name, .{}) catch unreachable; return self.element(child);
}
const chain = try PrototypeChain( const chain = try PrototypeChain(
&.{ EventTarget, Node, Element, Element.Svg, @TypeOf(child) }, &.{ EventTarget, Node, Element, Element.Svg, ChildT },
).allocate(allocator); ).allocate(allocator);
chain.setRoot(EventTarget.Type); chain.setRoot(EventTarget.Type);
chain.setMiddle(1, Node.Type); chain.setMiddle(1, Node.Type);
chain.setMiddle(2, Element.Type); chain.setMiddle(2, Element.Type);
// will never allocate, can't fail
const tag_name_str = String.init(self._page.arena, tag_name, .{}) catch unreachable;
// Manually set Element.Svg with the tag_name // Manually set Element.Svg with the tag_name
chain.set(3, .{ chain.set(3, .{
._proto = chain.get(2), ._proto = chain.get(2),

View File

@@ -1177,22 +1177,21 @@ pub fn createElement(self: *Page, ns_: ?[]const u8, name: []const u8, attribute_
else => {}, else => {},
} }
// TODO: uncomment if (namespace == .svg) {
// if (namespace == .svg) { const tag_name = try String.init(self.arena, name, .{});
// const tag_name = try String.init(self.arena, name, .{}); if (std.ascii.eqlIgnoreCase(name, "svg")) {
// if (std.ascii.eqlIgnoreCase(name, "svg")) { return self.createSvgElementT(Element.Svg, name, attribute_iterator, .{
// return self.createSvgElementT(Element.Svg, name, attribute_iterator, .{ ._proto = undefined,
// ._proto = undefined, ._type = .svg,
// ._type = .svg, ._tag_name = tag_name,
// ._tag_name = tag_name, });
// }); }
// }
// // Other SVG elements (rect, circle, text, g, etc.) // Other SVG elements (rect, circle, text, g, etc.)
// const lower = std.ascii.lowerString(&self.buf, name); const lower = std.ascii.lowerString(&self.buf, name);
// const tag = std.meta.stringToEnum(Element.Tag, lower) orelse .unknown; const tag = std.meta.stringToEnum(Element.Tag, lower) orelse .unknown;
// return self.createSvgElementT(Element.Svg.Generic, name, attribute_iterator, .{ ._proto = undefined, ._tag = tag }); return self.createSvgElementT(Element.Svg.Generic, name, attribute_iterator, .{ ._proto = undefined, ._tag = tag });
// } }
const tag_name = try String.init(self.arena, name, .{}); const tag_name = try String.init(self.arena, name, .{});