describeNode

This commit is contained in:
sjorsdonkers
2025-04-18 11:53:53 +02:00
parent f3d8ec040c
commit 2ac63b6985
3 changed files with 71 additions and 4 deletions

View File

@@ -30,6 +30,7 @@ pub fn processMessage(cmd: anytype) !void {
getSearchResults,
discardSearchResults,
resolveNode,
describeNode,
}, cmd.input.action) orelse return error.UnknownMethod;
switch (action) {
@@ -39,6 +40,7 @@ pub fn processMessage(cmd: anytype) !void {
.getSearchResults => return getSearchResults(cmd),
.discardSearchResults => return discardSearchResults(cmd),
.resolveNode => return resolveNode(cmd),
.describeNode => return describeNode(cmd),
}
}
@@ -151,6 +153,37 @@ fn resolveNode(cmd: anytype) !void {
} }, .{});
}
fn describeNode(cmd: anytype) !void {
const params = (try cmd.params(struct {
nodeId: ?Node.Id = null,
backendNodeId: ?Node.Id = null,
objectId: ?[]const u8 = null,
depth: u32 = 1,
pierce: bool = false,
})) orelse return error.InvalidParams;
if (params.backendNodeId != null or params.depth != 1 or params.pierce) {
return error.NotYetImplementedParams;
}
const bc = cmd.browser_context orelse return error.BrowserContextNotLoaded;
if (params.nodeId != null) {
const node = bc.node_registry.lookup_by_id.get(params.nodeId.?) orelse return error.NodeNotFound;
return cmd.sendResult(.{ .node = bc.nodeWriter(node, .{}) }, .{});
} else if (params.objectId != null) {
// Retrieve the object from which ever context it is in.
const js_value = try bc.session.inspector.getValueByObjectId(cmd.arena, bc.session.executor, params.objectId.?);
const entry = js_value.taggedAnyOpaque() orelse return error.ObjectIdIsNotANode;
const subtype = entry.subtype orelse return error.ObjectIdIsNotANode;
if (subtype != .node) return error.ObjectIdIsNotANode;
const node = try bc.node_registry.register(@ptrCast(entry.ptr));
return cmd.sendResult(.{ .node = bc.nodeWriter(node, .{}) }, .{});
}
return error.MissingParams;
}
const testing = @import("../testing.zig");
test "cdp.dom: getSearchResults unknown search id" {

View File

@@ -55,13 +55,13 @@ const Browser = struct {
if (self.session != null) {
return error.MockBrowserSessionAlreadyExists;
}
const arena = self.arena.allocator();
const executor = arena.create(Executor) catch unreachable;
self.session = try arena.create(Session);
self.session.?.* = .{
.page = null,
.arena = arena,
.executor = .{},
.executor = executor,
.inspector = .{},
};
return self.session.?;
@@ -78,7 +78,7 @@ const Browser = struct {
const Session = struct {
page: ?Page = null,
arena: Allocator,
executor: Executor,
executor: *Executor,
inspector: Inspector,
pub fn currentPage(self: *Session) ?*Page {
@@ -112,7 +112,7 @@ const Executor = struct {};
const Inspector = struct {
pub fn getRemoteObject(
self: *const Inspector,
executor: Executor,
executor: *Executor,
group: []const u8,
value: anytype,
) !RemoteObject {
@@ -122,6 +122,27 @@ const Inspector = struct {
_ = value;
return RemoteObject{};
}
pub fn getValueByObjectId(self: Inspector, alloc: std.mem.Allocator, executor: *const Executor, object_id: []const u8) !Value {
_ = self;
_ = alloc;
_ = executor;
_ = object_id;
return .{};
}
};
const Value = struct {
pub fn taggedAnyOpaque(self: Value) ?*TaggedAnyOpaque {
_ = self;
return null;
}
};
const TaggedAnyOpaque = struct {
ptr: *anyopaque,
subtype: ?SubType = .node,
};
const SubType = enum {
node,
};
const RemoteObject = struct {