diff --git a/src/browser/js/bridge.zig b/src/browser/js/bridge.zig index faa61a2a..677052b1 100644 --- a/src/browser/js/bridge.zig +++ b/src/browser/js/bridge.zig @@ -565,6 +565,7 @@ pub const JsApis = flattenTypes(&.{ @import("../webapi/event/ErrorEvent.zig"), @import("../webapi/event/MessageEvent.zig"), @import("../webapi/event/ProgressEvent.zig"), + @import("../webapi/event/UIEvent.zig"), @import("../webapi/MessageChannel.zig"), @import("../webapi/MessagePort.zig"), @import("../webapi/media/MediaError.zig"), diff --git a/src/browser/tests/event/ui.html b/src/browser/tests/event/ui.html new file mode 100644 index 00000000..27a0f8ae --- /dev/null +++ b/src/browser/tests/event/ui.html @@ -0,0 +1,49 @@ + + + + + + + + + + + + diff --git a/src/browser/webapi/Event.zig b/src/browser/webapi/Event.zig index dafb0204..74ba5567 100644 --- a/src/browser/webapi/Event.zig +++ b/src/browser/webapi/Event.zig @@ -56,6 +56,7 @@ pub const Type = union(enum) { message_event: *@import("event/MessageEvent.zig"), progress_event: *@import("event/ProgressEvent.zig"), composition_event: *@import("event/CompositionEvent.zig"), + ui_event: *@import("event/UIEvent.zig"), }; const Options = struct { diff --git a/src/browser/webapi/event/UIEvent.zig b/src/browser/webapi/event/UIEvent.zig index 13f22533..4e0c53ef 100644 --- a/src/browser/webapi/event/UIEvent.zig +++ b/src/browser/webapi/event/UIEvent.zig @@ -1,4 +1,4 @@ -// Copyright (C) 2023-2024 Lightpanda (Selecy SAS) +// Copyright (C) 2023-2025 Lightpanda (Selecy SAS) // // Francis Bouvier // Pierre Tachoire @@ -30,16 +30,24 @@ _view: *Window, pub const EventOptions = struct { detail: u32 = 0, view: ?*Window = null, + + // From Event. + bubbles: bool = false, + cancelable: bool = false, }; pub fn init(typ: []const u8, _options: ?EventOptions, page: *Page) !*UIEvent { const options = _options orelse EventOptions{}; - return page._factory.event(typ, UIEvent{ + const event = try page._factory.event(typ, UIEvent{ ._proto = undefined, ._detail = options.detail, - ._view = options.view, + ._view = options.view orelse page.window, }); + + event._proto._bubbles = options.bubbles; + event._proto._cancelable = options.cancelable; + return event; } pub fn asEvent(self: *UIEvent) *Event { @@ -56,6 +64,8 @@ pub fn getView(self: *UIEvent) *Window { return self._view; } +// deprecated `initUIEvent()` not implemented + pub const JsApi = struct { pub const bridge = js.Bridge(UIEvent); @@ -69,3 +79,8 @@ pub const JsApi = struct { pub const detail = bridge.accessor(UIEvent.getDetail, null, .{}); pub const view = bridge.accessor(UIEvent.getView, null, .{}); }; + +const testing = @import("../../../testing.zig"); +test "WebApi: UIEvent" { + try testing.htmlRunner("event/ui.html", .{}); +}