File tree Expand file tree Collapse file tree 3 files changed +25
-3
lines changed Expand file tree Collapse file tree 3 files changed +25
-3
lines changed Original file line number Diff line number Diff line change @@ -148,8 +148,22 @@ pub const EventTarget = struct {
148148 );
149149 }
150150
151- pub fn _dispatchEvent (self : * parser.EventTarget , event : * parser.Event ) ! bool {
152- return try parser .eventTargetDispatchEvent (self , event );
151+ pub fn _dispatchEvent (self : * parser.EventTarget , event : * parser.Event , page : * Page ) ! bool {
152+ const res = try parser .eventTargetDispatchEvent (self , event );
153+
154+ // TODO: If we get this working, we should also create a getter to check
155+ // stopPropagation and not bubble to window if true.
156+ if (! parser .eventBubbles (event )) {
157+ return res ;
158+ }
159+
160+ // I think this mutates `event`, which means any JavaScript that captured
161+ // it will be mutated incorrectly.
162+ const Window = @import ("../html/window.zig" ).Window ;
163+ return parser .eventTargetDispatchEvent (
164+ parser .toEventTarget (Window , & page .window ),
165+ event ,
166+ );
153167 }
154168};
155169
Original file line number Diff line number Diff line change @@ -604,7 +604,7 @@ fn eventTargetVtable(et: *EventTarget) c.dom_event_target_vtable {
604604 return @as ([* c ]const c .dom_event_target_vtable , @ptrCast (vtable_aligned )).* ;
605605}
606606
607- pub inline fn toEventTarget (comptime T : type , v : * T ) * EventTarget {
607+ pub fn toEventTarget (comptime T : type , v : * T ) * EventTarget {
608608 if (comptime eventTargetTBaseFieldName (T )) | field | {
609609 const et_aligned : * align (@alignOf (EventTarget )) EventTargetTBase = @alignCast (&@field (v , field ));
610610 return @as (* EventTarget , @ptrCast (et_aligned ));
Original file line number Diff line number Diff line change 1313
1414 el . dispatchEvent ( new CustomEvent ( 'c2' , { detail : { over : 9000 } } ) ) ;
1515 testing . expectEqual ( "c2-9000" , capture ) ;
16+
17+ let window_calls = 0 ;
18+ window . addEventListener ( 'c1' , ( ) => {
19+ window_calls += 1 ;
20+ } ) ;
21+
22+ el . dispatchEvent ( new CustomEvent ( 'c1' , { bubbles : true } ) ) ;
23+ testing . expectEqual ( 1 , window_calls ) ;
1624</ script >
You can’t perform that action at this time.
0 commit comments