// META: title=FormData: changes to entry list during iteration // These are tests for next()'s behavior as specified in // https://webidl.spec.whatwg.org/#es-iterator-prototype-object "use strict"; function createFormData(input) { const formData = new FormData(); for (const [name, value] of input) { formData.append(name, value); } return formData; } test(() => { const formData = createFormData([["foo", "0"], ["baz", "1"], ["BAR", "2"]]); const actualKeys = []; const actualValues = []; for (const [name, value] of formData) { actualKeys.push(name); actualValues.push(value); formData.delete("baz"); } assert_array_equals(actualKeys, ["foo", "BAR"]); assert_array_equals(actualValues, ["0", "2"]); }, "Iteration skips elements removed while iterating"); test(() => { const formData = createFormData([["foo", "0"], ["baz", "1"], ["BAR", "2"], ["quux", "3"]]); const actualKeys = []; const actualValues = []; for (const [name, value] of formData) { actualKeys.push(name); actualValues.push(value); if (name === "baz") formData.delete("foo"); } assert_array_equals(actualKeys, ["foo", "baz", "quux"]); assert_array_equals(actualValues, ["0", "1", "3"]); }, "Removing elements already iterated over causes an element to be skipped during iteration"); test(() => { const formData = createFormData([["foo", "0"], ["baz", "1"], ["BAR", "2"], ["quux", "3"]]); const actualKeys = []; const actualValues = []; for (const [name, value] of formData) { actualKeys.push(name); actualValues.push(value); if (name === "baz") formData.append("X-yZ", "4"); } assert_array_equals(actualKeys, ["foo", "baz", "BAR", "quux", "X-yZ"]); assert_array_equals(actualValues, ["0", "1", "2", "3", "4"]); }, "Appending a value pair during iteration causes it to be reached during iteration");