<html>
<head>
</head>
<body>
<form>
<input id="textEmpty" type="text"><br>
<input id="textValue" type="text" value="Default Value"><br>
<input id="passwordEmpty" type="password"><br>
<input id="passwordValue" type="password" value="Default Value"><br>
<input id="hiddenEmpty" type="hidden"><br>
<input id="hiddenValue" type="hidden" value="Default Value">

<input id="inputReset" type="reset">
<button id="buttonReset" type="reset">Reset Button</button>
</form>
<p>This test verifies that text-type input form controls are properly reset by
both a reset input control and a reset button control.<br>
(But file input element values can't be modified by JS, so this test can't be
used for those.)</p>

<p>You should see six element IDs below, and the word "SUCCESS" twice after each:</p>

<script>
if (window.testRunner)
    testRunner.dumpAsText();
var inputReset = document.getElementById("inputReset");
var buttonReset = document.getElementById("buttonReset");

function testValue(testElement, expected, button)
{
    var success = false;
    if (testElement.value == expected)
    {
        testElement.value = "Not Expected! " + expected;
        button.click();
        if (testElement.value == expected)
          success = true;
    }
    if (success)
        document.writeln(": SUCCESS");
    else
        document.writeln(": FAILED (value = " + testElement.value + ")");
}

function test(elementId, expected)
{
    var element = document.getElementById(elementId);
    document.writeln(elementId);
    testValue(element, expected, inputReset);
    testValue(element, expected, buttonReset);
    document.writeln("<br>");
}

test("textEmpty", "");
test("textValue", "Default Value");
test("passwordEmpty", "");
test("passwordValue", "Default Value");
</script>
</body>
</html>
