blob: 1688c86278966552066235a514853e8b1064bb34 [file] [log] [blame]
<!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_equals(position.toString(), "[object GeolocationPosition]",
"position.toString should result in '[object GeolocationPosition]' was: " + position.toString());
}, "GeolocationPosition toString");
test(function() {
assert_equals(position.coords.toString(), "[object GeolocationCoordinates]",
"position.coords.toString should result in '[object GeolocationCoordinates]' was: " + position.coords.toString());
}, "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_equals(error.toString(), "[object GeolocationPositionError]",
"error.toString should result in '[object GeolocationPositionError]' was: " +
error.toString());
}, "GeolocationPositionError 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");
// 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>