<html>
<head>
<script type="text/javascript" src="../../http/tests/inspector-protocol/inspector-protocol-test.js"></script>
<script>

window.addEventListener("keydown", logEvent);
window.addEventListener("keypress", logEvent);
window.addEventListener("keyup", logEvent);

function logEvent(event)
{
    log("-----Event-----");
    log("type: " + event.type);
    if (event.altKey)
        log("altKey");
    if (event.ctrlKey)
        log("ctrlKey");
    if (event.metaKey)
        log("metaKey");
    if (event.shiftKey)
        log("shiftKey");
    if (event.keyCode)
        log("keyCode: " + event.keyCode);
    if (event.key)
        log("key: " + event.key);
    if (event.charCode)
        log("charCode: " + event.charCode);
    if (event.text)
        log("text: " + event.text);
    log("");
}

function test()
{
    var events = [
        {
            "type": "rawKeyDown",
            "windowsVirtualKeyCode": 65, // VK_A
            "key": "A"
        },
        {
            "type": "char",
            "modifiers": 8, // shift
            "text": "A",
            "unmodifiedText": "a"
        },
        {
            "type": "keyUp",
            "windowsVirtualKeyCode": 65,
            "key": "A"
        },
        {
            "type": "char",
            "text": "\u05E9",  // Hebrew Shin (sh)
            "unmodifiedText": "\u05E9"
        }
    ];

    for (var i = 0; i < events.length; i++)
        InspectorTest.sendCommand("Input.dispatchKeyEvent", events[i], checkResponse.bind(undefined, i == events.length - 1));

    function checkResponse(isLastCommand, msg)
    {
        if (msg.error)
            InspectorTest.log("Error: " + msg.error.message);
        if (isLastCommand)
            InspectorTest.completeTest();
    }
}

</script>
</head>
<body onload="runTest()">
</body>
</html>
