<svg id="svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" onload="load()">
<defs>
    <rect id="rect" width="100" height="100" />
</defs>
<g id="g"/>
<text x="50" y="50" id="log"/>
<script id="script">
<![CDATA[

var g = document.getElementById("g");

function log(message) {
    var logDiv = document.getElementById('log');
    logDiv.appendChild(document.createTextNode(message));
}

function createAnimatedRectInstance() {
    var use = document.createElementNS("http://www.w3.org/2000/svg", "use");
    use.setAttributeNS("http://www.w3.org/1999/xlink", "href", "#rect");
    
    var anim = document.createElementNS("http://www.w3.org/2000/svg", "animate");
    anim.setAttribute("attributeType", "XML");
    anim.setAttribute("attributeName", "x");
    anim.setAttribute("from", "100");
    anim.setAttribute("to", "0");
    anim.setAttribute("begin", "0s");
    anim.setAttribute("dur", "10.0s");
    anim.setAttribute("repeatCount", 1);

    use.appendChild(anim);

    return use;
}

function startTest() {
    // Collect garbage before recording starting live node count, in case there are live elements from previous tests.
    GCController.collect();
    originalLiveElements = window.internals.numberOfLiveNodes();

    for (var i = 0; i < 100; i++)
        g.appendChild(createAnimatedRectInstance());

    setTimeout(continueTest, 0);
}

function continueTest() {
    while (g.hasChildNodes())
        g.removeChild(g.lastChild);

    setTimeout(finishTest, 0);
}

var attemptsToFinish = 5;

function finishTest() {
    GCController.collect();

    var liveDelta = window.internals.numberOfLiveNodes() - originalLiveElements;
    if (liveDelta == 0)
        log("PASS");
    else if (--attemptsToFinish) {
        setTimeout(finishTest, 100);
        return;
    } else
        log("FAIL: " + liveDelta + " extra live node(s)");

    testRunner.notifyDone();
}

function load() {
    if (window.testRunner && window.GCController && window.internals) {
        testRunner.dumpAsText();
        testRunner.waitUntilDone();
    } else {
        log("This test only works when run with the testRunner, GCController, and internals available.");
        return;
    }

    setTimeout(startTest, 0);
}
]]>
</script>
</svg>
