From 4f63f6f204cf3dd018e7a77f6429554c45b6111e Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Thu, 27 Aug 2026 08:32:53 +0800 Subject: [PATCH] fix: --with-base now uses proper attribute Improve dump's void element list --- src/browser/dump.zig | 39 +++++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/src/browser/dump.zig b/src/browser/dump.zig index 1a6bc1344..6879f00cc 100644 --- a/src/browser/dump.zig +++ b/src/browser/dump.zig @@ -75,7 +75,7 @@ pub fn root(doc: *Node.Document, opts: Opts, writer: *std.Io.Writer, frame: *Fra if (opts.with_base) { const parent = if (html_doc.getHead()) |head| head.asNode() else doc.asNode(); const base = try doc.createElement("base", null, frame); - try base.setAttributeSafe(comptime .wrap("base"), .wrap(frame.base()), frame); + try base.setAttributeSafe(comptime .wrap("href"), .wrap(frame.base()), frame); _ = try parent.insertBefore(base.asNode(), parent.firstChild(), frame); } } @@ -328,13 +328,17 @@ fn dumpSlotContent(slot: *Slot, opts: Opts, writer: *std.Io.Writer, frame: *Fram } } -fn isVoidElement(el: *const Node.Element) bool { - return switch (el._type) { - .html => switch (el.subtype(Node.Element.Html)._type) { - .br, .hr, .img, .input, .link, .meta => true, - else => false, +fn isVoidElement(el: *Node.Element) bool { + return switch (el.getTag()) { + .area, .base, .br, .col, .embed, .hr, .img, .input, .link, .meta, .param, .source, .track => true, + .unknown => { + const unknown = el.as(Node.Element.Html.Unknown); + if (unknown._tag_name.eql(comptime .wrap("wbr"))) { + return true; + } + return false; }, - .svg => false, + else => false, }; } @@ -474,10 +478,29 @@ test "dump: default dumps the whole document" { test "dump: with_base injects a element" { try expectDump(.{ .with_base = true }, \\ - \\

Title

visible & well

+ \\

Title

visible & well

); } +test "dump: void elements have no end tag" { + const frame = try testing.createFrame(); + defer testing.test_session.closeAllPages(); + + const doc = frame.window._document; + const div = try doc.createElement("div", null, frame); + try Frame.parse.htmlAsChildren(frame, div.asNode(), + \\

ab

+ ); + + var aw: std.Io.Writer.Allocating = .init(testing.allocator); + defer aw.deinit(); + try deep(div.asNode(), .{}, &aw.writer, frame); + + try testing.expectString( + \\

ab

+ , aw.written()); +} + test "dump: strip.js removes script and noscript" { try expectDump(.{ .strip = .{ .js = true } }, \\