From 27a85c1241616e2fe773178513a9a004d3aa518c Mon Sep 17 00:00:00 2001 From: Pierre Tachoire Date: Mon, 24 Nov 2025 08:59:10 +0100 Subject: [PATCH 1/6] add .input scope to logs And Add debug messages for click and key down events callback on page. --- src/browser/page.zig | 7 +++++-- src/log.zig | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/browser/page.zig b/src/browser/page.zig index b7c5345c2..d750d21f2 100644 --- a/src/browser/page.zig +++ b/src/browser/page.zig @@ -920,7 +920,7 @@ pub const Page = struct { fn windowClicked(node: *parser.EventNode, event: *parser.Event) void { const self: *Page = @fieldParentPtr("window_clicked_event_node", node); self._windowClicked(event) catch |err| { - log.err(.browser, "click handler error", .{ .err = err }); + log.err(.input, "click handler error", .{ .err = err }); }; } @@ -928,6 +928,7 @@ pub const Page = struct { const target = parser.eventTarget(event) orelse return; const node = parser.eventTargetToNode(target); const tag = (try parser.nodeHTMLGetTagType(node)) orelse return; + log.debug(.input, "window click event", .{ .tag = tag }); switch (tag) { .a => { const element: *parser.Element = @ptrCast(node); @@ -997,7 +998,7 @@ pub const Page = struct { fn keydownCallback(node: *parser.EventNode, event: *parser.Event) void { const self: *Page = @fieldParentPtr("keydown_event_node", node); self._keydownCallback(event) catch |err| { - log.err(.browser, "keydown handler error", .{ .err = err }); + log.err(.input, "keydown handler error", .{ .err = err }); }; } @@ -1006,6 +1007,8 @@ pub const Page = struct { const node = parser.eventTargetToNode(target); const tag = (try parser.nodeHTMLGetTagType(node)) orelse return; + log.debug(.input, "key down event", .{ .tag = tag }); + const kbe: *parser.KeyboardEvent = @ptrCast(event); var new_key = try parser.keyboardEventGetKey(kbe); if (std.mem.eql(u8, new_key, "Dead")) { diff --git a/src/log.zig b/src/log.zig index 2c799fb6d..b8a78fac7 100644 --- a/src/log.zig +++ b/src/log.zig @@ -40,6 +40,7 @@ pub const Scope = enum { fetch, polyfill, interceptor, + input, }; const Opts = struct { From 633aee9439c1f5e58303611065a0b126733857a7 Mon Sep 17 00:00:00 2001 From: Pierre Tachoire Date: Mon, 24 Nov 2025 09:03:23 +0100 Subject: [PATCH 2/6] change the focus on click event --- src/browser/page.zig | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/browser/page.zig b/src/browser/page.zig index d750d21f2..e2db05068 100644 --- a/src/browser/page.zig +++ b/src/browser/page.zig @@ -934,6 +934,7 @@ pub const Page = struct { const element: *parser.Element = @ptrCast(node); const href = (try parser.elementGetAttribute(element, "href")) orelse return; try self.navigateFromWebAPI(href, .{}, .{ .push = null }); + return; }, .input => { const element: *parser.Element = @ptrCast(node); @@ -956,6 +957,12 @@ pub const Page = struct { }, else => {}, } + + // Set the focus on the clicked element. + // Thanks to parser.nodeHTMLGetTagType, we know nod is an element. + // We assume we have a ElementHTML. + const Document = @import("dom/document.zig").Document; + try Document.setFocus(@ptrCast(self.window.document), @as(*parser.ElementHTML, @ptrCast(node)), self); } pub const KeyboardEvent = struct { From 7887ca6a45686d112ba4e0816b392abe4a10206c Mon Sep 17 00:00:00 2001 From: Pierre Tachoire Date: Mon, 24 Nov 2025 09:13:19 +0100 Subject: [PATCH 3/6] improve input log --- src/browser/page.zig | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/browser/page.zig b/src/browser/page.zig index e2db05068..f99dca7ad 100644 --- a/src/browser/page.zig +++ b/src/browser/page.zig @@ -928,11 +928,11 @@ pub const Page = struct { const target = parser.eventTarget(event) orelse return; const node = parser.eventTargetToNode(target); const tag = (try parser.nodeHTMLGetTagType(node)) orelse return; - log.debug(.input, "window click event", .{ .tag = tag }); switch (tag) { .a => { const element: *parser.Element = @ptrCast(node); const href = (try parser.elementGetAttribute(element, "href")) orelse return; + log.debug(.input, "window click on link", .{ .tag = tag, .href = href }); try self.navigateFromWebAPI(href, .{}, .{ .push = null }); return; }, @@ -940,12 +940,14 @@ pub const Page = struct { const element: *parser.Element = @ptrCast(node); const input_type = try parser.inputGetType(@ptrCast(element)); if (std.ascii.eqlIgnoreCase(input_type, "submit")) { + log.debug(.input, "window click on submit input", .{ .tag = tag }); return self.elementSubmitForm(element); } }, .button => { const element: *parser.Element = @ptrCast(node); const button_type = try parser.buttonGetType(@ptrCast(element)); + log.debug(.input, "window click on button", .{ .tag = tag, .button_type = button_type }); if (std.ascii.eqlIgnoreCase(button_type, "submit")) { return self.elementSubmitForm(element); } @@ -957,7 +959,7 @@ pub const Page = struct { }, else => {}, } - + log.debug(.input, "window click on element", .{ .tag = tag }); // Set the focus on the clicked element. // Thanks to parser.nodeHTMLGetTagType, we know nod is an element. // We assume we have a ElementHTML. From 96e80cc2fc611de081a66a3242862ea538ec117f Mon Sep 17 00:00:00 2001 From: Pierre Tachoire Date: Mon, 24 Nov 2025 09:13:41 +0100 Subject: [PATCH 4/6] form: enter must send the form for all input --- src/browser/page.zig | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/browser/page.zig b/src/browser/page.zig index f99dca7ad..206c3f7e0 100644 --- a/src/browser/page.zig +++ b/src/browser/page.zig @@ -1016,24 +1016,22 @@ pub const Page = struct { const node = parser.eventTargetToNode(target); const tag = (try parser.nodeHTMLGetTagType(node)) orelse return; - log.debug(.input, "key down event", .{ .tag = tag }); - const kbe: *parser.KeyboardEvent = @ptrCast(event); var new_key = try parser.keyboardEventGetKey(kbe); if (std.mem.eql(u8, new_key, "Dead")) { return; } - + log.debug(.input, "key down event", .{ .tag = tag, .key = new_key }); switch (tag) { .input => { const element: *parser.Element = @ptrCast(node); const input_type = try parser.inputGetType(@ptrCast(element)); - if (std.mem.eql(u8, input_type, "text")) { - if (std.mem.eql(u8, new_key, "Enter")) { - const form = (try self.formForElement(element)) orelse return; - return self.submitForm(@ptrCast(form), null); - } + if (std.mem.eql(u8, new_key, "Enter")) { + const form = (try self.formForElement(element)) orelse return; + return self.submitForm(@ptrCast(form), null); + } + if (std.mem.eql(u8, input_type, "text")) { const value = try parser.inputGetValue(@ptrCast(element)); const new_value = try std.mem.concat(self.arena, u8, &.{ value, new_key }); try parser.inputSetValue(@ptrCast(element), new_value); From 9881a4d288169b8ab9f6583bd12b110fcb4d3190 Mon Sep 17 00:00:00 2001 From: Pierre Tachoire Date: Mon, 24 Nov 2025 10:05:39 +0100 Subject: [PATCH 5/6] improve key down log --- src/browser/page.zig | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/browser/page.zig b/src/browser/page.zig index 206c3f7e0..1be08cc6d 100644 --- a/src/browser/page.zig +++ b/src/browser/page.zig @@ -1021,11 +1021,11 @@ pub const Page = struct { if (std.mem.eql(u8, new_key, "Dead")) { return; } - log.debug(.input, "key down event", .{ .tag = tag, .key = new_key }); switch (tag) { .input => { const element: *parser.Element = @ptrCast(node); const input_type = try parser.inputGetType(@ptrCast(element)); + log.debug(.input, "key down on input", .{ .tag = tag, .key = new_key, .input_type = input_type }); if (std.mem.eql(u8, new_key, "Enter")) { const form = (try self.formForElement(element)) orelse return; return self.submitForm(@ptrCast(form), null); @@ -1038,6 +1038,7 @@ pub const Page = struct { } }, .textarea => { + log.debug(.input, "key down on textarea", .{ .tag = tag, .key = new_key }); const value = try parser.textareaGetValue(@ptrCast(node)); if (std.mem.eql(u8, new_key, "Enter")) { new_key = "\n"; @@ -1045,7 +1046,9 @@ pub const Page = struct { const new_value = try std.mem.concat(self.arena, u8, &.{ value, new_key }); try parser.textareaSetValue(@ptrCast(node), new_value); }, - else => {}, + else => { + log.debug(.input, "key down event", .{ .tag = tag, .key = new_key }); + }, } } From b0d9ebaf3a7e54058550314b61332c2f0d87b1d5 Mon Sep 17 00:00:00 2001 From: Pierre Tachoire Date: Mon, 24 Nov 2025 10:05:51 +0100 Subject: [PATCH 6/6] handle key down for more input types --- src/browser/page.zig | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/browser/page.zig b/src/browser/page.zig index 1be08cc6d..e33e1c7a7 100644 --- a/src/browser/page.zig +++ b/src/browser/page.zig @@ -1031,11 +1031,16 @@ pub const Page = struct { return self.submitForm(@ptrCast(form), null); } - if (std.mem.eql(u8, input_type, "text")) { - const value = try parser.inputGetValue(@ptrCast(element)); - const new_value = try std.mem.concat(self.arena, u8, &.{ value, new_key }); - try parser.inputSetValue(@ptrCast(element), new_value); + if (std.mem.eql(u8, input_type, "radio")) { + return; } + if (std.mem.eql(u8, input_type, "checkbox")) { + return; + } + + const value = try parser.inputGetValue(@ptrCast(element)); + const new_value = try std.mem.concat(self.arena, u8, &.{ value, new_key }); + try parser.inputSetValue(@ptrCast(element), new_value); }, .textarea => { log.debug(.input, "key down on textarea", .{ .tag = tag, .key = new_key });