<html> 
<head>
<script src=../editing.js type="text/javascript"></script>
<script>

var framex;
var framey;

function editingTest() {
  
    if (!window.layoutTestController)
        return;

    window.layoutTestController.waitUntilDone();
    
    var t = document.getElementById("targetframe");
    framex = t.offsetLeft + 10;
    framey = t.offsetTop + t.offsetHeight / 2;
    
    // Drag 'hello'
    dragDropIt1();
}


function dragDropIt1() {
    var e = document.getElementById("dragme");
    window.getSelection().setBaseAndExtent(e, 0, e, 4); 
    x = e.offsetLeft + 10;
    y = e.offsetTop + e.offsetHeight / 2;
    eventSender.mouseMoveTo(x, y);
    eventSender.mouseDown();
    
    eventSender.leapForward(500);
    eventSender.mouseMoveTo(framex, framey);
    setTimeout(dropIt1, 100);
}

function dropIt1() {

    // Drop it off to the frame
    eventSender.mouseUp();
    setTimeout(deleteFrameAndDrop, 1000);
}

function deleteFrameAndDrop() {

    // Delete the frame where we just dragged somet stuff
    var f = document.getElementById("targetframe");
    f.parentNode.removeChild(f);
    
    // Do drag drop again
    var e = document.getElementById("dragme");
    x = e.offsetLeft + 10;
    y = e.offsetTop + e.offsetHeight / 2;
    eventSender.mouseMoveTo(x, y);
    eventSender.mouseDown();
    eventSender.leapForward(500);
    eventSender.mouseMoveTo(framex, framey);
    setTimeout(dropIt2, 100);
}

function dropIt2() {
    // Drop it off to somewhere
    eventSender.mouseUp();
    window.layoutTestController.notifyDone();
}



</script>
<title>Check you don't crash when your previous drag target frame is deleted</title> 
</head> 
<body>

<p>Check you don't crash when your previous drag target frame is deleted &lt;rdar://problem/5049842&gt;</p>
<div><span id="dragme">hello</span></div>
<iframe id=targetframe src="data:text/html;charset=utf-8,%3Cbody%20contentEditable%3Dtrue%3E%0D%0A"></iframe>
<script>runEditingTest();</script>
</body>
</html>
