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`. /// Collect all forms and their fields under `root`.
/// Uses Form.getElements() to include fields outside the <form> that /// Uses Form.getElements() to include fields outside the <form> that
/// reference it via the form="id" attribute, matching browser behavior. /// reference it via the form="id" attribute, matching browser behavior.

View File

@@ -174,15 +174,7 @@ fn detectForms(cmd: anytype) !void {
page, page,
); );
// Register form and field nodes for backendNodeId references try lp.forms.registerNodes(forms_data, &bc.node_registry);
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;
}
}
return cmd.sendResult(.{ return cmd.sendResult(.{
.forms = forms_data, .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"); return server.sendError(id, .InternalError, "Failed to collect forms");
}; };
// Register form and field nodes for backendNodeId references lp.forms.registerNodes(forms_data, &server.node_registry) catch |err| {
for (forms_data) |*form| { log.err(.mcp, "form node registration failed", .{ .err = err });
const form_registered = try server.node_registry.register(form.node); return server.sendError(id, .InternalError, "Failed to register form nodes");
form.backendNodeId = form_registered.id; };
for (form.fields) |*field| {
const field_registered = try server.node_registry.register(field.node);
field.backendNodeId = field_registered.id;
}
}
var aw: std.Io.Writer.Allocating = .init(arena); var aw: std.Io.Writer.Allocating = .init(arena);
try std.json.Stringify.value(forms_data, .{}, &aw.writer); try std.json.Stringify.value(forms_data, .{}, &aw.writer);