From 2873aa5f811ebaf94769d3d0462fcdbef689e4f4 Mon Sep 17 00:00:00 2001 From: sjorsdonkers <72333389+sjorsdonkers@users.noreply.github.com> Date: Tue, 8 Jul 2025 13:21:52 +0200 Subject: [PATCH] EventTarget constructor --- src/browser/dom/event_target.zig | 12 ++++++++++++ src/runtime/js.zig | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/browser/dom/event_target.zig b/src/browser/dom/event_target.zig index 7d1b18c3..e3ddaa0f 100644 --- a/src/browser/dom/event_target.zig +++ b/src/browser/dom/event_target.zig @@ -35,6 +35,9 @@ pub const EventTarget = struct { pub const Self = parser.EventTarget; pub const Exception = DOMException; + // Extend libdom event target for pure zig struct. + base: parser.EventTargetTBase = parser.EventTargetTBase{}, + pub fn toInterface(e: *parser.Event, et: *parser.EventTarget, page: *Page) !Union { // libdom assumes that all event targets are libdom nodes. They are not. @@ -63,6 +66,11 @@ pub const EventTarget = struct { // JS funcs // -------- + pub fn constructor(page: *Page) !*parser.EventTarget { + const et = try page.arena.create(EventTarget); + return @ptrCast(&et.base); + } + pub fn _addEventListener( self: *parser.EventTarget, typ: []const u8, @@ -128,6 +136,10 @@ test "Browser.DOM.EventTarget" { var runner = try testing.jsRunner(testing.tracking_allocator, .{}); defer runner.deinit(); + try runner.testCases(&.{ + .{ "new EventTarget()", "[object EventTarget]" }, + }, .{}); + try runner.testCases(&.{ .{ "let content = document.getElementById('content')", "undefined" }, .{ "let para = document.getElementById('para')", "undefined" }, diff --git a/src/runtime/js.zig b/src/runtime/js.zig index c99fd129..f02fe991 100644 --- a/src/runtime/js.zig +++ b/src/runtime/js.zig @@ -2131,7 +2131,6 @@ pub fn Env(comptime State: type, comptime WebApis: type) type { const info = v8.FunctionCallbackInfo.initFromV8(raw_info); var caller = Caller(JsContext, State).init(info); defer caller.deinit(); - // See comment above. We generateConstructor on all types // in order to create the FunctionTemplate, but there might // not be an actual "constructor" function. So if someone @@ -2139,6 +2138,7 @@ pub fn Env(comptime State: type, comptime WebApis: type) type { // a constructor function, we'll return an error. if (@hasDecl(Struct, "constructor") == false) { const iso = caller.isolate; + log.warn(.js, "Illegal constructor call", .{ .name = @typeName(Struct) }); const js_exception = iso.throwException(createException(iso, "Illegal Constructor")); info.getReturnValue().set(js_exception); return;