diff --git a/src/browser/dump.zig b/src/browser/dump.zig index f69ba095..0fbc7e44 100644 --- a/src/browser/dump.zig +++ b/src/browser/dump.zig @@ -62,7 +62,7 @@ pub fn writeNode(node: *parser.Node, opts: Opts, writer: anytype) anyerror!void switch (try parser.nodeType(node)) { .element => { // open the tag - const tag_type = try parser.elementHTMLGetTagType(@ptrCast(node)); + const tag_type = try parser.nodeHTMLGetTagType(node) orelse .undef; if (tag_type == .script and opts.exclude_scripts) { return; } @@ -150,7 +150,7 @@ pub fn writeChildren(root: *parser.Node, opts: Opts, writer: anytype) !void { // area, base, br, col, embed, hr, img, input, link, meta, source, track, wbr // https://html.spec.whatwg.org/#void-elements fn isVoid(elem: *parser.Element) !bool { - const tag = try parser.elementHTMLGetTagType(@as(*parser.ElementHTML, @ptrCast(elem))); + const tag = try parser.elementTag(elem); return switch (tag) { .area, .base, .br, .col, .embed, .hr, .img, .input, .link => true, .meta, .source, .track, .wbr => true, diff --git a/src/browser/netsurf.zig b/src/browser/netsurf.zig index ffdcfe3c..3891eed1 100644 --- a/src/browser/netsurf.zig +++ b/src/browser/netsurf.zig @@ -340,7 +340,7 @@ pub const Tag = enum(u8) { } const testing = @import("../testing.zig"); - test "Tag.elementTag" { + test "Tag.fromString" { try testing.expect(try Tag.fromString("ABBR") == .abbr); try testing.expect(try Tag.fromString("abbr") == .abbr); @@ -1428,13 +1428,13 @@ pub inline fn nodeToDocument(node: *Node) *Document { return @as(*Document, @ptrCast(node)); } -// Combination of nodeToElement + elementHTMLGetTagType +// Combination of nodeToElement + elementTag pub fn nodeHTMLGetTagType(node: *Node) !?Tag { if (try nodeType(node) != .element) { return null; } - const html_element: *ElementHTML = @ptrCast(node); - return try elementHTMLGetTagType(html_element); + + return try elementTag(@ptrCast(node)); } // CharacterData @@ -1595,6 +1595,11 @@ fn elementVtable(elem: *Element) c.dom_element_vtable { return getVtable(c.dom_element_vtable, Element, elem); } +pub fn elementTag(elem: *Element) !Tag { + const tagname = try elementGetTagName(elem) orelse return .undef; + return Tag.fromString(tagname) catch .undef; +} + pub fn elementGetTagName(elem: *Element) !?[]const u8 { var s: ?*String = undefined; const err = elementVtable(elem).dom_element_get_tag_name.?(elem, &s); @@ -1797,21 +1802,6 @@ fn elementHTMLVtable(elem_html: *ElementHTML) c.dom_html_element_vtable { return getVtable(c.dom_html_element_vtable, ElementHTML, elem_html); } -pub fn elementHTMLGetTagType(elem_html: *ElementHTML) !Tag { - var tag_type: c.dom_html_element_type = undefined; - const err = elementHTMLVtable(elem_html).dom_html_element_get_tag_type.?(elem_html, &tag_type); - try DOMErr(err); - - if (tag_type >= 255) { - // This is questionable, but std.meta.intToEnum has more overhead - // Added this because this WPT test started to fail once we - // introduced an SVGElement: - // html/dom/documents/dom-tree-accessors/document.title-09.html - return Tag.undef; - } - return @as(Tag, @enumFromInt(tag_type)); -} - // HTMLScriptElement // scriptToElt is an helper to convert an script to an element. diff --git a/src/browser/page.zig b/src/browser/page.zig index aece1cbe..eff09152 100644 --- a/src/browser/page.zig +++ b/src/browser/page.zig @@ -365,7 +365,7 @@ pub const Page = struct { const current = next.?; const e = parser.nodeToElement(current); - const tag = try parser.elementHTMLGetTagType(@as(*parser.ElementHTML, @ptrCast(e))); + const tag = try parser.elementTag(e); if (tag != .script) { // ignore non-js script. @@ -809,7 +809,7 @@ pub const Page = struct { if (try parser.elementGetAttribute(element, "form")) |form_id| { const document = parser.documentHTMLToDocument(self.window.document); const form_element = try parser.documentGetElementById(document, form_id) orelse return null; - if (try parser.elementHTMLGetTagType(@ptrCast(form_element)) == .form) { + if (try parser.elementTag(@ptrCast(form_element)) == .form) { return @ptrCast(form_element); } return null; diff --git a/src/browser/xhr/form_data.zig b/src/browser/xhr/form_data.zig index 48e03ad3..6dc1a69f 100644 --- a/src/browser/xhr/form_data.zig +++ b/src/browser/xhr/form_data.zig @@ -141,7 +141,7 @@ fn collectForm(form: *parser.Form, submitter_: ?*parser.ElementHTML, page: *Page continue; } - const tag = try parser.elementHTMLGetTagType(@as(*parser.ElementHTML, @ptrCast(element))); + const tag = try parser.elementTag(element); switch (tag) { .input => { const tpe = try parser.inputGetType(@ptrCast(element)); @@ -246,7 +246,7 @@ fn collectSelectValues(arena: Allocator, select: *parser.Select, name: []const u fn getSubmitterName(submitter_: ?*parser.ElementHTML) !?[]const u8 { const submitter = submitter_ orelse return null; - const tag = try parser.elementHTMLGetTagType(submitter); + const tag = try parser.elementTag(@ptrCast(submitter)); const element: *parser.Element = @ptrCast(submitter); const name = try parser.elementGetAttribute(element, "name");