@@ -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