<!DOCTYPE HTML>
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
</head>
<body>
<p id="description"></p>
<input type="button" onfocus="log('focused first button')" value="1">
<input type="text" onfocus="log('focused text field')" value="2">
<input type="button" onfocus="log('focused second button')" value="3">
<div id="console"></div>
<script>
description('https://bugs.webkit.org/show_bug.cgi?id=68412 - This test checks to see if option(alt)-tabbing properly focuses form elements that are normally not focused. For testing, the assumption is that by default pressing tab will skip over buttons, and option-tab will include buttons.');

var iteration = 0;
var modifiers;
var result;
function startTest() {
    debug("Pressing tab 4 times:");
    modifiers = undefined;
    testRunner.focusWebView(runKeyPresses);
}

function runKeyPresses() {
    result = '';
    for (var i = 0; i < 4; ++i) {
        result += ' /' + (i + 1) + ':';
        eventSender.keyDown("\t", modifiers);
    }
    iteration++;
    switch (iteration) {
        case 1:
            shouldBe('result', '" /1:focused text field /2: /3:focused text field /4:"');
            debug("Pressing shift-tab 4 times:");
            modifiers = ["shiftKey"];
            testRunner.focusWebView(runKeyPresses);
            break;
        case 2:
            shouldBe('result', '" /1:focused text field /2: /3:focused text field /4:"');
            debug("Pressing option-tab 4 times:");
            modifiers = ["altKey"];
            testRunner.focusWebView(runKeyPresses);
            break;
        case 3:
            shouldBe('result', '" /1:focused first button /2:focused text field /3:focused second button /4:"');
            debug("Pressing shift-option-tab 4 times:");
            modifiers = ["shiftKey", "altKey"];
            testRunner.focusWebView(runKeyPresses);
            break;
        case 4:
            shouldBe('result', '" /1:focused second button /2:focused text field /3:focused first button /4:"');
            testRunner.removeChromeInputField(notifyDone);
            break;
    }
}

function notifyDone() {
    setTimeout(function() { testRunner.notifyDone(); }, 0);
}

function log(val) {
    result += val;
}

/////////////////////////////////
if (window.testRunner && window.eventSender && testRunner.addChromeInputField) {
    window.jsTestIsAsync = true;
    testRunner.addChromeInputField(startTest);
} else
    finishJSTest();

var successfullyParsed = true;
</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>
