<!DOCTYPE html>
<html>
    <head>
        <title id='desc'> MutationEvent.relatedNode for DOMNodeInserted and DOMNodeRemoved </title>
        <script type="text/javascript">
            var PassTest = function()
            {
                document.getElementById("testresult").firstChild.data = "PASS";
            }

            var FailTest = function()
            {
                document.getElementById("testresult").firstChild.data = "FAIL";
            }

            var EVENT1 = "DOMNodeInserted";
            var EVENT2 = "DOMNodeRemoved";
            var TARGET;
            var PARENT;
            var NODE;
            var ActualResult = [];
            var ExpectResult = [];

            window.onload = function()
            {
                try
                {
                    TARGET = document.getElementById("target");
                    PARENT = document.getElementById("parent");
                    TARGET.addEventListener(EVENT1, TestEvent, true);
                    TARGET.addEventListener(EVENT2, TestEvent, true);

                    ExpectResult = [TARGET, PARENT];

                    NODE = document.createElement("INPUT");
                    TARGET.appendChild(NODE);
                    PARENT.removeChild(TARGET);
                }
                catch(ex)
                {
                    FailTest();
                }
            }

            function TestEvent(evt)
            {
                ActualResult.push(evt.relatedNode);

                if (ExpectResult.toString() == ActualResult.toString())
                {
                    PassTest();
                }

                if (2 < ActualResult.length)
                {
                    FailTest();
                }
            }
        </script>
    </head>
    <body>
        <h3>DOM Events</h3>
        <h4>
            Test Description: MutationEvent.relatedNode is the parent node of the node being removed for DOMNodeRemoved event;
            and, it is the parent node of the node that has been inserted for DOMNodeInserted event
        </h4>

        <span id="parent">
            <div id="target" style="border:solid 1px green; width:200px; height:50px">
            </div>
        </span>
        <p>Test passes if the word "PASS" appears below.</p>
        <div>Test result: </div>
        <div id='testresult'>FAIL</div>
    </body>
</html>