"use strict"; var harness = SimpleTest.harnessParameters.testRoot == "chrome" ? "chrome" : "tests"; var BASE_URL = "http://mochi.test:8888/" + harness + "/dom/tests/mochitest/geolocation/network_geolocation.sjs"; function set_geo_wifi_uri(uri, callback) { // Disable NetworkGeolocationProvider.js request cache because the cache // does not remember from which location service it came from. We expect // different results when we change the provider URL (geo.provider.network.url). set_network_request_cache_enabled(false, () => { SpecialPowers.pushPrefEnv( { set: [["geo.provider.network.url", uri]] }, callback ); }); } function sleep(delay) { var start = Date.now(); while (Date.now() < start + delay) {} } function force_prompt(allow, callback) { SpecialPowers.pushPrefEnv( { set: [ ["geo.prompt.testing", true], ["geo.prompt.testing.allow", allow], ], }, callback ); } function start_sending_garbage(callback) { set_geo_wifi_uri(BASE_URL + "?action=respond-garbage", () => { // we need to be sure that all location data has been purged/set. sleep(1000); callback.call(); }); } function stop_sending_garbage(callback) { set_geo_wifi_uri(BASE_URL + "", () => { // we need to be sure that all location data has been purged/set. sleep(1000); callback.call(); }); } function stop_geolocationProvider(callback) { set_geo_wifi_uri(BASE_URL + "?action=stop-responding", () => { // we need to be sure that all location data has been purged/set. sleep(1000); callback.call(); }); } function set_network_request_cache_enabled(enabled, callback) { SpecialPowers.pushPrefEnv( { set: [["geo.provider.network.debug.requestCache.enabled", enabled]] }, callback ); } function worse_geolocationProvider(callback) { set_geo_wifi_uri(BASE_URL + "?action=worse-accuracy", callback); } function resume_geolocationProvider(callback) { set_geo_wifi_uri(BASE_URL + "", callback); } function delay_geolocationProvider(delay, callback) { set_geo_wifi_uri(BASE_URL + "?delay=" + delay, callback); } function send404_geolocationProvider(callback) { set_geo_wifi_uri(BASE_URL + "?action=send404", callback); } function check_geolocation(location) { ok(location, "Check to see if this location is non-null"); const timestamp = location.timestamp; dump(`timestamp=${timestamp}\n`); ok(IsNumber(timestamp), "check timestamp type"); ok(timestamp > 0, "check timestamp range"); // eventually, coords may be optional (eg, when civic addresses are supported) ok("coords" in location, "Check to see if this location has a coords"); const { latitude, longitude, accuracy, altitude, altitudeAccuracy, speed, heading, } = location.coords; dump(`latitude=${latitude}\n`); dump(`longitude=${longitude}\n`); dump(`accuracy=${accuracy}\n`); dump(`altitude=${altitude}\n`); dump(`altitudeAccuracy=${altitudeAccuracy}\n`); dump(`speed=${speed}\n`); dump(`heading=${heading}\n`); ok(IsNumber(latitude), "check latitude type"); ok(IsNumber(longitude), "check longitude type"); ok( Math.abs(latitude - 37.41857) < 0.001, "latitude matches hard-coded value" ); ok( Math.abs(longitude + 122.08769) < 0.001, "longitude matches hard-coded value" ); ok(IsNonNegativeNumber(accuracy), "check accuracy type and range"); ok(IsNumber(altitude) || altitude === null, "check accuracy type"); ok( (IsNonNegativeNumber(altitudeAccuracy) && IsNumber(altitude)) || altitudeAccuracy === null, "check altitudeAccuracy type and range" ); ok( IsNonNegativeNumber(speed) || speed === null, "check speed type and range" ); ok( (IsNonNegativeNumber(heading) && heading < 360 && speed > 0) || heading === null, "check heading type and range" ); } function IsNumber(x) { return typeof x === "number" && !Number.isNaN(x); } function IsNonNegativeNumber(x) { return IsNumber(x) && x >= 0; }