mirror of
https://github.com/lightpanda-io/browser.git
synced 2025-10-29 15:13:28 +00:00
Make intervals easier and faster, add window.setInterval and clearInterval
When the browser microtask was added, zig-specific timeout functions were added to the loop. This was necessary for two reasons: 1 - The existing functions were JS specific 2 - We wanted a different reset counter for JS and Zig Like we did in https://github.com/lightpanda-io/browser/pull/577, the loop is now JS-agnostic. It gets a Zig callback, and the Zig callback can execute JS (or do whatever). An intrusive node, like with events, is used to minimize allocations. Also, because the microtask was recently moved to the page, there is no longer a need for separate event counters. All timeouts are scoped to the page. The new timeout callback can now be used to efficiently reschedule a task. This reuses the IO.completion and Context, avoiding 2 allocations. More importantly it makes the internal timer_id static for the lifetime of an "interval". This is important for window.setInterval, where the callback can itself clear the interval, which we would need to detect in the callback handler to avoid re-scheduling. With the stable timer_id, the existing cancel mechanism works as expected. The loop no longer has a cbk_error. Callback code is expected to try/catch callbacks (or use callback.tryCall) and handle errors accordingly.
This commit is contained in:
@@ -1042,9 +1042,6 @@ pub fn run(
|
||||
// - JS callbacks events from scripts
|
||||
while (true) {
|
||||
try loop.io.run_for_ns(10 * std.time.ns_per_ms);
|
||||
if (loop.cbk_error) {
|
||||
log.err("JS error", .{});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user