Skip to content

Commit eaf8459

Browse files
authored
Merge pull request #1106 from lightpanda-io/nikneym/window-onload-fix
Don't allow object to be set on `window.onload`
2 parents 651521d + fb37b29 commit eaf8459

File tree

2 files changed

+20
-14
lines changed

2 files changed

+20
-14
lines changed

src/browser/html/window.zig

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -111,27 +111,30 @@ pub const Window = struct {
111111
/// Sets `onload_callback`.
112112
pub fn set_onload(self: *Window, maybe_listener: ?EventHandler.Listener, page: *Page) !void {
113113
const event_target = parser.toEventTarget(Window, self);
114+
const event_type = "load";
114115

116+
// Check if we have a listener set.
115117
if (self.onload_callback) |callback| {
116-
// If we got here, it means `onload_callback` has been set before
117-
// so listener cannot be null.
118-
const listener = try parser.eventTargetHasListener(event_target, "load", false, callback.id);
118+
const listener = try parser.eventTargetHasListener(event_target, event_type, false, callback.id);
119119
std.debug.assert(listener != null);
120-
121-
try parser.eventTargetRemoveEventListener(event_target, "load", listener.?, false);
120+
try parser.eventTargetRemoveEventListener(event_target, event_type, listener.?, false);
122121
}
123122

124123
if (maybe_listener) |listener| {
125-
// The only time this can return null if the listener is already
126-
// registered. But before calling `register`, all of our functions
127-
// remove any existing listener, so it should be impossible to get null
128-
// from this function call.
129-
_ = try EventHandler.register(page.arena, event_target, "load", listener, null) orelse unreachable;
130-
self.onload_callback = listener.function;
131-
} else {
132-
// Just unset the listener.
133-
self.onload_callback = null;
124+
switch (listener) {
125+
// If an object is given as listener, do nothing.
126+
.object => {},
127+
.function => |callback| {
128+
_ = try EventHandler.register(page.arena, event_target, event_type, listener, null) orelse unreachable;
129+
self.onload_callback = callback;
130+
131+
return;
132+
},
133+
}
134134
}
135+
136+
// Just unset the listener.
137+
self.onload_callback = null;
135138
}
136139

137140
pub fn get_window(self: *Window) *Window {

src/tests/window/window.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,9 @@
111111
const callback = (e) => isWindowTarget = e.target === window;
112112
// Callback is not set yet.
113113
testing.expectEqual(null, window.onload);
114+
// Setting an object.
115+
window.onload = {};
116+
testing.expectEqual(null, window.onload);
114117
// Callback is set.
115118
window.onload = callback;
116119
testing.expectEqual(callback, window.onload);

0 commit comments

Comments
 (0)