iteration.any.js (2275B)
1 // META: title=FormData: changes to entry list during iteration 2 3 // These are tests for next()'s behavior as specified in 4 // https://webidl.spec.whatwg.org/#es-iterator-prototype-object 5 6 "use strict"; 7 8 function createFormData(input) { 9 const formData = new FormData(); 10 11 for (const [name, value] of input) { 12 formData.append(name, value); 13 } 14 15 return formData; 16 } 17 18 test(() => { 19 const formData = createFormData([["foo", "0"], 20 ["baz", "1"], 21 ["BAR", "2"]]); 22 const actualKeys = []; 23 const actualValues = []; 24 for (const [name, value] of formData) { 25 actualKeys.push(name); 26 actualValues.push(value); 27 formData.delete("baz"); 28 } 29 assert_array_equals(actualKeys, ["foo", "BAR"]); 30 assert_array_equals(actualValues, ["0", "2"]); 31 }, "Iteration skips elements removed while iterating"); 32 33 test(() => { 34 const formData = createFormData([["foo", "0"], 35 ["baz", "1"], 36 ["BAR", "2"], 37 ["quux", "3"]]); 38 const actualKeys = []; 39 const actualValues = []; 40 for (const [name, value] of formData) { 41 actualKeys.push(name); 42 actualValues.push(value); 43 if (name === "baz") 44 formData.delete("foo"); 45 } 46 assert_array_equals(actualKeys, ["foo", "baz", "quux"]); 47 assert_array_equals(actualValues, ["0", "1", "3"]); 48 }, "Removing elements already iterated over causes an element to be skipped during iteration"); 49 50 test(() => { 51 const formData = createFormData([["foo", "0"], 52 ["baz", "1"], 53 ["BAR", "2"], 54 ["quux", "3"]]); 55 const actualKeys = []; 56 const actualValues = []; 57 for (const [name, value] of formData) { 58 actualKeys.push(name); 59 actualValues.push(value); 60 if (name === "baz") 61 formData.append("X-yZ", "4"); 62 } 63 assert_array_equals(actualKeys, ["foo", "baz", "BAR", "quux", "X-yZ"]); 64 assert_array_equals(actualValues, ["0", "1", "2", "3", "4"]); 65 }, "Appending a value pair during iteration causes it to be reached during iteration");