blob: 7fdc373cb252f3ed0e418206d2925731c713288d [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<title>HTML5 Geo-location test</title>
<script type="text/javascript" src="../test_bootstrap.js"></script>
<script type="text/javascript">
goog.require('bot');
goog.require('bot.geolocation');
goog.require('bot.html5');
goog.require('bot.test');
goog.require('bot.userAgent');
goog.require('goog.testing.AsyncTestCase');
goog.require('goog.testing.jsunit');
goog.require('goog.userAgent');
goog.require('goog.userAgent.product');
</script>
<script type="text/javascript">
var asyncTestCase = null;
// WebDriver does not enable geolocation for Android (b/5787618).
// WebDriver does not enable geolocation for Firefox (b/5787180).
// WebDriver does not enable geolocation for Opera 11.5 (b/5746540).
// WebDriver does not enable geolocation for IE 9 (b/5817463).
// Selenium breaks geolocation on Opera (b/5773581).
var GEOLOCATION_NOT_WORKING =
!bot.html5.isSupported(bot.html5.API.GEOLOCATION) ||
goog.userAgent.product.ANDROID ||
goog.userAgent.product.FIREFOX ||
bot.userAgent.IE_DOC_9 ||
(goog.userAgent.OPERA && (bot.test.isSeleniumBacked() ||
bot.userAgent.isEngineVersion(11.5)));
/**
* This method checks if the device location
* can be retrieved, i.e. non-null value of Position within the timeout
* period.
*/
function testLocationWithinDefaultInterval() {
if (GEOLOCATION_NOT_WORKING) {
return;
}
function onSuccess(position) {
asyncTestCase.continueTesting();
//5s (default timeout) should definitely be sufficient
//to retrieve a position.
}
function onError(error) {
switch (error.code) {
case error.POSITION_UNAVAILABLE:
// Some test machines run on a private ip address range where
// location is not be available, so do not consider this case as an
// error.
break;
case error.PERMISSION_DENIED:
fail('User denied the request for Geolocation.');
case error.TIMEOUT:
fail('When enabled, location should be known within 10s');
default:
fail('An unknown error occurred. ' + error.message);
}
asyncTestCase.continueTesting();
}
try {
bot.geolocation.getCurrentPosition(onSuccess, onError);
asyncTestCase.waitForAsync('geolocation.getCurrentPosition');
} catch (e) {
assertEquals(e.code, bot.ErrorCode.UNKNOWN_ERROR);
}
}
/**
* Tested with Chrome and Firefox. It checks if the device location cannot
* can be retrieved, i.e. null value of Position, when requested to
* retrieve the position with high accuracy and immediately (no cached).
* Note: Firefox seems to return the position even in this case.
* The HTML5 standard states If the value of the timeout variable is 0,
* invoke the errorCallback (if present) with a new PositionError object
* whose code attribute is set to TIMEOUT.
*/
function testLocationNoTimeout() {
if (GEOLOCATION_NOT_WORKING) {
return;
}
var posOptions = {
enableHighAccuracy: true,
maximumAge: 0,
timeout: 0
};
function onSuccess(position) {
asyncTestCase.continueTesting();
fail('Location within 0s timeout interval and 0s max age fails');
}
function onError(error) {
asyncTestCase.continueTesting();
}
try {
bot.geolocation.getCurrentPosition(onSuccess, onError, posOptions);
asyncTestCase.waitForAsync('geolocation.getCurrentPosition');
} catch (e) {
assertEquals(e.code, bot.ErrorCode.UNKNOWN_ERROR);
}
}
// TODO(user): Add more tests to check the returned value.
</script>
</head>
<body>
<script type="text/javascript">
asyncTestCase = goog.testing.AsyncTestCase.createAndInstall();
asyncTestCase.stepTimeout = 15 * 1000;
</script>
</body>
</html>