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