<!DOCTYPE html>
<body>
    <div>Removing the target of an animate element should detach the wrappers of the attributes from their animated properties.</div>
    <svg>
        <text x="15" y="40">
            <tspan id="first-tspan" x="0">First tspan.</tspan> 
        </text>
        <text x="15" y="60">
            <tspan id="second-tspan" x="0">Second tspan</tspan> 
        </text>
        <animate id="animate" xlink:href="#first-tspan" attributeType="XML" attributeName="x" from="0" to="100" dur="10s" repeatCount="indefinite"/>
    </svg>
    <script>
        function gc() {
            if (window.GCController)
                return GCController.collect();

            // Force garbage collection.
            for (var i = 0; i < 10000; i++)
                var s = new String("abc");
        }

        (function() {
            if (window.testRunner)  {
                testRunner.dumpAsText();
                testRunner.waitUntilDone();
            }

            window.requestAnimationFrame(() => {
                // The target of the <animate> element is the "first-tspan".
                var tspanElement = document.getElementById("first-tspan");

                // animItem is a reference (not a copy) to the first item in the x animated list.
                var animList = tspanElement.x.animVal;
                var animItem = animList.getItem(0);
                var originalValue = animItem.valueAsString;

                // Now change the target of the <animate> element to be the "second-tspan".
                var animateElement = document.getElementById("animate");
                animateElement.setAttributeNS("http://www.w3.org/1999/xlink", "href", "second-tspan");

                // By now animItem should be detached from the animated animList and has its own copy
                // of an SVGLength. animItem should not be affected if garbage collection is forced.
                gc();
                window.requestAnimationFrame(() => {
                    if (animItem.valueAsString == originalValue) {
                        document.querySelector("div").innerHTML += "<br><br>PASS."
                        document.querySelector("svg").remove();
                    }

                    if (window.testRunner)
                        testRunner.notifyDone();
                });
            });
        })();
    </script>
</body>
