<html>
    <head>
        <script>
       function log(msg)
       {
           document.getElementById('console').appendChild(document.createTextNode(msg + '\n'));
       }

       function test()
       {
           if (window.layoutTestController) {
               layoutTestController.waitUntilDone();
               layoutTestController.dumpAsText();
               setTimeout(autoscrollTestPart1, 0);
           }
       }

       function autoscrollTestPart1()
       {
           var iframe = document.getElementById('NoScrolliFrame');
           var iframeDocument = iframe.contentDocument;
           var textInIframe = iframeDocument.getElementById('textInFrame');
           if (window.eventSender) {
               var x = iframe.offsetLeft + textInIframe.offsetLeft + 7;
               var y = iframe.offsetLeft + textInIframe.offsetTop + 7;
               eventSender.dragMode = false;
               eventSender.mouseMoveTo(x, y);
               eventSender.mouseDown();
               eventSender.mouseMoveTo(x + 220, y + 220);
           }
           setTimeout(autoscrollTestPart2, 100);
       }

       function autoscrollTestPart2()
       {
           if (window.eventSender)
               eventSender.mouseUp();
           var sd = document.getElementById('scrollableDiv');
           if (sd.scrollLeft != 0)
               log("PASSED : the autoscroll has worked !");
           else
               log("FAILED : the autoscroll has not worked :-(");
           
           if (window.layoutTestController)
               layoutTestController.notifyDone();
       }       
        </script>
    </head>
<body onload="test()">
       
   <div id="scrollableDiv" style="height: 100px; overflow-x: auto; overflow-y: auto; width: 100px">
       <div style=" height: 1000px; width: 1000px">
           <iframe id="NoScrolliFrame" src="resources/big-page-with-overflow-hidden.html" style="height: 1000px; width: 1000px"></iframe>
       </div>
   </div>

    <div id="console">
       rdar://problem/6166435  Inspector doesn't auto scroll when selecting text (20451) <br>
       To do the test manually you have to try triggering the autoscroll by starting the dragging from within the blue iframe. If the autoscroll occurs the text has passed, if the autoscroll isn't working, the test has failed<br>
       nb: Knowing that the iframe document has a overflow: hidden on his body but the whole iframe is embedded in scrollable div, the scrollable div have to be able to trigger the autoscroll<br>
       Though you should be able to write some long text in the input and to trigger the autoscroll within the input.<br>
   </div>
    
</body>
</html>

