diff --git a/src/browser/tests/element/html/input_click.html b/src/browser/tests/element/html/input_click.html
index de0efff90..6814fbc3c 100644
--- a/src/browser/tests/element/html/input_click.html
+++ b/src/browser/tests/element/html/input_click.html
@@ -281,3 +281,30 @@
testing.expectEqual(false, r3.checked);
}
+
+
diff --git a/src/browser/webapi/Element.zig b/src/browser/webapi/Element.zig
index 36ce60df2..6bb7ee479 100644
--- a/src/browser/webapi/Element.zig
+++ b/src/browser/webapi/Element.zig
@@ -139,7 +139,14 @@ pub const Namespace = enum(u8) {
pub const Flags = packed struct(u8) {
shadow_host: bool = false,
customized_builtin: bool = false,
- _unused: u6 = 0,
+
+ // Prevents nested clicks (which have a specific spec-compliant behavior
+ // compared to other events). If this bit can be more useful for something
+ // else, a stack in EventManager (for click-specifically) is an alterantive
+ // approach
+ click_in_progress: bool = false,
+
+ _unused: u5 = 0,
};
_type: Type,
diff --git a/src/browser/webapi/element/Html.zig b/src/browser/webapi/element/Html.zig
index 8940a21a7..0b4333085 100644
--- a/src/browser/webapi/element/Html.zig
+++ b/src/browser/webapi/element/Html.zig
@@ -402,6 +402,13 @@ pub fn click(self: *HtmlElement, frame: *Frame) !void {
else => {},
}
+ const flags = &self.asElement()._flags;
+ if (flags.click_in_progress) {
+ return;
+ }
+ flags.click_in_progress = true;
+ defer flags.click_in_progress = false;
+
const event = (try @import("../event/MouseEvent.zig").init("click", .{
.bubbles = true,
.cancelable = true,