mirror of
https://github.com/lightpanda-io/browser.git
synced 2025-10-29 07:03:29 +00:00
netsurf: use EventTargetTBase field to cast EventTarget
This commit is contained in:
@@ -333,7 +333,7 @@ pub const Page = struct {
|
||||
// dispatch window.load event
|
||||
const loadevt = try parser.eventCreate();
|
||||
try parser.eventInit(loadevt, "load", .{});
|
||||
_ = try parser.eventTargetDispatchEvent(parser.toEventTarget(Window, &self.session.window), loadevt);
|
||||
_ = try parser.eventTargetDispatchEvent(parser.toEventTarget(EventTargetTBase, &self.session.window), loadevt);
|
||||
}
|
||||
|
||||
// evalScript evaluates the src in priority.
|
||||
|
||||
@@ -483,6 +483,11 @@ fn eventTargetVtable(et: *EventTarget) c.dom_event_target_vtable {
|
||||
}
|
||||
|
||||
pub inline fn toEventTarget(comptime T: type, v: *T) *EventTarget {
|
||||
if (comptime eventTargetTBaseFieldName(T)) |field| {
|
||||
const et_aligned: *align(@alignOf(EventTarget)) EventTargetTBase = @alignCast(&@field(v, field));
|
||||
return @as(*EventTarget, @ptrCast(et_aligned));
|
||||
}
|
||||
|
||||
const et_aligned: *align(@alignOf(EventTarget)) T = @alignCast(v);
|
||||
return @as(*EventTarget, @ptrCast(et_aligned));
|
||||
}
|
||||
@@ -633,6 +638,20 @@ pub fn eventTargetDispatchEvent(et: *EventTarget, event: *Event) !bool {
|
||||
return res;
|
||||
}
|
||||
|
||||
pub fn eventTargetTBaseFieldName(comptime T: type) ?[]const u8 {
|
||||
std.debug.assert(@inComptime());
|
||||
switch (@typeInfo(T)) {
|
||||
.Struct => |ti| {
|
||||
for (ti.fields) |f| {
|
||||
if (f.type == EventTargetTBase) return f.name;
|
||||
}
|
||||
},
|
||||
else => {},
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
// EventTargetBase is used to implement EventTarget for pure zig struct.
|
||||
pub const EventTargetTBase = struct {
|
||||
const Self = @This();
|
||||
|
||||
@@ -143,6 +143,17 @@ test "Window is a libdom event target" {
|
||||
const event = try parser.eventCreate();
|
||||
try parser.eventInit(event, "foo", .{});
|
||||
|
||||
const et = @as(*parser.EventTarget, @ptrCast(&window));
|
||||
const et = parser.toEventTarget(Window, &window);
|
||||
_ = try parser.eventTargetDispatchEvent(et, event);
|
||||
}
|
||||
|
||||
test "DocumentHTML is a libdom event target" {
|
||||
doc = try parser.documentHTMLParseFromStr("<body></body>");
|
||||
parser.documentHTMLClose(doc) catch {};
|
||||
|
||||
const event = try parser.eventCreate();
|
||||
try parser.eventInit(event, "foo", .{});
|
||||
|
||||
const et = parser.toEventTarget(parser.DocumentHTML, doc);
|
||||
_ = try parser.eventTargetDispatchEvent(et, event);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user