<script>

function test() {
    if (window.layoutTestController)
        layoutTestController.dumpAsText();

    var inputs = "";
    for (i = 0; i != 500; ++i)
        inputs += "<input>";

    document.getElementById("a").innerHTML = inputs;
    document.getElementById("b").innerHTML = inputs;
    document.getElementById("a").innerHTML = "";
    document.getElementById("c").innerHTML = inputs;

    document.getElementById("a").innerHTML = "";
    document.getElementById("b").innerHTML = "";
    document.getElementById("c").innerHTML = "";

    document.getElementById("a").innerHTML = inputs;
    document.getElementById("b").innerHTML = inputs;
    document.getElementById("a").innerHTML = "";
    document.getElementById("c").innerHTML = inputs;

    document.getElementById("a").innerHTML = "";
    document.getElementById("b").innerHTML = "";
    document.getElementById("c").innerHTML = "";

    document.getElementById("a").innerHTML = inputs;
    document.getElementById("b").innerHTML = inputs;
    document.getElementById("a").innerHTML = "";
    document.getElementById("c").innerHTML = inputs;

    document.getElementById("complete").innerHTML = "The test was run. If it failed you would have seen an assertion failure or crash. "
        + "In some cases the crash won't occur until you move on to the next page.";
    document.getElementById("b").innerHTML = "";
    document.getElementById("c").innerHTML = "";
}

</script>

<body onload="test()">

<p>This adds and removes lots of input elements, to test the behavior of ListHashSet when it has more elements than will fit in its pool.</p>

<p id="complete">IF YOU CAN SEE THIS, THE TEST DID NOT RUN.</p>

<div id="a"></div><div id="b"></div><div id="c"></div>
