@@ -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+
118227const testing = @import ("../testing.zig" );
119228
120229test "cdp.dom: getSearchResults unknown search id" {
0 commit comments