diff --git a/src/browser/Page.zig b/src/browser/Page.zig index bfff78ce..42e65a52 100644 --- a/src/browser/Page.zig +++ b/src/browser/Page.zig @@ -61,6 +61,7 @@ const IntersectionObserver = @import("webapi/IntersectionObserver.zig"); const CustomElementDefinition = @import("webapi/CustomElementDefinition.zig"); const storage = @import("webapi/storage/storage.zig"); const PageTransitionEvent = @import("webapi/event/PageTransitionEvent.zig"); +const SubmitEvent = @import("webapi/event/SubmitEvent.zig"); const NavigationKind = @import("webapi/navigation/root.zig").NavigationKind; const KeyboardEvent = @import("webapi/event/KeyboardEvent.zig"); const MouseEvent = @import("webapi/event/MouseEvent.zig"); @@ -3487,7 +3488,8 @@ pub fn submitForm(self: *Page, submitter_: ?*Element, form_: ?*Element.Html.Form }; if (submit_opts.fire_event) { - const submit_event = try Event.initTrusted(comptime .wrap("submit"), .{ .bubbles = true, .cancelable = true }, self); + const submitter_html: ?*HtmlElement = if (submitter_) |s| s.is(HtmlElement) else null; + const submit_event = (try SubmitEvent.initTrusted(comptime .wrap("submit"), .{ .bubbles = true, .cancelable = true, .submitter = submitter_html }, self)).asEvent(); // so submit_event is still valid when we check _prevent_default submit_event.acquireRef(); diff --git a/src/browser/js/bridge.zig b/src/browser/js/bridge.zig index e63caf8d..b7da3c13 100644 --- a/src/browser/js/bridge.zig +++ b/src/browser/js/bridge.zig @@ -850,6 +850,7 @@ pub const JsApis = flattenTypes(&.{ @import("../webapi/event/TextEvent.zig"), @import("../webapi/event/InputEvent.zig"), @import("../webapi/event/PromiseRejectionEvent.zig"), + @import("../webapi/event/SubmitEvent.zig"), @import("../webapi/MessageChannel.zig"), @import("../webapi/MessagePort.zig"), @import("../webapi/media/MediaError.zig"), diff --git a/src/browser/tests/element/html/form.html b/src/browser/tests/element/html/form.html index d3249856..9521e680 100644 --- a/src/browser/tests/element/html/form.html +++ b/src/browser/tests/element/html/form.html @@ -463,3 +463,44 @@ }); } + + +
+ + + + + + + diff --git a/src/browser/webapi/Event.zig b/src/browser/webapi/Event.zig index d70042f8..bbac984d 100644 --- a/src/browser/webapi/Event.zig +++ b/src/browser/webapi/Event.zig @@ -76,6 +76,7 @@ pub const Type = union(enum) { pop_state_event: *@import("event/PopStateEvent.zig"), ui_event: *@import("event/UIEvent.zig"), promise_rejection_event: *@import("event/PromiseRejectionEvent.zig"), + submit_event: *@import("event/SubmitEvent.zig"), }; pub const Options = struct { @@ -174,6 +175,7 @@ pub fn is(self: *Event, comptime T: type) ?*T { .page_transition_event => |e| return if (T == @import("event/PageTransitionEvent.zig")) e else null, .pop_state_event => |e| return if (T == @import("event/PopStateEvent.zig")) e else null, .promise_rejection_event => |e| return if (T == @import("event/PromiseRejectionEvent.zig")) e else null, + .submit_event => |e| return if (T == @import("event/SubmitEvent.zig")) e else null, .ui_event => |e| { if (T == @import("event/UIEvent.zig")) { return e; diff --git a/src/browser/webapi/event/SubmitEvent.zig b/src/browser/webapi/event/SubmitEvent.zig new file mode 100644 index 00000000..80cb4d36 --- /dev/null +++ b/src/browser/webapi/event/SubmitEvent.zig @@ -0,0 +1,95 @@ +// Copyright (C) 2023-2026 Lightpanda (Selecy SAS) +// +// Francis Bouvier