diff --git a/src/browser/Frame.zig b/src/browser/Frame.zig index 07dadac3..9ba0be76 100644 --- a/src/browser/Frame.zig +++ b/src/browser/Frame.zig @@ -3735,7 +3735,16 @@ pub fn submitForm(self: *Frame, submitter_: ?*Element, form_: ?*Element.Html.For const arena = try self._session.getArena(.medium, "submitForm"); errdefer self._session.releaseArena(arena); - const enctype = form_element.getAttributeSafe(comptime .wrap("enctype")); + // Per HTML spec form-submission algorithm, when the submitter is a submit + // button, its formaction/formmethod/formenctype attributes override the + // form's corresponding attributes (matching how formtarget is honored above). + // https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#concept-form-submit + const enctype = blk: { + if (submitter_) |s| { + if (s.getAttributeSafe(comptime .wrap("formenctype"))) |fe| break :blk fe; + } + break :blk form_element.getAttributeSafe(comptime .wrap("enctype")); + }; // Get charset from accept-charset attribute or fall back to document charset const charset: []const u8 = blk: { @@ -3752,8 +3761,18 @@ pub fn submitForm(self: *Frame, submitter_: ?*Element, form_: ?*Element.Html.For var buf = std.Io.Writer.Allocating.init(arena); try form_data.write(.{ .enctype = enctype, .charset = charset, .allocator = arena }, &buf.writer); - const method = form_element.getAttributeSafe(comptime .wrap("method")) orelse ""; - var action = form_element.getAttributeSafe(comptime .wrap("action")) orelse self.url; + const method = blk: { + if (submitter_) |s| { + if (s.getAttributeSafe(comptime .wrap("formmethod"))) |fm| break :blk fm; + } + break :blk form_element.getAttributeSafe(comptime .wrap("method")) orelse ""; + }; + var action = blk: { + if (submitter_) |s| { + if (s.getAttributeSafe(comptime .wrap("formaction"))) |fa| break :blk fa; + } + break :blk form_element.getAttributeSafe(comptime .wrap("action")) orelse self.url; + }; var opts = NavigateOpts{ .reason = .form, diff --git a/src/browser/tests/frames/target.html b/src/browser/tests/frames/target.html index dbf23242..924e0e59 100644 --- a/src/browser/tests/frames/target.html +++ b/src/browser/tests/frames/target.html @@ -56,3 +56,73 @@ }); } + + + +
+ + + + + + + + + + + + + +