<!DOCTYPE HTML><!-- webkit-test-runner [ experimental:CSSOMViewSmoothScrollingEnabled=true ] -->
<style>
#scroller {
    width: 200px;
    height: 200px;
    border: 1px solid black;
    overflow: scroll;
    scroll-behavior: smooth;
}

#innerDiv {
    width: 400px;
    height: 400px;
}
</style>

<body style="margin:0" onload="startTest()">
<div id="scroller">
    <div id="innerDiv">

    </div>
</div>
<div id="log"></div>
</body>

<script>
var initialScrollTop;
var startYPosition;
var endYPosition;
var scroller = document.getElementById('scroller');

function log(msg)
{
    document.getElementById('log').appendChild(document.createTextNode(msg + '\n'));
}
function testDragScrollResult()
{
    if (window.eventSender) {
        // Try to prevent momentum scroll
        eventSender.mouseMoveTo(50, endYPosition - 50);
        eventSender.mouseUp();
    }
    if (scroller.scrollTop > initialScrollTop)
        log("PASS: Test drag scroll-behavior:smooth element");
    else
        log("FAIL: Test drag scroll-behavior:smooth element");

    if (window.testRunner)
        testRunner.notifyDone();
}

function startTest() {
    if (window.testRunner) {
        testRunner.waitUntilDone();
        testRunner.dumpAsText();
    }

    startYPosition = scroller.offsetHeight - 50;
    endYPosition = scroller.offsetHeight + 100;
    initialScrollTop = scroller.scrollTop;

    if (window.eventSender) {
        eventSender.dragMode = false;
        eventSender.mouseMoveTo(50, startYPosition);
        eventSender.mouseDown();
        eventSender.mouseMoveTo(50, startYPosition + 20);
        eventSender.mouseMoveTo(50, endYPosition);
        setTimeout(testDragScrollResult, 100);
    } else {
        log("Test can't run without eventSender");
    }
}

</script>
