From 7f732c94daf88d172664af1e0e2e79640cbf0bc6 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Wed, 9 Jul 2025 13:27:25 +0800 Subject: [PATCH] add HTMLElementLink get/set href --- src/browser/html/elements.zig | 15 +++++++++++++++ src/browser/netsurf.zig | 15 +++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/browser/html/elements.zig b/src/browser/html/elements.zig index 7cd5c4dc..3bc64ddc 100644 --- a/src/browser/html/elements.zig +++ b/src/browser/html/elements.zig @@ -895,6 +895,15 @@ pub const HTMLLinkElement = struct { pub fn constructor(page: *Page, js_this: Env.JsThis) !*parser.Element { return constructHtmlElement(page, js_this); } + + pub fn get_href(self: *parser.Link) ![]const u8 { + return try parser.linkGetHref(self); + } + + pub fn set_href(self: *parser.Link, href: []const u8, page: *const Page) !void { + const full = try urlStitch(page.call_arena, href, page.url.raw, .{}); + return try parser.linkSetHref(self, full); + } }; pub const HTMLMapElement = struct { @@ -1581,6 +1590,12 @@ test "Browser.HTML.Element" { .{ "document.createElement('a').focus()", null }, .{ "document.activeElement === focused", "true" }, }, .{}); + + try runner.testCases(&.{ + .{ "let l2 = document.createElement('link');", null }, + .{ "l2.href = 'https://lightpanda.io/'", null }, + .{ "l2.href", "https://lightpanda.io/" }, + }, .{}); } test "Browser.HTML.Element.DataSet" { diff --git a/src/browser/netsurf.zig b/src/browser/netsurf.zig index 3be9481a..ec1747c9 100644 --- a/src/browser/netsurf.zig +++ b/src/browser/netsurf.zig @@ -1830,6 +1830,21 @@ pub fn anchorSetRel(a: *Anchor, rel: []const u8) !void { try DOMErr(err); } +// HTMLLinkElement + +pub fn linkGetHref(link: *Link) ![]const u8 { + var res: ?*String = undefined; + const err = c.dom_html_link_element_get_href(link, &res); + try DOMErr(err); + if (res == null) return ""; + return strToData(res.?); +} + +pub fn linkSetHref(link: *Link, href: []const u8) !void { + const err = c.dom_html_link_element_set_href(link, try strFromData(href)); + try DOMErr(err); +} + // ElementsHTML pub const MediaElement = struct { base: *c.dom_html_element };