Merge pull request #1050 from lightpanda-io/event_window_bubble

Event window bubble
This commit is contained in:
Karl Seguin
2025-09-16 18:44:22 +08:00
committed by GitHub
4 changed files with 26 additions and 4 deletions

View File

@@ -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;
}
};

View File

@@ -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));

View File

@@ -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);
</script>