Skip to content

Commit 4f127c9

Browse files
committed
Bubble events to the Window
1 parent 0f13e06 commit 4f127c9

File tree

3 files changed

+25
-3
lines changed

3 files changed

+25
-3
lines changed

src/browser/dom/event_target.zig

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff 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

src/browser/netsurf.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff 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));

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)