dom: implement some element getters

This commit is contained in:
Pierre Tachoire
2023-12-08 12:11:11 +01:00
parent 1bc65583da
commit 4f5a9f6833
2 changed files with 38 additions and 6 deletions

View File

@@ -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" },

View File

@@ -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);