<!DOCTYPE HTML> <meta charset="utf-8"> <title>Geolocation Test: getCurrentPosition tests</title> <link rel="help" href="http://www.w3.org/TR/geolocation-API/"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <p>Clear all Geolocation permissions before running this test. If prompted for permission, please allow.</p> <div id="log"></div> <script> var geo, success, fail; setup(function() { geo = navigator.geolocation; }, {explicit_done: true}); function successCallback(position) { var ii, oldval; /* [NoInterfaceObject] interface Position { readonly attribute Coordinates coords; readonly attribute DOMTimeStamp timestamp; }; */ test(function() { assert_equals(position.toString(), "[object Position]", "Position.toString should result in '[object Position]' was: " + position.toString()); }, "Position toString"); test(function() { assert_equals(position.coords.toString(), "[object Coordinates]", "position.coords.toString should result in '[object Coordinates]' was: " + position.coords.toString()); }, "Position.coordinates toString"); test(function() { assert_equals(typeof(position.timestamp), "number", "Position.timestamp should be of type 'number' was: " + typeof(position.timestamp)); }, "Position.timestamp is type number"); /* [NoInterfaceObject] interface Coordinates { readonly attribute double latitude; readonly attribute double longitude; readonly attribute double? altitude; readonly attribute double accuracy; readonly attribute double? altitudeAccuracy; readonly attribute double? heading; readonly attribute double? speed; }; */ for (ii in position.coords) { // these four can be numbers or null if (ii == "altitude" || ii == "altitudeAccuracy" || ii == "heading" || ii == "speed") { test(function() { assert_true(position.coords[ii] === null || typeof(position.coords[ii]) === "number", ii + " must be null or 'number' type, was: " + typeof(position.coords[ii])); }, ii+ " is null or number"); } else { test(function() { assert_equals(typeof(position.coords[ii]), "number", ii + " should be type 'number' but typeof returned: " + typeof(position.coords[ii])); }, ii + " is type number"); } oldval = position.coords[ii]; position.coords[ii] = 666; test(function() { assert_equals(position.coords[ii], oldval, ii + " should be readonly, wrote: " + position.coords[ii] + " old value was " + oldval); }, ii + " readonly"); } success.done(); done(); } function BadErrorCallback(error) { success.step(function() { assert_unreached("Error callback called in error"); }); success.done(); done(); } function BadSuccessCallback(position) { fail.step(function() { assert_unreached("Success callback called in error"); }); fail.done(); } function errorCallback(error) { test(function() { assert_equals(error.toString(), "[object PositionError]", "PositionError.toString should result in '[object PositionError]' was: " + error.toString()); }, "PositionError toString"); test(function() { assert_equals(error.PERMISSION_DENIED, 1, "PERMISSION_DENIED should be 1 was: " + error.POSITION_DENIED); }, "PERMISSION_DENIED value is 1"); test(function() { assert_equals(error.POSITION_UNAVAILABLE, 2, "POSITION_UNAVAILABLE should be 2' was: " + error.POSITION_UNAVAILABLE); }, "POSITION_UNAVAILABLE is 2"); test(function() { assert_equals(error.TIMEOUT, 3, "TIMEOUT should be 3 was: " + error.TIMEOUT); }, "TIMEOUT value is 3"); fail.done(); } success = async_test("getCurrentPosition success callback tests", {timeout:20000}); // with a longer timeout and with the user accepting the position request, // this should test the successcallback success.step(function() { geo.getCurrentPosition( successCallback, BadErrorCallback, {maximumAge:600000, timeout:10000} ); }); fail = async_test("getCurrentPosition error callback tests"); // with a timeout of 0 the error callback is hopefully consistently called fail.step(function() { geo.getCurrentPosition( BadSuccessCallback, errorCallback, {maximumAge:00, timeout:0} ); }); </script>