mirror of
https://github.com/lightpanda-io/browser.git
synced 2025-10-29 15:13:28 +00:00
Merge pull request #1050 from lightpanda-io/event_window_bubble
Event window bubble
This commit is contained in:
@@ -148,8 +148,15 @@ pub const EventTarget = struct {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn _dispatchEvent(self: *parser.EventTarget, event: *parser.Event) !bool {
|
pub fn _dispatchEvent(self: *parser.EventTarget, event: *parser.Event, page: *Page) !bool {
|
||||||
return try parser.eventTargetDispatchEvent(self, event);
|
const res = try parser.eventTargetDispatchEvent(self, event);
|
||||||
|
|
||||||
|
if (!parser.eventBubbles(event) or parser.eventIsStopped(event)) {
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
try page.window.dispatchForDocumentTarget(event);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
@@ -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)).*;
|
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| {
|
if (comptime eventTargetTBaseFieldName(T)) |field| {
|
||||||
const et_aligned: *align(@alignOf(EventTarget)) EventTargetTBase = @alignCast(&@field(v, field));
|
const et_aligned: *align(@alignOf(EventTarget)) EventTargetTBase = @alignCast(&@field(v, field));
|
||||||
return @as(*EventTarget, @ptrCast(et_aligned));
|
return @as(*EventTarget, @ptrCast(et_aligned));
|
||||||
|
|||||||
@@ -13,4 +13,12 @@
|
|||||||
|
|
||||||
el.dispatchEvent(new CustomEvent('c2', {detail: {over: 9000}}));
|
el.dispatchEvent(new CustomEvent('c2', {detail: {over: 9000}}));
|
||||||
testing.expectEqual("c2-9000", capture);
|
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>
|
</script>
|
||||||
|
|||||||
2
vendor/netsurf/libdom
vendored
2
vendor/netsurf/libdom
vendored
Submodule vendor/netsurf/libdom updated: 0a6ba2c73d...a251317928
Reference in New Issue
Block a user