From fb37b29671360488225fc3436b3f66d2d6cae8ed Mon Sep 17 00:00:00 2001 From: nikneym Date: Tue, 30 Sep 2025 12:38:08 +0300 Subject: [PATCH] don't allow object to be set on `window.onload` --- src/browser/html/window.zig | 31 +++++++++++++++++-------------- src/tests/window/window.html | 3 +++ 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/browser/html/window.zig b/src/browser/html/window.zig index 00c374ae2..b0ade3fc8 100644 --- a/src/browser/html/window.zig +++ b/src/browser/html/window.zig @@ -111,27 +111,30 @@ pub const Window = struct { /// Sets `onload_callback`. pub fn set_onload(self: *Window, maybe_listener: ?EventHandler.Listener, page: *Page) !void { const event_target = parser.toEventTarget(Window, self); + const event_type = "load"; + // Check if we have a listener set. 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); + const listener = try parser.eventTargetHasListener(event_target, event_type, false, callback.id); std.debug.assert(listener != null); - - try parser.eventTargetRemoveEventListener(event_target, "load", listener.?, false); + try parser.eventTargetRemoveEventListener(event_target, event_type, 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; + switch (listener) { + // If an object is given as listener, do nothing. + .object => {}, + .function => |callback| { + _ = try EventHandler.register(page.arena, event_target, event_type, listener, null) orelse unreachable; + self.onload_callback = callback; + + return; + }, + } } + + // Just unset the listener. + self.onload_callback = null; } pub fn get_window(self: *Window) *Window { diff --git a/src/tests/window/window.html b/src/tests/window/window.html index f97c2f23e..62129a14b 100644 --- a/src/tests/window/window.html +++ b/src/tests/window/window.html @@ -111,6 +111,9 @@ const callback = (e) => isWindowTarget = e.target === window; // Callback is not set yet. testing.expectEqual(null, window.onload); + // Setting an object. + window.onload = {}; + testing.expectEqual(null, window.onload); // Callback is set. window.onload = callback; testing.expectEqual(callback, window.onload);