Skip to content

Commit a87f4ab

Browse files
authored
Merge pull request #1050 from lightpanda-io/event_window_bubble
Event window bubble
2 parents 57aa270 + 1b73691 commit a87f4ab

File tree

4 files changed

+26
-4
lines changed

4 files changed

+26
-4
lines changed

src/browser/dom/event_target.zig

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,15 @@ 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+
if (!parser.eventBubbles(event) or parser.eventIsStopped(event)) {
155+
return res;
156+
}
157+
158+
try page.window.dispatchForDocumentTarget(event);
159+
return true;
153160
}
154161
};
155162

src/browser/netsurf.zig

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,13 @@ pub fn eventStopPropagation(evt: *Event) void {
517517
std.debug.assert(err == c.DOM_NO_ERR);
518518
}
519519

520+
pub fn eventIsStopped(evt: *Event) bool {
521+
var res: bool = undefined;
522+
const err = c._dom_event_is_stopped(evt, &res);
523+
std.debug.assert(err == c.DOM_NO_ERR);
524+
return res;
525+
}
526+
520527
pub fn eventStopImmediatePropagation(evt: *Event) void {
521528
const err = c._dom_event_stop_immediate_propagation(evt);
522529
std.debug.assert(err == c.DOM_NO_ERR);
@@ -604,7 +611,7 @@ fn eventTargetVtable(et: *EventTarget) c.dom_event_target_vtable {
604611
return @as([*c]const c.dom_event_target_vtable, @ptrCast(vtable_aligned)).*;
605612
}
606613

607-
pub inline fn toEventTarget(comptime T: type, v: *T) *EventTarget {
614+
pub fn toEventTarget(comptime T: type, v: *T) *EventTarget {
608615
if (comptime eventTargetTBaseFieldName(T)) |field| {
609616
const et_aligned: *align(@alignOf(EventTarget)) EventTargetTBase = @alignCast(&@field(v, field));
610617
return @as(*EventTarget, @ptrCast(et_aligned));

src/tests/events/custom.html

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,12 @@
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>

0 commit comments

Comments
 (0)