From 44a76e59f98690cb3224a6c36e51ef718203390a Mon Sep 17 00:00:00 2001 From: Pierre Tachoire Date: Wed, 2 Jul 2025 13:16:20 -0700 Subject: [PATCH] run pumpmessageloop in its own loop --- src/browser/browser.zig | 4 ++++ src/browser/page.zig | 14 ++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/browser/browser.zig b/src/browser/browser.zig index 623df886..d132a860 100644 --- a/src/browser/browser.zig +++ b/src/browser/browser.zig @@ -98,6 +98,10 @@ pub const Browser = struct { pub fn runMicrotasks(self: *const Browser) void { self.env.runMicrotasks(); + } + + pub fn runMessageLoop(self: *const Browser) void { + log.debug(.browser, "pumpMessageLoop", .{}); while (self.env.pumpMessageLoop()) { log.debug(.browser, "pumpMessageLoop", .{}); } diff --git a/src/browser/page.zig b/src/browser/page.zig index e8f92216..fd750b3d 100644 --- a/src/browser/page.zig +++ b/src/browser/page.zig @@ -78,7 +78,10 @@ pub const Page = struct { renderer: Renderer, + // run v8 micro tasks microtask_node: Loop.CallbackNode, + // run v8 pump message loop and idle tasks + messageloop_node: Loop.CallbackNode, keydown_event_node: parser.EventNode, window_clicked_event_node: parser.EventNode, @@ -106,6 +109,7 @@ pub const Page = struct { .state_pool = &browser.state_pool, .cookie_jar = &session.cookie_jar, .microtask_node = .{ .func = microtaskCallback }, + .messageloop_node = .{ .func = messageLoopCallback }, .keydown_event_node = .{ .func = keydownCallback }, .window_clicked_event_node = .{ .func = windowClicked }, .request_factory = browser.http_client.requestFactory(.{ @@ -119,6 +123,10 @@ pub const Page = struct { try polyfill.load(self.arena, self.main_context); _ = try session.browser.app.loop.timeout(1 * std.time.ns_per_ms, &self.microtask_node); + // message loop must run only non-test env + if (comptime !builtin.is_test) { + _ = try session.browser.app.loop.timeout(1 * std.time.ns_per_ms, &self.messageloop_node); + } } fn microtaskCallback(node: *Loop.CallbackNode, repeat_delay: *?u63) void { @@ -127,6 +135,12 @@ pub const Page = struct { repeat_delay.* = 1 * std.time.ns_per_ms; } + fn messageLoopCallback(node: *Loop.CallbackNode, repeat_delay: *?u63) void { + const self: *Page = @fieldParentPtr("messageloop_node", node); + self.session.browser.runMessageLoop(); + repeat_delay.* = 100 * std.time.ns_per_ms; + } + // dump writes the page content into the given file. pub fn dump(self: *const Page, out: std.fs.File) !void { if (self.raw_data) |raw_data| {