diff --git a/src/browser/dom/event_target.zig b/src/browser/dom/event_target.zig index 3d239629..acaf5c3f 100644 --- a/src/browser/dom/event_target.zig +++ b/src/browser/dom/event_target.zig @@ -148,8 +148,15 @@ pub const EventTarget = struct { ); } - pub fn _dispatchEvent(self: *parser.EventTarget, event: *parser.Event) !bool { - return try parser.eventTargetDispatchEvent(self, event); + pub fn _dispatchEvent(self: *parser.EventTarget, event: *parser.Event, page: *Page) !bool { + const res = try parser.eventTargetDispatchEvent(self, event); + + if (!parser.eventBubbles(event) or parser.eventIsStopped(event)) { + return res; + } + + try page.window.dispatchForDocumentTarget(event); + return true; } }; diff --git a/src/browser/netsurf.zig b/src/browser/netsurf.zig index 01aeb82c..aa20be60 100644 --- a/src/browser/netsurf.zig +++ b/src/browser/netsurf.zig @@ -517,6 +517,13 @@ pub fn eventStopPropagation(evt: *Event) void { std.debug.assert(err == c.DOM_NO_ERR); } +pub fn eventIsStopped(evt: *Event) bool { + var res: bool = undefined; + const err = c._dom_event_is_stopped(evt, &res); + std.debug.assert(err == c.DOM_NO_ERR); + return res; +} + pub fn eventStopImmediatePropagation(evt: *Event) void { const err = c._dom_event_stop_immediate_propagation(evt); std.debug.assert(err == c.DOM_NO_ERR); @@ -604,7 +611,7 @@ fn eventTargetVtable(et: *EventTarget) c.dom_event_target_vtable { return @as([*c]const c.dom_event_target_vtable, @ptrCast(vtable_aligned)).*; } -pub inline fn toEventTarget(comptime T: type, v: *T) *EventTarget { +pub fn toEventTarget(comptime T: type, v: *T) *EventTarget { if (comptime eventTargetTBaseFieldName(T)) |field| { const et_aligned: *align(@alignOf(EventTarget)) EventTargetTBase = @alignCast(&@field(v, field)); return @as(*EventTarget, @ptrCast(et_aligned)); diff --git a/src/tests/events/custom.html b/src/tests/events/custom.html index e749fe05..ed7e0faf 100644 --- a/src/tests/events/custom.html +++ b/src/tests/events/custom.html @@ -13,4 +13,12 @@ el.dispatchEvent(new CustomEvent('c2', {detail: {over: 9000}})); testing.expectEqual("c2-9000", capture); + + let window_calls = 0; + window.addEventListener('c1', () => { + window_calls += 1; + }); + + el.dispatchEvent(new CustomEvent('c1', {bubbles: true})); + testing.expectEqual(1, window_calls); diff --git a/vendor/netsurf/libdom b/vendor/netsurf/libdom index 0a6ba2c7..a2513179 160000 --- a/vendor/netsurf/libdom +++ b/vendor/netsurf/libdom @@ -1 +1 @@ -Subproject commit 0a6ba2c73d6d673dfeadf7070167c0ce9d945721 +Subproject commit a2513179286ce82bbae53123b82f64fe45f82e05