diff --git a/src/browser/actions.zig b/src/browser/actions.zig index d55721b9..9341572e 100644 --- a/src/browser/actions.zig +++ b/src/browser/actions.zig @@ -132,16 +132,7 @@ pub fn setChecked(node: *DOMNode, checked: bool, page: *Page) !void { return error.ActionFailed; }; - const input_evt: *Event = try .initTrusted(comptime .wrap("input"), .{ .bubbles = true }, page); - page._event_manager.dispatch(el.asEventTarget(), input_evt) catch |err| { - lp.log.err(.app, "dispatch input event failed", .{ .err = err }); - }; - - const change_evt: *Event = try .initTrusted(comptime .wrap("change"), .{ .bubbles = true }, page); - page._event_manager.dispatch(el.asEventTarget(), change_evt) catch |err| { - lp.log.err(.app, "dispatch change event failed", .{ .err = err }); - }; - + // Match browser event order: click fires first, then input and change. const click_event: *MouseEvent = try .initTrusted(comptime .wrap("click"), .{ .bubbles = true, .cancelable = true, @@ -151,6 +142,16 @@ pub fn setChecked(node: *DOMNode, checked: bool, page: *Page) !void { page._event_manager.dispatch(el.asEventTarget(), click_event.asEvent()) catch |err| { lp.log.err(.app, "dispatch click event failed", .{ .err = err }); }; + + const input_evt: *Event = try .initTrusted(comptime .wrap("input"), .{ .bubbles = true }, page); + page._event_manager.dispatch(el.asEventTarget(), input_evt) catch |err| { + lp.log.err(.app, "dispatch input event failed", .{ .err = err }); + }; + + const change_evt: *Event = try .initTrusted(comptime .wrap("change"), .{ .bubbles = true }, page); + page._event_manager.dispatch(el.asEventTarget(), change_evt) catch |err| { + lp.log.err(.app, "dispatch change event failed", .{ .err = err }); + }; } pub fn fill(node: *DOMNode, text: []const u8, page: *Page) !void { diff --git a/src/browser/tests/mcp_actions.html b/src/browser/tests/mcp_actions.html index 88cb70b1..f27c63ef 100644 --- a/src/browser/tests/mcp_actions.html +++ b/src/browser/tests/mcp_actions.html @@ -10,5 +10,20 @@