<!DOCTYPE html> <!-- webkit-test-runner [ useFlexibleViewport=true ] -->
<html>
<head>
<script src="../../../resources/ui-helper.js"></script>
<script src="../../../resources/basic-gestures.js"></script>
<meta name=viewport content="width=device-width">
<style>
body, html {
    width: 100%;
    height: 100%;
    margin: 0;
}

#output {
    width: 320px;
    height: 160px;
    overflow: scroll;
    color: green;
    border: 1px green solid;
}

#target {
    width: 320px;
    height: 160px;
}
</style>
<script>
if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.waitUntilDone();
}

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

function checkForCompletion() {
    doneCount = window.doneCount ? doneCount : 0;
    if (++doneCount == 4 && window.testRunner)
        testRunner.notifyDone();
}

addEventListener("message", event => {
    appendOutput(event.data);
    checkForCompletion();
});

async function runTest() {
    // Wait for both the main frame and the subframe to finish loading.
    loadCount = window.loadCount ? loadCount : 0;
    if (++loadCount != 2)
        return;

    await longPressAtPoint(30, 240);
    let grabberEndRect = null;
    while (!grabberEndRect || !grabberEndRect.width || !grabberEndRect.height)
        grabberEndRect = await UIHelper.getSelectionEndGrabberViewRect();

    const [midX, midY] = [grabberEndRect.left + (grabberEndRect.width / 2), grabberEndRect.top + (grabberEndRect.height / 2)];
    await touchAndDragFromPointToPoint(midX, midY, midX + 150, midY);
    await liftUpAtPoint(midX + 150, midY);
    checkForCompletion();
}
</script>
</head>

<body onload="runTest()">
<pre id="output"></pre>
<iframe onload="runTest()" src="data:text/html,
    <span id='text' style='font-size: 140px;'>M M</span>
    <script>
    document.addEventListener('selectionchange', () => {
        const eventData = 'selectionchange: \'' + getSelection().toString() + '\'';
        parent.postMessage(eventData, '*');
    });
    </script>" id="target"></iframe>
<p>Verifies that the user can select text in an iframe by dragging selection handles. This test is best run under WebKitTestRunner.</p>
<p>To manually run the test, select "M" in the iframe above and drag the selection handles.</p>
<p>The output above should log selection changes in the subframe.</p>
</body>
</html>