<html>
<head>
<script>
    function log(msg) {
        document.getElementById('res').innerHTML = document.getElementById('res').innerHTML + msg + "<br>";
    }
    
    function test() {
        if (window.layoutTestController)
            layoutTestController.dumpAsText();
        var tf = document.getElementById('tf');
      
        log('Calling focus on text field');
        tf.focus();
        log('After focus: text field selection start: ' + tf.selectionStart + ' end: ' + tf.selectionEnd + '<br>');

        log('Calling setSelectionRange on text field');
        tf.setSelectionRange(3, 5);
        log('After setSelectionRange(3, 5): text field selection start: ' + tf.selectionStart + ' end: ' + tf.selectionEnd + '<br>');

        log('Double clicking to make selection for text field');
        if (window.eventSender) {
            eventSender.mouseMoveTo(60, 55);
            eventSender.mouseDown();
            eventSender.mouseUp();
            eventSender.mouseDown();
            eventSender.mouseUp();
        }
        log('After double clicking: text field selection start: ' + tf.selectionStart + ' end: ' + tf.selectionEnd + '<br>');

        log('Calling blur on text field');
        tf.blur();
        log('After blur: text field selection start: ' + tf.selectionStart + ' end: ' + tf.selectionEnd + '<br>');

        log('Calling focus on text field');
        tf.focus();
        log('After focus: text field selection start: ' + tf.selectionStart + ' end: ' + tf.selectionEnd);
    }
</script>
</head>
<body onload="test()"><br>
This tests onSelect for text fields.  <br><br>
<input type="text" id="tf" onselect="log('onselect fired for text field');" style="position: absolute; top: 50; left: 10;" value="input text"></input>
<div id="res" style="position: absolute; top: 100; left: 10;"></div>
</body>
</html>

