forms: extract form node registration logic

This commit is contained in:
Adrià Arrufat
2026-03-25 09:30:06 +09:00
parent 567cd97312
commit 8e315e551a
3 changed files with 18 additions and 19 deletions

View File

@@ -141,6 +141,19 @@ pub const FormInfo = struct {
}
};
/// Populate backendNodeId on each form and its fields by registering
/// their nodes in the given registry. Works with both CDP and MCP registries.
pub fn registerNodes(forms_data: []FormInfo, registry: anytype) !void {
for (forms_data) |*form| {
const form_registered = try registry.register(form.node);
form.backendNodeId = form_registered.id;
for (form.fields) |*field| {
const field_registered = try registry.register(field.node);
field.backendNodeId = field_registered.id;
}
}
}
/// Collect all forms and their fields under `root`.
/// Uses Form.getElements() to include fields outside the <form> that
/// reference it via the form="id" attribute, matching browser behavior.

View File

@@ -174,15 +174,7 @@ fn detectForms(cmd: anytype) !void {
page,
);
// Register form and field nodes for backendNodeId references
for (forms_data) |*form| {
const registered = try bc.node_registry.register(form.node);
form.backendNodeId = registered.id;
for (form.fields) |*field| {
const field_registered = try bc.node_registry.register(field.node);
field.backendNodeId = field_registered.id;
}
}
try lp.forms.registerNodes(forms_data, &bc.node_registry);
return cmd.sendResult(.{
.forms = forms_data,

View File

@@ -471,16 +471,10 @@ fn handleDetectForms(server: *Server, arena: std.mem.Allocator, id: std.json.Val
return server.sendError(id, .InternalError, "Failed to collect forms");
};
// Register form and field nodes for backendNodeId references
for (forms_data) |*form| {
const form_registered = try server.node_registry.register(form.node);
form.backendNodeId = form_registered.id;
for (form.fields) |*field| {
const field_registered = try server.node_registry.register(field.node);
field.backendNodeId = field_registered.id;
}
}
lp.forms.registerNodes(forms_data, &server.node_registry) catch |err| {
log.err(.mcp, "form node registration failed", .{ .err = err });
return server.sendError(id, .InternalError, "Failed to register form nodes");
};
var aw: std.Io.Writer.Allocating = .init(arena);
try std.json.Stringify.value(forms_data, .{}, &aw.writer);