<!DOCTYPE html>
<html>
<body>
<!-- FIXME: Don't use Flash, it may not be installed on the machine where this test is run.
     It is not trivial to switch from Flash to TestNetscapePlugin, because we need to be loading
     a resource in this test. -->
<embed id="viewer" src="resources/simple_blank.swf"></embed>
<div>
This test passes if it does not trip an assert in debug builds.
It ensures a readystatechange event can't get dispatched until after a plugin is fully removed.
</div>
<script>
if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.waitUntilDone();
}

document.addEventListener('readystatechange', function() {
    if (document.readyState == "complete") {
        try {
            document.body.appendChild(document.getElementById('viewer'));
        }
        catch (e) {
            alert('PASS: element could not be re-appended');
        }
        if (window.testRunner)
            testRunner.notifyDone();
    }
});

window.addEventListener('DOMContentLoaded', function() {
    // This test relies on removing the embed element while it is actively loading.
    // There's no observable event that creates the exact right timing for that.
    // As of this writing, after DOMContentLoaded, then next layout is the right time.
    // Here we evaluate document.body.offsetLeft to trigger that layout. But really,
    // this is a race condition, nothing guarantees that the load starts at that moment,
    // and we might have to revise this test again in the future.
    document.body.offsetLeft;
    document.body.removeChild(document.getElementById('viewer'));
});
</script>
</body>
</html>
