From ab1ebfed8a1c89931bd41e21a60440eaa1162c7d Mon Sep 17 00:00:00 2001 From: sjorsdonkers <72333389+sjorsdonkers@users.noreply.github.com> Date: Mon, 7 Apr 2025 17:58:27 +0200 Subject: [PATCH 1/4] Inspector session wrapObject wrapper --- src/engines/v8/v8.zig | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/engines/v8/v8.zig b/src/engines/v8/v8.zig index 68a887e..98c30fe 100644 --- a/src/engines/v8/v8.zig +++ b/src/engines/v8/v8.zig @@ -719,6 +719,31 @@ pub const Inspector = struct { pub fn send(self: Inspector, env: Env, msg: []const u8) void { return self.session.dispatchProtocolMessage(env.isolate, msg); } + + // inspector's wrapObject for use in resolveNode. We may extending the interface here to include: + // backendNodeId, objectGroup, executionContextId. For a complete resolveNode implementation at this level. + // node_ptr is expected to be a sub-type of *parser.Node + pub fn wrapObject(self: Inspector, env: *Env, node_ptr: anytype) !v8.RemoteObject { + // Find or bind Native and JS objects together, if it does not already exist + // NOTE: We're not using env.addObject(..) as it registers a named variable at global scope + const T_refl = comptime gen.getType(@TypeOf(node_ptr)); + const js_object = try setNativeObject( + env.nat_ctx.alloc, + &env.nat_ctx, + T_refl, + T_refl.value.underT(), + node_ptr, + null, + env.isolate, + env.js_ctx.?, + ); + const js_value = js_object.toValue(); + + // Temporary defaults for which we do not know yet what they are for + const group_name = "AGroupName"; + const generate_preview = false; + return self.session.wrapObject(env.isolate, env.js_ctx.?, js_value, group_name, generate_preview); + } }; // When we return a Zig instance to V8, we wrap it in a v8.Object. That wrapping From dcac194b77b8d50be19b9e50345bf5a67367e93b Mon Sep 17 00:00:00 2001 From: sjorsdonkers <72333389+sjorsdonkers@users.noreply.github.com> Date: Tue, 8 Apr 2025 09:05:26 +0200 Subject: [PATCH 2/4] typo extend --- src/engines/v8/v8.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engines/v8/v8.zig b/src/engines/v8/v8.zig index 98c30fe..8a0d39b 100644 --- a/src/engines/v8/v8.zig +++ b/src/engines/v8/v8.zig @@ -720,7 +720,7 @@ pub const Inspector = struct { return self.session.dispatchProtocolMessage(env.isolate, msg); } - // inspector's wrapObject for use in resolveNode. We may extending the interface here to include: + // Inspector's wrapObject for use in resolveNode. We may extend the interface here to include: // backendNodeId, objectGroup, executionContextId. For a complete resolveNode implementation at this level. // node_ptr is expected to be a sub-type of *parser.Node pub fn wrapObject(self: Inspector, env: *Env, node_ptr: anytype) !v8.RemoteObject { From 405e9a975f42d47a57f0130fe0d4fb5fb24ce370 Mon Sep 17 00:00:00 2001 From: sjorsdonkers <72333389+sjorsdonkers@users.noreply.github.com> Date: Tue, 8 Apr 2025 18:13:24 +0200 Subject: [PATCH 3/4] findOrAddValue for dom.Node.Union --- src/engines/v8/v8.zig | 46 ++++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/src/engines/v8/v8.zig b/src/engines/v8/v8.zig index 8a0d39b..915d5ba 100644 --- a/src/engines/v8/v8.zig +++ b/src/engines/v8/v8.zig @@ -36,6 +36,7 @@ pub const ModuleLoadFn = *const fn (ctx: *anyopaque, referrer: ?Module, specifie pub const LoadFnType = @import("generate.zig").LoadFnType; pub const loadFn = @import("generate.zig").loadFn; const setNativeObject = @import("generate.zig").setNativeObject; +const setNativeType = @import("generate.zig").setNativeType; const loadFunctionTemplate = @import("generate.zig").loadFunctionTemplate; const bindObjectNativeAndJS = @import("generate.zig").bindObjectNativeAndJS; const getTpl = @import("generate.zig").getTpl; @@ -351,6 +352,25 @@ pub const Env = struct { } } + // Currently used for DOM nodes + // - value Note: *parser.Node should be converted to dom/node.zig.Union to get the most precise type + pub fn findOrAddValue(env: *Env, value: anytype) !v8.Value { + comptime var ret: refl.Type = undefined; + comptime { + @setEvalBranchQuota(150_000); // Needed when this is called with a dom/node.zig.Union + ret = try refl.Type.reflect(@TypeOf(value), null); + try ret.lookup(gen.Types); + } + return try setNativeType( + env.nat_ctx.alloc, + &env.nat_ctx, + ret, + value, + env.js_ctx.?, + env.isolate, + ); + } + // compile and run a JS script // It doesn't wait for callbacks execution pub fn exec( @@ -720,29 +740,11 @@ pub const Inspector = struct { return self.session.dispatchProtocolMessage(env.isolate, msg); } - // Inspector's wrapObject for use in resolveNode. We may extend the interface here to include: + // Retrieves the RemoteObject for a given JsValue. We may extend the interface here to include: // backendNodeId, objectGroup, executionContextId. For a complete resolveNode implementation at this level. - // node_ptr is expected to be a sub-type of *parser.Node - pub fn wrapObject(self: Inspector, env: *Env, node_ptr: anytype) !v8.RemoteObject { - // Find or bind Native and JS objects together, if it does not already exist - // NOTE: We're not using env.addObject(..) as it registers a named variable at global scope - const T_refl = comptime gen.getType(@TypeOf(node_ptr)); - const js_object = try setNativeObject( - env.nat_ctx.alloc, - &env.nat_ctx, - T_refl, - T_refl.value.underT(), - node_ptr, - null, - env.isolate, - env.js_ctx.?, - ); - const js_value = js_object.toValue(); - - // Temporary defaults for which we do not know yet what they are for - const group_name = "AGroupName"; - const generate_preview = false; - return self.session.wrapObject(env.isolate, env.js_ctx.?, js_value, group_name, generate_preview); + pub fn getRemoteObject(self: Inspector, env: *Env, jsValue: v8.Value, groupName: []const u8) !v8.RemoteObject { + const generatePreview = false; // We do not want to expose this as a parameter for now + return self.session.wrapObject(env.isolate, env.js_ctx.?, jsValue, groupName, generatePreview); } }; From a49001825c72e596cd571f24c473bd3ec4c18c5e Mon Sep 17 00:00:00 2001 From: sjorsdonkers <72333389+sjorsdonkers@users.noreply.github.com> Date: Wed, 9 Apr 2025 11:19:41 +0200 Subject: [PATCH 4/4] workaround testing.refAllDecls issue --- src/engines/v8/v8.zig | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/engines/v8/v8.zig b/src/engines/v8/v8.zig index 915d5ba..2bbf4da 100644 --- a/src/engines/v8/v8.zig +++ b/src/engines/v8/v8.zig @@ -355,6 +355,10 @@ pub const Env = struct { // Currently used for DOM nodes // - value Note: *parser.Node should be converted to dom/node.zig.Union to get the most precise type pub fn findOrAddValue(env: *Env, value: anytype) !v8.Value { + if (builtin.is_test) { + // std.testing.refAllDecls(@import("server.zig")); Causes `try ret.lookup(gen.Types);` to throw an error + return error.TestingNotSupported; + } comptime var ret: refl.Type = undefined; comptime { @setEvalBranchQuota(150_000); // Needed when this is called with a dom/node.zig.Union