<!DOCTYPE html>

<html>
<head>
    <script>
        if (window.testRunner) {
            testRunner.dumpAsText();
            testRunner.waitUntilDone();
        }

        function getClickUIScript(x, y)
        {
            return `
            (function() {
                uiController.singleTapAtPoint(${x}, ${y}, function() {
                    uiController.uiScriptComplete("Done");
                });
            })();`
        }

        function getDragUIScript(startX, startY, endX, endY)
        {
            return `
            (function() {
                uiController.dragFromPointToPoint(${startX}, ${startY}, ${endX}, ${endY}, 0.15, function() {
                    uiController.uiScriptComplete("Done");
                });
            })();`
        }

        function runTest()
        {
            if (!testRunner.runUIScript)
                return;

            function fail(event) {
                output += 'FAILED!: No mouse event should be receive, we got a ' + event.type;
            }
            window.addEventListener('mouseover', fail);
            window.addEventListener('mouseout', fail);
            window.addEventListener('mouseenter', fail);
            window.addEventListener('mouseleave', fail);
            window.addEventListener('mousedown', fail);
            window.addEventListener('mousemove', fail);
            window.addEventListener('mouseup', fail);
            window.addEventListener('click', fail);
            window.addEventListener('scroll', fail);

            let output = '';
            function getLogEvent(listener, shouldPreventDefault = false) {
                return function logEvent(event) {
                    output += 'Listener ' + listener + ' received' + (event.cancelable ? ' cancelable' : '') + ' event ' + event.type + ' targetting ' + event.target.id;
                    if (event.touches[0] && event.touches[0].clientX) {
                        output += ' at ' + event.touches[0].clientX + ', ' + event.touches[0].clientY;
                    }
                    output +=  '<br>';

                    if (shouldPreventDefault)
                        event.preventDefault();
                }
            }

            window.addEventListener('touchstart', getLogEvent("document"), { 'passive': true });
            window.addEventListener('touchmove', getLogEvent("document"), { 'passive': true });
            window.addEventListener('touchend', getLogEvent("document"), { 'passive': true });
            window.addEventListener('touchcancel', getLogEvent("document"), { 'passive': true });

            let target1 = document.getElementById('eventTarget1');
            target1.addEventListener('touchstart', getLogEvent("target1"), { 'passive': true });
            target1.addEventListener('touchmove', getLogEvent("target1", true));
            target1.addEventListener('touchend', getLogEvent("target1"), { 'passive': true });
            target1.addEventListener('touchcancel', getLogEvent("target1"), { 'passive': true });
            let target3 = document.getElementById('eventTarget3');
            target3.addEventListener('touchstart', getLogEvent("target3"), { 'passive': true });
            target3.addEventListener('touchmove', getLogEvent("target3", true));
            target3.addEventListener('touchend', getLogEvent("target3"), { 'passive': true });
            target3.addEventListener('touchcancel', getLogEvent("target3"), { 'passive': true });

            output += "<h1>Cancelled drag on Target1 (green)</h1>";
            testRunner.runUIScript(getDragUIScript(50, 50, 100, 100), function(result) {
                output += result;
                output += "<h1>Cancelled drag on Target2 (red)</h1>";
                testRunner.runUIScript(getDragUIScript(150, 50, 200, 100), function(result) {
                    output += result;
                    output += "<h1>Cancelled drag on Target3 (blue)</h1>";
                    testRunner.runUIScript(getDragUIScript(250, 50, 300, 100), function(result) {
                        output += result;
                        output += "<h1>Useless Click in the document, should be passive</h1>";
                        testRunner.runUIScript(getClickUIScript(300, 300), function(result) {
                            document.getElementById('output').innerHTML = output;
                            testRunner.notifyDone();
                        });
                    });
                });
            });
        }

        window.addEventListener('load', runTest, false);
    </script>
    <style>
        * { touch-action: manipulation; }
        body {
            margin: 0;
        }
        #eventTarget1, #eventTarget2, #eventTarget3 {
            width: 100px;
            height: 100px;
        }
        #eventTarget1 {
            background-color: green;
        }
        #eventTarget2 {
            background-color: red;
            position: absolute;
            left: 100px;
        }
        #eventTarget3 {
            background-color: blue;
            position: absolute;
            left: 100px;
        }
        body {
            height: 5000px;
        }
    </style>
    <meta name="viewport" content="initial-scale=1">
</head>
<body>
    <div id=eventTarget1>
        <div id=eventTarget2>
            <div id=eventTarget3>
            </div>
        </div>
    </div>
    <div id=output>
    This test requires UIScriptController to run.
    </div>
</body>
</html>
