Skip to content

Commit 6b1eb4a

Browse files
committed
EventTarget InternalType
1 parent 6b41677 commit 6b1eb4a

File tree

3 files changed

+26
-2
lines changed

3 files changed

+26
-2
lines changed

src/browser/dom/event_target.zig

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ const nod = @import("node.zig");
2828
pub const Union = union(enum) {
2929
node: nod.Union,
3030
xhr: *@import("../xhr/xhr.zig").XMLHttpRequest,
31+
plain: *parser.EventTarget,
3132
};
3233

3334
// EventTarget implementation
@@ -36,7 +37,7 @@ pub const EventTarget = struct {
3637
pub const Exception = DOMException;
3738

3839
// Extend libdom event target for pure zig struct.
39-
base: parser.EventTargetTBase = parser.EventTargetTBase{},
40+
base: parser.EventTargetTBase = parser.EventTargetTBase{ .internal_target_type = .plain },
4041

4142
pub fn toInterface(e: *parser.Event, et: *parser.EventTarget, page: *Page) !Union {
4243
// libdom assumes that all event targets are libdom nodes. They are not.
@@ -47,6 +48,10 @@ pub const EventTarget = struct {
4748
return .{ .node = .{ .Window = &page.window } };
4849
}
4950

51+
if (try parser.eventTargetInternalType(et) == .plain) {
52+
return .{ .plain = et };
53+
}
54+
5055
// AbortSignal is another non-node target. It has a distinct usage though
5156
// so we hijack the event internal type to identity if.
5257
switch (try parser.eventGetInternalType(e)) {

src/browser/netsurf.zig

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -749,6 +749,13 @@ pub fn eventTargetDispatchEvent(et: *EventTarget, event: *Event) !bool {
749749
return res;
750750
}
751751

752+
pub fn eventTargetInternalType(et: *EventTarget) !EventTargetTBase.InternalType {
753+
var res: u32 = undefined;
754+
const err = eventTargetVtable(et).internal_type.?(et, &res);
755+
try DOMErr(err);
756+
return @enumFromInt(res);
757+
}
758+
752759
pub fn elementDispatchEvent(element: *Element, event: *Event) !bool {
753760
const et: *EventTarget = toEventTarget(Element, element);
754761
return eventTargetDispatchEvent(et, @ptrCast(event));
@@ -771,12 +778,17 @@ pub fn eventTargetTBaseFieldName(comptime T: type) ?[]const u8 {
771778
// EventTargetBase is used to implement EventTarget for pure zig struct.
772779
pub const EventTargetTBase = extern struct {
773780
const Self = @This();
781+
const InternalType = enum(u32) {
782+
libdom = 0,
783+
plain = 1,
784+
};
774785

775786
vtable: ?*const c.struct_dom_event_target_vtable = &c.struct_dom_event_target_vtable{
776787
.dispatch_event = dispatch_event,
777788
.remove_event_listener = remove_event_listener,
778789
.add_event_listener = add_event_listener,
779790
.iter_event_listener = iter_event_listener,
791+
.internal_type = internal_type,
780792
},
781793

782794
// When we dispatch the event, we need to provide a target. In reality, the
@@ -790,6 +802,7 @@ pub const EventTargetTBase = extern struct {
790802
refcnt: u32 = 0,
791803

792804
eti: c.dom_event_target_internal = c.dom_event_target_internal{ .listeners = null },
805+
internal_target_type: InternalType = .libdom,
793806

794807
pub fn add_event_listener(et: [*c]c.dom_event_target, t: [*c]c.dom_string, l: ?*c.struct_dom_event_listener, capture: bool) callconv(.C) c.dom_exception {
795808
const self = @as(*Self, @ptrCast(et));
@@ -822,6 +835,12 @@ pub const EventTargetTBase = extern struct {
822835
const self = @as(*Self, @ptrCast(et));
823836
return c._dom_event_target_iter_event_listener(self.eti, t, capture, cur, next, l);
824837
}
838+
839+
pub fn internal_type(et: [*c]c.dom_event_target, internal_type_: [*c]u32) callconv(.C) c.dom_exception {
840+
const self = @as(*Self, @ptrCast(et));
841+
internal_type_.* = @intFromEnum(self.internal_target_type);
842+
return c.DOM_NO_ERR;
843+
}
825844
};
826845

827846
// MouseEvent

0 commit comments

Comments
 (0)