Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

<!DOCTYPE html>
<meta charset="utf-8"/>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js?feature=bidi"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script>
const latitude = 51.478;
const longitude = -0.166;
const accuracy = 100;
const altitude = 53;
const altitudeAccuracy = 30;
const heading = 10.4;
const speed = 20.7;
async function override_geolocation(t) {
t.add_cleanup(async () => {
await test_driver.bidi.emulation.set_geolocation_override(
{coordinates: null});
});
await test_driver.bidi.emulation.set_geolocation_override({
coordinates: {latitude, longitude, accuracy, altitude,
altitudeAccuracy, heading, speed}
});
}
promise_setup(async () => {
// Ensure permission is granted before proceeding.
await test_driver.bidi.permissions.set_permission({
descriptor: {name: "geolocation"},
state: "granted",
});
});
promise_test(async (t) => {
await override_geolocation(t);
const position = await new Promise((resolve, reject) => {
window.navigator.geolocation.getCurrentPosition(
position => resolve(position.coords.toJSON()),
reject,
{accuracyMode: "approximate"}
);
});
// The coordinates are not compared to the emulated values: an approximate position is "coarsened
// to a larger area", and "What constitutes a coarsened area is left to the underlying system,
// which in turn can vary per jurisdiction", so an implementation that coarsens cannot be
// required to return them unchanged. They must still be present.
assert_equals(typeof position.latitude, "number", "latitude must be a number");
assert_equals(typeof position.longitude, "number", "longitude must be a number");
assert_equals(typeof position.accuracy, "number", "accuracy must be a number");
assert_equals(position.altitude, null);
assert_equals(position.altitudeAccuracy, null);
assert_equals(position.heading, null);
assert_equals(position.speed, null);
}, 'getCurrentPosition with accuracyMode: "approximate"');
promise_test(async (t) => {
await override_geolocation(t);
const position = await new Promise((resolve, reject) => {
window.navigator.geolocation.getCurrentPosition(
position => resolve(position.coords.toJSON()),
reject,
{accuracyMode: "precise", enableHighAccuracy: true}
);
});
assert_equals(position.latitude, latitude);
assert_equals(position.longitude, longitude);
assert_equals(position.accuracy, accuracy);
assert_equals(position.altitude, altitude);
assert_equals(position.altitudeAccuracy, altitudeAccuracy);
assert_equals(position.heading, heading);
assert_equals(position.speed, speed);
}, 'getCurrentPosition with accuracyMode: "precise"');
</script>