diff --git a/src/html/document.zig b/src/html/document.zig index 341c1701..6e58d0e1 100644 --- a/src/html/document.zig +++ b/src/html/document.zig @@ -6,10 +6,13 @@ const jsruntime = @import("jsruntime"); const Case = jsruntime.test_utils.Case; const checkCases = jsruntime.test_utils.checkCases; +const Node = @import("../dom/node.zig").Node; const Document = @import("../dom/document.zig").Document; const NodeList = @import("../dom/nodelist.zig").NodeList; const HTMLElem = @import("elements.zig"); + const collection = @import("../dom/html_collection.zig"); +const Walker = collection.WalkerDepthFirst; // WEB IDL https://html.spec.whatwg.org/#the-document-object pub const HTMLDocument = struct { @@ -45,6 +48,18 @@ pub const HTMLDocument = struct { return try get_body(self); } + pub fn get_head(self: *parser.DocumentHTML) !?*parser.Head { + const root = try rootNode(self) orelse return null; + const walker = Walker{}; + var next: ?*parser.Node = null; + while (true) { + next = try walker.get_next(root, next) orelse return null; + if (std.ascii.eqlIgnoreCase("head", try parser.nodeName(next.?))) { + return @as(*parser.Head, @ptrCast(next.?)); + } + } + } + // TODO: not implemented by libdom pub fn get_cookie(_: *parser.DocumentHTML) ![]const u8 { return error.NotImplemented; @@ -137,7 +152,8 @@ pub fn testExecFn( .{ .src = "document.domain", .ex = "" }, .{ .src = "document.referrer", .ex = "" }, .{ .src = "document.title", .ex = "" }, - .{ .src = "document.body.tagName", .ex = "BODY" }, + .{ .src = "document.body.localName", .ex = "body" }, + .{ .src = "document.head.localName", .ex = "head" }, .{ .src = "document.images.length", .ex = "0" }, .{ .src = "document.embeds.length", .ex = "0" }, .{ .src = "document.plugins.length", .ex = "0" },