<p>This tests to see if a mouse click inside an editable, focusable node focuses that node. Normally, we focus a node on mouse down, but to make it easier to drag selections containing editable pieces we delay focus until mouse up. The editable table cell should be focused and you should see a 'Success' message below.</p>
<div id="div" contenteditable="true" onblur="handleBlur();"><table contenteditable="false" border="1"><tr><td>non-editable</td><td id="cell" contenteditable="true" onfocus="log('Success');">editable</td></tr></table></div>
<div id="destination" contenteditable="true"><br></div>
<ul id="console"></ul>
<script>
function log(str) {
    var text = document.createTextNode(str);
    var li = document.createElement("li");
    var console = document.getElementById("console");
    console.appendChild(li);
    li.appendChild(text);
}
function handleBlur() {
    blurred = true;
}
function runTest() {
    var blurred = false;
    if (!window.testRunner)
        return;
    var cell = document.getElementById("cell");
    cell.addEventListener("DOMBlurEvent", handleBlur);
    var div = document.getElementById("div");
    div.focus();
    document.execCommand("SelectAll");

    var x, y;
    x = cell.offsetParent.offsetLeft + cell.offsetLeft + cell.offsetWidth / 2;
    y = cell.offsetParent.offsetTop + cell.offsetTop + cell.offsetHeight / 2;
    eventSender.mouseMoveTo(x, y);
    eventSender.mouseDown();
    if (blurred == true)
        log("Error, focus changed too early.")
    eventSender.mouseUp();
}

runTest();
</script>
