test_geolocation_monitor.js (2725B)
1 const { HttpServer } = ChromeUtils.importESModule( 2 "resource://testing-common/httpd.sys.mjs" 3 ); 4 5 let geolocation = null; 6 let locations = [ 7 [1, 2], 8 [3, 4], 9 [5, 6], 10 ]; 11 12 function geoHandler(metadata, response) { 13 let [lat, lng] = locations.shift(); 14 response.setStatusLine("1.0", 200, "OK"); 15 response.setHeader("Cache-Control", "no-cache", false); 16 response.setHeader("Content-Type", "application/x-javascript", false); 17 response.write( 18 JSON.stringify({ 19 status: "OK", 20 location: { lat, lng }, 21 accuracy: 42, 22 }) 23 ); 24 } 25 26 function toJSON(pos) { 27 return { lat: pos.coords.latitude, lng: pos.coords.longitude }; 28 } 29 30 function getPosition() { 31 return new Promise(function (resolve, reject) { 32 geolocation.getCurrentPosition(resolve, reject); 33 }); 34 } 35 36 function watchPosition() { 37 let seen = 0; 38 return new Promise(function (resolve, reject) { 39 let id = geolocation.watchPosition(position => { 40 seen++; 41 if (seen === 1) { 42 Assert.deepEqual(toJSON(position), { lat: 3, lng: 4 }); 43 Assert.deepEqual(observer._lastData, { lat: 3, lng: 4 }); 44 Assert.equal(observer._countEvents, 2); 45 } else if (seen === 2) { 46 Assert.deepEqual(toJSON(position), { lat: 5, lng: 6 }); 47 Assert.deepEqual(observer._lastData, { lat: 5, lng: 6 }); 48 Assert.equal(observer._countEvents, 3); 49 geolocation.clearWatch(id); 50 resolve(); 51 } 52 }, reject); 53 }); 54 } 55 56 let observer = { 57 QueryInterface: ChromeUtils.generateQI(["nsIObserver"]), 58 59 observe(subject, topic) { 60 Assert.equal(topic, "geolocation-position-events"); 61 observer._countEvents++; 62 observer._lastData = toJSON(subject); 63 }, 64 65 _lastData: null, 66 _countEvents: 0, 67 }; 68 69 add_task(async function test_resetClient() { 70 do_get_profile(); 71 geolocation = Cc["@mozilla.org/geolocation;1"].getService(Ci.nsISupports); 72 73 let server = new HttpServer(); 74 server.registerPathHandler("/geo", geoHandler); 75 server.start(-1); 76 77 Services.prefs.setCharPref( 78 "geo.provider.network.url", 79 "http://localhost:" + server.identity.primaryPort + "/geo" 80 ); 81 Services.prefs.setBoolPref( 82 "geo.provider.network.debug.requestCache.enabled", 83 false 84 ); 85 Services.prefs.setBoolPref("geo.provider.network.scan", false); 86 87 var obs = Cc["@mozilla.org/observer-service;1"].getService(); 88 obs = obs.QueryInterface(Ci.nsIObserverService); 89 obs.addObserver(observer, "geolocation-position-events"); 90 91 let position = await getPosition(); 92 Assert.deepEqual(toJSON(position), { lat: 1, lng: 2 }); 93 Assert.equal(observer._countEvents, 1); 94 Assert.deepEqual(observer._lastData, { lat: 1, lng: 2 }); 95 96 await watchPosition(); 97 98 await new Promise(resolve => server.stop(resolve)); 99 });