Skip to content

Commit b3b43c8

Browse files
committed
axtree: build consistent tree
1 parent ece3597 commit b3b43c8

File tree

1 file changed

+32
-39
lines changed

1 file changed

+32
-39
lines changed

src/cdp/AXNode.zig

Lines changed: 32 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -49,39 +49,27 @@ pub const Writer = struct {
4949

5050
fn toJSON(self: *const Writer, node: *const Node, w: anytype) !void {
5151
try w.beginArray();
52-
if (try self.writeNode(node, w)) {
53-
// skip children
54-
try w.endArray();
55-
return;
56-
}
57-
58-
// special case: if the node is the document, walk starts from body.
59-
const start = blk: {
60-
if (parser.nodeType(node._node) != .document) {
61-
break :blk node._node;
62-
}
63-
64-
const doc = parser.documentHTMLToDocument(@ptrCast(node._node));
65-
std.debug.assert(doc.is_html);
66-
67-
// find <body> tag
68-
const list = try parser.documentGetElementsByTagName(doc, "body");
69-
break :blk parser.nodeListItem(list, 0) orelse node._node;
70-
};
52+
try self.writeNode(node, w);
7153

7254
const walker = Walker{};
7355
var next: ?*parser.Node = null;
7456
var skip_children = false;
7557
while (true) {
76-
next = try walker.get_next(start, next, .{ .skip_children = skip_children }) orelse break;
58+
next = try walker.get_next(node._node, next, .{ .skip_children = skip_children }) orelse break;
7759

7860
if (parser.nodeType(next.?) != .element) {
7961
skip_children = true;
8062
continue;
8163
}
8264

8365
const n = try self.registry.register(next.?);
84-
skip_children = try self.writeNode(n, w);
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+
};
8573
}
8674

8775
try w.endArray();
@@ -206,18 +194,22 @@ pub const Writer = struct {
206194
}
207195

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

212200
const axn = try AXNode.fromNode(node._node);
213201
try w.objectField("nodeId");
214202
try w.write(node.id);
215203

204+
try w.objectField("role");
205+
try self.writeAXValue(.{ .type = .role, .value = .{ .string = try axn.getRole() } }, w);
206+
216207
const ignore = try axn.isIgnore();
217208
try w.objectField("ignored");
218209
try w.write(ignore);
219210

220211
if (ignore) {
212+
// Ignore reasons
221213
try w.objectField("ignored_reasons");
222214
try w.beginArray();
223215
try w.beginObject();
@@ -227,12 +219,8 @@ pub const Writer = struct {
227219
try self.writeAXValue(.{ .type = .boolean, .value = .{ .boolean = true } }, w);
228220
try w.endObject();
229221
try w.endArray();
230-
}
231-
232-
try w.objectField("role");
233-
try self.writeAXValue(.{ .type = .role, .value = .{ .string = try axn.getRole() } }, w);
234-
235-
if (!ignore) {
222+
} else {
223+
// Name
236224
try w.objectField("name");
237225
try w.beginObject();
238226
try w.objectField("type");
@@ -243,10 +231,17 @@ pub const Writer = struct {
243231
try self.writeAXSource(s, w);
244232
}
245233
try w.endObject();
234+
235+
// Properties
236+
try w.objectField("properties");
237+
try w.beginArray();
238+
try self.writeAXProperties(axn, w);
239+
try w.endArray();
246240
}
247241

248242
const n = axn._node;
249243

244+
// Parent
250245
if (parser.nodeParentNode(n)) |p| {
251246
const parent_node = try self.registry.register(p);
252247
try w.objectField("parentId");
@@ -265,21 +260,17 @@ pub const Writer = struct {
265260
defer i += 1;
266261
const child = (parser.nodeListItem(child_nodes, @intCast(i))) orelse break;
267262

268-
// TODO ignore some of them?
263+
// ignore non-elements
264+
if (parser.nodeType(child) != .element) {
265+
continue;
266+
}
267+
269268
const child_node = try registry.register(child);
270269
try w.write(child_node.id);
271270
}
272271
try w.endArray();
273272

274-
// Properties
275-
try w.objectField("properties");
276-
try w.beginArray();
277-
try self.writeAXProperties(axn, w);
278-
try w.endArray();
279-
280273
try w.endObject();
281-
282-
return false;
283274
}
284275
};
285276

@@ -527,8 +518,8 @@ pub const AXRole = enum(u8) {
527518
.dfn => .term,
528519

529520
// Document Structure
530-
.html => .document,
531-
.body => .document,
521+
.html => .none,
522+
.body => .none,
532523

533524
// Deprecated/Obsolete Elements
534525
.marquee => .marquee,
@@ -697,6 +688,8 @@ fn isIgnore(self: AXNode) !bool {
697688
.datalist,
698689
.col,
699690
.colgroup,
691+
.html,
692+
.body,
700693
=> return true,
701694
.img => {
702695
// Check for empty decorative images

0 commit comments

Comments
 (0)