<!DOCTYPE html>
<html>
<head>
    <title>Touch Adjustment : Touch adjustment does not target shadow DOM elements - bug 89556</title>
    <script src="../resources/js-test-pre.js"></script>
    <style>
        #targetDiv {
            background: #00f;
            height: 100px;
            position: relative;
            width: 100px;
        }
    </style>

</head>

<body>

<div id="targetDiv">
</div>

<p id='description'></p>
<div id='console'></div>

<script>
    var element;
    var adjustedNode;
    var adjustedPoint;

    function findAbsolutePosition(node) {
        var pos = {left: 0, top: 0};
        do {
            pos.left += node.offsetLeft;
            pos.top += node.offsetTop;
        } while (node = node.offsetParent);
        return pos;
    }

    function addShadowDOM() {
        var targetDiv = document.getElementById("targetDiv");
        var root = internals.ensureShadowRoot(targetDiv);
        var shadowDiv = document.createElement("div");
        shadowDiv.style.width = "20px";
        shadowDiv.style.height = "20px";
        shadowDiv.style.background = "#ff0";
        shadowDiv.style.position = "absolute";
        shadowDiv.style.right = "10px";
        shadowDiv.style.top = "10px";
        shadowDiv.addEventListener('click', function() {}, false);
        root.appendChild(shadowDiv);
    }

    function runTouchTests() {
        element = document.getElementById("targetDiv");
        element.addEventListener('click', function() {}, false);
        document.addEventListener('click', function() {}, false);

        var pos = findAbsolutePosition(element);
        var x = pos.left;
        var y = pos.top;
        var width = element.clientWidth;
        var height = element.clientHeight;
        var midX = x + width / 2;
        var midY = y + height / 2;
        var border = 10;
        var targetRadius = 10;
        var padding = 30;
        var targetX = x + width - targetRadius - border;
        var targetY = y + targetRadius + border;
        var offset = 2;

        // Test touches that are just outside the bounds of the shadow-DOM.  The adjusted point should be pulled within the bounds of the shadow-DOM node.
        testTouch(targetX + targetRadius + offset, targetY, padding, targetX, targetY, targetRadius);
        testTouch(targetX - targetRadius - offset, targetY, padding, targetX, targetY, targetRadius);
        testTouch(targetX, targetY + targetRadius + offset, padding, targetX, targetY, targetRadius);
        testTouch(targetX, targetY - targetRadius - offset, padding, targetX, targetY, targetRadius);
        
        // A touch in the center of targetDiv is sufficient distance from the shadow-DOM element that the position should not snap.
        testTouch(midX, midY, padding, midX, midY, 1);
    }

    function testTouch(touchX, touchY, padding, adjustedX, adjustedY, tolerance) {
        var left = touchX - padding / 2;
        var top = touchY - padding / 2;
        adjustedNode = internals.touchNodeAdjustedToBestClickableNode(left, top, padding, padding);
        shouldBe('adjustedNode.id', 'element.id');
        adjustedPoint = internals.touchPositionAdjustedToBestClickableNode(left, top, padding, padding);
        shouldBeCloseTo('adjustedPoint.x', adjustedX, tolerance);
        shouldBeCloseTo('adjustedPoint.y', adjustedY, tolerance);
    }

    function runTests()
    {
        if (window.testRunner && window.internals && internals.touchNodeAdjustedToBestClickableNode && internals.ensureShadowRoot) {
            description('Test the case where a clickable target contains a shadow-DOM element.  The adjusted point should snap to the location of the shadow-DOM element if close enough to the original touch position.')
            addShadowDOM();
            runTouchTests();
        }
    }
    runTests();
</script>
<script src="../resources/js-test-post.js"></script>
</body>
</html>
