<p>This tests that modifier keys are propagated to the fake mouse event created when you press return and a link has focus.</p>
<p>If the test succeeds, you should see six "PASS" messages below.</p>
<p>This is the <a id="link" href="#" onclick="checkKeyState(event)" onmousedown="checkKeyState(event)" onmouseuup="checkKeyState(event)">link</a> used for testing.</p>
<pre id="console">
</pre>
<script>

if (window.layoutTestController)
    layoutTestController.dumpAsText();

var link = document.getElementById("link");
link.focus();

var expectedCtrl;
var expectedAlt;
var expectedShift;
var expectedMeta;

function test(ctrlKey, altKey, shiftKey, metaKey)
{
    expectedCtrl = ctrlKey;
    expectedAlt = altKey;
    expectedShift = shiftKey;
    expectedMeta = metaKey;
    var event = document.createEvent("KeyboardEvents");
    event.initKeyboardEvent("keydown", true, true, document.defaultView, "Enter", 0, ctrlKey, altKey, shiftKey, metaKey, false);
    link.dispatchEvent(event);
}

function checkKeyState(event)
{
    if (event.ctrlKey == expectedCtrl && event.altKey == expectedAlt && event.shiftKey == expectedShift && event.metaKey == expectedMeta)
        document.getElementById("console").innerHTML += "PASS: " + event.type + " event had all the right key state.\n";
    else
        document.getElementById("console").innerHTML += "FAIL: " + event.type + " event did not have the right key state.\n";
}

test(false, false, false, false);
test(true, false, false, false);
test(false, true, false, false);
test(false, false, true, false);
test(false, false, false, true);
test(true, true, true, true);

link.blur();

</script>
