<html>
    <head>
        <title>Pan Scrolling Test</title>
    </head>
    <body>
        <script>
            if (window.testRunner) {
                testRunner.dumpAsText();
                testRunner.waitUntilDone();
            }
        </script>
        <div id="overflow" style="width:500px; height:150px; overflow:auto; border:2px solid red; padding:10px">
            <map name="navMap">
                <area shape=rect coords="0,0,100,50" href=""> 
            </map>
            <img border="2" width="100" height="100" usemap="#navmap" ismap>
            <h1>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=32613">bug 32613</a> This tests that middle
            clicking on the part of an image map that does have a link will not scroll.</h1>
        </div>
        <p>
        <div id="console"></div>
        <script>
            if (window.eventSender)
            {
                // 50, 50 is inside the area part of the map with the href.
                eventSender.mouseMoveTo(50, 50);
                eventSender.mouseDown(1);
                eventSender.mouseMoveTo(50, 200);
                setTimeout(finished, 500);
            }
            
            function finished()
            {
                eventSender.mouseUp(1);
                if (!document.getElementById('overflow').scrollTop)
                    document.getElementById('console').innerHTML = "Success! Div with overflow was not scrolled";
                else
                    document.getElementById('console').innerHTML = "Fail! Div with overflow was scrolled";
                
                window.testRunner.notifyDone();
            }
        </script>
    </body>
</html>
