Skip to content

Commit 26e8642

Browse files
authored
Merge pull request #782 from lightpanda-io/form_support_dynamic_elements
Use css.querySelectorAll to find form elements
2 parents faebabe + c20052f commit 26e8642

File tree

1 file changed

+17
-9
lines changed

1 file changed

+17
-9
lines changed

src/browser/xhr/form_data.zig

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -115,17 +115,24 @@ const EntryIterable = iterator.Iterable(kv.EntryIterator, "FormDataEntryIterator
115115
// TODO: handle disabled fieldsets
116116
fn collectForm(form: *parser.Form, submitter_: ?*parser.ElementHTML, page: *Page) !kv.List {
117117
const arena = page.arena;
118-
const collection = try parser.formGetCollection(form);
119-
const len = try parser.htmlCollectionGetLength(collection);
118+
119+
// Don't use libdom's formGetCollection (aka dom_html_form_element_get_elements)
120+
// It doesn't work with dynamically added elements, because their form
121+
// property doesn't get set. We should fix that.
122+
// However, even once fixed, there are other form-collection features we
123+
// probably want to implement (like disabled fieldsets), so we might want
124+
// to stick with our own walker even if fix libdom to properly support
125+
// dynamically added elements.
126+
const node_list = try @import("../dom/css.zig").querySelectorAll(arena, @alignCast(@ptrCast(form)), "input,select,button,textarea");
127+
const nodes = node_list.nodes.items;
120128

121129
var entries: kv.List = .{};
122-
try entries.ensureTotalCapacity(arena, len);
130+
try entries.ensureTotalCapacity(arena, nodes.len);
123131

124132
var submitter_included = false;
125133
const submitter_name_ = try getSubmitterName(submitter_);
126134

127-
for (0..len) |i| {
128-
const node = try parser.htmlCollectionItem(collection, @intCast(i));
135+
for (nodes) |node| {
129136
const element = parser.nodeToElement(node);
130137

131138
// must have a name
@@ -181,10 +188,7 @@ fn collectForm(form: *parser.Form, submitter_: ?*parser.ElementHTML, page: *Page
181188
submitter_included = true;
182189
}
183190
},
184-
else => {
185-
log.warn(.web_api, "unsupported form element", .{ .tag = @tagName(tag) });
186-
continue;
187-
},
191+
else => unreachable,
188192
}
189193
}
190194

@@ -297,6 +301,7 @@ test "Browser.FormData" {
297301
\\ <input type=submit name=s2 value=s2-v>
298302
\\ <input type=image name=i1 value=i1-v>
299303
\\ </form>
304+
\\ <input type=text name=abc value=123 form=form1>
300305
});
301306
defer runner.deinit();
302307

@@ -356,6 +361,8 @@ test "Browser.FormData" {
356361

357362
try runner.testCases(&.{
358363
.{ "let form1 = document.getElementById('form1')", null },
364+
.{ "let input = document.createElement('input');", null },
365+
.{ "input.name = 'dyn'; input.value= 'dyn-v'; form1.appendChild(input);", null },
359366
.{ "let submit1 = document.getElementById('s1')", null },
360367
.{ "let f2 = new FormData(form1, submit1)", null },
361368
.{ "acc = '';", null },
@@ -378,6 +385,7 @@ test "Browser.FormData" {
378385
\\mlt-2=water
379386
\\mlt-2=tea
380387
\\s1=s1-v
388+
\\dyn=dyn-v
381389
},
382390
}, .{});
383391
}

0 commit comments

Comments
 (0)