chromium/third_party/blink/web_tests/virtual/overlay-scrollbar/plugin-overlay-scrollbar-mouse-capture.html

<head>
    <script src="../../resources/js-test.js"></script>
    <script src="../../resources/gesture-util.js"></script>
    <style>
        body {
            /* Hide the horizontal-scrollbar so that clicking right at the
               bottom of the vertical scrollbar will trigger a scroll */
            overflow-x: hidden;
        }
        #container {
            /* The plugin is guaranteed not to be in the margin. */
            margin-left: 10px;
        }
    </style>
</head>
<body>
    <div id="container"></div>
    <pre id="console"></pre>
</body>
<script>
    description('This tests whether scrolling still works correctly when an '
    + 'overlay scrollbar is over a plugin. Clicking on the overlay scrollbar '
    + 'should cause it to activate and capture input.');

    window.jsTestIsAsync = true;
    var startLogging = false;
    var eventHistory = [];

    function runTest() {
        internals.setScrollbarVisibilityInScrollableArea(document, true);

        // Mouse down on the scrollbar thumb which is over the plugin.
        eventSender.mouseMoveTo(window.innerWidth - 1, 50);
        eventSender.mouseDown();
        // Drag the thumb down but move off the thumb, the plugin shouldn't
        // receive any events because there shouldn't be any mouse capture.
        eventSender.mouseMoveTo(window.innerWidth - 20, window.innerHeight - 10);
        // A mouse up will be received because when dragging off a
        // scrollbar and releasing, it dispatches an event to the last
        // element under the mouse.
        eventSender.mouseUp();

        // The scrollbar captures the input and the plugin should not receive
        // events.
        shouldBe('eventHistory.length', '0');
        requestAnimationFrame(function() {
          shouldBeTrue('window.scrollY > 0');
          finishJSTest();
        });
    }

    window.onload = function() {
        if (!window.eventSender || !window.internals) {
            finishJSTest();
            return;
        }

        var plugin = document.createElement('object');
        plugin.type = 'application/x-webkit-test-webplugin';
        plugin.width = window.innerWidth * 2;
        plugin.height = window.innerHeight * 2;
        plugin.addEventListener('mousedown', function(e) {
            startLogging = true;
            eventHistory.push('plugin.mousedown');
        });
        plugin.addEventListener('mouseup', function(e) {
            if (startLogging)
                eventHistory.push('plugin.mouseup');
        });
        plugin.addEventListener('mousemove', function(e) {
            if (startLogging)
                eventHistory.push('plugin.mousemove');
        });

        var d = document.getElementById('container');
        d.appendChild(plugin);

        waitForCompositorCommit().then(runTest);
    }
</script>