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