<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<meta charset="utf-8">
<script src="../../resources/js-test-pre.js"></script>
</head>
<body>
<p id="description"></p>
<input id="text" readonly="readonly" value="2009-04-29"/><br/>
<textarea id="area" readonly="readonly">2009-04-29</textarea></div>
<div id="console"></div>
<div>
<script type="text/javascript">
description('Tests for selectionStart and selectionEnd on read-only INPUT and TEXTAREA. <br/> <a href="https://bugs.webkit.org/show_bug.cgi?id=25444">bug 25444</a>: SelectionStart, selectionEnd properties return wrong values when the selection is in a form input.');

function startTest(element, start, end) {
    element.setSelectionRange(start, end);

    start = start < 0 ? 0 : start;
    end = end > 10 ? 10 : end;
    start = start > end ? end : start;

    if (element.selectionStart != start)
        testFailed('element.selectionStart' + ' should be ' + start + ' but it is ' + element.selectionStart);
    else
        testPassed('element.selectionStart' + ' is ' + element.selectionStart);

    if (element.selectionEnd != end)
        testFailed('element.selectionEnd' + ' should be ' + end + ' but it is ' + element.selectionEnd);
    else
        testPassed('element.selectionEnd' + ' is ' + element.selectionEnd);
}

function testHandler(element) {
    var offsets = [[0, 10], [0, 9], [1, 10], [5,5], [8,5], [-1,0], [-1,50]];
    for (var i = 0; i < offsets.length; i++)
        startTest(element, offsets[i][0], offsets[i][1]);
}

testHandler(document.getElementById('text'));
testHandler(document.getElementById('area'));        

 </script>  
 <script src="../../resources/js-test-post.js"></script>
 </body>
</html>

