<html>
<head>
<script>

if (window.testRunner)
    testRunner.dumpAsText();

function log(message)
{    
    var txt = document.createTextNode(message);
    document.getElementById("logger").appendChild(txt);
    document.getElementById("logger").appendChild(document.createElement('br'));
}

function logAutoCompleteAPIResult()
{
    if (testRunner.elementDoesAutoCompleteForElementWithId("autoInput"))
        log("Element does autocomplete");
    else
        log("Element does *not* autocomplete");
}

function runTest()
{
    if (!window.testRunner) {
        alert("This test can only be run in DumpRenderTree");
        return;
    }
    
    var form = document.getElementById("autoForm");
    var input = document.getElementById("autoInput");
    
    // Test with no autocomplete attribute on the <form>
    logAutoCompleteAPIResult();

    input.setAttribute("autocomplete", "cheese");
    logAutoCompleteAPIResult();

    input.setAttribute("autocomplete", "off");
    logAutoCompleteAPIResult();

    input.setAttribute("autocomplete", "on");
    logAutoCompleteAPIResult();

    input.setAttribute("autocomplete", "cheese");
    logAutoCompleteAPIResult();

    input.removeAttribute("autocomplete");
    logAutoCompleteAPIResult();
    
    // Test with autocomplete="off" on the <form>
    form.setAttribute("autocomplete", "off");
    logAutoCompleteAPIResult();
    
    input.setAttribute("autocomplete", "cheese");
    logAutoCompleteAPIResult();

    input.setAttribute("autocomplete", "off");
    logAutoCompleteAPIResult();

    input.setAttribute("autocomplete", "on");
    logAutoCompleteAPIResult();

    input.setAttribute("autocomplete", "cheese");
    logAutoCompleteAPIResult();

    input.removeAttribute("autocomplete");
    logAutoCompleteAPIResult();
}

</script>
</head>
<body onload="runTest();">
<div id="logger"></div>
<form id="autoForm" method="post">
<input type="text" id="autoInput"/>
</form>
This test exercises the WebKit API "elementDoesAutoComplete:" to make sure that API clients get the correct answer about whether or not a an element should autocomplete.
</body>
</html>
