From 25ad3559f7989fd63954ff1de26fe7a544087377 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Sun, 21 Dec 2025 17:13:36 +0800 Subject: [PATCH] Add Document.gettype --- src/browser/dump.zig | 6 +++--- src/browser/webapi/Document.zig | 6 ++++++ src/browser/webapi/HTMLDocument.zig | 16 ++++++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/browser/dump.zig b/src/browser/dump.zig index b1ca4b29..77a75c88 100644 --- a/src/browser/dump.zig +++ b/src/browser/dump.zig @@ -50,9 +50,9 @@ pub const Opts = struct { }; pub fn root(doc: *Node.Document, opts: RootOpts, writer: *std.Io.Writer, page: *Page) !void { - if (opts.with_base) { - if (doc.is(Node.Document.HTMLDocument)) |html_doc| { - try writer.writeAll(""); + if (doc.is(Node.Document.HTMLDocument)) |html_doc| { + try writer.writeAll(""); + if (opts.with_base) { const parent = if (html_doc.getHead()) |head| head.asNode() else doc.asNode(); const base = try doc.createElement("base", null, page); try base.setAttributeSafe("base", page.url, page); diff --git a/src/browser/webapi/Document.zig b/src/browser/webapi/Document.zig index 1c1969a4..bcd75b47 100644 --- a/src/browser/webapi/Document.zig +++ b/src/browser/webapi/Document.zig @@ -30,6 +30,7 @@ const Parser = @import("../parser/Parser.zig"); const collections = @import("collections.zig"); const Selector = @import("selector/Selector.zig"); const NodeFilter = @import("NodeFilter.zig"); +const DocumentType = @import("DocumentType.zig"); const DOMTreeWalker = @import("DOMTreeWalker.zig"); const DOMNodeIterator = @import("DOMNodeIterator.zig"); const DOMImplementation = @import("DOMImplementation.zig"); @@ -404,6 +405,10 @@ pub fn elementsFromPoint(self: *Document, x: f64, y: f64, page: *Page) ![]const return result.items; } +pub fn getDocType(_: *const Document) ?*DocumentType { + return null; +} + pub fn write(self: *Document, text: []const []const u8, page: *Page) !void { if (self._type == .xml) { return error.InvalidStateError; @@ -598,6 +603,7 @@ pub const JsApi = struct { pub const write = bridge.function(Document.write, .{ .dom_exception = true }); pub const open = bridge.function(Document.open, .{ .dom_exception = true }); pub const close = bridge.function(Document.close, .{ .dom_exception = true }); + pub const doctype = bridge.accessor(Document.getDocType, null, .{}); pub const defaultView = bridge.accessor(struct { fn defaultView(_: *const Document, page: *Page) *@import("Window.zig") { diff --git a/src/browser/webapi/HTMLDocument.zig b/src/browser/webapi/HTMLDocument.zig index 1d6dedc4..1d10d474 100644 --- a/src/browser/webapi/HTMLDocument.zig +++ b/src/browser/webapi/HTMLDocument.zig @@ -24,11 +24,13 @@ const Page = @import("../Page.zig"); const Node = @import("Node.zig"); const Document = @import("Document.zig"); const Element = @import("Element.zig"); +const DocumentType = @import("DocumentType.zig"); const collections = @import("collections.zig"); const HTMLDocument = @This(); _proto: *Document, +_document_type: ?*DocumentType = null, pub fn asDocument(self: *HTMLDocument) *Document { return self._proto; @@ -163,6 +165,19 @@ pub fn setCookie(_: *HTMLDocument, cookie_str: []const u8, page: *Page) ![]const return cookie_str; } +pub fn getDocType(self: *HTMLDocument, page: *Page) !*DocumentType { + if (self._document_type) |dt| { + return dt; + } + self._document_type = try page._factory.node(DocumentType{ + ._proto = undefined, + ._name = "html", + ._public_id = "", + ._system_id = "", + }); + return self._document_type.?; +} + pub const JsApi = struct { pub const bridge = js.Bridge(HTMLDocument); @@ -194,4 +209,5 @@ pub const JsApi = struct { pub const location = bridge.accessor(HTMLDocument.getLocation, null, .{ .cache = "location" }); pub const all = bridge.accessor(HTMLDocument.getAll, null, .{}); pub const cookie = bridge.accessor(HTMLDocument.getCookie, HTMLDocument.setCookie, .{}); + pub const doctype = bridge.accessor(HTMLDocument.getDocType, null, .{}); };