<!DOCTYPE html>
<html>
<head>
<script>
if (window.testRunner) {
    testRunner.waitUntilDone();
    testRunner.dumpAsText();
}

function log(msg) {
    var msgNode = document.createTextNode(msg);
    var li = document.createElement("li");
    li.appendChild(msgNode);
    document.getElementById("log").appendChild(li);
}
var dragging = false;
var waitingForUp = false;
function dragStarted() {
    if (dragging || waitingForUp) {
        log("Unexpected drag start");
        return;
    }
    log("Drag started");
    dragging = true;
}

window.onmousedown = function() {
    log("Unexpected mousedown");
}

window.onmousemove = function() {
    if (!dragging || waitingForUp)
        return;
    log("Received mouse move");
    waitingForUp = true;
}

window.onmouseup = function() {
    if (!waitingForUp) {
        log("Unexpected mouseup");
        return;
    }
    log("Received mouseup event")
    log("PASS!");
}

window.onload = function() {
    try {
        if (!frames[0] || !frames[0].document || !frames[0].document.getElementById("dragSource")) {
            log("Window.onload fired before subframe completed load.");
        }
        
        if (!window.testRunner) {
            log("This test needs to be run in DRT.  To test manually drag from the text 'Drag Me!' out into the parent frame.");
            return;
        }
        var dragSource = frames[0].document.getElementById("dragSource");
        var sourceFrame = document.getElementById("sourceFrame");
        var x = dragSource.offsetLeft + sourceFrame.offsetLeft + 10;
        var y = dragSource.offsetTop + sourceFrame.offsetTop + dragSource.offsetHeight / 2;
        eventSender.mouseMoveTo(x,y);
        eventSender.mouseDown();
        eventSender.mouseMoveTo(120, 120);
        eventSender.mouseUp();
    } finally {
        if (window.testRunner)
            testRunner.notifyDone();
    }
}
</script>
</head>
<body>
    <div>This tests that dragging from an element that returns <emph>false</emph> from its mousedown handler will not let the subsequent mousemove events be captured by the containing frame.</div>
    <iframe id="sourceFrame" style="width: 100px; height: 50px;" src="resources/mouse-drag-from-frame-subframe.html"></iframe>
    <ul id="log">
    </ul>
</body>
</html>
