rename scope jscontext
Some checks failed
e2e-test / zig build release (push) Has been cancelled
zig-test / zig build dev (push) Has been cancelled
zig-test / zig test (push) Has been cancelled
e2e-test / puppeteer-perf (push) Has been cancelled
e2e-test / demo-scripts (push) Has been cancelled
e2e-test / cdp-and-hyperfine-bench (push) Has been cancelled
e2e-test / perf-fmt (push) Has been cancelled
zig-test / browser fetch (push) Has been cancelled
zig-test / perf-fmt (push) Has been cancelled
nightly build / build-linux-x86_64 (push) Has been cancelled
nightly build / build-linux-aarch64 (push) Has been cancelled
nightly build / build-macos-aarch64 (push) Has been cancelled
nightly build / build-macos-x86_64 (push) Has been cancelled
wpt / web platform tests json output (push) Has been cancelled
wpt / perf-fmt (push) Has been cancelled

This commit is contained in:
sjorsdonkers
2025-06-06 12:41:35 +02:00
committed by Sjors
parent 9bd5ff69ef
commit 0c0ddc10ee
13 changed files with 311 additions and 311 deletions

View File

@@ -38,7 +38,7 @@ pub const MutationObserver = struct {
cbk: Env.Function, cbk: Env.Function,
arena: Allocator, arena: Allocator,
// List of records which were observed. When the scopeEnds, we need to // List of records which were observed. When the call scope ends, we need to
// execute our callback with it. // execute our callback with it.
observed: std.ArrayListUnmanaged(*MutationRecord), observed: std.ArrayListUnmanaged(*MutationRecord),

View File

@@ -85,7 +85,7 @@ pub const Page = struct {
// Our JavaScript context for this specific page. This is what we use to // Our JavaScript context for this specific page. This is what we use to
// execute any JavaScript // execute any JavaScript
scope: *Env.Scope, main_context: *Env.JsContext,
// List of modules currently fetched/loaded. // List of modules currently fetched/loaded.
module_map: std.StringHashMapUnmanaged([]const u8), module_map: std.StringHashMapUnmanaged([]const u8),
@@ -118,13 +118,13 @@ pub const Page = struct {
.request_factory = browser.http_client.requestFactory(.{ .request_factory = browser.http_client.requestFactory(.{
.notification = browser.notification, .notification = browser.notification,
}), }),
.scope = undefined, .main_context = undefined,
.module_map = .empty, .module_map = .empty,
}; };
self.scope = try session.executor.startScope(&self.window, self, self, true); self.main_context = try session.executor.createJsContext(&self.window, self, self, true);
// load polyfills // load polyfills
try polyfill.load(self.arena, self.scope); try polyfill.load(self.arena, self.main_context);
_ = try session.browser.app.loop.timeout(1 * std.time.ns_per_ms, &self.microtask_node); _ = try session.browser.app.loop.timeout(1 * std.time.ns_per_ms, &self.microtask_node);
} }
@@ -166,7 +166,7 @@ pub const Page = struct {
pub fn wait(self: *Page) !void { pub fn wait(self: *Page) !void {
var try_catch: Env.TryCatch = undefined; var try_catch: Env.TryCatch = undefined;
try_catch.init(self.scope); try_catch.init(self.main_context);
defer try_catch.deinit(); defer try_catch.deinit();
try self.session.browser.app.loop.run(); try self.session.browser.app.loop.run();
@@ -798,7 +798,7 @@ pub const Page = struct {
pub fn stackTrace(self: *Page) !?[]const u8 { pub fn stackTrace(self: *Page) !?[]const u8 {
if (comptime builtin.mode == .Debug) { if (comptime builtin.mode == .Debug) {
return self.scope.stackTrace(); return self.main_context.stackTrace();
} }
return null; return null;
} }
@@ -818,7 +818,7 @@ const DelayedNavigation = struct {
// //
// In the first phase, when self.initial == true, we'll shutdown the page // In the first phase, when self.initial == true, we'll shutdown the page
// and create a new one. The shutdown is important, because it resets the // and create a new one. The shutdown is important, because it resets the
// loop ctx_id and closes the scope. Closing the scope calls our XHR // loop ctx_id and removes the JsContext. Removing the context calls our XHR
// destructors which aborts requests. This is necessary to make sure our // destructors which aborts requests. This is necessary to make sure our
// [blocking] navigate won't block. // [blocking] navigate won't block.
// //
@@ -982,14 +982,14 @@ const Script = struct {
fn eval(self: *const Script, page: *Page, body: []const u8) !void { fn eval(self: *const Script, page: *Page, body: []const u8) !void {
var try_catch: Env.TryCatch = undefined; var try_catch: Env.TryCatch = undefined;
try_catch.init(page.scope); try_catch.init(page.main_context);
defer try_catch.deinit(); defer try_catch.deinit();
const src = self.src orelse "inline"; const src = self.src orelse "inline";
_ = switch (self.kind) { _ = switch (self.kind) {
.javascript => page.scope.exec(body, src), .javascript => page.main_context.exec(body, src),
.module => blk: { .module => blk: {
switch (try page.scope.module(body, src)) { switch (try page.main_context.module(body, src)) {
.value => |v| break :blk v, .value => |v| break :blk v,
.exception => |e| { .exception => |e| {
log.warn(.user_script, "eval module", .{ log.warn(.user_script, "eval module", .{
@@ -1023,9 +1023,9 @@ const Script = struct {
switch (callback) { switch (callback) {
.string => |str| { .string => |str| {
var try_catch: Env.TryCatch = undefined; var try_catch: Env.TryCatch = undefined;
try_catch.init(page.scope); try_catch.init(page.main_context);
defer try_catch.deinit(); defer try_catch.deinit();
_ = page.scope.exec(str, typ) catch { _ = page.main_context.exec(str, typ) catch {
if (try try_catch.err(page.arena)) |msg| { if (try try_catch.err(page.arena)) |msg| {
log.warn(.user_script, "script callback", .{ log.warn(.user_script, "script callback", .{
.src = self.src, .src = self.src,

View File

@@ -16,7 +16,7 @@ test "Browser.fetch" {
var runner = try testing.jsRunner(testing.tracking_allocator, .{}); var runner = try testing.jsRunner(testing.tracking_allocator, .{});
defer runner.deinit(); defer runner.deinit();
try @import("polyfill.zig").load(testing.allocator, runner.page.scope); try @import("polyfill.zig").load(testing.allocator, runner.page.main_context);
try runner.testCases(&.{ try runner.testCases(&.{
.{ .{

View File

@@ -30,13 +30,13 @@ const modules = [_]struct {
.{ .name = "polyfill-fetch", .source = @import("fetch.zig").source }, .{ .name = "polyfill-fetch", .source = @import("fetch.zig").source },
}; };
pub fn load(allocator: Allocator, scope: *Env.Scope) !void { pub fn load(allocator: Allocator, js_context: *Env.JsContext) !void {
var try_catch: Env.TryCatch = undefined; var try_catch: Env.TryCatch = undefined;
try_catch.init(scope); try_catch.init(js_context);
defer try_catch.deinit(); defer try_catch.deinit();
for (modules) |m| { for (modules) |m| {
_ = scope.exec(m.source, m.name) catch |err| { _ = js_context.exec(m.source, m.name) catch |err| {
if (try try_catch.err(allocator)) |msg| { if (try try_catch.err(allocator)) |msg| {
defer allocator.free(msg); defer allocator.free(msg);
log.fatal(.app, "polyfill error", .{ .name = m.name, .err = msg }); log.fatal(.app, "polyfill error", .{ .name = m.name, .err = msg });

View File

@@ -116,11 +116,11 @@ pub const Session = struct {
// phase. It's important that we clean these up, as they're holding onto // phase. It's important that we clean these up, as they're holding onto
// limited resources (like our fixed-sized http state pool). // limited resources (like our fixed-sized http state pool).
// //
// First thing we do, is endScope() which will execute the destructor // First thing we do, is removeJsContext() which will execute the destructor
// of any type that registered a destructor (e.g. XMLHttpRequest). // of any type that registered a destructor (e.g. XMLHttpRequest).
// This will shutdown any pending sockets, which begins our cleaning // This will shutdown any pending sockets, which begins our cleaning
// processed // processed
self.executor.endScope(); self.executor.removeJsContext();
// Second thing we do is reset the loop. This increments the loop ctx_id // Second thing we do is reset the loop. This increments the loop ctx_id
// so that any "stale" timeouts we process will get ignored. We need to // so that any "stale" timeouts we process will get ignored. We need to

View File

@@ -555,8 +555,8 @@ const IsolatedWorld = struct {
self.executor.deinit(); self.executor.deinit();
} }
pub fn removeContext(self: *IsolatedWorld) !void { pub fn removeContext(self: *IsolatedWorld) !void {
if (self.executor.scope == null) return error.NoIsolatedContextToRemove; if (self.executor.js_context == null) return error.NoIsolatedContextToRemove;
self.executor.endScope(); self.executor.removeJsContext();
} }
// The isolate world must share at least some of the state with the related page, specifically the DocumentHTML // The isolate world must share at least some of the state with the related page, specifically the DocumentHTML
@@ -565,8 +565,8 @@ const IsolatedWorld = struct {
// This also means this pointer becomes invalid after removePage untill a new page is created. // This also means this pointer becomes invalid after removePage untill a new page is created.
// Currently we have only 1 page/frame and thus also only 1 state in the isolate world. // Currently we have only 1 page/frame and thus also only 1 state in the isolate world.
pub fn createContext(self: *IsolatedWorld, page: *Page) !void { pub fn createContext(self: *IsolatedWorld, page: *Page) !void {
if (self.executor.scope != null) return error.Only1IsolatedContextSupported; if (self.executor.js_context != null) return error.Only1IsolatedContextSupported;
_ = try self.executor.startScope(&page.window, page, {}, false); _ = try self.executor.createJsContext(&page.window, page, {}, false);
} }
}; };

View File

@@ -259,13 +259,13 @@ fn resolveNode(cmd: anytype) !void {
const bc = cmd.browser_context orelse return error.BrowserContextNotLoaded; const bc = cmd.browser_context orelse return error.BrowserContextNotLoaded;
const page = bc.session.currentPage() orelse return error.PageNotLoaded; const page = bc.session.currentPage() orelse return error.PageNotLoaded;
var scope = page.scope; var js_context = page.main_context;
if (params.executionContextId) |context_id| { if (params.executionContextId) |context_id| {
if (scope.context.debugContextId() != context_id) { if (js_context.v8_context.debugContextId() != context_id) {
var isolated_world = bc.isolated_world orelse return error.ContextNotFound; var isolated_world = bc.isolated_world orelse return error.ContextNotFound;
scope = &(isolated_world.executor.scope orelse return error.ContextNotFound); js_context = &(isolated_world.executor.js_context orelse return error.ContextNotFound);
if (scope.context.debugContextId() != context_id) return error.ContextNotFound; if (js_context.v8_context.debugContextId() != context_id) return error.ContextNotFound;
} }
} }
@@ -275,7 +275,7 @@ fn resolveNode(cmd: anytype) !void {
// node._node is a *parser.Node we need this to be able to find its most derived type e.g. Node -> Element -> HTMLElement // node._node is a *parser.Node we need this to be able to find its most derived type e.g. Node -> Element -> HTMLElement
// So we use the Node.Union when retrieve the value from the environment // So we use the Node.Union when retrieve the value from the environment
const remote_object = try bc.inspector.getRemoteObject( const remote_object = try bc.inspector.getRemoteObject(
scope, js_context,
params.objectGroup orelse "", params.objectGroup orelse "",
try dom_node.Node.toInterface(node._node), try dom_node.Node.toInterface(node._node),
); );

View File

@@ -117,14 +117,14 @@ fn createIsolatedWorld(cmd: anytype) !void {
const world = try bc.createIsolatedWorld(params.worldName, params.grantUniveralAccess); const world = try bc.createIsolatedWorld(params.worldName, params.grantUniveralAccess);
const page = bc.session.currentPage() orelse return error.PageNotLoaded; const page = bc.session.currentPage() orelse return error.PageNotLoaded;
try pageCreated(bc, page); try pageCreated(bc, page);
const scope = &world.executor.scope.?; const js_context = &world.executor.js_context.?;
// Create the auxdata json for the contextCreated event // Create the auxdata json for the contextCreated event
// Calling contextCreated will assign a Id to the context and send the contextCreated event // Calling contextCreated will assign a Id to the context and send the contextCreated event
const aux_data = try std.fmt.allocPrint(cmd.arena, "{{\"isDefault\":false,\"type\":\"isolated\",\"frameId\":\"{s}\"}}", .{params.frameId}); const aux_data = try std.fmt.allocPrint(cmd.arena, "{{\"isDefault\":false,\"type\":\"isolated\",\"frameId\":\"{s}\"}}", .{params.frameId});
bc.inspector.contextCreated(scope, world.name, "", aux_data, false); bc.inspector.contextCreated(js_context, world.name, "", aux_data, false);
return cmd.sendResult(.{ .executionContextId = scope.context.debugContextId() }, .{}); return cmd.sendResult(.{ .executionContextId = js_context.v8_context.debugContextId() }, .{});
} }
fn navigate(cmd: anytype) !void { fn navigate(cmd: anytype) !void {
@@ -253,7 +253,7 @@ pub fn pageNavigate(arena: Allocator, bc: anytype, event: *const Notification.Pa
const page = bc.session.currentPage() orelse return error.PageNotLoaded; const page = bc.session.currentPage() orelse return error.PageNotLoaded;
const aux_data = try std.fmt.allocPrint(arena, "{{\"isDefault\":true,\"type\":\"default\",\"frameId\":\"{s}\"}}", .{target_id}); const aux_data = try std.fmt.allocPrint(arena, "{{\"isDefault\":true,\"type\":\"default\",\"frameId\":\"{s}\"}}", .{target_id});
bc.inspector.contextCreated( bc.inspector.contextCreated(
page.scope, page.main_context,
"", "",
try page.origin(arena), try page.origin(arena),
aux_data, aux_data,
@@ -264,7 +264,7 @@ pub fn pageNavigate(arena: Allocator, bc: anytype, event: *const Notification.Pa
const aux_json = try std.fmt.allocPrint(arena, "{{\"isDefault\":false,\"type\":\"isolated\",\"frameId\":\"{s}\"}}", .{target_id}); const aux_json = try std.fmt.allocPrint(arena, "{{\"isDefault\":false,\"type\":\"isolated\",\"frameId\":\"{s}\"}}", .{target_id});
// Calling contextCreated will assign a new Id to the context and send the contextCreated event // Calling contextCreated will assign a new Id to the context and send the contextCreated event
bc.inspector.contextCreated( bc.inspector.contextCreated(
&isolated_world.executor.scope.?, &isolated_world.executor.js_context.?,
isolated_world.name, isolated_world.name,
"://", "://",
aux_json, aux_json,
@@ -286,7 +286,7 @@ pub fn pageCreated(bc: anytype, page: *Page) !void {
try isolated_world.createContext(page); try isolated_world.createContext(page);
const polyfill = @import("../../browser/polyfill/polyfill.zig"); const polyfill = @import("../../browser/polyfill/polyfill.zig");
try polyfill.load(bc.arena, &isolated_world.executor.scope.?); try polyfill.load(bc.arena, &isolated_world.executor.js_context.?);
} }
} }

View File

@@ -127,7 +127,7 @@ fn createTarget(cmd: anytype) !void {
{ {
const aux_data = try std.fmt.allocPrint(cmd.arena, "{{\"isDefault\":true,\"type\":\"default\",\"frameId\":\"{s}\"}}", .{target_id}); const aux_data = try std.fmt.allocPrint(cmd.arena, "{{\"isDefault\":true,\"type\":\"default\",\"frameId\":\"{s}\"}}", .{target_id});
bc.inspector.contextCreated( bc.inspector.contextCreated(
page.scope, page.main_context,
"", "",
try page.origin(cmd.arena), try page.origin(cmd.arena),
aux_data, aux_data,

View File

@@ -113,7 +113,7 @@ fn run(arena: Allocator, test_file: []const u8, loader: *FileLoader, err_out: *?
}); });
defer runner.deinit(); defer runner.deinit();
try polyfill.load(arena, runner.page.scope); try polyfill.load(arena, runner.page.main_context);
// loop over the scripts. // loop over the scripts.
const doc = parser.documentHTMLToDocument(runner.page.window.document); const doc = parser.documentHTMLToDocument(runner.page.window.document);
@@ -155,7 +155,7 @@ fn run(arena: Allocator, test_file: []const u8, loader: *FileLoader, err_out: *?
{ {
// wait for all async executions // wait for all async executions
var try_catch: Env.TryCatch = undefined; var try_catch: Env.TryCatch = undefined;
try_catch.init(runner.page.scope); try_catch.init(runner.page.main_context);
defer try_catch.deinit(); defer try_catch.deinit();
try runner.page.loop.run(); try runner.page.loop.run();

File diff suppressed because it is too large Load Diff

View File

@@ -29,7 +29,7 @@ pub fn Runner(comptime State: type, comptime Global: type, comptime types: anyty
return struct { return struct {
env: *Env, env: *Env,
scope: *Env.Scope, js_context: *Env.JsContext,
executor: Env.ExecutionWorld, executor: Env.ExecutionWorld,
pub const Env = js.Env(State, struct { pub const Env = js.Env(State, struct {
@@ -48,7 +48,7 @@ pub fn Runner(comptime State: type, comptime Global: type, comptime types: anyty
self.executor = try self.env.newExecutionWorld(); self.executor = try self.env.newExecutionWorld();
errdefer self.executor.deinit(); errdefer self.executor.deinit();
self.scope = try self.executor.startScope( self.js_context = try self.executor.createJsContext(
if (Global == void) &default_global else global, if (Global == void) &default_global else global,
state, state,
{}, {},
@@ -68,10 +68,10 @@ pub fn Runner(comptime State: type, comptime Global: type, comptime types: anyty
pub fn testCases(self: *Self, cases: []const Case, _: RunOpts) !void { pub fn testCases(self: *Self, cases: []const Case, _: RunOpts) !void {
for (cases, 0..) |case, i| { for (cases, 0..) |case, i| {
var try_catch: Env.TryCatch = undefined; var try_catch: Env.TryCatch = undefined;
try_catch.init(self.scope); try_catch.init(self.js_context);
defer try_catch.deinit(); defer try_catch.deinit();
const value = self.scope.exec(case.@"0", null) catch |err| { const value = self.js_context.exec(case.@"0", null) catch |err| {
if (try try_catch.err(allocator)) |msg| { if (try try_catch.err(allocator)) |msg| {
defer allocator.free(msg); defer allocator.free(msg);
if (isExpectedTypeError(case.@"1", msg)) { if (isExpectedTypeError(case.@"1", msg)) {

View File

@@ -419,17 +419,17 @@ pub const JsRunner = struct {
const RunOpts = struct {}; const RunOpts = struct {};
pub const Case = std.meta.Tuple(&.{ []const u8, ?[]const u8 }); pub const Case = std.meta.Tuple(&.{ []const u8, ?[]const u8 });
pub fn testCases(self: *JsRunner, cases: []const Case, _: RunOpts) !void { pub fn testCases(self: *JsRunner, cases: []const Case, _: RunOpts) !void {
const scope = self.page.scope; const js_context = self.page.main_context;
const arena = self.page.arena; const arena = self.page.arena;
const start = try std.time.Instant.now(); const start = try std.time.Instant.now();
for (cases, 0..) |case, i| { for (cases, 0..) |case, i| {
var try_catch: Env.TryCatch = undefined; var try_catch: Env.TryCatch = undefined;
try_catch.init(scope); try_catch.init(js_context);
defer try_catch.deinit(); defer try_catch.deinit();
const value = scope.exec(case.@"0", null) catch |err| { const value = js_context.exec(case.@"0", null) catch |err| {
if (try try_catch.err(arena)) |msg| { if (try try_catch.err(arena)) |msg| {
std.debug.print("{s}\n\nCase: {d}\n{s}\n", .{ msg, i + 1, case.@"0" }); std.debug.print("{s}\n\nCase: {d}\n{s}\n", .{ msg, i + 1, case.@"0" });
} }
@@ -453,14 +453,14 @@ pub const JsRunner = struct {
} }
pub fn eval(self: *JsRunner, src: []const u8, name: ?[]const u8, err_msg: *?[]const u8) !Env.Value { pub fn eval(self: *JsRunner, src: []const u8, name: ?[]const u8, err_msg: *?[]const u8) !Env.Value {
const scope = self.page.scope; const js_context = self.page.main_context;
const arena = self.page.arena; const arena = self.page.arena;
var try_catch: Env.TryCatch = undefined; var try_catch: Env.TryCatch = undefined;
try_catch.init(scope); try_catch.init(js_context);
defer try_catch.deinit(); defer try_catch.deinit();
return scope.exec(src, name) catch |err| { return js_context.exec(src, name) catch |err| {
if (try try_catch.err(arena)) |msg| { if (try try_catch.err(arena)) |msg| {
err_msg.* = msg; err_msg.* = msg;
std.debug.print("Error running script: {s}\n", .{msg}); std.debug.print("Error running script: {s}\n", .{msg});