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", .{});
+}