<p>This test dumps all of the properties that are reachable from the window.performance object, along with their types.</p>
<hr>
<pre id="pre"></pre>

<script>
if (window.testRunner)
    testRunner.dumpAsText();
    
var logBuffer = [];
function log(s)
{
    logBuffer.push(s);
}

var pre = document.getElementById('pre');
function flushLog()
{
    var logMessage = logBuffer.join("");
    pre.appendChild(document.createTextNode(logMessage));
}

function tryEval(string)
{
    try {
        return eval(string);
    } catch (e) {
        return new String("Caught exception: " + e);
    }
}

function typeOfNullAware(value)
{
    if (typeof value == "object" && value == null)
        return "null";
    return typeof value;
}

function typeStringNullAware(value)
{
    var valueType = typeOfNullAware(value);
    return valueType == "object"
        ? Object.prototype.toString.call(value)
        : "[" + valueType + "]";
}

function logValue(valueName)
{
    var value = tryEval(valueName);
    var valueType = typeOfNullAware(value);

    // Don't taint the test with our own variables
    if (value == logBuffer || value == pre)
        return;

    // Don't taint the test with our own properties
    if (/__visitedByLogValue__/.test(valueName) || /__nameWhenVisitedByLogValue__/.test(valueName))
        return;

    // Work around Firefox infinite recursion
    if (/\.[0-9]/.test(valueName))
        return;

    // Avoid infinite recursion
    if (valueType == "object" && value.__visitedByLogValue__) {
        log(valueName + " [printed above as " + value.__nameWhenVisitedByLogValue__ + "]\n");
        return;
    }

    log(valueName + " " + typeStringNullAware(value) + "\n");

    if (valueType == "object") {
        value.__visitedByLogValue__ = true;
        value.__nameWhenVisitedByLogValue__ = valueName;
        logProperties(value, valueName);
    }
}

function logProperties(object, objectName)
{
    var array = new Array;
    for (var property in object) {
        array.push(property);
    }
    array.sort();
    for (var i = 0; i < array.length; i++) {
        var property = array[i];
        logValue(objectName + "." + property);
    }
}

logValue('window.performance');
window.performance.timing = 'timing is not replaceable';
logValue('window.performance.timing');
window.performance.navigation = 'navigation is not replaceable';
logValue('window.performance.navigation');
window.performance = 'performance is replaceable';
logValue('window.performance');
flushLog();
</script>
