| <!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> | |