prefer Scheduler.ScheduleInterface instead of callbacks

Commit before introduces `Scheduler.ScheduleInterface` which allow consumers to pass types that contain `action` and `finalize` callbacks.
This commit is contained in:
Halil Durak
2026-02-03 15:10:01 +03:00
parent 03018c28b4
commit 2dd59da2bb
4 changed files with 29 additions and 41 deletions

View File

@@ -380,16 +380,16 @@ fn registerBackgroundTasks(self: *Page) !void {
const Browser = @import("Browser.zig"); const Browser = @import("Browser.zig");
return self.scheduler.after( return self.scheduler.after(
.{ .name = "runMessageLoop", .priority = .high }, .{ .name = "runMessageLoop", .prio = .high },
Browser, Browser,
self._session.browser, self._session.browser,
250, 250,
struct { struct {
fn runMessageLoop(_: *Scheduler, browser: *Browser) !Scheduler.AfterAction { pub fn action(_: *Scheduler, browser: *Browser) !Scheduler.AfterAction {
browser.runMessageLoop(); browser.runMessageLoop();
return .repeat(250); return .repeat(250);
} }
}.runMessageLoop, },
); );
} }
@@ -1268,11 +1268,11 @@ pub fn notifyPerformanceObservers(self: *Page, entry: *Performance.Entry) !void
self._performance_delivery_scheduled = true; self._performance_delivery_scheduled = true;
return self.scheduler.once( return self.scheduler.once(
.{ .priority = .low }, .{ .prio = .low },
Page, Page,
self, self,
struct { struct {
fn run(_: *Scheduler, page: *Page) !void { pub fn action(_: *Scheduler, page: *Page) !void {
page._performance_delivery_scheduled = false; page._performance_delivery_scheduled = false;
// Dispatch performance observers. // Dispatch performance observers.
@@ -1282,7 +1282,7 @@ pub fn notifyPerformanceObservers(self: *Page, entry: *Performance.Entry) !void
} }
} }
} }
}.run, },
); );
} }

View File

