From c587e380a0ca8617e1042fdaf4715da8229b5ad0 Mon Sep 17 00:00:00 2001 From: nikneym Date: Mon, 29 Sep 2025 14:45:35 +0300 Subject: [PATCH 1/2] add `window.onload` getter and setter --- src/browser/html/window.zig | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/browser/html/window.zig b/src/browser/html/window.zig index 0478bea8..00c374ae 100644 --- a/src/browser/html/window.zig +++ b/src/browser/html/window.zig @@ -35,6 +35,7 @@ const CSSStyleDeclaration = @import("../cssom/CSSStyleDeclaration.zig"); const Screen = @import("screen.zig").Screen; const domcss = @import("../dom/css.zig"); const Css = @import("../css/css.zig").Css; +const EventHandler = @import("../events/event.zig").EventHandler; const Function = Env.Function; @@ -67,6 +68,7 @@ pub const Window = struct { performance: Performance, screen: Screen = .{}, css: Css = .{}, + onload_callback: ?Function = null, pub fn create(target: ?[]const u8, navigator: ?Navigator) !Window { var fbs = std.io.fixedBufferStream(""); @@ -101,6 +103,37 @@ pub const Window = struct { return fetchFn(input, options, page); } + /// Returns `onload_callback`. + pub fn get_onload(self: *const Window) ?Function { + return self.onload_callback; + } + + /// Sets `onload_callback`. + pub fn set_onload(self: *Window, maybe_listener: ?EventHandler.Listener, page: *Page) !void { + const event_target = parser.toEventTarget(Window, self); + + if (self.onload_callback) |callback| { + // If we got here, it means `onload_callback` has been set before + // so listener cannot be null. + const listener = try parser.eventTargetHasListener(event_target, "load", false, callback.id); + std.debug.assert(listener != null); + + try parser.eventTargetRemoveEventListener(event_target, "load", listener.?, false); + } + + if (maybe_listener) |listener| { + // The only time this can return null if the listener is already + // registered. But before calling `register`, all of our functions + // remove any existing listener, so it should be impossible to get null + // from this function call. + _ = try EventHandler.register(page.arena, event_target, "load", listener, null) orelse unreachable; + self.onload_callback = listener.function; + } else { + // Just unset the listener. + self.onload_callback = null; + } + } + pub fn get_window(self: *Window) *Window { return self; } From 1d50e091c701435d256530ba6d0613ad7214df73 Mon Sep 17 00:00:00 2001 From: nikneym Date: Mon, 29 Sep 2025 14:45:47 +0300 Subject: [PATCH 2/2] add `window.onload` test --- src/tests/window/window.html | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/tests/window/window.html b/src/tests/window/window.html index 3d67e9be..f97c2f23 100644 --- a/src/tests/window/window.html +++ b/src/tests/window/window.html @@ -104,3 +104,16 @@ }); testing.eventually(() => testing.expectEqual(true, dcl)); + +