<!DOCTYPE html> <!-- webkit-test-runner [ useFlexibleViewport=true ] -->
<html>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<head>
    <script src="../../../resources/ui-helper.js"></script>
    <script src="../../../resources/js-test.js"></script>
    <style>
        body {
            margin: 0;
        }

        input {
            width: 100%;
            height: 50px;
            position: absolute;
            left: 0;
            top: 0;
        }

        div {
            background-image: linear-gradient(0deg, blue, red);
            height: 10000px;
        }
    </style>
</head>
<body>
<div>
<input id="input"></input>
</div>
</body>
<script>
jsTestIsAsync = true;

(() => {
    if (!window.testRunner || !testRunner.runUIScript) {
        description("To manually test, tap this input field and scroll up. The text caret should not end up outside of the input.");
        return;
    }

    UIHelper.activateAndWaitForInputSessionAt(innerWidth / 2, 30)
    .then(() => UIHelper.getUICaretRect())
    .then((rect) => {
        initialCaretRect = rect;
        shouldBe("initialCaretRect.left", "6");
        shouldBe("initialCaretRect.top", "21");
        shouldBe("initialCaretRect.width", "3");
        shouldBe("initialCaretRect.height", "15");
        document.scrollingElement.scrollTop += 5000;
        return UIHelper.getUICaretRect();
    })
    .then((rect) => {
        finalCaretRect = rect;
        shouldBe("finalCaretRect.left", "6");
        shouldBe("finalCaretRect.top", "21");
        shouldBe("finalCaretRect.width", "3");
        shouldBe("finalCaretRect.height", "15");
        finishJSTest();
    });
})();
</script>
</html>