@@ -100,16 +100,12 @@ pub fn createTimeout(delay: u32, page: *Page) !*AbortSignal {
.signal = try init(page), .signal = try init(page),
}; };
//try page.scheduler.add(callback, TimeoutCallback.run, delay, .{
// .name = "AbortSignal.timeout",
//});
try page.scheduler.after( try page.scheduler.after(
.{ .name = "AbortSignal.timeout", .priority = .high }, .{ .name = "AbortSignal.timeout", .prio = .high },
TimeoutCallback, TimeoutCallback,
callback, callback,
delay, delay,
TimeoutCallback.run, TimeoutCallback,
); );
return callback.signal; return callback.signal;
@@ -143,7 +139,7 @@ const TimeoutCallback = struct {
page: *Page, page: *Page,
signal: *AbortSignal, signal: *AbortSignal,
fn run(_: *Scheduler, self: *TimeoutCallback) !Scheduler.AfterAction { pub fn action(_: *Scheduler, self: *TimeoutCallback) !Scheduler.AfterAction {
var ls: js.Local.Scope = undefined; var ls: js.Local.Scope = undefined;
self.page.js.localScope(&ls); self.page.js.localScope(&ls);
defer ls.deinit(); defer ls.deinit();

View File

@@ -67,10 +67,10 @@ pub fn postMessage(self: *MessagePort, message: js.Value.Global, page: *Page) !v
}); });
try page.scheduler.once( try page.scheduler.once(
.{ .name = "MessagePort.postMessage", .priority = .high }, .{ .name = "MessagePort.postMessage", .prio = .high },
PostMessageCallback, PostMessageCallback,
callback, callback,
PostMessageCallback.run, PostMessageCallback,
); );
} }
@@ -116,7 +116,7 @@ const PostMessageCallback = struct {
self.page._factory.destroy(self); self.page._factory.destroy(self);
} }
fn run(_: *Scheduler, self: *PostMessageCallback) !void { pub fn action(_: *Scheduler, self: *PostMessageCallback) !void {
defer self.deinit(); defer self.deinit();
const page = self.page; const page = self.page;

View File

@@ -368,17 +368,11 @@ pub fn postMessage(self: *Window, message: js.Value.Global, target_origin: ?[]co
.origin = try arena.dupe(u8, origin), .origin = try arena.dupe(u8, origin),
}; };
//try page.scheduler.add(callback, PostMessageCallback.run, 0, .{
// .name = "postMessage",
// .low_priority = false,
// .finalizer = PostMessageCallback.cancelled,
//});
return page.scheduler.once( return page.scheduler.once(
.{ .name = "postMessage", .priority = .high }, .{ .name = "postMessage", .prio = .high },
PostMessageCallback, PostMessageCallback,
callback, callback,
PostMessageCallback.run, PostMessageCallback,
); );
} }
@@ -457,11 +451,11 @@ pub fn scrollTo(self: *Window, opts: ScrollToOpts, y: ?i32, page: *Page) !void {
// We dispatch scroll event asynchronously after 10ms. So we can throttle // We dispatch scroll event asynchronously after 10ms. So we can throttle
// them. // them.
try page.scheduler.once( try page.scheduler.once(
.{ .priority = .low }, .{ .prio = .low },
Page, Page,
page, page,
struct { struct {
fn dispatch(_: *Scheduler, p: *Page) !void { pub fn action(_: *Scheduler, p: *Page) !void {
const pos = &p.window._scroll_pos; const pos = &p.window._scroll_pos;
// If the state isn't scroll, we can ignore safely to throttle // If the state isn't scroll, we can ignore safely to throttle
// the events. // the events.
@@ -476,17 +470,17 @@ pub fn scrollTo(self: *Window, opts: ScrollToOpts, y: ?i32, page: *Page) !void {
return; return;
} }
}.dispatch, },
); );
// We dispatch scrollend event asynchronously after 20ms. // We dispatch scrollend event asynchronously after 20ms.
try page.scheduler.after( try page.scheduler.after(
.{ .priority = .low }, .{ .prio = .low },
Page, Page,
page, page,
20, 20,
struct { struct {
fn dispatch(_: *Scheduler, p: *Page) !Scheduler.AfterAction { pub fn action(_: *Scheduler, p: *Page) !Scheduler.AfterAction {
const pos = &p.window._scroll_pos; const pos = &p.window._scroll_pos;
// Dispatch only if the state is .end. // Dispatch only if the state is .end.
// If a scroll is pending, retry in 10ms. // If a scroll is pending, retry in 10ms.
@@ -504,7 +498,7 @@ pub fn scrollTo(self: *Window, opts: ScrollToOpts, y: ?i32, page: *Page) !void {
return .dont_repeat; return .dont_repeat;
} }
}.dispatch, },
); );
} }
@@ -561,11 +555,11 @@ fn scheduleCallback(self: *Window, cb: js.Function.Temp, delay_ms: u32, opts: Sc
//}); //});
try page.scheduler.after( try page.scheduler.after(
.{ .priority = .high }, .{ .prio = .high },
ScheduleCallback, ScheduleCallback,
callback, callback,
delay_ms, delay_ms,
ScheduleCallback.run, ScheduleCallback,
); );
return timer_id; return timer_id;
@@ -595,11 +589,6 @@ const ScheduleCallback = struct {
animation_frame, animation_frame,
}; };
fn cancelled(ctx: *anyopaque) void {
var self: *ScheduleCallback = @ptrCast(@alignCast(ctx));
self.deinit();
}
fn deinit(self: *ScheduleCallback) void { fn deinit(self: *ScheduleCallback) void {
self.page.js.release(self.cb); self.page.js.release(self.cb);
for (self.params) |param| { for (self.params) |param| {
@@ -608,7 +597,11 @@ const ScheduleCallback = struct {
self.page.releaseArena(self.arena); self.page.releaseArena(self.arena);
} }
fn run(_: *Scheduler, self: *ScheduleCallback) !Scheduler.AfterAction { pub fn finalize(self: *ScheduleCallback) void {
self.deinit();
}
pub fn action(_: *Scheduler, self: *ScheduleCallback) !Scheduler.AfterAction {
const page = self.page; const page = self.page;
const window = page.window; const window = page.window;
@@ -660,12 +653,11 @@ const PostMessageCallback = struct {
self.page.releaseArena(self.arena); self.page.releaseArena(self.arena);
} }
fn cancelled(ctx: *anyopaque) void { pub fn finalize(self: *PostMessageCallback) void {
const self: *PostMessageCallback = @ptrCast(@alignCast(ctx));
self.page.releaseArena(self.arena); self.page.releaseArena(self.arena);
} }
fn run(_: *Scheduler, self: *PostMessageCallback) !void { pub fn action(_: *Scheduler, self: *PostMessageCallback) !void {
defer self.deinit(); defer self.deinit();
const page = self.page; const page = self.page;