@@ -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+
663685fn isIgnore (self : AXNode ) ! bool {
664686 const node = self ._node ;
665687 const role_attr = self .role_attr ;
0 commit comments