<!DOCTYPE html> <!-- webkit-test-runner [ useFlexibleViewport=true ] -->

<html>
<head>
    <meta name="viewport" content="initial-scale=1.0">
    <style>
        body {
            height: 2000px;
        }
        .fixed {
            position: fixed;
            top: 0; 
            width: 100%; 
            background: beige;
            padding-top: 300px;
        }
        input {
            display: block;
            margin: 60px 30px;
        }
    </style>
    <script src="../../../resources/js-test-pre.js"></script>
    <script>
        var jsTestIsAsync = true;

        function getScrollDownUIScript()
        {
            return `(function() {
                uiController.immediateScrollToOffset(0, 800);
            })();`;
        }
        
        function getFocusInputUIScript(x, y)
        {
            return `(function() {
                uiController.didEndZoomingCallback = function() {
                    uiController.uiScriptComplete();
                };
                uiController.singleTapAtPoint(${x}, ${y}, function() {});
            })();`;
        }
        
        function getMoveToNextInputScript()
        {
            return `(function() {
                uiController.doAfterNextStablePresentationUpdate(function() {
                    uiController.uiScriptComplete(JSON.stringify(uiController.textSelectionCaretRect));
                });
                uiController.keyboardAccessoryBarNext();
            })();`;
        }

        function getCaretRectScript()
        {
            return `(function() {
                return JSON.stringify(uiController.textSelectionCaretRect);
            })();`;
        }

        function toString(rect)
        {
            return `[${rect.left.toFixed(2)} ${rect.top.toFixed(2)} ; ${rect.width.toFixed(2)} ${rect.height.toFixed(2)}]`;
        }

        var finalCaretRect;

        function runTest()
        {
            if (!window.testRunner || !testRunner.runUIScript)
                return;
            
            testRunner.runUIScript(getScrollDownUIScript(), function() {
                window.setTimeout(function() {
                    var rect = document.getElementById('input').getBoundingClientRect();
                    debug('Focusing first field');
                    testRunner.runUIScript(getFocusInputUIScript(rect.left, rect.top + document.scrollingElement.scrollTop), function() {
                        debug('Moving to next field');
                        testRunner.runUIScript(getMoveToNextInputScript(), function() {
                            setTimeout(function() {
                                testRunner.runUIScript(getMoveToNextInputScript(), function(caretRect) {
                                    finalCaretRect = JSON.parse(caretRect);
                                    shouldBeEqualToString('finalCaretRect.left.toFixed(2)', '44.00');
                                    shouldBeEqualToString('finalCaretRect.top.toFixed(2)', '1244.00');
                                    finishJSTest();
                                });
                            }, 0);
                        });
                    });
                }, 0);
            });
        }

        window.addEventListener('load', runTest, false);
    </script>
</head>
<body>
<p>Checks the location of the caret after focussing inputs inside position:fixed.</p>
<div class="fixed">
    <input id="input" type="text"/>
    <input type="text"/>
</div>
<script src="../../../resources/js-test-post.js"></script>
</body>
</html>
