diff --git a/src/browser/interactive.zig b/src/browser/interactive.zig index 94d6b799..075e8554 100644 --- a/src/browser/interactive.zig +++ b/src/browser/interactive.zig @@ -254,28 +254,51 @@ pub fn classifyInteractivity( } pub fn isInteractiveRole(role: []const u8) bool { - const interactive_roles = [_][]const u8{ - "button", "link", "tab", "menuitem", - "menuitemcheckbox", "menuitemradio", "switch", "checkbox", - "radio", "slider", "spinbutton", "searchbox", - "combobox", "option", "treeitem", "textbox", - "listbox", "iframe", - }; - return for (interactive_roles) |r| { - if (std.ascii.eqlIgnoreCase(role, r)) break true; - } else false; + const MAX_LEN = "menuitemcheckbox".len; + if (role.len > MAX_LEN) return false; + var buf: [MAX_LEN]u8 = undefined; + const lowered = std.ascii.lowerString(&buf, role); + const interactive_roles = std.StaticStringMap(void).initComptime(.{ + .{ "button", {} }, + .{ "checkbox", {} }, + .{ "combobox", {} }, + .{ "iframe", {} }, + .{ "link", {} }, + .{ "listbox", {} }, + .{ "menuitem", {} }, + .{ "menuitemcheckbox", {} }, + .{ "menuitemradio", {} }, + .{ "option", {} }, + .{ "radio", {} }, + .{ "searchbox", {} }, + .{ "slider", {} }, + .{ "spinbutton", {} }, + .{ "switch", {} }, + .{ "tab", {} }, + .{ "textbox", {} }, + .{ "treeitem", {} }, + }); + return interactive_roles.has(lowered); } pub fn isContentRole(role: []const u8) bool { - const content_roles = [_][]const u8{ - "heading", "cell", "gridcell", - "columnheader", "rowheader", "listitem", - "article", "region", "main", - "navigation", - }; - return for (content_roles) |r| { - if (std.ascii.eqlIgnoreCase(role, r)) break true; - } else false; + const MAX_LEN = "columnheader".len; + if (role.len > MAX_LEN) return false; + var buf: [MAX_LEN]u8 = undefined; + const lowered = std.ascii.lowerString(&buf, role); + const content_roles = std.StaticStringMap(void).initComptime(.{ + .{ "article", {} }, + .{ "cell", {} }, + .{ "columnheader", {} }, + .{ "gridcell", {} }, + .{ "heading", {} }, + .{ "listitem", {} }, + .{ "main", {} }, + .{ "navigation", {} }, + .{ "region", {} }, + .{ "rowheader", {} }, + }); + return content_roles.has(lowered); } fn getRole(el: *Element) ?[]const u8 {