diff --git a/src/dom/event_target.zig b/src/dom/event_target.zig index ca688993..b74b7680 100644 --- a/src/dom/event_target.zig +++ b/src/dom/event_target.zig @@ -29,6 +29,7 @@ const EventHandler = @import("../events/event.zig").EventHandler; const DOMException = @import("exceptions.zig").DOMException; const Nod = @import("node.zig"); +const Window = @import("../html/window.zig").Window; // EventTarget interfaces pub const Union = Nod.Union; @@ -40,9 +41,10 @@ pub const EventTarget = struct { pub const mem_guarantied = true; pub fn toInterface(et: *parser.EventTarget) !Union { - // NOTE: for now we state that all EventTarget are Nodes - // TODO: handle other types (eg. Window) - return Nod.Node.toInterface(@as(*parser.Node, @ptrCast(et))); + return switch (try parser.eventTargetGetType(et)) { + .window => .{ .Window = @as(*Window, @ptrCast(et)) }, + .node => Nod.Node.toInterface(@as(*parser.Node, @ptrCast(et))), + }; } // JS funcs diff --git a/src/html/window.zig b/src/html/window.zig index 65a8af67..efc89e05 100644 --- a/src/html/window.zig +++ b/src/html/window.zig @@ -57,6 +57,7 @@ pub const Window = struct { return Window{ .target = target orelse "", .navigator = navigator orelse .{}, + .base = .{ .et_type = @intFromEnum(parser.EventTargetType.window) }, }; } diff --git a/src/netsurf/netsurf.zig b/src/netsurf/netsurf.zig index a3560d25..112b8998 100644 --- a/src/netsurf/netsurf.zig +++ b/src/netsurf/netsurf.zig @@ -560,6 +560,11 @@ fn eventListenerGetData(lst: *EventListener) ?*anyopaque { } // EventTarget +pub const EventTargetType = enum(u4) { + node = c.DOM_EVENT_TARGET_NODE, + window = 2, +}; + pub const EventTarget = c.dom_event_target; pub fn eventTargetToNode(et: *EventTarget) *Node { @@ -801,6 +806,14 @@ pub fn eventTargetDispatchEvent(et: *EventTarget, event: *Event) !bool { return res; } +pub fn eventTargetGetType(et: *EventTarget) !EventTargetType { + var res: c.dom_event_target_type = undefined; + const err = eventTargetVtable(et).dom_event_target_get_type.?(et, &res); + try DOMErr(err); + + return @enumFromInt(res); +} + pub fn eventTargetTBaseFieldName(comptime T: type) ?[]const u8 { std.debug.assert(@inComptime()); switch (@typeInfo(T)) { @@ -824,8 +837,10 @@ pub const EventTargetTBase = extern struct { .remove_event_listener = remove_event_listener, .add_event_listener = add_event_listener, .iter_event_listener = iter_event_listener, + .dom_event_target_get_type = dom_event_target_get_type, }, eti: c.dom_event_target_internal = c.dom_event_target_internal{ .listeners = null }, + et_type: c.dom_event_target_type = @intFromEnum(EventTargetType.node), 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 { const self = @as(*Self, @ptrCast(et)); @@ -858,6 +873,17 @@ pub const EventTargetTBase = extern struct { const self = @as(*Self, @ptrCast(et)); return c._dom_event_target_iter_event_listener(self.eti, t, capture, cur, next, l); } + + pub fn dom_event_target_get_type( + et: [*c]c.dom_event_target, + res: [*c]c.dom_event_target_type, + ) callconv(.C) c.dom_exception { + const self = @as(*Self, @ptrCast(et)); + + res.* = self.et_type; + + return c.DOM_NO_ERR; + } }; // NodeType diff --git a/vendor/netsurf/libdom b/vendor/netsurf/libdom index 279398be..fe6c9b8d 160000 --- a/vendor/netsurf/libdom +++ b/vendor/netsurf/libdom @@ -1 +1 @@ -Subproject commit 279398bebbef59fd5f38fca1d65d220fd18e06f2 +Subproject commit fe6c9b8d40825f841666be17e280caaa680a67f0