mirror of
https://github.com/lightpanda-io/browser.git
synced 2025-12-16 16:28:58 +00:00
Move some details implementation from EventTarget to the parser
Signed-off-by: Francis Bouvier <francis@lightpanda.io>
This commit is contained in:
@@ -17,18 +17,6 @@ pub const EventTarget = struct {
|
|||||||
// JS funcs
|
// 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(
|
pub fn _addEventListener(
|
||||||
self: *parser.EventTarget,
|
self: *parser.EventTarget,
|
||||||
alloc: std.mem.Allocator,
|
alloc: std.mem.Allocator,
|
||||||
@@ -38,8 +26,7 @@ pub const EventTarget = struct {
|
|||||||
// TODO: when can we free this allocation?
|
// TODO: when can we free this allocation?
|
||||||
const cbk_ptr = try alloc.create(Callback);
|
const cbk_ptr = try alloc.create(Callback);
|
||||||
cbk_ptr.* = cbk;
|
cbk_ptr.* = cbk;
|
||||||
const func = @as(*anyopaque, @ptrCast(cbk_ptr));
|
try parser.eventTargetAddEventListener(self, eventType, cbk_ptr);
|
||||||
try parser.eventTargetAddEventListener(self, eventType, func, js_handler);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn _dispatchEvent(self: *parser.EventTarget, event: *parser.Event) !bool {
|
pub fn _dispatchEvent(self: *parser.EventTarget, event: *parser.Event) !bool {
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ const c = @cImport({
|
|||||||
@cInclude("dom/bindings/hubbub/parser.h");
|
@cInclude("dom/bindings/hubbub/parser.h");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const Callback = @import("jsruntime").Callback;
|
||||||
|
|
||||||
// Vtable
|
// Vtable
|
||||||
// ------
|
// ------
|
||||||
|
|
||||||
@@ -343,7 +345,6 @@ fn DOMErr(except: DOMException) DOMError!void {
|
|||||||
|
|
||||||
// Event
|
// Event
|
||||||
pub const Event = c.dom_event;
|
pub const Event = c.dom_event;
|
||||||
pub const EventHandler = fn (?*Event, ?*anyopaque) callconv(.C) void;
|
|
||||||
|
|
||||||
pub fn eventCreate() !*Event {
|
pub fn eventCreate() !*Event {
|
||||||
var evt: ?*Event = undefined;
|
var evt: ?*Event = undefined;
|
||||||
@@ -358,6 +359,21 @@ pub fn eventInit(evt: *Event, eventType: []const u8) !void {
|
|||||||
try DOMErr(err);
|
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
|
// EventTarget
|
||||||
pub const EventTarget = c.dom_event_target;
|
pub const EventTarget = c.dom_event_target;
|
||||||
|
|
||||||
@@ -368,12 +384,12 @@ fn eventTargetVtable(et: *EventTarget) c.dom_event_target_vtable {
|
|||||||
pub fn eventTargetAddEventListener(
|
pub fn eventTargetAddEventListener(
|
||||||
et: *EventTarget,
|
et: *EventTarget,
|
||||||
eventType: []const u8,
|
eventType: []const u8,
|
||||||
data: ?*anyopaque,
|
cbk_ptr: *Callback,
|
||||||
comptime handler: EventHandler,
|
|
||||||
) !void {
|
) !void {
|
||||||
const s = try strFromData(eventType);
|
const s = try strFromData(eventType);
|
||||||
|
const ctx = @as(*anyopaque, @ptrCast(cbk_ptr));
|
||||||
var listener: ?*c.dom_event_listener = undefined;
|
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);
|
try DOMErr(errLst);
|
||||||
const err = eventTargetVtable(et).add_event_listener.?(et, s, listener, true);
|
const err = eventTargetVtable(et).add_event_listener.?(et, s, listener, true);
|
||||||
try DOMErr(err);
|
try DOMErr(err);
|
||||||
|
|||||||
Reference in New Issue
Block a user