From a9e60518670eab3b5e7d4ee79b83015753cfb8a6 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Wed, 24 Dec 2025 16:15:10 +0800 Subject: [PATCH] HTMLElement.click() --- src/browser/tests/element/element.html | 13 ++++++++++++ src/browser/webapi/element/Html.zig | 29 +++++++++++++++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/browser/tests/element/element.html b/src/browser/tests/element/element.html index 84044ecd..92620a48 100644 --- a/src/browser/tests/element/element.html +++ b/src/browser/tests/element/element.html @@ -166,3 +166,16 @@ testing.expectEqual(1, parent.childNodes.length); } + + diff --git a/src/browser/webapi/element/Html.zig b/src/browser/webapi/element/Html.zig index e84dd0f5..75e691b5 100644 --- a/src/browser/webapi/element/Html.zig +++ b/src/browser/webapi/element/Html.zig @@ -172,6 +172,14 @@ pub fn asElement(self: *HtmlElement) *Element { return self._proto; } +pub fn asNode(self: *HtmlElement) *Node { + return self._proto._proto; +} + +pub fn asEventTarget(self: *HtmlElement) *@import("../EventTarget.zig") { + return self._proto._proto._proto; +} + // innerText represents the **rendered** text content of a node and its // descendants. pub fn getInnerText(self: *HtmlElement, writer: *std.Io.Writer) !void { @@ -286,6 +294,25 @@ pub fn insertAdjacentHTML( } } +pub fn click(self: *HtmlElement, page: *Page) !void { + switch (self._type) { + inline .button, .input, .textarea, .select => |i| { + if (i.getDisabled()) { + return; + } + }, + else => {}, + } + + const event = try @import("../event/MouseEvent.zig").init("click", .{ + .bubbles = true, + .cancelable = true, + .clientX = 0, + .clientY = 0, + }, page); + try page._event_manager.dispatch(self.asEventTarget(), event.asEvent()); +} + pub const JsApi = struct { pub const bridge = js.Bridge(HtmlElement); @@ -303,8 +330,8 @@ pub const JsApi = struct { try self.getInnerText(&buf.writer); return buf.written(); } - pub const insertAdjacentHTML = bridge.function(HtmlElement.insertAdjacentHTML, .{ .dom_exception = true }); + pub const click = bridge.function(HtmlElement.click, .{}); }; pub const Build = struct {