From b33bb54442a03061fc3b388c210ec16399da125e Mon Sep 17 00:00:00 2001 From: Trevin Chow Date: Fri, 3 Apr 2026 16:09:07 -0700 Subject: [PATCH] fix: propagate keyUp and char keyboard events to JS listeners dispatchKeyEvent only handled keyDown, returning early for keyUp, rawKeyDown, and char types. This meant JS keyup and keypress listeners never fired via CDP. Now keyUp dispatches as "keyup" and char dispatches as "keypress". rawKeyDown remains a no-op (Chrome-internal, not used for JS dispatch). Fixes #2080 Ref #2043 --- src/cdp/domains/input.zig | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/cdp/domains/input.zig b/src/cdp/domains/input.zig index a3e43d40..1767ba72 100644 --- a/src/cdp/domains/input.zig +++ b/src/cdp/domains/input.zig @@ -52,17 +52,19 @@ fn dispatchKeyEvent(cmd: *CDP.Command) !void { try cmd.sendResult(null, .{}); - // quickly ignore types we know we don't handle - switch (params.type) { - .keyUp, .rawKeyDown, .char => return, - .keyDown => {}, - } + // rawKeyDown is a Chrome-internal event type not used for JS dispatch + if (params.type == .rawKeyDown) return; const bc = cmd.browser_context orelse return; const page = bc.session.currentPage() orelse return; const KeyboardEvent = @import("../../browser/webapi/event/KeyboardEvent.zig"); - const keyboard_event = try KeyboardEvent.initTrusted(comptime .wrap("keydown"), .{ + const keyboard_event = try KeyboardEvent.initTrusted(switch (params.type) { + .keyDown => comptime .wrap("keydown"), + .keyUp => comptime .wrap("keyup"), + .char => comptime .wrap("keypress"), + .rawKeyDown => unreachable, + }, .{ .key = params.key, .code = params.code, .altKey = params.modifiers & 1 == 1,