Skip to content

Commit 44a76e5

Browse files
committed
run pumpmessageloop in its own loop
1 parent 1504e36 commit 44a76e5

File tree

2 files changed

+18
-0
lines changed

2 files changed

+18
-0
lines changed

src/browser/browser.zig

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,10 @@ pub const Browser = struct {
9898

9999
pub fn runMicrotasks(self: *const Browser) void {
100100
self.env.runMicrotasks();
101+
}
102+
103+
pub fn runMessageLoop(self: *const Browser) void {
104+
log.debug(.browser, "pumpMessageLoop", .{});
101105
while (self.env.pumpMessageLoop()) {
102106
log.debug(.browser, "pumpMessageLoop", .{});
103107
}

src/browser/page.zig

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,10 @@ pub const Page = struct {
7878

7979
renderer: Renderer,
8080

81+
// run v8 micro tasks
8182
microtask_node: Loop.CallbackNode,
83+
// run v8 pump message loop and idle tasks
84+
messageloop_node: Loop.CallbackNode,
8285

8386
keydown_event_node: parser.EventNode,
8487
window_clicked_event_node: parser.EventNode,
@@ -106,6 +109,7 @@ pub const Page = struct {
106109
.state_pool = &browser.state_pool,
107110
.cookie_jar = &session.cookie_jar,
108111
.microtask_node = .{ .func = microtaskCallback },
112+
.messageloop_node = .{ .func = messageLoopCallback },
109113
.keydown_event_node = .{ .func = keydownCallback },
110114
.window_clicked_event_node = .{ .func = windowClicked },
111115
.request_factory = browser.http_client.requestFactory(.{
@@ -119,6 +123,10 @@ pub const Page = struct {
119123
try polyfill.load(self.arena, self.main_context);
120124

121125
_ = try session.browser.app.loop.timeout(1 * std.time.ns_per_ms, &self.microtask_node);
126+
// message loop must run only non-test env
127+
if (comptime !builtin.is_test) {
128+
_ = try session.browser.app.loop.timeout(1 * std.time.ns_per_ms, &self.messageloop_node);
129+
}
122130
}
123131

124132
fn microtaskCallback(node: *Loop.CallbackNode, repeat_delay: *?u63) void {
@@ -127,6 +135,12 @@ pub const Page = struct {
127135
repeat_delay.* = 1 * std.time.ns_per_ms;
128136
}
129137

138+
fn messageLoopCallback(node: *Loop.CallbackNode, repeat_delay: *?u63) void {
139+
const self: *Page = @fieldParentPtr("messageloop_node", node);
140+
self.session.browser.runMessageLoop();
141+
repeat_delay.* = 100 * std.time.ns_per_ms;
142+
}
143+
130144
// dump writes the page content into the given file.
131145
pub fn dump(self: *const Page, out: std.fs.File) !void {
132146
if (self.raw_data) |raw_data| {

0 commit comments

Comments
 (0)