<html xmlns='http://www.w3.org/1999/xhtml'>
<body style="margin: 0px; padding: 0px">
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="400" style="border: solid">
    <circle cx="350" cy="350" r="50" fill="green" onmousedown="startMove()"/>
    <text x="200" y="50" text-anchor="middle">The circle should be in the middle</text>
</svg>
<script>
    var root = document.getElementsByTagName("svg")[0];
    var circle = document.getElementsByTagName("circle")[0];

    function move(evt) {
        var matrix = root.getScreenCTM();
        var point = root.createSVGPoint();
        point.x = evt.clientX;
        point.y = evt.clientY;
        point = point.matrixTransform(matrix.inverse());
        circle.cx.baseVal.value = point.x;
        circle.cy.baseVal.value = point.y;
    }

    function startMove() {
        root.addEventListener("mousemove", move, false);
        root.addEventListener("mouseup", stopMove, false);
    }

    function stopMove() {
        root.removeEventListener("mousemove", move, false);
        root.removeEventListener("mouseup", stopMove, false);

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

    if (window.testRunner)
        testRunner.waitUntilDone();

    if (window.eventSender) {
        eventSender.mouseMoveTo(350, 350);
        eventSender.mouseDown();
        eventSender.mouseMoveTo(200, 200);
        eventSender.mouseUp();
    }
</script>
</body>
</html>
