From e799fcd48a52311556c82ed792fae76945831d81 Mon Sep 17 00:00:00 2001 From: sjorsdonkers <72333389+sjorsdonkers@users.noreply.github.com> Date: Wed, 28 May 2025 12:29:47 +0200 Subject: [PATCH] xmlserializer for doctype --- src/browser/dump.zig | 28 ++++++++++++++++++++- src/browser/xmlserializer/xmlserializer.zig | 17 ++++++++++--- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/browser/dump.zig b/src/browser/dump.zig index 18923ed1..35eb4d42 100644 --- a/src/browser/dump.zig +++ b/src/browser/dump.zig @@ -28,6 +28,32 @@ pub fn writeHTML(doc: *parser.Document, writer: anytype) !void { try writer.writeAll("\n"); } +// Spec: https://www.w3.org/TR/xml/#sec-prolog-dtd +pub fn writeDocType(doc_type: *parser.DocumentType, writer: anytype) !void { + try writer.writeAll(""); +} + pub fn writeNode(node: *parser.Node, writer: anytype) anyerror!void { switch (try parser.nodeType(node)) { .element => { @@ -88,7 +114,7 @@ pub fn writeNode(node: *parser.Node, writer: anytype) anyerror!void { .document_fragment => return, // document will never be called, but required for completeness. .document => return, - // done globally instead, but required for completeness. + // done globally instead, but required for completeness. Only the outer DOCTYPE should be written .document_type => return, // deprecated .attribute => return, diff --git a/src/browser/xmlserializer/xmlserializer.zig b/src/browser/xmlserializer/xmlserializer.zig index 17c362f8..5b11bcb0 100644 --- a/src/browser/xmlserializer/xmlserializer.zig +++ b/src/browser/xmlserializer/xmlserializer.zig @@ -35,10 +35,10 @@ pub const XMLSerializer = struct { pub fn _serializeToString(_: *const XMLSerializer, root: *parser.Node, page: *Page) ![]const u8 { var buf = std.ArrayList(u8).init(page.arena); - if (try parser.nodeType(root) == .document) { - try dump.writeHTML(@as(*parser.Document, @ptrCast(root)), buf.writer()); - } else { - try dump.writeNode(root, buf.writer()); + switch (try parser.nodeType(root)) { + .document => try dump.writeHTML(@as(*parser.Document, @ptrCast(root)), buf.writer()), + .document_type => try dump.writeDocType(@as(*parser.DocumentType, @ptrCast(root)), buf.writer()), + else => try dump.writeNode(root, buf.writer()), } return buf.items; } @@ -54,3 +54,12 @@ test "Browser.XMLSerializer" { .{ "s.serializeToString(document.getElementById('para'))", "
And
" }, }, .{}); } +test "Browser.XMLSerializer with DOCTYPE" { + var runner = try testing.jsRunner(testing.tracking_allocator, .{ .html = "" }); + defer runner.deinit(); + + try runner.testCases(&.{ + .{ "new XMLSerializer().serializeToString(document.doctype)", "" }, + }, .{}); +} +test \ No newline at end of file