1717// along with this program. If not, see <https://www.gnu.org/licenses/>.
1818
1919const std = @import ("std" );
20+ const log = @import ("../../log.zig" );
2021const Allocator = std .mem .Allocator ;
2122const Node = @import ("../Node.zig" );
2223const css = @import ("../../browser/dom/css.zig" );
@@ -39,6 +40,7 @@ pub fn processMessage(cmd: anytype) !void {
3940 getContentQuads ,
4041 getBoxModel ,
4142 requestChildNodes ,
43+ getFrameOwner ,
4244 }, cmd .input .action ) orelse return error .UnknownMethod ;
4345
4446 switch (action ) {
@@ -55,6 +57,7 @@ pub fn processMessage(cmd: anytype) !void {
5557 .getContentQuads = > return getContentQuads (cmd ),
5658 .getBoxModel = > return getBoxModel (cmd ),
5759 .requestChildNodes = > return requestChildNodes (cmd ),
60+ .getFrameOwner = > return getFrameOwner (cmd ),
5861 }
5962}
6063
@@ -67,6 +70,10 @@ fn getDocument(cmd: anytype) !void {
6770 };
6871 const params = try cmd .params (Params ) orelse Params {};
6972
73+ if (params .pierce ) {
74+ log .warn (.cdp , "not implemented" , .{ .feature = "DOM.getDocument: Not implemented pierce parameter" });
75+ }
76+
7077 const bc = cmd .browser_context orelse return error .BrowserContextNotLoaded ;
7178 const page = bc .session .currentPage () orelse return error .PageNotLoaded ;
7279 const doc = parser .documentHTMLToDocument (page .window .document );
@@ -206,7 +213,9 @@ fn querySelector(cmd: anytype) !void {
206213
207214 const bc = cmd .browser_context orelse return error .BrowserContextNotLoaded ;
208215
209- const node = bc .node_registry .lookup_by_id .get (params .nodeId ) orelse return error .UnknownNode ;
216+ const node = bc .node_registry .lookup_by_id .get (params .nodeId ) orelse {
217+ return cmd .sendError (-32000 , "Could not find node with given id" , .{});
218+ };
210219
211220 const selected_node = try css .querySelector (
212221 cmd .arena ,
@@ -233,7 +242,9 @@ fn querySelectorAll(cmd: anytype) !void {
233242
234243 const bc = cmd .browser_context orelse return error .BrowserContextNotLoaded ;
235244
236- const node = bc .node_registry .lookup_by_id .get (params .nodeId ) orelse return error .UnknownNode ;
245+ const node = bc .node_registry .lookup_by_id .get (params .nodeId ) orelse {
246+ return cmd .sendError (-32000 , "Could not find node with given id" , .{});
247+ };
237248
238249 const arena = cmd .arena ;
239250 const selected_nodes = try css .querySelectorAll (arena , node ._node , params .selector );
@@ -266,10 +277,12 @@ fn resolveNode(cmd: anytype) !void {
266277 var js_context = page .main_context ;
267278 if (params .executionContextId ) | context_id | {
268279 if (js_context .v8_context .debugContextId () != context_id ) {
269- var isolated_world = bc .isolated_world orelse return error .ContextNotFound ;
270- js_context = &(isolated_world .executor .js_context orelse return error .ContextNotFound );
271-
272- if (js_context .v8_context .debugContextId () != context_id ) return error .ContextNotFound ;
280+ for (bc .isolated_worlds .items ) | * isolated_world | {
281+ js_context = &(isolated_world .executor .js_context orelse return error .ContextNotFound );
282+ if (js_context .v8_context .debugContextId () == context_id ) {
283+ break ;
284+ }
285+ } else return error .ContextNotFound ;
273286 }
274287 }
275288
@@ -300,16 +313,18 @@ fn describeNode(cmd: anytype) !void {
300313 nodeId : ? Node.Id = null ,
301314 backendNodeId : ? Node.Id = null ,
302315 objectId : ? []const u8 = null ,
303- depth : u32 = 1 ,
316+ depth : i32 = 1 ,
304317 pierce : bool = false ,
305318 })) orelse return error .InvalidParams ;
306319
307- if (params .depth != 1 or params .pierce ) return error .NotImplemented ;
320+ if (params .pierce ) {
321+ log .warn (.cdp , "not implemented" , .{ .feature = "DOM.describeNode: Not implemented pierce parameter" });
322+ }
308323 const bc = cmd .browser_context orelse return error .BrowserContextNotLoaded ;
309324
310325 const node = try getNode (cmd .arena , bc , params .nodeId , params .backendNodeId , params .objectId );
311326
312- return cmd .sendResult (.{ .node = bc .nodeWriter (node , .{}) }, .{});
327+ return cmd .sendResult (.{ .node = bc .nodeWriter (node , .{ . depth = params . depth }) }, .{});
313328}
314329
315330// An array of quad vertices, x immediately followed by y for each point, points clock-wise.
@@ -461,6 +476,24 @@ fn requestChildNodes(cmd: anytype) !void {
461476 return cmd .sendResult (null , .{});
462477}
463478
479+ fn getFrameOwner (cmd : anytype ) ! void {
480+ const params = (try cmd .params (struct {
481+ frameId : []const u8 ,
482+ })) orelse return error .InvalidParams ;
483+
484+ const bc = cmd .browser_context orelse return error .BrowserContextNotLoaded ;
485+ const target_id = bc .target_id orelse return error .TargetNotLoaded ;
486+ if (std .mem .eql (u8 , target_id , params .frameId ) == false ) {
487+ return cmd .sendError (-32000 , "Frame with the given id does not belong to the target." , .{});
488+ }
489+
490+ const page = bc .session .currentPage () orelse return error .PageNotLoaded ;
491+ const doc = parser .documentHTMLToDocument (page .window .document );
492+
493+ const node = try bc .node_registry .register (parser .documentToNode (doc ));
494+ return cmd .sendResult (.{ .nodeId = node .id , .backendNodeId = node .id }, .{});
495+ }
496+
464497const testing = @import ("../testing.zig" );
465498
466499test "cdp.dom: getSearchResults unknown search id" {
@@ -534,16 +567,19 @@ test "cdp.dom: querySelector unknown search id" {
534567
535568 _ = try ctx .loadBrowserContext (.{ .id = "BID-A" , .html = "<p>1</p> <p>2</p>" });
536569
537- try testing . expectError ( error . UnknownNode , ctx .processMessage (.{
570+ try ctx .processMessage (.{
538571 .id = 9 ,
539572 .method = "DOM.querySelector" ,
540573 .params = .{ .nodeId = 99 , .selector = "" },
541- }));
542- try testing .expectError (error .UnknownNode , ctx .processMessage (.{
574+ });
575+ try ctx .expectSentError (-32000 , "Could not find node with given id" , .{});
576+
577+ try ctx .processMessage (.{
543578 .id = 9 ,
544579 .method = "DOM.querySelectorAll" ,
545580 .params = .{ .nodeId = 99 , .selector = "" },
546- }));
581+ });
582+ try ctx .expectSentError (-32000 , "Could not find node with given id" , .{});
547583}
548584
549585test "cdp.dom: querySelector Node not found" {
0 commit comments