<!DOCTYPE html>
<script src="../../resources/js-test.js"></script>
<style>
  #target {
    width: 2000px;
    height: 1500px;
  }
</style>
<script>
    var numScrollsReceived = 0;
    var numRAFCalls = 0;
    if (window.testRunner && window.internals) {
        window.jsTestIsAsync = true;
        testRunner.dumpAsText();
        testRunner.waitUntilDone();
        setPrintTestResultsLazily();
    }

    description("This test ensures that scrolling the visual viewport doesn't\
        trigger an onscroll event.");

    function runTest() {
        if (!window.testRunner || !window.internals) {
            testFailed("This test requires test runner and internals")
            finishJSTest();
            return;
        }

        internals.settings.setScrollAnimatorEnabled(false);

        window.internals.setPageScaleFactor(2.0);
        var target = document.getElementById('target');

        document.onscroll = function() {
            ++numScrollsReceived;
            debug('OnScroll called for scroll #' + numScrollsReceived);
        }

        var failureSentinel = function() {
            if (numRAFCalls == 0) {
                // The first scroll should trigger onscroll because it scrolls
                // the layout viewport.
                eventSender.mouseMoveTo(target.offsetLeft + 5, target.offsetTop + 5);
                eventSender.continuousMouseScrollBy(0, -400);
            } else if (numRAFCalls == 1) {
                shouldBe('numScrollsReceived', '1');
                // The second scroll should not trigger onscroll because it only
                // scrolls the visual viewport.
                eventSender.mouseMoveTo(target.offsetLeft + 5, target.offsetTop + 5);
                eventSender.continuousMouseScrollBy(0, 40);
            } else {
                shouldBe('numScrollsReceived', '1');
                finishJSTest();
                return;
            }
            ++numRAFCalls;
            window.requestAnimationFrame(failureSentinel);
        }

        window.requestAnimationFrame(failureSentinel);
    }

    onload = runTest;
</script>
<div id="target"></div>
