From 86cc3d25dcb0b10e947065ea8de38bc3411d180e Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Wed, 17 Jan 2024 15:29:48 +0100 Subject: [PATCH] Move some details implementation from EventTarget to the parser Signed-off-by: Francis Bouvier --- src/dom/event_target.zig | 15 +-------------- src/netsurf.zig | 24 ++++++++++++++++++++---- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/dom/event_target.zig b/src/dom/event_target.zig index 03ae8975..9a49585d 100644 --- a/src/dom/event_target.zig +++ b/src/dom/event_target.zig @@ -17,18 +17,6 @@ pub const EventTarget = struct { // JS funcs // -------- - const js_handler = struct { - fn handle(event: ?*parser.Event, data: ?*anyopaque) callconv(.C) void { - const ptr: *align(@alignOf(*Callback)) anyopaque = @alignCast(data.?); - const func = @as(*Callback, @ptrCast(ptr)); - func.call(.{event}) catch unreachable; - // NOTE: we can not call func.deinit here - // b/c the handler can be called several times - // as the event goes through the ancestors - // TODO: check the event phase to call func.deinit and free func - } - }.handle; - pub fn _addEventListener( self: *parser.EventTarget, alloc: std.mem.Allocator, @@ -38,8 +26,7 @@ pub const EventTarget = struct { // TODO: when can we free this allocation? const cbk_ptr = try alloc.create(Callback); cbk_ptr.* = cbk; - const func = @as(*anyopaque, @ptrCast(cbk_ptr)); - try parser.eventTargetAddEventListener(self, eventType, func, js_handler); + try parser.eventTargetAddEventListener(self, eventType, cbk_ptr); } pub fn _dispatchEvent(self: *parser.EventTarget, event: *parser.Event) !bool { diff --git a/src/netsurf.zig b/src/netsurf.zig index b8d4d7e2..863ccc1d 100644 --- a/src/netsurf.zig +++ b/src/netsurf.zig @@ -5,6 +5,8 @@ const c = @cImport({ @cInclude("dom/bindings/hubbub/parser.h"); }); +const Callback = @import("jsruntime").Callback; + // Vtable // ------ @@ -343,7 +345,6 @@ fn DOMErr(except: DOMException) DOMError!void { // Event pub const Event = c.dom_event; -pub const EventHandler = fn (?*Event, ?*anyopaque) callconv(.C) void; pub fn eventCreate() !*Event { var evt: ?*Event = undefined; @@ -358,6 +359,21 @@ pub fn eventInit(evt: *Event, eventType: []const u8) !void { try DOMErr(err); } +// EventHandler +pub const EventHandler = fn (?*Event, ?*anyopaque) callconv(.C) void; + +const event_handler = struct { + fn handle(event: ?*Event, data: ?*anyopaque) callconv(.C) void { + const ptr: *align(@alignOf(*Callback)) anyopaque = @alignCast(data.?); + const func = @as(*Callback, @ptrCast(ptr)); + func.call(.{event}) catch unreachable; + // NOTE: we can not call func.deinit here + // b/c the handler can be called several times + // as the event goes through the ancestors + // TODO: check the event phase to call func.deinit and free func + } +}.handle; + // EventTarget pub const EventTarget = c.dom_event_target; @@ -368,12 +384,12 @@ fn eventTargetVtable(et: *EventTarget) c.dom_event_target_vtable { pub fn eventTargetAddEventListener( et: *EventTarget, eventType: []const u8, - data: ?*anyopaque, - comptime handler: EventHandler, + cbk_ptr: *Callback, ) !void { const s = try strFromData(eventType); + const ctx = @as(*anyopaque, @ptrCast(cbk_ptr)); var listener: ?*c.dom_event_listener = undefined; - const errLst = c.dom_event_listener_create(handler, data, &listener); + const errLst = c.dom_event_listener_create(event_handler, ctx, &listener); try DOMErr(errLst); const err = eventTargetVtable(et).add_event_listener.?(et, s, listener, true); try DOMErr(err);