actions: refactor node type checks for idiomatic flattening

This commit is contained in:
Adrià Arrufat
2026-03-16 16:38:21 +09:00
parent 21e9967a8a
commit f5bc7310b1

View File

@@ -24,66 +24,58 @@ const Event = @import("webapi/Event.zig");
const Page = @import("Page.zig"); const Page = @import("Page.zig");
pub fn click(node: *DOMNode, page: *Page) !void { pub fn click(node: *DOMNode, page: *Page) !void {
if (node.is(Element)) |el| { if (node.is(Element.Html)) |html_el| {
if (el.is(Element.Html)) |html_el| { html_el.click(page) catch |err| {
html_el.click(page) catch |err| { lp.log.err(.app, "click failed", .{ .err = err });
lp.log.err(.app, "click failed", .{ .err = err }); return error.ActionFailed;
return error.ActionFailed; };
};
} else {
return error.InvalidNodeType;
}
} else { } else {
return error.InvalidNodeType; return error.InvalidNodeType;
} }
} }
pub fn fill(node: *DOMNode, text: []const u8, page: *Page) !void { pub fn fill(node: *DOMNode, text: []const u8, page: *Page) !void {
if (node.is(Element)) |el| { const el = node.is(Element) orelse return error.InvalidNodeType;
if (el.is(Element.Html.Input)) |input| {
input.setValue(text, page) catch |err| {
lp.log.err(.app, "fill input failed", .{ .err = err });
return error.ActionFailed;
};
} else if (el.is(Element.Html.TextArea)) |textarea| {
textarea.setValue(text, page) catch |err| {
lp.log.err(.app, "fill textarea failed", .{ .err = err });
return error.ActionFailed;
};
} else if (el.is(Element.Html.Select)) |select| {
select.setValue(text, page) catch |err| {
lp.log.err(.app, "fill select failed", .{ .err = err });
return error.ActionFailed;
};
} else {
return error.InvalidNodeType;
}
const input_evt = try Event.initTrusted(comptime lp.String.wrap("input"), .{ .bubbles = true }, page); if (el.is(Element.Html.Input)) |input| {
_ = page._event_manager.dispatch(el.asEventTarget(), input_evt) catch {}; input.setValue(text, page) catch |err| {
lp.log.err(.app, "fill input failed", .{ .err = err });
const change_evt = try Event.initTrusted(comptime lp.String.wrap("change"), .{ .bubbles = true }, page); return error.ActionFailed;
_ = page._event_manager.dispatch(el.asEventTarget(), change_evt) catch {}; };
} else if (el.is(Element.Html.TextArea)) |textarea| {
textarea.setValue(text, page) catch |err| {
lp.log.err(.app, "fill textarea failed", .{ .err = err });
return error.ActionFailed;
};
} else if (el.is(Element.Html.Select)) |select| {
select.setValue(text, page) catch |err| {
lp.log.err(.app, "fill select failed", .{ .err = err });
return error.ActionFailed;
};
} else { } else {
return error.InvalidNodeType; return error.InvalidNodeType;
} }
const input_evt = try Event.initTrusted(comptime lp.String.wrap("input"), .{ .bubbles = true }, page);
_ = page._event_manager.dispatch(el.asEventTarget(), input_evt) catch {};
const change_evt = try Event.initTrusted(comptime lp.String.wrap("change"), .{ .bubbles = true }, page);
_ = page._event_manager.dispatch(el.asEventTarget(), change_evt) catch {};
} }
pub fn scroll(node: ?*DOMNode, x: i32, y: i32, page: *Page) !void { pub fn scroll(node: ?*DOMNode, x: i32, y: i32, page: *Page) !void {
if (node) |n| { if (node) |n| {
if (n.is(Element)) |el| { const el = n.is(Element) orelse return error.InvalidNodeType;
if (x != 0) {
el.setScrollLeft(x, page) catch {};
}
if (y != 0) {
el.setScrollTop(y, page) catch {};
}
const scroll_evt = try Event.initTrusted(comptime lp.String.wrap("scroll"), .{ .bubbles = true }, page); if (x != 0) {
_ = page._event_manager.dispatch(el.asEventTarget(), scroll_evt) catch {}; el.setScrollLeft(x, page) catch {};
} else {
return error.InvalidNodeType;
} }
if (y != 0) {
el.setScrollTop(y, page) catch {};
}
const scroll_evt = try Event.initTrusted(comptime lp.String.wrap("scroll"), .{ .bubbles = true }, page);
_ = page._event_manager.dispatch(el.asEventTarget(), scroll_evt) catch {};
} else { } else {
page.window.scrollTo(.{ .x = x }, y, page) catch |err| { page.window.scrollTo(.{ .x = x }, y, page) catch |err| {
lp.log.err(.app, "scroll failed", .{ .err = err }); lp.log.err(.app, "scroll failed", .{ .err = err });