diff --git a/src/SemanticTree.zig b/src/SemanticTree.zig index 815f22d9..ce509d97 100644 --- a/src/SemanticTree.zig +++ b/src/SemanticTree.zig @@ -31,20 +31,6 @@ const CDPNode = @import("cdp/Node.zig"); const Self = @This(); -const interactive_roles = std.StaticStringMap(void).initComptime(.{ - .{ "button", {} }, - .{ "link", {} }, - .{ "checkbox", {} }, - .{ "radio", {} }, - .{ "textbox", {} }, - .{ "combobox", {} }, - .{ "searchbox", {} }, - .{ "slider", {} }, - .{ "spinbutton", {} }, - .{ "switch", {} }, - .{ "menuitem", {} }, -}); - dom_node: *Node, registry: *CDPNode.Registry, page: *Page, @@ -131,7 +117,8 @@ fn dump(self: Self, node: *Node, jw: *std.json.Stringify, parent_xpath: []const if (node.is(Element)) |el| { node_name = el.getTagNameLower(); - if (interactive_roles.has(role)) { + const ax_role = std.meta.stringToEnum(AXNode.AXRole, role) orelse .none; + if (ax_role.isInteractive()) { is_interactive = true; } diff --git a/src/cdp/AXNode.zig b/src/cdp/AXNode.zig index d7c68db2..27272de0 100644 --- a/src/cdp/AXNode.zig +++ b/src/cdp/AXNode.zig @@ -560,13 +560,31 @@ pub const AXRole = enum(u8) { none, article, banner, blockquote, button, caption, cell, checkbox, code, columnheader, combobox, complementary, contentinfo, definition, deletion, dialog, document, emphasis, figure, form, group, heading, image, insertion, - link, list, listbox, listitem, main, marquee, meter, navigation, option, + link, list, listbox, listitem, main, marquee, menuitem, meter, navigation, option, paragraph, presentation, progressbar, radio, region, row, rowgroup, rowheader, searchbox, separator, slider, spinbutton, status, strong, - subscript, superscript, table, term, textbox, time, RootWebArea, LineBreak, + subscript, superscript, @"switch", table, term, textbox, time, RootWebArea, LineBreak, StaticText, // zig fmt: on + pub fn isInteractive(self: AXRole) bool { + return switch (self) { + .button, + .link, + .checkbox, + .radio, + .textbox, + .combobox, + .searchbox, + .slider, + .spinbutton, + .@"switch", + .menuitem, + => true, + else => false, + }; + } + fn fromNode(node: *DOMNode) !AXRole { return switch (node._type) { .document => return .RootWebArea, // Chrome specific.