From 746921b86d7bcf4cd3e4c652111f818a7ebd0b09 Mon Sep 17 00:00:00 2001 From: Navid EMAD Date: Mon, 27 Apr 2026 03:44:33 +0200 Subject: [PATCH] Fix SubmitEvent.submitter for requestSubmit() with no argument When Form.requestSubmit() is called without a submitter argument, the HTML spec defaults the internal submitter variable to the form element itself (step 2). The subsequent "submit a form element" algorithm then collapses submitter === form back to submitterButton = null before constructing the SubmitEvent. We were skipping that collapse and using the form as the SubmitEvent's submitter, which diverges from Chrome / Firefox / WPT. Frame.submitForm now coerces submitter_ to null when it equals the form element, mirroring the spec algorithm. The form.html fixture that previously asserted the wrong behavior is updated to assert .submitter === null per spec. https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#concept-form-submit Closes #2252 --- src/browser/Frame.zig | 10 +++++++++- src/browser/tests/element/html/form.html | 7 ++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/browser/Frame.zig b/src/browser/Frame.zig index 17c49d0e..9b28c25a 100644 --- a/src/browser/Frame.zig +++ b/src/browser/Frame.zig @@ -3701,7 +3701,15 @@ pub fn submitForm(self: *Frame, submitter_: ?*Element, form_: ?*Element.Html.For }; if (submit_opts.fire_event) { - const submitter_html: ?*HtmlElement = if (submitter_) |s| s.is(HtmlElement) else null; + // Per HTML spec "submit a form element" algorithm: SubmitEvent.submitter + // must be null when the submitter is the form itself, which is what + // Form.requestSubmit() passes when called with no submitter argument. + // https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#concept-form-submit + const submitter_html: ?*HtmlElement = blk: { + const s = submitter_ orelse break :blk null; + if (s == form_element) break :blk null; + break :blk s.is(HtmlElement); + }; 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 diff --git a/src/browser/tests/element/html/form.html b/src/browser/tests/element/html/form.html index 31f5d648..8a92cb10 100644 --- a/src/browser/tests/element/html/form.html +++ b/src/browser/tests/element/html/form.html @@ -485,12 +485,13 @@ } - +
-