From e18d04a799b431969a4d5fcb9e55441ae7730f08 Mon Sep 17 00:00:00 2001 From: Pierre Tachoire Date: Tue, 16 Apr 2024 12:06:29 +0200 Subject: [PATCH] userctx: inject user context --- src/apiweb.zig | 2 ++ src/browser/browser.zig | 2 +- src/main.zig | 3 ++- src/main_get.zig | 1 + src/main_shell.zig | 5 +++++ src/main_wpt.zig | 1 + src/run_tests.zig | 9 ++++++++- src/test_runner.zig | 1 + src/user_context.zig | 6 ++++++ src/wpt/run.zig | 5 ++++- 10 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 src/user_context.zig diff --git a/src/apiweb.zig b/src/apiweb.zig index decac389..cbf2ffa0 100644 --- a/src/apiweb.zig +++ b/src/apiweb.zig @@ -39,3 +39,5 @@ pub const Interfaces = generate.Tuple(.{ Storage.Interfaces, URL.Interfaces, }); + +pub const UserContext = @import("user_context.zig").UserContext; diff --git a/src/browser/browser.zig b/src/browser/browser.zig index 2fb759cc..b17173da 100644 --- a/src/browser/browser.zig +++ b/src/browser/browser.zig @@ -107,7 +107,7 @@ pub const Session = struct { .storageShed = storage.Shed.init(alloc), }; - self.env = try Env.init(self.arena.allocator(), &self.loop); + self.env = try Env.init(self.arena.allocator(), &self.loop, null); try self.env.load(&self.jstypes); return self; diff --git a/src/main.zig b/src/main.zig index 1c032b68..ab4fb585 100644 --- a/src/main.zig +++ b/src/main.zig @@ -25,6 +25,7 @@ const apiweb = @import("apiweb.zig"); const Window = @import("html/window.zig").Window; pub const Types = jsruntime.reflect(apiweb.Interfaces); +pub const UserContext = apiweb.UserContext; const socket_path = "/tmp/browsercore-server.sock"; @@ -103,5 +104,5 @@ pub fn main() !void { try server.listen(addr); std.debug.print("Listening on: {s}...\n", .{socket_path}); - try jsruntime.loadEnv(&arena, execJS); + try jsruntime.loadEnv(&arena, null, execJS); } diff --git a/src/main_get.zig b/src/main_get.zig index 579edca2..387106a6 100644 --- a/src/main_get.zig +++ b/src/main_get.zig @@ -23,6 +23,7 @@ const jsruntime = @import("jsruntime"); const apiweb = @import("apiweb.zig"); pub const Types = jsruntime.reflect(apiweb.Interfaces); +pub const UserContext = apiweb.UserContext; pub const std_options = struct { pub const log_level = .debug; diff --git a/src/main_shell.zig b/src/main_shell.zig index 4b4967d1..7eca5f03 100644 --- a/src/main_shell.zig +++ b/src/main_shell.zig @@ -28,6 +28,7 @@ const storage = @import("storage/storage.zig"); const html_test = @import("html_test.zig").html; pub const Types = jsruntime.reflect(apiweb.Interfaces); +pub const UserContext = apiweb.UserContext; var doc: *parser.DocumentHTML = undefined; @@ -39,6 +40,10 @@ fn execJS( try js_env.start(alloc); defer js_env.stop(); + js_env.setUserContext(UserContext{ + .document = doc, + }); + var storageShelf = storage.Shelf.init(alloc); defer storageShelf.deinit(); diff --git a/src/main_wpt.zig b/src/main_wpt.zig index 06c6a249..bc9927fd 100644 --- a/src/main_wpt.zig +++ b/src/main_wpt.zig @@ -49,6 +49,7 @@ const Out = enum { pub const Types = jsruntime.reflect(apiweb.Interfaces); pub const GlobalType = apiweb.GlobalType; +pub const UserContext = apiweb.UserContext; // TODO For now the WPT tests run is specific to WPT. // It manually load js framwork libs, and run the first script w/ js content in diff --git a/src/run_tests.zig b/src/run_tests.zig index 3fe20b3f..be65e5be 100644 --- a/src/run_tests.zig +++ b/src/run_tests.zig @@ -54,6 +54,7 @@ const URLTestExecFn = url.testExecFn; const HTMLElementTestExecFn = @import("html/elements.zig").testExecFn; pub const Types = jsruntime.reflect(apiweb.Interfaces); +pub const UserContext = @import("user_context.zig").UserContext; var doc: *parser.DocumentHTML = undefined; @@ -81,6 +82,8 @@ fn testExecFn( std.debug.print("documentHTMLClose error: {s}\n", .{@errorName(err)}); }; + js_env.getUserContext().?.document = doc; + // alias global as self and window var window = Window.create(null); @@ -315,7 +318,11 @@ fn testJSRuntime(alloc: std.mem.Allocator) !void { var arena_alloc = std.heap.ArenaAllocator.init(alloc); defer arena_alloc.deinit(); - try jsruntime.loadEnv(&arena_alloc, testsAllExecFn); + const userctx = UserContext{ + .document = null, + }; + + try jsruntime.loadEnv(&arena_alloc, userctx, testsAllExecFn); } test "DocumentHTMLParseFromStr" { diff --git a/src/test_runner.zig b/src/test_runner.zig index d385c813..8b138d0b 100644 --- a/src/test_runner.zig +++ b/src/test_runner.zig @@ -21,6 +21,7 @@ const std = @import("std"); const tests = @import("run_tests.zig"); pub const Types = tests.Types; +pub const UserContext = tests.UserContext; pub fn main() !void { try tests.main(); diff --git a/src/user_context.zig b/src/user_context.zig new file mode 100644 index 00000000..a2bc3efb --- /dev/null +++ b/src/user_context.zig @@ -0,0 +1,6 @@ +const std = @import("std"); +const parser = @import("netsurf.zig"); + +pub const UserContext = struct { + document: ?*parser.DocumentHTML, +}; diff --git a/src/wpt/run.zig b/src/wpt/run.zig index c7c263a5..8b0e7516 100644 --- a/src/wpt/run.zig +++ b/src/wpt/run.zig @@ -30,6 +30,7 @@ const Window = @import("../html/window.zig").Window; const storage = @import("../storage/storage.zig"); const Types = @import("../main_wpt.zig").Types; +const UserContext = @import("../main_wpt.zig").UserContext; // runWPT parses the given HTML file, starts a js env and run the first script // tags containing javascript sources. @@ -50,7 +51,9 @@ pub fn run(arena: *std.heap.ArenaAllocator, comptime dir: []const u8, f: []const // create JS env var loop = try Loop.init(alloc); defer loop.deinit(); - var js_env = try Env.init(alloc, &loop); + var js_env = try Env.init(alloc, &loop, UserContext{ + .document = html_doc, + }); defer js_env.deinit(); var storageShelf = storage.Shelf.init(alloc);