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,