| <!DOCTYPE HTML> |
| <meta charset="utf-8"> |
| <meta name=timeout content=long> |
| <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; |
| |
| /* |
| interface GeolocationPosition { |
| readonly attribute GeolocationCoordinates coords; |
| readonly attribute DOMTimeStamp timestamp; |
| }; |
| */ |
| |
| test(function() { |
| assert_class_string(position, "GeolocationPosition"); |
| }, "GeolocationPosition toString"); |
| |
| test(function() { |
| assert_class_string(position.coords, "GeolocationCoordinates"); |
| }, "GeolocationCoordinates toString"); |
| |
| test(function() { |
| assert_equals(typeof(position.timestamp), "number", |
| "position.timestamp should be of type 'number' was: " + typeof(position.timestamp)); |
| }, "GeolocationPosition.timestamp is type number"); |
| |
| /* |
| interface GeolocationCoordinates { |
| 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_class_string(error, "GeolocationPositionError"); |
| }, "GeolocationPositionError toString"); |
| |
| fail.done(); |
| } |
| |
| success = async_test("getCurrentPosition success callback tests"); |
| |
| // 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> |
| |