@@ -115,17 +115,24 @@ const EntryIterable = iterator.Iterable(kv.EntryIterator, "FormDataEntryIterator
115115// TODO: handle disabled fieldsets
116116fn 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