@@ -28,6 +28,7 @@ pub fn processMessage(cmd: anytype) !void {
28
28
performSearch ,
29
29
getSearchResults ,
30
30
discardSearchResults ,
31
+ resolveNode ,
31
32
}, cmd .input .action ) orelse return error .UnknownMethod ;
32
33
33
34
switch (action ) {
@@ -36,6 +37,7 @@ pub fn processMessage(cmd: anytype) !void {
36
37
.performSearch = > return performSearch (cmd ),
37
38
.getSearchResults = > return getSearchResults (cmd ),
38
39
.discardSearchResults = > return discardSearchResults (cmd ),
40
+ .resolveNode = > return resolveNode (cmd ),
39
41
}
40
42
}
41
43
@@ -115,6 +117,113 @@ fn getSearchResults(cmd: anytype) !void {
115
117
return cmd .sendResult (.{ .nodeIds = node_ids [params .fromIndex .. params .toIndex ] }, .{});
116
118
}
117
119
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
+
118
227
const testing = @import ("../testing.zig" );
119
228
120
229
test "cdp.dom: getSearchResults unknown search id" {
0 commit comments