<html>
<head>
<script src="../../../resources/ui-helper.js"></script>
<meta name=viewport content="width=device-width">
<style>
    body, html {
        width: 100%;
        height: 100%;
        margin: 0;
    }

    #target {
        font-size: 150px;
    }
</style>
</head>

<body>
<p id="target">WK</p>
<pre id="output"></pre>
<script>
if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.waitUntilDone();
}

function appendOutput(s)
{
    const paragraph = document.createElement("div");
    paragraph.textContent = s;
    output.appendChild(paragraph);
}

function toString(rect)
{
    return `{ left = ${Math.round(rect.left)}, top = ${Math.round(rect.top)}, width = ${Math.round(rect.width)}, height = ${Math.round(rect.height)} }`;
}

function checkDone() {
    if (!window.doneCount)
        doneCount = 0;
    if (++doneCount == 3)
        testRunner.notifyDone();
}

document.addEventListener("selectionchange", async () => {
    if (!getSelection().rangeCount || getSelection().getRangeAt(0).collapsed)
        return;

    appendOutput("Selection rects before touchend:");
    (await UIHelper.getUISelectionRects()).map(toString).map(appendOutput);
    appendOutput(`Selection start handle before touchend: ${toString(await UIHelper.getSelectionStartGrabberViewRect())}`);
    appendOutput(`Selection end handle before touchend: ${toString(await UIHelper.getSelectionEndGrabberViewRect())}`);
    appendOutput("\n");
    testRunner.runUIScript("uiController.liftUpAtPoint(100, 75, 1, () => uiController.uiScriptComplete(''));", checkDone);
});

document.addEventListener("touchend", async () => {
    appendOutput("Selection rects after touchend:");
    (await UIHelper.getUISelectionRects()).map(toString).map(appendOutput);
    appendOutput(`Selection start handle after touchend: ${toString(await UIHelper.getSelectionStartGrabberViewRect())}`);
    appendOutput(`Selection end handle after touchend: ${toString(await UIHelper.getSelectionEndGrabberViewRect())}`);
    checkDone();
});

if (window.testRunner && testRunner.runUIScript)
    testRunner.runUIScript("uiController.touchDownAtPoint(100, 75, 1, () => uiController.uiScriptComplete(''));", checkDone);
else {
    appendOutput(`This test verifies that selection handles are not present when selecting a word via long press,
        before ending the long press. To manually test, long press the word "WK" until a selection highlight is shown,
        and verify that there are no selection handles. Upon release, selection handles should appear.`);
}
</script>
</body>
</html>