@@ -44,6 +44,8 @@ const fetchFn = @import("../fetch/fetch.zig").fetch;
4444const storage = @import ("../storage/storage.zig" );
4545const ErrorEvent = @import ("error_event.zig" ).ErrorEvent ;
4646
47+ const DirectEventHandler = @import ("../events/event.zig" ).DirectEventHandler ;
48+
4749// https://dom.spec.whatwg.org/#interface-window-extensions
4850// https://html.spec.whatwg.org/multipage/nav-history-apis.html#window
4951pub const Window = struct {
@@ -70,6 +72,7 @@ pub const Window = struct {
7072 scroll_x : u32 = 0 ,
7173 scroll_y : u32 = 0 ,
7274 onload_callback : ? js.Function = null ,
75+ onpopstate_callback : ? js.Function = null ,
7376
7477 pub fn create (target : ? []const u8 , navigator : ? Navigator ) ! Window {
7578 var fbs = std .io .fixedBufferStream ("" );
@@ -111,31 +114,17 @@ pub const Window = struct {
111114
112115 /// Sets `onload_callback`.
113116 pub fn set_onload (self : * Window , maybe_listener : ? EventHandler.Listener , page : * Page ) ! void {
114- const event_target = parser .toEventTarget (Window , self );
115- const event_type = "load" ;
116-
117- // Check if we have a listener set.
118- if (self .onload_callback ) | callback | {
119- const listener = try parser .eventTargetHasListener (event_target , event_type , false , callback .id );
120- std .debug .assert (listener != null );
121- try parser .eventTargetRemoveEventListener (event_target , event_type , listener .? , false );
122- }
123-
124- if (maybe_listener ) | listener | {
125- switch (listener ) {
126- // If an object is given as listener, do nothing.
127- .object = > {},
128- .function = > | callback | {
129- _ = try EventHandler .register (page .arena , event_target , event_type , listener , null ) orelse unreachable ;
130- self .onload_callback = callback ;
117+ try DirectEventHandler (Window , self , "load" , maybe_listener , & self .onload_callback , page .arena );
118+ }
131119
132- return ;
133- },
134- }
135- }
120+ /// Returns `onpopstate_callback`.
121+ pub fn get_onpopstate ( self : * const Window ) ? js.Function {
122+ return self . onpopstate_callback ;
123+ }
136124
137- // Just unset the listener.
138- self .onload_callback = null ;
125+ /// Sets `onpopstate_callback`.
126+ pub fn set_onpopstate (self : * Window , maybe_listener : ? EventHandler.Listener , page : * Page ) ! void {
127+ try DirectEventHandler (Window , self , "popstate" , maybe_listener , & self .onpopstate_callback , page .arena );
139128 }
140129
141130 pub fn get_location (self : * Window ) * Location {
0 commit comments