<p>This test dumps all of the properties that are reachable from the window.clientInformation.geolocation
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.clientInformation.geolocation');
flushLog();
</script>
