<p>Test that SELECT is in correct state when handling a DOM modification event for option removing.</p>
<form>
<select ><option selected>1</option><option>2</option></select>
<select multiple><option selected>1</option><option selected>2</option></select>
<select multiple></select>
</form>
<div id=res></div>
<script>
    if (window.testRunner)
        testRunner.dumpAsText();

    function log(msg)
    {
        var r = document.getElementById('res');
        r.innerHTML = r.innerHTML + "<br>" + msg;
    }

    var theSelect;

    function testResults(expectedArr)
    {
        var resultsArr = new Array(theSelect.options.length);
        
        var i;
        for (i=0; i < theSelect.options.length; i++) {
            resultsArr[i] = theSelect.options[i].selected;
        }
        var successString = "Failed";
        var success = false;
        if (expectedArr.join() == resultsArr.join()) {
            success = true;
            successString = "Passed";
        }
        
        log(successString);
        if (!success) {
            log("<pre>     Expected: " + expectedArr.join() + "<br>" + "     Actual: " + resultsArr.join() + "</pre>");
        }
    }

    function subtreeModified()
    {
        testResults([true], theSelect);
    }

    function nodeInserted()
    {
        testResults([false], theSelect);
    }

    try {
        theSelect = document.forms[0].elements[0];
        theSelect.addEventListener("DOMSubtreeModified", subtreeModified, true);
        theSelect.remove(theSelect.options[0]);

        theSelect = document.forms[0].elements[1];
        theSelect.addEventListener("DOMSubtreeModified", subtreeModified, true);
        theSelect.remove(theSelect.options[0]);

        theSelect = document.forms[0].elements[2];
        theSelect.addEventListener("DOMNodeInserted", nodeInserted, true);
        theSelect.options.add(new Option("2", "2", false, false), 0);

    } catch (ex) {
        alert(ex);
    }
</script>
