From 501b3caa8ea2300db4fa5b390d88cd313a53cfe8 Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Mon, 29 Jan 2024 09:04:03 +0100 Subject: [PATCH] Add legacy document.createEvent and event.initEvent Signed-off-by: Francis Bouvier --- src/dom/document.zig | 9 +++++++++ src/events/event.zig | 28 ++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/src/dom/document.zig b/src/dom/document.zig index 702d92e2..7f3af5cf 100644 --- a/src/dom/document.zig +++ b/src/dom/document.zig @@ -81,6 +81,15 @@ pub const Document = struct { return try parser.documentGetDoctype(self); } + pub fn _createEvent(_: *parser.Document, eventCstr: []const u8) !*parser.Event { + // TODO: for now only "Event" constructor is supported + // see table on https://dom.spec.whatwg.org/#dom-document-createevent $2 + if (std.ascii.eqlIgnoreCase(eventCstr, "Event") or std.ascii.eqlIgnoreCase(eventCstr, "Events")) { + return try parser.eventCreate(); + } + return parser.DOMError.NotSupported; + } + pub fn _getElementById(self: *parser.Document, id: []const u8) !?ElementUnion { const e = try parser.documentGetElementById(self, id) orelse return null; return try Element.toInterface(e); diff --git a/src/events/event.zig b/src/events/event.zig index 25dd40fe..fe939621 100644 --- a/src/events/event.zig +++ b/src/events/event.zig @@ -78,6 +78,19 @@ pub const Event = struct { // Methods + pub fn _initEvent( + self: *parser.Event, + eventType: []const u8, + bubbles: ?bool, + cancelable: ?bool, + ) !void { + const opts = EventInit{ + .bubbles = bubbles orelse false, + .cancelable = cancelable orelse false, + }; + return try parser.eventInit(self, eventType, opts); + } + pub fn _stopPropagation(self: *parser.Event) !void { return try parser.eventStopPropagation(self); } @@ -170,4 +183,19 @@ pub fn testExecFn( .{ .src = "nb", .ex = "1" }, // will be 2 if event was not stopped at first content event listener }; try checkCases(js_env, &stop_immediate); + + var legacy = [_]Case{ + .{ .src = "nb = 0", .ex = "0" }, + .{ .src = + \\content.addEventListener('legacy', + \\function(e) { + \\evt = e; nb = nb + 1; + \\}) + , .ex = "undefined" }, + .{ .src = "let evtLegacy = document.createEvent('Event')", .ex = "undefined" }, + .{ .src = "evtLegacy.initEvent('legacy')", .ex = "undefined" }, + .{ .src = "content.dispatchEvent(evtLegacy)", .ex = "true" }, + .{ .src = "nb", .ex = "1" }, + }; + try checkCases(js_env, &legacy); }