Skip to content

Commit 055530c

Browse files
committed
cdp: send dom node children
1 parent fb3b38a commit 055530c

File tree

1 file changed

+35
-9
lines changed

1 file changed

+35
-9
lines changed

src/cdp/dom.zig

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -109,28 +109,49 @@ const Node = struct {
109109
nodeName: []const u8 = "",
110110
localName: []const u8 = "",
111111
nodeValue: []const u8 = "",
112-
childNodeCount: u32,
112+
childNodeCount: ?u32 = null,
113113
children: ?[]const Node = null,
114114
documentURL: ?[]const u8 = null,
115115
baseURL: ?[]const u8 = null,
116116
xmlVersion: []const u8 = "",
117117
compatibilityMode: []const u8 = "NoQuirksMode",
118118
isScrollable: bool = false,
119119

120-
fn init(n: *parser.Node, id: NodeId) !Node {
121-
const children = try parser.nodeGetChildNodes(n);
122-
const ln = try parser.nodeListLength(children);
123-
120+
fn init(n: *parser.Node, nlist: *NodeList) !Node {
121+
const id = try nlist.set(n);
124122
return .{
125123
.nodeId = id,
126124
.backendNodeId = id,
127125
.nodeType = @intFromEnum(try parser.nodeType(n)),
128126
.nodeName = try parser.nodeName(n),
129127
.localName = try parser.nodeLocalName(n),
130128
.nodeValue = try parser.nodeValue(n) orelse "",
131-
.childNodeCount = ln,
132129
};
133130
}
131+
132+
fn initChildren(
133+
self: *Node,
134+
alloc: std.mem.Allocator,
135+
n: *parser.Node,
136+
nlist: *NodeList,
137+
) !std.ArrayList(Node) {
138+
const children = try parser.nodeGetChildNodes(n);
139+
const ln = try parser.nodeListLength(children);
140+
self.childNodeCount = ln;
141+
142+
var list = try std.ArrayList(Node).initCapacity(alloc, ln);
143+
144+
var i: u32 = 0;
145+
while (i < ln) {
146+
defer i += 1;
147+
const child = try parser.nodeListItem(children, i) orelse continue;
148+
try list.append(try Node.init(child, nlist));
149+
}
150+
151+
self.children = list.items;
152+
153+
return list;
154+
}
134155
};
135156

136157
// https://chromedevtools.github.io/devtools-protocol/tot/DOM/#method-getDocument
@@ -155,17 +176,22 @@ fn getDocument(
155176
if (page.doc == null) return error.NoDocument;
156177

157178
const node = parser.documentToNode(page.doc.?);
158-
const id = try ctx.state.nodelist.set(node);
179+
var n = try Node.init(node, &ctx.state.nodelist);
180+
var list = try n.initChildren(alloc, node, &ctx.state.nodelist);
181+
defer list.deinit();
159182

160183
// output
161184
const Resp = struct {
162185
root: Node,
163186
};
164187
const resp: Resp = .{
165-
.root = try Node.init(node, id),
188+
.root = n,
166189
};
167190

168-
return result(alloc, input.id, Resp, resp, input.sessionId);
191+
const res = try result(alloc, input.id, Resp, resp, input.sessionId);
192+
try ctx.send(res);
193+
194+
return "";
169195
}
170196

171197
pub const NodeSearch = struct {

0 commit comments

Comments
 (0)