mirror of
https://github.com/lightpanda-io/browser.git
synced 2026-03-23 05:04:42 +00:00
SemanticTree: optimize tag and role filtering
* Refactored tag ignoring logic to use the el.getTag() enum switch instead of string comparisons, improving performance and safety. * Replaced string comparisons for interactive roles with std.StaticStringMap. * Renamed internal dumpNode method to dump for brevity.
This commit is contained in:
@@ -31,13 +31,27 @@ const CDPNode = @import("cdp/Node.zig");
|
|||||||
|
|
||||||
const Self = @This();
|
const Self = @This();
|
||||||
|
|
||||||
|
const interactive_roles = std.StaticStringMap(void).initComptime(.{
|
||||||
|
.{ "button", {} },
|
||||||
|
.{ "link", {} },
|
||||||
|
.{ "checkbox", {} },
|
||||||
|
.{ "radio", {} },
|
||||||
|
.{ "textbox", {} },
|
||||||
|
.{ "combobox", {} },
|
||||||
|
.{ "searchbox", {} },
|
||||||
|
.{ "slider", {} },
|
||||||
|
.{ "spinbutton", {} },
|
||||||
|
.{ "switch", {} },
|
||||||
|
.{ "menuitem", {} },
|
||||||
|
});
|
||||||
|
|
||||||
dom_node: *Node,
|
dom_node: *Node,
|
||||||
registry: *CDPNode.Registry,
|
registry: *CDPNode.Registry,
|
||||||
page: *Page,
|
page: *Page,
|
||||||
arena: std.mem.Allocator,
|
arena: std.mem.Allocator,
|
||||||
|
|
||||||
pub fn jsonStringify(self: @This(), jw: *std.json.Stringify) error{WriteFailed}!void {
|
pub fn jsonStringify(self: @This(), jw: *std.json.Stringify) error{WriteFailed}!void {
|
||||||
self.dumpNode(self.dom_node, jw, "") catch |err| {
|
self.dump(self.dom_node, jw, "") catch |err| {
|
||||||
log.err(.cdp, "semantic tree dump failed", .{ .err = err });
|
log.err(.cdp, "semantic tree dump failed", .{ .err = err });
|
||||||
return error.WriteFailed;
|
return error.WriteFailed;
|
||||||
};
|
};
|
||||||
@@ -76,20 +90,12 @@ fn getXPathSegment(self: @This(), node: *Node) ![]const u8 {
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
fn dumpNode(self: Self, node: *Node, jw: *std.json.Stringify, parent_xpath: []const u8) !void {
|
fn dump(self: Self, node: *Node, jw: *std.json.Stringify, parent_xpath: []const u8) !void {
|
||||||
// 1. Skip non-content nodes
|
// 1. Skip non-content nodes
|
||||||
if (node.is(Element)) |el| {
|
if (node.is(Element)) |el| {
|
||||||
const tag = el.getTagNameLower();
|
switch (el.getTag()) {
|
||||||
if (std.mem.eql(u8, tag, "script") or
|
.script, .style, .meta, .link, .noscript, .svg, .head, .title => return,
|
||||||
std.mem.eql(u8, tag, "style") or
|
else => {},
|
||||||
std.mem.eql(u8, tag, "meta") or
|
|
||||||
std.mem.eql(u8, tag, "link") or
|
|
||||||
std.mem.eql(u8, tag, "noscript") or
|
|
||||||
std.mem.eql(u8, tag, "svg") or
|
|
||||||
std.mem.eql(u8, tag, "head") or
|
|
||||||
std.mem.eql(u8, tag, "title"))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// CSS display: none visibility check (inline style only for now)
|
// CSS display: none visibility check (inline style only for now)
|
||||||
@@ -125,18 +131,7 @@ fn dumpNode(self: Self, node: *Node, jw: *std.json.Stringify, parent_xpath: []co
|
|||||||
if (node.is(Element)) |el| {
|
if (node.is(Element)) |el| {
|
||||||
node_name = el.getTagNameLower();
|
node_name = el.getTagNameLower();
|
||||||
|
|
||||||
if (std.mem.eql(u8, role, "button") or
|
if (interactive_roles.has(role)) {
|
||||||
std.mem.eql(u8, role, "link") or
|
|
||||||
std.mem.eql(u8, role, "checkbox") or
|
|
||||||
std.mem.eql(u8, role, "radio") or
|
|
||||||
std.mem.eql(u8, role, "textbox") or
|
|
||||||
std.mem.eql(u8, role, "combobox") or
|
|
||||||
std.mem.eql(u8, role, "searchbox") or
|
|
||||||
std.mem.eql(u8, role, "slider") or
|
|
||||||
std.mem.eql(u8, role, "spinbutton") or
|
|
||||||
std.mem.eql(u8, role, "switch") or
|
|
||||||
std.mem.eql(u8, role, "menuitem"))
|
|
||||||
{
|
|
||||||
is_interactive = true;
|
is_interactive = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -218,7 +213,7 @@ fn dumpNode(self: Self, node: *Node, jw: *std.json.Stringify, parent_xpath: []co
|
|||||||
try jw.beginArray();
|
try jw.beginArray();
|
||||||
var it = node.childrenIterator();
|
var it = node.childrenIterator();
|
||||||
while (it.next()) |child| {
|
while (it.next()) |child| {
|
||||||
try self.dumpNode(child, jw, xpath);
|
try self.dump(child, jw, xpath);
|
||||||
}
|
}
|
||||||
try jw.endArray();
|
try jw.endArray();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user