<html>
<head>
<script>
function checkForDone()
{
    var targetParent = document.getElementById("targetParent");
    var textNode = targetParent.firstChild;

    var selection = window.getSelection();
    var anchor = selection.anchorNode;
    if (anchor == textNode) {
        var console = document.getElementById("console");
        console.innerHTML = "SUCCESS! We did not dismiss the selection when we force clicked the link.";
    }

    if (window.testRunner)
        testRunner.notifyDone();
}

function startTest()
{
    if (window.testRunner) {
        testRunner.dumpAsText();
        testRunner.waitUntilDone();
    }

    var selection = window.getSelection();
    var targetParent = document.getElementById("targetParent");
    var textNode = targetParent.firstChild;
    var range = document.createRange();
    range.selectNodeContents(textNode);
    selection.addRange(range);

    if (window.eventSender) {
        eventSender.mouseMoveTo(16, 16);
        eventSender.mouseForceClick();
        window.setTimeout(checkForDone, 0);
    }
}
</script>
</head>

<body onload="startTest()">

<a href="resources/do-not-navigate-here.html">Link</a>
<div id="targetParent">Select me.</div>
<pre id="console">Failed. This test must be run in the test harness. To run the test manually, select text on the page and then force click the link. The selection should not be dismissed.</pre>

</body>
</html>
