diff --git a/src/browser/browser.zig b/src/browser/browser.zig index 635390c4..cc153870 100644 --- a/src/browser/browser.zig +++ b/src/browser/browser.zig @@ -214,6 +214,20 @@ pub const Page = struct { }; } + // start js env. + pub fn start(self: *Page) !void { + // start JS env + log.debug("start js env", .{}); + try self.session.env.start(); + + // register the module loader + try self.session.env.setModuleLoadFn(self.session, Session.fetchModule); + + // add global objects + log.debug("setup global env", .{}); + try self.session.env.bindGlobal(&self.session.window); + } + // reset js env and mem arena. pub fn end(self: *Page) void { self.session.env.stop(); @@ -373,14 +387,6 @@ pub const Page = struct { // https://html.spec.whatwg.org/#read-html - // start JS env - // TODO load the js env concurrently with the HTML parsing. - log.debug("start js env", .{}); - try self.session.env.start(); - - // register the module loader - try self.session.env.setModuleLoadFn(self.session, Session.fetchModule); - // load polyfills try polyfill.load(alloc, self.session.env); @@ -395,10 +401,6 @@ pub const Page = struct { .httpClient = &self.session.httpClient, }); - // add global objects - log.debug("setup global env", .{}); - try self.session.env.bindGlobal(&self.session.window); - // browse the DOM tree to retrieve scripts // TODO execute the synchronous scripts during the HTL parsing. // TODO fetch the script resources concurrently but execute them in the diff --git a/src/cdp/page.zig b/src/cdp/page.zig index cf86297f..d453e9d5 100644 --- a/src/cdp/page.zig +++ b/src/cdp/page.zig @@ -331,8 +331,9 @@ fn navigate( // TODO: noop event, we have no env context at this point, is it necesarry? try sendEvent(alloc, ctx, "Runtime.executionContextsCleared", void, {}, input.sessionId); - // Launch navigate - const p = try ctx.browser.session.createPage(); + // Launch navigate, the page must have been created by a + // target.createTarget. + var p = ctx.browser.session.page orelse return error.NoPage; ctx.state.executionContextId += 1; const auxData = try std.fmt.allocPrint( alloc, diff --git a/src/cdp/target.zig b/src/cdp/target.zig index 6d3c611b..048c1d68 100644 --- a/src/cdp/target.zig +++ b/src/cdp/target.zig @@ -344,6 +344,14 @@ fn createTarget( ctx.state.loaderID = LoaderID; ctx.state.sessionID = msg.sessionId; + // TODO stop the previous page instead? + if (ctx.browser.session.page != null) return error.pageAlreadyExists; + + // create the page + const p = try ctx.browser.session.createPage(); + // start the js env + try p.start(); + // send targetCreated event const created = TargetCreated{ .sessionId = cdp.ContextSessionID, @@ -440,6 +448,8 @@ fn closeTarget( null, ); + if (ctx.browser.session.page != null) ctx.browser.session.page.?.end(); + return ""; } diff --git a/src/main.zig b/src/main.zig index 84e23536..787f1501 100644 --- a/src/main.zig +++ b/src/main.zig @@ -326,6 +326,8 @@ pub fn main() !void { // page const page = try browser.session.createPage(); + try page.start(); + defer page.end(); _ = page.navigate(opts.url, null) catch |err| switch (err) { error.UnsupportedUriScheme, error.UriMissingHost => {