<html>
<head>
<script src="../../../resources/gc.js"></script>
<script src="../../../resources/js-test.js"></script>
<script src="resources/window-property-collector.js"></script>
<script>
var jsTestIsAsync = true;

var childWindow;
var propertiesToVerify = [];

function insertExpectedResult(path, expected)
{
    if (path.length < 2)
        return;
    // It's expected that performance.eventCounts.size is non-zero.
    if (getPropertyPath(path, path.length) == "performance.eventCounts.size")
        return;
    var propertyDir = getPropertyPath(path, path.length - 1);
    var cachedPropertyDir = "cached_" + propertyDir.replace('.', '_');
    window[cachedPropertyDir] = eval("childWindow." + propertyDir);
    propertiesToVerify.push({
        'property': ["window", cachedPropertyDir, path[path.length - 1]].join("."),
        'expected': expected,
    });
}

function runTest()
{
    description("Tests access of cached DOMWindow properties after the associated frame is removed from a web page and garbage collected. Test should not crash and properties should be set to sane defaults.");
    var frame = document.getElementById("test_frame");
    childWindow = frame.contentWindow;
    // Have expected results assume that the frame has been closed (=> window.closed = true.)
    collectProperties(document.getElementById("src_frame").contentWindow, true);
    frame.parentNode.removeChild(frame);
    asyncGC(function () {
        for (var i = 0; i < propertiesToVerify.length; ++i)
            shouldBe(propertiesToVerify[i].property, propertiesToVerify[i].expected);
        finishJSTest();
    });
}
</script>
</head>
<body onload="runTest()">
<iframe id="src_frame"></iframe>
<iframe id="test_frame" src="about:blank"></iframe>
</body>
</html>
