<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
<script>
jsTestIsAsync = true;

var numErrors = 0;
var numErrorsExpected = 0;

function runTests()
{
    if (typeof HTMLFormElement.prototype.requestAutocomplete != 'function') {
        testFailed('no requestAutocomplete function');
        finishJSTest();
        return;
    }

    checkDynamicAttributes();
    checkParsedAttributes();
    checkNonUserGesture();
}

function checkForEnumerableProperties(form)
{
    var enumerated = false;
    for (var field in form) {
        if (/onautocomplete/.test(field))
            testFailed('enumerable form attribute found on HTMLFormElement: ' + field);
        enumerated = true;
    }
    if (enumerated)
        testPassed('no enumerable properties on HTMLFormElement');
    else
        testFailed('failed to enumerate HTMLFormElement properties');
}

function checkParsedAttributes()
{
    numErrorsExpected += 1;

    var form = document.forms[0];
    checkForEnumerableProperties(form);

    // Currently Chrome just immediately dispatches an error.
    form.onautocompleteerror = errorWithReason('disabled');
    form.requestAutocomplete();
}

function checkDynamicAttributes()
{
    numErrorsExpected += 1;

    var form = document.createElement('form');
    checkForEnumerableProperties(form);

    form.autocomplete = 'off';
    form.onautocompleteerror = errorWithReason('disabled');
    form.requestAutocomplete();
}

function checkNonUserGesture()
{
    numErrorsExpected += 1;

    var form = document.createElement('form');
    checkForEnumerableProperties(form);
    form.onautocompleteerror = errorWithReason('disabled');

    setTimeout(function()
    {
        form.requestAutocomplete();
    }, 0);
}

function errorWithReason(reason)
{
    return function(event) {
        if (event instanceof AutocompleteErrorEvent)
            testPassed('event is an AutocompleteErrorEvent');
        else
            testFailed('expected an AutocompleteErrorEvent');

        if (event.reason == reason)
            testPassed('got expected reason: ' + reason);
        else
            testFailed('wrong reason, expected: ' + reason + ', got: ' + event.reason);

        onError();
    };
}

function onError()
{
    numErrors += 1;
    if (numErrors > numErrorsExpected)
        testFailed('too many error events');
    else if (numErrors == numErrorsExpected) {
        testPassed('got expected number of error events (' + numErrorsExpected + ')');
        finishJSTest();
    }
}

window.addEventListener('load', runTests, true);
</script>
</head>
<body>
<p> <a href="http://bugs.webkit.org/show_bug.cgi?id=100557">HTMLFormElement#requestAutocomplete and associated events</a> </p>
<p> For this test to pass, you should see all PASSED below. </p>
<form autocomplete="off" onautocompleteerror="onError();"></form>
<p id="console"></p>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>
