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