<p>This test dumps all of the properties that are reachable from the window.DeviceMotionEvent window.ondevicemotion, window.DeviceOrientationEvent and window.ondeviceorientation objects, along with their types.
  These properties are currently guarded by ENABLE_DEVICE_ORIENTATION.</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.DeviceMotionEvent');
logValue('window.ondevicemotion');
logValue('window.DeviceOrientationEvent');
logValue('window.ondeviceorientation');
flushLog();
</script>
