use redispatch, check for stopped

This commit is contained in:
Karl Seguin
2025-09-16 10:26:51 +08:00
parent 4f127c9de3
commit 1ba542fb3b
3 changed files with 11 additions and 11 deletions

View File

@@ -151,19 +151,12 @@ pub const EventTarget = struct {
pub fn _dispatchEvent(self: *parser.EventTarget, event: *parser.Event, page: *Page) !bool { pub fn _dispatchEvent(self: *parser.EventTarget, event: *parser.Event, page: *Page) !bool {
const res = try parser.eventTargetDispatchEvent(self, event); const res = try parser.eventTargetDispatchEvent(self, event);
// TODO: If we get this working, we should also create a getter to check if (!parser.eventBubbles(event) or parser.eventIsStopped(event)) {
// stopPropagation and not bubble to window if true.
if (!parser.eventBubbles(event)) {
return res; return res;
} }
// I think this mutates `event`, which means any JavaScript that captured try page.window.dispatchForDocumentTarget(event);
// it will be mutated incorrectly. return true;
const Window = @import("../html/window.zig").Window;
return parser.eventTargetDispatchEvent(
parser.toEventTarget(Window, &page.window),
event,
);
} }
}; };

View File

@@ -517,6 +517,13 @@ pub fn eventStopPropagation(evt: *Event) void {
std.debug.assert(err == c.DOM_NO_ERR); 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 { pub fn eventStopImmediatePropagation(evt: *Event) void {
const err = c._dom_event_stop_immediate_propagation(evt); const err = c._dom_event_stop_immediate_propagation(evt);
std.debug.assert(err == c.DOM_NO_ERR); std.debug.assert(err == c.DOM_NO_ERR);