<html>
<style>
div#styled::-webkit-scrollbar {
  width:17px;
  height:17px;
}

div#styled::-webkit-scrollbar-button {
  display:block;
  width: 17px;
  height: 17px;
}

div#styled::-webkit-scrollbar-button:vertical {
  background-color:lightblue;
  border:2px solid black;
}

div#styled::-webkit-scrollbar-button:horizontal {
  background-color:#208020;
  border:2px solid black;
}

div#styled::-webkit-scrollbar-thumb {
  min-width:20px;
  min-height:20px;
  background-color: navy;
  border:2px solid #cccccc;
}

div#styled::-webkit-scrollbar-thumb:horizontal {
  background-color: #004000;
}

div#styled::-webkit-scrollbar-button:disabled {
  display:none
}

div#styled::-webkit-scrollbar-track {
  background-color: #2060a0;
}

div#styled::-webkit-scrollbar-track:horizontal {
  background-color: #40a040;
}
</style>
<body style="margin:0">
<script>
if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.waitUntilDone();
}
</script>
<div id="overflow" style="border:2px solid black;overflow:auto;height:200px;width:200px; left: 0px; top: 100px; position: absolute;">
<div style="background-color:green;width:1000px;height:1000px;"></div>
<div style="background-color:red;width:1000px;height:1000px;"></div>
</div>
<div id="styled" style="width:200px; height:200px; overflow-y:scroll; overflow-x:scroll; position: absolute; left: 450px; top: 100px;">
Hello<br>
Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>
Hello<br>Hello<br>Hello<br>Hello<br>
Hello<br>Hello<br>Hello<br>Hello<br>
<span style="white-space:nowrap">Hello world this is a long string and will not wrap.</span>
Hello<br>Hello<br>Hello<br>Hello<br>
Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>
Hello<br>Hello<br>Hello<br>Hello<br>
Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>
Hello<br>Hello<br>Hello<br>Hello<br>
Hello<br>Hello<br>Hello<br>
</div>
<p>Test
for <a href="https://bugs.webkit.org/show_bug.cgi?id=29348">bug
29348</a>: This tests that using the mouse wheel while having the
pointer in a horizontal scrollbar makes it scroll horizontally, also
with styled scrollbars. On success, the vertical offset for both divs
should be 80, and the horizonta 40.<p/>
<div id="console"></div>
<script>
function failed() {
    document.getElementById('console').innerHTML = "FAILED";
    window.testRunner.notifyDone();
}

if (window.eventSender) {
    var overflow = document.getElementById('overflow');

    // Scroll inside the div
    var x = overflow.offsetLeft + overflow.offsetWidth - 50;
    var y = overflow.offsetTop + overflow.offsetHeight - 50;
    eventSender.mouseMoveTo(x, y);
    eventSender.mouseScrollBy(0, -1);

    if (overflow.scrollTop != 40 || overflow.scrollLeft != 0)
        failed();

    // Scroll on top of the horizontal scrollbar
    var x = overflow.offsetLeft + overflow.offsetWidth - 50;
    var y = overflow.offsetTop + overflow.offsetHeight - 6;
    eventSender.mouseMoveTo(x, y);
    eventSender.mouseScrollBy(0, -1);

    if (overflow.scrollTop != 40 || overflow.scrollLeft != 40)
        failed();

    // Scroll on top of the vertical scrollbar
    var x = overflow.offsetLeft + overflow.offsetWidth - 6;
    var y = overflow.offsetTop + overflow.offsetHeight - 50;
    eventSender.mouseMoveTo(x, y);
    eventSender.mouseScrollBy(0, -1);

    if (overflow.scrollTop != 80 || overflow.scrollLeft != 40)
        failed();

    var styled = document.getElementById('styled');

    // Scroll inside the div
    var x = styled.offsetLeft + styled.offsetWidth - 50;
    var y = styled.offsetTop + styled.offsetHeight - 50;
    eventSender.mouseMoveTo(x, y);
    eventSender.mouseScrollBy(0, -1);

    if (styled.scrollTop != 40 || styled.scrollLeft != 0)
        failed();

    // Scroll on top of the horizontal scrollbar
    var x = styled.offsetLeft + styled.offsetWidth - 50;
    var y = styled.offsetTop + styled.offsetHeight - 6;
    eventSender.mouseMoveTo(x, y);
    eventSender.mouseScrollBy(0, -1);

    if (styled.scrollTop != 40 || styled.scrollLeft != 40)
        failed();

    // Scroll on top of the vertical scrollbar
    var x = styled.offsetLeft + styled.offsetWidth - 6;
    var y = styled.offsetTop + styled.offsetHeight - 50;
    eventSender.mouseMoveTo(x, y);
    eventSender.mouseScrollBy(0, -1);

    if (styled.scrollTop != 80 || styled.scrollLeft != 40)
        failed();

    setTimeout(finished, 500);
}

function finished()
{
    var msg = "Scroll offset for 'overflow' is " + document.getElementById('overflow').scrollTop + " and " + document.getElementById('overflow').scrollLeft;
    msg += "<br/>";
    msg += "Scroll offset for 'styled' is " + document.getElementById('styled').scrollTop + " and " + document.getElementById('styled').scrollLeft;

    document.getElementById('console').innerHTML = msg;

    // Just to cleanup the test results page
    document.getElementById('styled').style.display = 'none';

    window.testRunner.notifyDone();
}

</script>
</body>
</html>
