<script>

var count = 0;
var keyEventTime;

function sendKeyEvent()
{
    if (window.eventSender)
        eventSender.keyDown("x");
}

function sendDeleteKeyEvent()
{
    if (window.eventSender)
        eventSender.keyDown("\x7F");
}

function keyEvent(event)
{
    keyEventTime = event.timeStamp;
}

function searchEvent(event)
{
    document.getElementById("times").innerHTML += " " + (Math.round((event.timeStamp - keyEventTime) / 100) / 10);
    count += 1;
    if (count != 6) {
        if (count != 5)
            sendKeyEvent();
        else {
            document.getElementById("search").select();
            sendDeleteKeyEvent();
        }
    } else {
        if (window.layoutTestController)
            layoutTestController.notifyDone();
    }
}

function startTest()
{
    if (window.layoutTestController) {
        layoutTestController.dumpAsText();
        layoutTestController.waitUntilDone();
    }
    document.getElementById("search").focus();
    sendKeyEvent();
}

</script>

<body onload="startTest()">

<p>This tests the delay between when you type and the search event fires.</p>

<p>As of this writing we can't use DOM events to type into a search field, so the test uses the event sender and only runs under DumpRenderTree.</p>

<p><input id="search" type="search" incremental onkeypress="keyEvent(event)" onsearch="searchEvent(event)"></p>

<div>The two rows below should match.</div>
<div>0.5 0.4 0.3 0.2 0.2 0</p>
<div id="times"></div>

</body>
