@@ -20,7 +20,7 @@ const std = @import("std");
2020
2121const log = @import ("../../log.zig" );
2222const parser = @import ("../netsurf.zig" );
23- const Function = @import ("../env.zig" ).Function ;
23+ const Env = @import ("../env.zig" ).Env ;
2424const Page = @import ("../page.zig" ).Page ;
2525const Loop = @import ("../../runtime/loop.zig" ).Loop ;
2626
@@ -36,6 +36,9 @@ const CSSStyleDeclaration = @import("../cssom/css_style_declaration.zig").CSSSty
3636const Screen = @import ("screen.zig" ).Screen ;
3737const Css = @import ("../css/css.zig" ).Css ;
3838
39+ const Function = Env .Function ;
40+ const JsObject = Env .JsObject ;
41+
3942const storage = @import ("../storage/storage.zig" );
4043
4144// https://dom.spec.whatwg.org/#interface-window-extensions
@@ -184,13 +187,12 @@ pub const Window = struct {
184187 return page .loop .cancel (kv .value .loop_id );
185188 }
186189
187- pub fn _setTimeout (self : * Window , cbk : Function , delay : ? u32 , page : * Page ) ! u32 {
188- return self .createTimeout (cbk , delay , page , .{});
190+ pub fn _setTimeout (self : * Window , cbk : Function , delay : ? u32 , params : [] Env.JsObject , page : * Page ) ! u32 {
191+ return self .createTimeout (cbk , delay , page , .{ . args = params });
189192 }
190193
191- // TODO handle callback arguments.
192- pub fn _setInterval (self : * Window , cbk : Function , delay : ? u32 , page : * Page ) ! u32 {
193- return self .createTimeout (cbk , delay , page , .{ .repeat = true });
194+ pub fn _setInterval (self : * Window , cbk : Function , delay : ? u32 , params : []Env.JsObject , page : * Page ) ! u32 {
195+ return self .createTimeout (cbk , delay , page , .{ .repeat = true , .args = params });
194196 }
195197
196198 pub fn _clearTimeout (self : * Window , id : u32 , page : * Page ) ! void {
@@ -230,10 +232,11 @@ pub const Window = struct {
230232 }
231233
232234 const CreateTimeoutOpts = struct {
235+ args : []Env.JsObject = &.{},
233236 repeat : bool = false ,
234237 animation_frame : bool = false ,
235238 };
236- fn createTimeout (self : * Window , cbk : Function , delay_ : ? u32 , page : * Page , comptime opts : CreateTimeoutOpts ) ! u32 {
239+ fn createTimeout (self : * Window , cbk : Function , delay_ : ? u32 , page : * Page , opts : CreateTimeoutOpts ) ! u32 {
237240 const delay = delay_ orelse 0 ;
238241 if (delay > 5000 ) {
239242 log .warn (.user_script , "long timeout ignored" , .{ .delay = delay , .interval = opts .repeat });
@@ -258,6 +261,15 @@ pub const Window = struct {
258261 }
259262 errdefer _ = self .timers .remove (timer_id );
260263
264+ const args = opts .args ;
265+ var persisted_args : []Env.JsObject = &.{};
266+ if (args .len > 0 ) {
267+ persisted_args = try page .arena .alloc (Env .JsObject , args .len );
268+ for (args , persisted_args ) | a , * ca | {
269+ ca .* = try a .persist ();
270+ }
271+ }
272+
261273 const delay_ms : u63 = @as (u63 , delay ) * std .time .ns_per_ms ;
262274 const callback = try arena .create (TimerCallback );
263275
@@ -266,6 +278,7 @@ pub const Window = struct {
266278 .loop_id = 0 , // we're going to set this to a real value shortly
267279 .window = self ,
268280 .timer_id = timer_id ,
281+ .args = persisted_args ,
269282 .node = .{ .func = TimerCallback .run },
270283 .repeat = if (opts .repeat ) delay_ms else null ,
271284 .animation_frame = opts .animation_frame ,
@@ -344,6 +357,8 @@ const TimerCallback = struct {
344357
345358 window : * Window ,
346359
360+ args : []Env.JsObject = &.{},
361+
347362 fn run (node : * Loop.CallbackNode , repeat_delay : * ? u63 ) void {
348363 const self : * TimerCallback = @fieldParentPtr ("node" , node );
349364
@@ -353,7 +368,7 @@ const TimerCallback = struct {
353368 if (self .animation_frame ) {
354369 call = self .cbk .tryCall (void , .{self .window .performance ._now ()}, & result );
355370 } else {
356- call = self .cbk .tryCall (void , .{} , & result );
371+ call = self .cbk .tryCall (void , self . args , & result );
357372 }
358373
359374 call catch {
@@ -427,11 +442,17 @@ test "Browser.HTML.Window" {
427442 .{ "innerWidth" , "2" },
428443 }, .{});
429444
430- // cancelAnimationFrame should be able to cancel a request with the given id
431445 try runner .testCases (&.{
432446 .{ "let longCall = false;" , null },
433447 .{ "window.setTimeout(() => {longCall = true}, 5001);" , null },
434448 .{ "longCall;" , "false" },
449+
450+ .{ "let wst = 0;" , null },
451+ .{ "window.setTimeout(() => {wst += 1}, 1)" , null },
452+ .{ "wst" , "1" },
453+
454+ .{ "window.setTimeout((a, b) => {wst = a + b}, 1, 2, 3)" , null },
455+ .{ "wst" , "5" },
435456 }, .{});
436457
437458 // window event target
0 commit comments