Skip to content

Commit d41a3f6

Browse files
committed
reolveNode WIP
1 parent 2af71a6 commit d41a3f6

File tree

2 files changed

+110
-1
lines changed

2 files changed

+110
-1
lines changed

src/cdp/domains/dom.zig

+109
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ pub fn processMessage(cmd: anytype) !void {
2828
performSearch,
2929
getSearchResults,
3030
discardSearchResults,
31+
resolveNode,
3132
}, cmd.input.action) orelse return error.UnknownMethod;
3233

3334
switch (action) {
@@ -36,6 +37,7 @@ pub fn processMessage(cmd: anytype) !void {
3637
.performSearch => return performSearch(cmd),
3738
.getSearchResults => return getSearchResults(cmd),
3839
.discardSearchResults => return discardSearchResults(cmd),
40+
.resolveNode => return resolveNode(cmd),
3941
}
4042
}
4143

@@ -115,6 +117,113 @@ fn getSearchResults(cmd: anytype) !void {
115117
return cmd.sendResult(.{ .nodeIds = node_ids[params.fromIndex..params.toIndex] }, .{});
116118
}
117119

120+
fn resolveNode(cmd: anytype) !void {
121+
const params = (try cmd.params(struct {
122+
nodeId: ?Node.Id = null,
123+
backendNodeId: ?u32 = null,
124+
objectGroup: ?[]const u8 = null,
125+
executionContextId: ?u32 = null,
126+
})) orelse return error.InvalidParams;
127+
if (params.nodeId == null or params.backendNodeId != null or params.objectGroup != null or params.executionContextId != null) {
128+
return error.NotYetImplementedParams;
129+
}
130+
131+
const bc = cmd.browser_context orelse return error.BrowserContextNotLoaded;
132+
const node = bc.node_registry.lookup_by_id.get(params.nodeId.?).?;
133+
134+
// How best to do this? Create a functions that takes a functions(wrapObject), does all the switching at every level and applies the given function to the leav object?
135+
const remote_object = try switch (try parser.nodeType(node._node)) {
136+
.element => blk: {
137+
const elem: *align(@alignOf(*parser.Element)) parser.Element = @alignCast(@as(*parser.Element, @ptrCast(node._node)));
138+
const tag = try parser.elementHTMLGetTagType(@as(*parser.ElementHTML, @ptrCast(elem)));
139+
break :blk switch (tag) {
140+
.abbr, .acronym, .address, .article, .aside, .b, .basefont, .bdi, .bdo, .bgsound, .big, .center, .cite, .code, .dd, .details, .dfn, .dt, .em, .figcaption, .figure, .footer, .header, .hgroup, .i, .isindex, .keygen, .kbd, .main, .mark, .marquee, .menu, .menuitem, .nav, .nobr, .noframes, .noscript, .rp, .rt, .ruby, .s, .samp, .section, .small, .spacer, .strike, .strong, .sub, .summary, .sup, .tt, .u, .wbr, ._var => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.ElementHTML, @ptrCast(elem))),
141+
.a => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Anchor, @ptrCast(elem))),
142+
.applet => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Applet, @ptrCast(elem))),
143+
.area => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Area, @ptrCast(elem))),
144+
.audio => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Audio, @ptrCast(elem))),
145+
.base => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Base, @ptrCast(elem))),
146+
.body => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Body, @ptrCast(elem))),
147+
.br => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.BR, @ptrCast(elem))),
148+
.button => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Button, @ptrCast(elem))),
149+
.canvas => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Canvas, @ptrCast(elem))),
150+
.dl => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.DList, @ptrCast(elem))),
151+
.data => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Data, @ptrCast(elem))),
152+
.datalist => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.DataList, @ptrCast(elem))),
153+
.dialog => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Dialog, @ptrCast(elem))),
154+
.dir => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Directory, @ptrCast(elem))),
155+
.div => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Div, @ptrCast(elem))),
156+
.embed => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Embed, @ptrCast(elem))),
157+
.fieldset => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.FieldSet, @ptrCast(elem))),
158+
.font => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Font, @ptrCast(elem))),
159+
.form => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Form, @ptrCast(elem))),
160+
.frame => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Frame, @ptrCast(elem))),
161+
.frameset => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.FrameSet, @ptrCast(elem))),
162+
.hr => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.HR, @ptrCast(elem))),
163+
.head => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Head, @ptrCast(elem))),
164+
.h1, .h2, .h3, .h4, .h5, .h6 => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Heading, @ptrCast(elem))),
165+
.html => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Html, @ptrCast(elem))),
166+
.iframe => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.IFrame, @ptrCast(elem))),
167+
.img => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Image, @ptrCast(elem))),
168+
.input => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Input, @ptrCast(elem))),
169+
.li => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.LI, @ptrCast(elem))),
170+
.label => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Label, @ptrCast(elem))),
171+
.legend => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Legend, @ptrCast(elem))),
172+
.link => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Link, @ptrCast(elem))),
173+
.map => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Map, @ptrCast(elem))),
174+
.meta => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Meta, @ptrCast(elem))),
175+
.meter => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Meter, @ptrCast(elem))),
176+
.ins, .del => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Mod, @ptrCast(elem))),
177+
.ol => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.OList, @ptrCast(elem))),
178+
.object => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Object, @ptrCast(elem))),
179+
.optgroup => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.OptGroup, @ptrCast(elem))),
180+
.option => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Option, @ptrCast(elem))),
181+
.output => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Output, @ptrCast(elem))),
182+
.p => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Paragraph, @ptrCast(elem))),
183+
.param => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Param, @ptrCast(elem))),
184+
.picture => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Picture, @ptrCast(elem))),
185+
.pre => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Pre, @ptrCast(elem))),
186+
.progress => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Progress, @ptrCast(elem))),
187+
.blockquote, .q => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Quote, @ptrCast(elem))),
188+
.script => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Script, @ptrCast(elem))),
189+
.select => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Select, @ptrCast(elem))),
190+
.source => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Source, @ptrCast(elem))),
191+
.span => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Span, @ptrCast(elem))),
192+
.style => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Style, @ptrCast(elem))),
193+
.table => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Table, @ptrCast(elem))),
194+
.caption => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.TableCaption, @ptrCast(elem))),
195+
.th, .td => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.TableCell, @ptrCast(elem))),
196+
.col, .colgroup => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.TableCol, @ptrCast(elem))),
197+
.tr => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.TableRow, @ptrCast(elem))),
198+
.thead, .tbody, .tfoot => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.TableSection, @ptrCast(elem))),
199+
.template => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Template, @ptrCast(elem))),
200+
.textarea => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.TextArea, @ptrCast(elem))),
201+
.time => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Time, @ptrCast(elem))),
202+
.title => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Title, @ptrCast(elem))),
203+
.track => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Track, @ptrCast(elem))),
204+
.ul => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.UList, @ptrCast(elem))),
205+
.video => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Video, @ptrCast(elem))),
206+
.undef => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Unknown, @ptrCast(elem))),
207+
};
208+
},
209+
.comment => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Comment, @ptrCast(node._node))), // TODO sub types
210+
.text => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Text, @ptrCast(node._node))),
211+
.cdata_section => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.CDATASection, @ptrCast(node._node))),
212+
.processing_instruction => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.ProcessingInstruction, @ptrCast(node._node))),
213+
.document => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.DocumentHTML, @ptrCast(node._node))),
214+
.document_type => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.DocumentType, @ptrCast(node._node))),
215+
.attribute => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.Attribute, @ptrCast(node._node))),
216+
.document_fragment => bc.session.inspector.wrapObject(&bc.session.env, @as(*parser.DocumentFragment, @ptrCast(node._node))),
217+
else => @panic("node type not handled"),
218+
};
219+
defer remote_object.deinit();
220+
221+
var arena = std.heap.ArenaAllocator.init(cmd.cdp.allocator);
222+
const alloc = arena.allocator();
223+
defer arena.deinit();
224+
return cmd.sendResult(.{ .object = .{ .type = try remote_object.getType(alloc), .subtype = try remote_object.getSubtype(alloc), .className = try remote_object.getClassName(alloc), .description = try remote_object.getDescription(alloc), .objectId = try remote_object.getObjectId(alloc) } }, .{});
225+
}
226+
118227
const testing = @import("../testing.zig");
119228

120229
test "cdp.dom: getSearchResults unknown search id" {

0 commit comments

Comments
 (0)