mirror of
https://github.com/lightpanda-io/browser.git
synced 2025-10-29 23:23:28 +00:00
run pumpmessageloop in its own loop
This commit is contained in:
@@ -98,6 +98,10 @@ pub const Browser = struct {
|
|||||||
|
|
||||||
pub fn runMicrotasks(self: *const Browser) void {
|
pub fn runMicrotasks(self: *const Browser) void {
|
||||||
self.env.runMicrotasks();
|
self.env.runMicrotasks();
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn runMessageLoop(self: *const Browser) void {
|
||||||
|
log.debug(.browser, "pumpMessageLoop", .{});
|
||||||
while (self.env.pumpMessageLoop()) {
|
while (self.env.pumpMessageLoop()) {
|
||||||
log.debug(.browser, "pumpMessageLoop", .{});
|
log.debug(.browser, "pumpMessageLoop", .{});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,7 +78,10 @@ pub const Page = struct {
|
|||||||
|
|
||||||
renderer: Renderer,
|
renderer: Renderer,
|
||||||
|
|
||||||
|
// run v8 micro tasks
|
||||||
microtask_node: Loop.CallbackNode,
|
microtask_node: Loop.CallbackNode,
|
||||||
|
// run v8 pump message loop and idle tasks
|
||||||
|
messageloop_node: Loop.CallbackNode,
|
||||||
|
|
||||||
keydown_event_node: parser.EventNode,
|
keydown_event_node: parser.EventNode,
|
||||||
window_clicked_event_node: parser.EventNode,
|
window_clicked_event_node: parser.EventNode,
|
||||||
@@ -106,6 +109,7 @@ pub const Page = struct {
|
|||||||
.state_pool = &browser.state_pool,
|
.state_pool = &browser.state_pool,
|
||||||
.cookie_jar = &session.cookie_jar,
|
.cookie_jar = &session.cookie_jar,
|
||||||
.microtask_node = .{ .func = microtaskCallback },
|
.microtask_node = .{ .func = microtaskCallback },
|
||||||
|
.messageloop_node = .{ .func = messageLoopCallback },
|
||||||
.keydown_event_node = .{ .func = keydownCallback },
|
.keydown_event_node = .{ .func = keydownCallback },
|
||||||
.window_clicked_event_node = .{ .func = windowClicked },
|
.window_clicked_event_node = .{ .func = windowClicked },
|
||||||
.request_factory = browser.http_client.requestFactory(.{
|
.request_factory = browser.http_client.requestFactory(.{
|
||||||
@@ -119,6 +123,10 @@ pub const Page = struct {
|
|||||||
try polyfill.load(self.arena, self.main_context);
|
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);
|
||||||
|
// 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 {
|
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;
|
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.
|
// dump writes the page content into the given file.
|
||||||
pub fn dump(self: *const Page, out: std.fs.File) !void {
|
pub fn dump(self: *const Page, out: std.fs.File) !void {
|
||||||
if (self.raw_data) |raw_data| {
|
if (self.raw_data) |raw_data| {
|
||||||
|
|||||||
Reference in New Issue
Block a user