Skip to content

Commit ff871fc

Browse files
committed
axtree: fix skip children for head
1 parent b3b43c8 commit ff871fc

File tree

1 file changed

+47
-25
lines changed

1 file changed

+47
-25
lines changed

src/cdp/AXNode.zig

Lines changed: 47 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,10 @@ pub const Writer = struct {
4949

5050
fn toJSON(self: *const Writer, node: *const Node, w: anytype) !void {
5151
try w.beginArray();
52-
try self.writeNode(node, w);
52+
if (try self.writeNode(node, w)) {
53+
try w.endArray();
54+
return;
55+
}
5356

5457
const walker = Walker{};
5558
var next: ?*parser.Node = null;
@@ -63,13 +66,7 @@ pub const Writer = struct {
6366
}
6467

6568
const n = try self.registry.register(next.?);
66-
try self.writeNode(n, w);
67-
68-
const tag = try parser.elementTag(@ptrCast(next.?));
69-
skip_children = switch (tag) {
70-
.head => true,
71-
else => false,
72-
};
69+
skip_children = try self.writeNode(n, w);
7370
}
7471

7572
try w.endArray();
@@ -194,13 +191,16 @@ pub const Writer = struct {
194191
}
195192

196193
// write a node. returns true if children must be skipped.
197-
fn writeNode(self: *const Writer, node: *const Node, w: anytype) !void {
194+
fn writeNode(self: *const Writer, node: *const Node, w: anytype) !bool {
198195
try w.beginObject();
199196

200197
const axn = try AXNode.fromNode(node._node);
201198
try w.objectField("nodeId");
202199
try w.write(node.id);
203200

201+
try w.objectField("backendDOMNodeId");
202+
try w.write(node.id);
203+
204204
try w.objectField("role");
205205
try self.writeAXValue(.{ .type = .role, .value = .{ .string = try axn.getRole() } }, w);
206206

@@ -249,28 +249,34 @@ pub const Writer = struct {
249249
}
250250

251251
// Children
252-
try w.objectField("childIds");
253-
var registry = self.registry;
254-
const child_nodes = try parser.nodeGetChildNodes(n);
255-
const child_count = parser.nodeListLength(child_nodes);
252+
const skip_children = try axn.ignoreChildren();
256253

257-
var i: usize = 0;
254+
try w.objectField("childIds");
258255
try w.beginArray();
259-
for (0..child_count) |_| {
260-
defer i += 1;
261-
const child = (parser.nodeListItem(child_nodes, @intCast(i))) orelse break;
256+
if (!skip_children) {
257+
var registry = self.registry;
258+
const child_nodes = try parser.nodeGetChildNodes(n);
259+
const child_count = parser.nodeListLength(child_nodes);
262260

263-
// ignore non-elements
264-
if (parser.nodeType(child) != .element) {
265-
continue;
266-
}
261+
var i: usize = 0;
262+
for (0..child_count) |_| {
263+
defer i += 1;
264+
const child = (parser.nodeListItem(child_nodes, @intCast(i))) orelse break;
267265

268-
const child_node = try registry.register(child);
269-
try w.write(child_node.id);
266+
// ignore non-elements
267+
if (parser.nodeType(child) != .element) {
268+
continue;
269+
}
270+
271+
const child_node = try registry.register(child);
272+
try w.write(child_node.id);
273+
}
270274
}
271275
try w.endArray();
272276

273277
try w.endObject();
278+
279+
return skip_children;
274280
}
275281
};
276282

@@ -328,11 +334,11 @@ pub const AXRole = enum(u8) {
328334
term,
329335
textbox,
330336
time,
331-
WebRootArea,
337+
RootWebArea,
332338

333339
fn fromNode(node: *parser.Node) !AXRole {
334340
switch (parser.nodeType(node)) {
335-
.document => return .WebRootArea, // Chrome specific.
341+
.document => return .RootWebArea, // Chrome specific.
336342
.element => {},
337343
else => {
338344
log.debug(.cdp, "invalid tag", .{ .node_type = parser.nodeType(node) });
@@ -660,6 +666,22 @@ fn isHidden(elt: *parser.Element) !bool {
660666
return false;
661667
}
662668

669+
fn ignoreChildren(self: AXNode) !bool {
670+
const node = self._node;
671+
if (parser.nodeType(node) == .document) {
672+
return false;
673+
}
674+
675+
std.debug.assert(parser.nodeType(node) == .element);
676+
677+
const elt: *parser.Element = @ptrCast(node);
678+
const tag = try parser.elementTag(elt);
679+
return switch (tag) {
680+
.head => true,
681+
else => false,
682+
};
683+
}
684+
663685
fn isIgnore(self: AXNode) !bool {
664686
const node = self._node;
665687
const role_attr = self.role_attr;

0 commit comments

Comments
 (0)