From 4f5a9f683327ae0450e48a5f8c1fa00a3358cdd2 Mon Sep 17 00:00:00 2001 From: Pierre Tachoire Date: Fri, 8 Dec 2023 12:11:11 +0100 Subject: [PATCH] dom: implement some element getters --- src/dom/element.zig | 23 ++++++++++++++++++++++- src/netsurf.zig | 21 ++++++++++++++++----- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/dom/element.zig b/src/dom/element.zig index e7380e3d..b6b4138a 100644 --- a/src/dom/element.zig +++ b/src/dom/element.zig @@ -25,8 +25,20 @@ pub const Element = struct { // JS funcs // -------- + pub fn get_namespaceURI(self: *parser.Element) !?[]const u8 { + return try parser.nodeGetNamespace(parser.elementToNode(self)); + } + + pub fn get_prefix(self: *parser.Element) !?[]const u8 { + return try parser.nodeGetPrefix(parser.elementToNode(self)); + } + pub fn get_localName(self: *parser.Element) ![]const u8 { - return try parser.elementLocalName(self); + return try parser.nodeLocalName(parser.elementToNode(self)); + } + + pub fn get_tagName(self: *parser.Element) ![]const u8 { + return try parser.nodeName(parser.elementToNode(self)); } pub fn get_attributes(self: *parser.Element) !*parser.NamedNodeMap { @@ -92,6 +104,15 @@ pub fn testExecFn( js_env: *jsruntime.Env, comptime _: []jsruntime.API, ) !void { + var getters = [_]Case{ + .{ .src = "let g = document.getElementById('content')", .ex = "undefined" }, + .{ .src = "g.namespaceURI", .ex = "http://www.w3.org/1999/xhtml" }, + .{ .src = "g.prefix", .ex = "null" }, + .{ .src = "g.localName", .ex = "div" }, + .{ .src = "g.tagName", .ex = "DIV" }, + }; + try checkCases(js_env, &getters); + var attribute = [_]Case{ .{ .src = "let a = document.getElementById('content')", .ex = "undefined" }, .{ .src = "a.hasAttributes()", .ex = "true" }, diff --git a/src/netsurf.zig b/src/netsurf.zig index d32b2cee..ec2c60f0 100644 --- a/src/netsurf.zig +++ b/src/netsurf.zig @@ -725,6 +725,22 @@ pub fn nodeGetAttributes(node: *Node) !*NamedNodeMap { return res.?; } +pub fn nodeGetNamespace(node: *Node) !?[]const u8 { + var s: ?*String = undefined; + const err = nodeVtable(node).dom_node_get_namespace.?(node, &s); + try DOMErr(err); + if (s == null) return null; + return strToData(s.?); +} + +pub fn nodeGetPrefix(node: *Node) !?[]const u8 { + var s: ?*String = undefined; + const err = nodeVtable(node).dom_node_get_prefix.?(node, &s); + try DOMErr(err); + if (s == null) return null; + return strToData(s.?); +} + // nodeToElement is an helper to convert a node to an element. pub inline fn nodeToElement(node: *Node) *Element { return @as(*Element, @ptrCast(node)); @@ -831,11 +847,6 @@ fn elementVtable(elem: *Element) c.dom_element_vtable { return getVtable(c.dom_element_vtable, Element, elem); } -pub fn elementLocalName(elem: *Element) ![]const u8 { - const node = @as(*Node, @ptrCast(elem)); - return try nodeLocalName(node); -} - pub fn elementGetAttribute(elem: *Element, name: []const u8) !?[]const u8 { var s: ?*String = undefined; const err = elementVtable(elem).dom_element_get_attribute.?(elem, try strFromData(name), &s);