<!DOCTYPE HTML>
<html lang="en-US">
<head>
    <title>CSS Test: CSSOM View elementFromPoint</title>
    <meta charset="UTF-8">
    <link rel="author" title="Chris" href="mailto:pwx.frontend@gmail.com" />
    <link rel="help" href="https://www.w3.org/TR/cssom-view/#dom-document-elementfrompoint" />
    <meta name="flags" content="dom" />
    <script src="/resources/testharness.js" type="text/javascript"></script>
    <script src="/resources/testharnessreport.js" type="text/javascript"></script>
</head>
<body>
    <noscript>Test not run - JavaScript required!</noscript>
    <div id="log"></div>
    <script type="text/javascript">

        var body = document.getElementsByTagName( 'body' )[0];
        function createElement( id ) {
            var elem = document.createElement( 'div' );
            if ( id && typeof id == 'string' ) {
                elem.id = id;
            }
            body.appendChild( elem );
            return elem;
        }

        function setPosition( config ) {
            var target = config.target;
            target.style.position = 'absolute';
            target.style.left = config.left + 'px';
            target.style.top = config.top + 'px';
            target.style.width = config.width + 'px';
            target.style.height = config.height + 'px';
            if ( config['z-index'] ) {
                target.style.zIndex = config['z-index'];
            }
        }

        var target = createElement( 'dom-1' );
        setPosition( {
            width: 100,
            height: 100,
            left: 10,
            top: 10,
            target: target
        });

        test( function () {
            assert_inherits( document, 'elementFromPoint' );
        }, 'document.elementFromPoint');

        test( function () {
            assert_true( document.elementFromPoint instanceof Function );
        }, 'document.elementFromPoint is a Function');
        (function(){
            var wrap = [
                // 左上角.
                {x: 10, y: 10, r: 'top left corner'},
                // 上边线
                {x: 50, y: 10, r: 'top line'},
                // 右上角
                {x: 110, y: 10, r: 'top right corner'},
                // 左边线
                {x: 10, y: 50, r: 'left line'},
                // 元素范围内
                {x: 50, y: 50, r: 'inside'},
                // 右边线
                {x: 110, y: 50, r: 'right line'},
                // 左下角
                {x: 10, y: 110, r: 'bottom left corner'},
                // 下边线
                {x: 50, y: 110, r: 'bottom line'},
                // 右下角
                {x: 110, y: 110, r: 'bottom right corner'}
            ];
            var i = 0, len = wrap.length, item;
            for ( ; i < len; i++ ) {
                item = wrap[ i ];
                test( function () {
                    assert_equals( document.elementFromPoint( item.x, item.y).id == 'dom-1', true );
                }, 'test some point of the element: ' + item.r);
            }
        })();
        test( function () {
            var elem = document.elementFromPoint( 0, 0 );
            assert_equals( elem.nodeName, 'HTML' );
        }, 'Point (0, 0), return root element(HTML)' );

        test( function () {
            var elem = document.elementFromPoint( -1000, 0 );
            assert_equals( elem, null, 'negative x, return null' );
        }, ' test negative x ');

        test( function () {
            var elem = document.elementFromPoint( 0, -1000 );
            assert_equals( elem, null, 'negative y, return null' );
        }, ' test negative y ');

        test( function () {
            var elem = document.elementFromPoint( 100000, 0 );
            assert_equals( elem, null );
        }, 'test outside of viewport');

        test( function () {
            var config = {
                width: 100,
                height: 100,
                left: 5,
                top: 5
            };
            var target2 = createElement( 'dom-2' );
            config.target = target2;
            setPosition( config );

            var elem = document.elementFromPoint( 10, 10 );
            var elem2 = document.elementFromPoint( 10, 10 );
            assert_equals( elem.id, elem2.id );
        }, 'test the top of layer');
    </script>
</body>
</html>
