<html>
    <head>
        <script>
            if (window.layoutTestController) {
                layoutTestController.dumpAsText();
                layoutTestController.waitUntilDone();
            }

            function log(msg)
            {
                var console = document.getElementById('console');
                console.innerHTML = console.innerHTML + msg + "<br>";
            }
            
            function buttonClick()
            {
                if (document.getElementById('audio'))
                    log("<br>FAIL: audio element not deleted!!");

                log("<br>clicking button");

                // click the button
                var button = document.getElementById('button');
                eventSender.mouseMoveTo(button.offsetLeft + 20, button.offsetTop + 7);
                eventSender.mouseDown();
                eventSender.mouseUp();

                layoutTestController.notifyDone();
            }
            
            function deleteAudio()
            {
                // delete the search
                log("<br>deleting audio element");
                var audio = document.getElementById('audio');
                audio.parentNode.removeChild(audio);

                setTimeout(buttonClick, 10);
            }
            
            function step()
            {
                if (!window.layoutTestController)
                    return;

                layoutTestController.dumpAsText();
                layoutTestController.waitUntilDone();

                var audio = document.getElementById('audio');

                var right = audio.offsetLeft + audio.offsetWidth;
                var bottom = audio.offsetTop + audio.offsetHeight;
                
                var x = right - 8;
                var y = bottom - 8;

                // step forward, should generate a timeupdate event
                log("clicking step forward");
                eventSender.mouseMoveTo(x, y);
                eventSender.mouseDown();
                eventSender.mouseUp();

                // click step forward button but don't release
                log("clicking step forward");
                eventSender.mouseDown();

                setTimeout(deleteAudio, 10);
            }

        </script>
    </head>
    <body >
        This tests that events don't continue to target a step button if the media element is deleted while mouse down on button.
        <br>
        <input type="button" id="button" value="Click Me!" onmouseup="log('button click!')"> 
        <br>
        <audio id="audio" ontimeupdate="log('timeupdate')" onload="step()" controls src="content/test.wav"></audio><br><br>
        <div id="console"></div>
    </body>
</html>
