diff --git a/src/html/elements.zig b/src/html/elements.zig index 9e77e7bb..bc7cf5aa 100644 --- a/src/html/elements.zig +++ b/src/html/elements.zig @@ -154,7 +154,39 @@ pub const HTMLAnchorElement = struct { } pub fn set_href(self: *parser.Anchor, href: []const u8) !void { - return try parser.anchorSetTarget(self, href); + return try parser.anchorSetHref(self, href); + } + + pub fn get_hreflang(self: *parser.Anchor) ![]const u8 { + return try parser.anchorGetHrefLang(self); + } + + pub fn set_hreflang(self: *parser.Anchor, href: []const u8) !void { + return try parser.anchorSetHrefLang(self, href); + } + + pub fn get_type(self: *parser.Anchor) ![]const u8 { + return try parser.anchorGetType(self); + } + + pub fn set_type(self: *parser.Anchor, t: []const u8) !void { + return try parser.anchorSetType(self, t); + } + + pub fn get_rel(self: *parser.Anchor) ![]const u8 { + return try parser.anchorGetRel(self); + } + + pub fn set_rel(self: *parser.Anchor, t: []const u8) !void { + return try parser.anchorSetRel(self, t); + } + + pub fn get_text(self: *parser.Anchor) !?[]const u8 { + return try parser.nodeTextContent(parser.anchorToNode(self)); + } + + pub fn set_text(self: *parser.Anchor, v: []const u8) !void { + return try parser.nodeSetTextContent(parser.anchorToNode(self), v); } }; @@ -627,8 +659,23 @@ pub fn testExecFn( .{ .src = "let a = document.getElementById('link')", .ex = "undefined" }, .{ .src = "a.target", .ex = "" }, .{ .src = "a.target = '_blank'", .ex = "_blank" }, + .{ .src = "a.target", .ex = "_blank" }, + .{ .src = "a.target = ''", .ex = "" }, + .{ .src = "a.href", .ex = "foo" }, .{ .src = "a.href = 'https://lightpanda.io/'", .ex = "https://lightpanda.io/" }, + .{ .src = "a.href", .ex = "https://lightpanda.io/" }, + .{ .src = "a.href = 'foo'", .ex = "foo" }, + + .{ .src = "a.type", .ex = "" }, + .{ .src = "a.type = 'text/html'", .ex = "text/html" }, + .{ .src = "a.type", .ex = "text/html" }, + .{ .src = "a.type = ''", .ex = "" }, + + .{ .src = "a.text", .ex = "OK" }, + .{ .src = "a.text = 'foo'", .ex = "foo" }, + .{ .src = "a.text", .ex = "foo" }, + .{ .src = "a.text = 'OK'", .ex = "OK" }, }; try checkCases(js_env, &anchor); } diff --git a/src/netsurf.zig b/src/netsurf.zig index 0d49de0a..a3001839 100644 --- a/src/netsurf.zig +++ b/src/netsurf.zig @@ -1514,6 +1514,12 @@ pub fn elementHTMLGetTagType(elem_html: *ElementHTML) !Tag { } // HTMLAnchorElement + +// anchorToNode is an helper to convert an element to a node. +pub inline fn anchorToNode(a: *Anchor) *Node { + return @as(*Node, @ptrCast(a)); +} + pub fn anchorGetTarget(a: *Anchor) ![]const u8 { var res: ?*String = undefined; const err = c.dom_html_anchor_element_get_target(a, &res); @@ -1540,6 +1546,45 @@ pub fn anchorSetHref(a: *Anchor, href: []const u8) !void { try DOMErr(err); } +pub fn anchorGetHrefLang(a: *Anchor) ![]const u8 { + var res: ?*String = undefined; + const err = c.dom_html_anchor_element_get_hreflang(a, &res); + try DOMErr(err); + if (res == null) return ""; + return strToData(res.?); +} + +pub fn anchorSetHrefLang(a: *Anchor, href: []const u8) !void { + const err = c.dom_html_anchor_element_set_hreflang(a, try strFromData(href)); + try DOMErr(err); +} + +pub fn anchorGetType(a: *Anchor) ![]const u8 { + var res: ?*String = undefined; + const err = c.dom_html_anchor_element_get_type(a, &res); + try DOMErr(err); + if (res == null) return ""; + return strToData(res.?); +} + +pub fn anchorSetType(a: *Anchor, t: []const u8) !void { + const err = c.dom_html_anchor_element_set_type(a, try strFromData(t)); + try DOMErr(err); +} + +pub fn anchorGetRel(a: *Anchor) ![]const u8 { + var res: ?*String = undefined; + const err = c.dom_html_anchor_element_get_rel(a, &res); + try DOMErr(err); + if (res == null) return ""; + return strToData(res.?); +} + +pub fn anchorSetRel(a: *Anchor, rel: []const u8) !void { + const err = c.dom_html_anchor_element_set_rel(a, try strFromData(rel)); + try DOMErr(err); +} + // ElementsHTML pub const MediaElement = struct { base: *c.dom_html_element };