tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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");