From 91cdb52829b3e3ebf3c96a480bdfa2c63a0be369 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Arrufat?= Date: Sat, 12 Sep 2026 14:28:22 +0200 Subject: [PATCH] cdp: prune accessibility tree children when node is hidden MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 💘 Generated with Crush Assisted-by: Crush:gemini-3.8-flash --- src/server/cdp/AXNode.zig | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/server/cdp/AXNode.zig b/src/server/cdp/AXNode.zig index 215208dc4..372911e3e 100644 --- a/src/server/cdp/AXNode.zig +++ b/src/server/cdp/AXNode.zig @@ -596,7 +596,7 @@ pub const Writer = struct { } // Children - const write_children = axn.ignoreChildren() == false; + const write_children = axn.ignoreChildren() == false and hidden == false; const skip_text = ignoreText(axn.dom); const child_in_aria_hidden = in_aria_hidden or blk: { @@ -2029,3 +2029,30 @@ test "AXNode: getName name-from-content honors explicit role" { } } } + +test "AXNode: writer prunes children when root is hidden" { + var registry = NodeRegistry.init(testing.allocator); + defer registry.deinit(); + + var page = try testing.pageTest("cdp/ax_tree.html", .{}); + defer page.close(); + + const frame = page.frame().?; + const el = (try frame.window._document.querySelector(.wrap("#d-none"), frame)).?; + const node = try registry.register(el.asNode()); + var label_index: Label.LabelByForIndex = .{}; + const temp_arena = try frame.getArena(.medium, "AXNode"); + defer temp_arena.release(); + + const json = try std.json.Stringify.valueAlloc(testing.allocator, Writer{ + .root = node, + .registry = ®istry, + .frame = frame, + .label_index = &label_index, + .temp_arena = temp_arena, + }, .{}); + defer testing.allocator.free(json); + + try testing.expect(std.mem.indexOf(u8, json, "under-display-none") == null); + try testing.expect(std.mem.indexOf(u8, json, "\"childIds\":[]") != null); +}