don't allow object to be set on window.onload

This commit is contained in:
nikneym
2025-09-30 12:38:08 +03:00
parent 20cb6cdd8b
commit fb37b29671
2 changed files with 20 additions and 14 deletions

View File

@@ -111,27 +111,30 @@ pub const Window = struct {
/// Sets `onload_callback`. /// Sets `onload_callback`.
pub fn set_onload(self: *Window, maybe_listener: ?EventHandler.Listener, page: *Page) !void { pub fn set_onload(self: *Window, maybe_listener: ?EventHandler.Listener, page: *Page) !void {
const event_target = parser.toEventTarget(Window, self); const event_target = parser.toEventTarget(Window, self);
const event_type = "load";
// Check if we have a listener set.
if (self.onload_callback) |callback| { if (self.onload_callback) |callback| {
// If we got here, it means `onload_callback` has been set before const listener = try parser.eventTargetHasListener(event_target, event_type, false, callback.id);
// so listener cannot be null.
const listener = try parser.eventTargetHasListener(event_target, "load", false, callback.id);
std.debug.assert(listener != null); std.debug.assert(listener != null);
try parser.eventTargetRemoveEventListener(event_target, event_type, listener.?, false);
try parser.eventTargetRemoveEventListener(event_target, "load", listener.?, false);
} }
if (maybe_listener) |listener| { if (maybe_listener) |listener| {
// The only time this can return null if the listener is already switch (listener) {
// registered. But before calling `register`, all of our functions // If an object is given as listener, do nothing.
// remove any existing listener, so it should be impossible to get null .object => {},
// from this function call. .function => |callback| {
_ = try EventHandler.register(page.arena, event_target, "load", listener, null) orelse unreachable; _ = try EventHandler.register(page.arena, event_target, event_type, listener, null) orelse unreachable;
self.onload_callback = listener.function; self.onload_callback = callback;
} else {
// Just unset the listener. return;
self.onload_callback = null; },
}
} }
// Just unset the listener.
self.onload_callback = null;
} }
pub fn get_window(self: *Window) *Window { pub fn get_window(self: *Window) *Window {

View File

@@ -111,6 +111,9 @@
const callback = (e) => isWindowTarget = e.target === window; const callback = (e) => isWindowTarget = e.target === window;
// Callback is not set yet. // Callback is not set yet.
testing.expectEqual(null, window.onload); testing.expectEqual(null, window.onload);
// Setting an object.
window.onload = {};
testing.expectEqual(null, window.onload);
// Callback is set. // Callback is set.
window.onload = callback; window.onload = callback;
testing.expectEqual(callback, window.onload); testing.expectEqual(callback, window.onload);