diff --git a/src/browser/forms.zig b/src/browser/forms.zig index 1cfa69b8..b895da28 100644 --- a/src/browser/forms.zig +++ b/src/browser/forms.zig @@ -137,8 +137,8 @@ pub const FormInfo = struct { /// Collect all forms and their fields under `root`. pub fn collectForms( - root: *Node, arena: Allocator, + root: *Node, page: *Page, ) ![]FormInfo { var forms: std.ArrayList(FormInfo) = .empty; @@ -150,7 +150,7 @@ pub fn collectForms( const form_el = el.is(Element.Html.Form) orelse continue; - const fields = try collectFormFields(node, arena, page); + const fields = try collectFormFields(arena, node, page); if (fields.len == 0) continue; const action_attr = el.getAttributeSafe(comptime .wrap("action")); @@ -168,8 +168,8 @@ pub fn collectForms( } fn collectFormFields( - form_node: *Node, arena: Allocator, + form_node: *Node, page: *Page, ) ![]FormField { var fields: std.ArrayList(FormField) = .empty; @@ -180,7 +180,7 @@ fn collectFormFields( switch (el.getTag()) { .input => { - const input = el.as(Element.Html.Input); + const input = el.is(Element.Html.Input) orelse continue; if (input._input_type == .hidden) continue; if (input._input_type == .submit or input._input_type == .button or input._input_type == .image) continue; @@ -196,7 +196,7 @@ fn collectFormFields( }); }, .textarea => { - const textarea = el.as(Element.Html.TextArea); + const textarea = el.is(Element.Html.TextArea) orelse continue; try fields.append(arena, .{ .node = node, @@ -210,9 +210,9 @@ fn collectFormFields( }); }, .select => { - const select = el.as(Element.Html.Select); + const select = el.is(Element.Html.Select) orelse continue; - const options = try collectSelectOptions(node, arena, page); + const options = try collectSelectOptions(arena, node, page); try fields.append(arena, .{ .node = node, @@ -233,8 +233,8 @@ fn collectFormFields( } fn collectSelectOptions( - select_node: *Node, arena: Allocator, + select_node: *Node, page: *Page, ) ![]SelectOption { var options: std.ArrayList(SelectOption) = .empty; @@ -258,16 +258,17 @@ const testing = @import("../testing.zig"); fn testForms(html: []const u8) ![]FormInfo { const page = try testing.test_session.createPage(); - defer testing.test_session.removePage(); const doc = page.window._document; const div = try doc.createElement("div", null, page); try page.parseHtmlAsChildren(div.asNode(), html); - return collectForms(div.asNode(), page.call_arena, page); + return collectForms(page.call_arena, div.asNode(), page); } test "browser.forms: login form" { + defer testing.reset(); + defer testing.test_session.removePage(); const forms = try testForms( \\
\\ @@ -286,6 +287,8 @@ test "browser.forms: login form" { } test "browser.forms: form with select" { + defer testing.reset(); + defer testing.test_session.removePage(); const forms = try testForms( \\ \\ @@ -315,6 +320,8 @@ test "browser.forms: form with textarea" { } test "browser.forms: empty form skipped" { + defer testing.reset(); + defer testing.test_session.removePage(); const forms = try testForms( \\ \\

No fields here

@@ -324,6 +331,8 @@ test "browser.forms: empty form skipped" { } test "browser.forms: hidden inputs excluded" { + defer testing.reset(); + defer testing.test_session.removePage(); const forms = try testForms( \\ \\ @@ -336,6 +345,8 @@ test "browser.forms: hidden inputs excluded" { } test "browser.forms: multiple forms" { + defer testing.reset(); + defer testing.test_session.removePage(); const forms = try testForms( \\ \\ diff --git a/src/cdp/domains/lp.zig b/src/cdp/domains/lp.zig index 3944ea40..509500bd 100644 --- a/src/cdp/domains/lp.zig +++ b/src/cdp/domains/lp.zig @@ -167,8 +167,8 @@ fn detectForms(cmd: anytype) !void { const page = bc.session.currentPage() orelse return error.PageNotLoaded; const forms_data = try lp.forms.collectForms( - page.document.asNode(), cmd.arena, + page.document.asNode(), page, ); diff --git a/src/mcp/tools.zig b/src/mcp/tools.zig index c3d8bb71..57c339f0 100644 --- a/src/mcp/tools.zig +++ b/src/mcp/tools.zig @@ -465,7 +465,7 @@ fn handleDetectForms(server: *Server, arena: std.mem.Allocator, id: std.json.Val return server.sendError(id, .PageNotLoaded, "Page not loaded"); }; - const forms_data = lp.forms.collectForms(page.document.asNode(), arena, page) catch |err| { + const forms_data = lp.forms.collectForms(arena, page.document.asNode(), page) catch |err| { log.err(.mcp, "form collection failed", .{ .err = err }); return server.sendError(id, .InternalError, "Failed to collect forms"); };