browser_geolocation_override.js (14616B)
1 const GEO_URL = 2 "http://mochi.test:8888/tests/dom/geolocation/test/mochitest/network_geolocation.sjs"; 3 4 const PAGE_URL = 5 "https://example.com/browser/dom/tests/browser/file_empty.html"; 6 7 const required_preferences = [ 8 ["geo.provider.network.url", GEO_URL], 9 ["geo.timeout", 100], 10 ]; 11 12 add_task(async function test_getCurrentPosition() { 13 await SpecialPowers.pushPrefEnv({ 14 set: required_preferences, 15 }); 16 17 let pageLoaded; 18 let browser; 19 const tab = await BrowserTestUtils.openNewForegroundTab( 20 gBrowser, 21 () => { 22 gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, PAGE_URL); 23 browser = gBrowser.selectedBrowser; 24 pageLoaded = BrowserTestUtils.browserLoaded(browser, true); 25 }, 26 false 27 ); 28 await pageLoaded; 29 30 await SpecialPowers.spawn(browser, [], async () => { 31 await SpecialPowers.pushPermissions([ 32 { 33 type: "geo", 34 allow: SpecialPowers.Services.perms.ALLOW_ACTION, 35 context: content.document, 36 }, 37 ]); 38 39 info("Check original geolocation"); 40 const positionPromise = new Promise(resolve => 41 content.window.navigator.geolocation.getCurrentPosition(position => { 42 resolve(position.coords.toJSON()); 43 }) 44 ); 45 const coordinates = await positionPromise; 46 is(coordinates.latitude, 37.41857, "Original latitude is returned"); 47 is(coordinates.longitude, -122.08769, "Original longitude is returned"); 48 is(coordinates.accuracy, 42, "Original accuracy is returned"); 49 50 info("Override the geolocation"); 51 const browsingContext = content.browsingContext; 52 browsingContext.setGeolocationServiceOverride({ 53 coords: { 54 latitude: 10, 55 longitude: 10, 56 accuracy: 5, 57 altitude: NaN, 58 altitudeAccuracy: NaN, 59 heading: NaN, 60 speed: NaN, 61 }, 62 timestamp: Date.now(), 63 }); 64 const positionPromise2 = new Promise(resolve => 65 content.window.navigator.geolocation.getCurrentPosition(position => { 66 resolve(position.coords.toJSON()); 67 }) 68 ); 69 const coordinates2 = await positionPromise2; 70 is(coordinates2.latitude, 10, "Overridden latitude is returned"); 71 is(coordinates2.longitude, 10, "Overridden longitude is returned"); 72 is(coordinates2.accuracy, 5, "Overridden accuracy is returned"); 73 74 info("Override the geolocation again"); 75 browsingContext.setGeolocationServiceOverride({ 76 coords: { 77 latitude: 20, 78 longitude: 20, 79 accuracy: 10, 80 altitude: 10, 81 altitudeAccuracy: 5, 82 heading: 10, 83 speed: 7, 84 }, 85 timestamp: Date.now(), 86 }); 87 const positionPromise3 = new Promise(resolve => 88 content.window.navigator.geolocation.getCurrentPosition(position => { 89 resolve(position.coords.toJSON()); 90 }) 91 ); 92 const coordinates3 = await positionPromise3; 93 is(coordinates3.latitude, 20, "Overridden latitude is returned"); 94 is(coordinates3.longitude, 20, "Overridden longitude is returned"); 95 is(coordinates3.accuracy, 10, "Overridden accuracy is returned"); 96 is(coordinates3.altitude, 10, "Overridden altitude is returned"); 97 is( 98 coordinates3.altitudeAccuracy, 99 5, 100 "Overridden altitudeAccuracy is returned" 101 ); 102 is(coordinates3.heading, 10, "Overridden heading is returned"); 103 is(coordinates3.speed, 7, "Overridden speed is returned"); 104 105 info("Reset the geolocation override"); 106 browsingContext.setGeolocationServiceOverride(); 107 const positionPromise4 = new Promise(resolve => 108 content.window.navigator.geolocation.getCurrentPosition(position => { 109 resolve(position.coords.toJSON()); 110 }) 111 ); 112 const coordinates4 = await positionPromise4; 113 is(coordinates4.latitude, 37.41857, "Original latitude is returned"); 114 is(coordinates4.longitude, -122.08769, "Original longitude is returned"); 115 is(coordinates4.accuracy, 42, "Original accuracy is returned"); 116 }); 117 118 BrowserTestUtils.removeTab(tab); 119 }); 120 121 add_task(async function test_watchPosition() { 122 await SpecialPowers.pushPrefEnv({ 123 set: required_preferences, 124 }); 125 126 let pageLoaded; 127 let browser; 128 const tab = await BrowserTestUtils.openNewForegroundTab( 129 gBrowser, 130 () => { 131 gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, PAGE_URL); 132 browser = gBrowser.selectedBrowser; 133 pageLoaded = BrowserTestUtils.browserLoaded(browser, true); 134 }, 135 false 136 ); 137 await pageLoaded; 138 139 await SpecialPowers.spawn(browser, [], async () => { 140 await SpecialPowers.pushPermissions([ 141 { 142 type: "geo", 143 allow: SpecialPowers.Services.perms.ALLOW_ACTION, 144 context: content.document, 145 }, 146 ]); 147 148 const browsingContext = content.browsingContext; 149 150 // Set the initial override before the watchPosition is started. 151 browsingContext.setGeolocationServiceOverride({ 152 coords: { 153 latitude: 0, 154 longitude: 0, 155 accuracy: 0, 156 altitude: NaN, 157 altitudeAccuracy: NaN, 158 heading: NaN, 159 speed: NaN, 160 }, 161 timestamp: Date.now(), 162 }); 163 164 const watchID = content.window.navigator.geolocation.watchPosition( 165 result => { 166 const event = new content.window.CustomEvent("watchPosition", { 167 detail: result.coords.toJSON(), 168 }); 169 170 content.document.dispatchEvent(event); 171 } 172 ); 173 174 info("Override the geolocation"); 175 176 const onWatchPosition = new Promise(resolve => { 177 content.document.addEventListener( 178 "watchPosition", 179 e => { 180 resolve(e.detail); 181 }, 182 { once: true } 183 ); 184 }); 185 186 browsingContext.setGeolocationServiceOverride({ 187 coords: { 188 latitude: 10, 189 longitude: 10, 190 accuracy: 5, 191 altitude: NaN, 192 altitudeAccuracy: NaN, 193 heading: NaN, 194 speed: NaN, 195 }, 196 timestamp: Date.now(), 197 }); 198 199 const result = await onWatchPosition; 200 201 is(result.latitude, 10, "Overridden latitude is returned"); 202 is(result.longitude, 10, "Overridden longitude is returned"); 203 is(result.accuracy, 5, "Overridden accuracy is returned"); 204 205 info("Override the geolocation again"); 206 const onWatchPosition2 = new Promise(resolve => { 207 content.document.addEventListener( 208 "watchPosition", 209 e => { 210 resolve(e.detail); 211 }, 212 { once: true } 213 ); 214 }); 215 216 browsingContext.setGeolocationServiceOverride({ 217 coords: { 218 latitude: 20, 219 longitude: 20, 220 accuracy: 10, 221 altitude: 10, 222 altitudeAccuracy: 5, 223 heading: 10, 224 speed: 7, 225 }, 226 timestamp: Date.now(), 227 }); 228 229 const result2 = await onWatchPosition2; 230 231 is(result2.latitude, 20, "Overridden latitude is returned"); 232 is(result2.longitude, 20, "Overridden longitude is returned"); 233 is(result2.accuracy, 10, "Overridden accuracy is returned"); 234 is(result2.altitude, 10, "Overridden altitude is returned"); 235 is(result2.altitudeAccuracy, 5, "Overridden altitudeAccuracy is returned"); 236 is(result2.heading, 10, "Overridden heading is returned"); 237 is(result2.speed, 7, "Overridden speed is returned"); 238 239 content.window.navigator.geolocation.clearWatch(watchID); 240 }); 241 242 BrowserTestUtils.removeTab(tab); 243 }); 244 245 add_task(async function test_tab_reload() { 246 await SpecialPowers.pushPrefEnv({ 247 set: required_preferences, 248 }); 249 250 let pageLoaded; 251 let browser; 252 const tab = await BrowserTestUtils.openNewForegroundTab( 253 gBrowser, 254 () => { 255 gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, PAGE_URL); 256 browser = gBrowser.selectedBrowser; 257 pageLoaded = BrowserTestUtils.browserLoaded(browser, true); 258 }, 259 false 260 ); 261 await pageLoaded; 262 263 await SpecialPowers.spawn(browser, [], async () => { 264 await SpecialPowers.pushPermissions([ 265 { 266 type: "geo", 267 allow: SpecialPowers.Services.perms.ALLOW_ACTION, 268 context: content.document, 269 }, 270 ]); 271 272 info("Check original geolocation"); 273 const positionPromise = new Promise(resolve => 274 content.window.navigator.geolocation.getCurrentPosition(position => { 275 resolve(position.coords.toJSON()); 276 }) 277 ); 278 const coordinates = await positionPromise; 279 is(coordinates.latitude, 37.41857, "Original latitude is returned"); 280 is(coordinates.longitude, -122.08769, "Original longitude is returned"); 281 is(coordinates.accuracy, 42, "Original accuracy is returned"); 282 283 info("Override the geolocation"); 284 const browsingContext = content.browsingContext; 285 browsingContext.setGeolocationServiceOverride({ 286 coords: { 287 latitude: 10, 288 longitude: 10, 289 accuracy: 5, 290 altitude: NaN, 291 altitudeAccuracy: NaN, 292 heading: NaN, 293 speed: NaN, 294 }, 295 timestamp: Date.now(), 296 }); 297 const positionPromise2 = new Promise(resolve => 298 content.window.navigator.geolocation.getCurrentPosition(position => { 299 resolve(position.coords.toJSON()); 300 }) 301 ); 302 const coordinates2 = await positionPromise2; 303 is(coordinates2.latitude, 10, "Overridden latitude is returned"); 304 is(coordinates2.longitude, 10, "Overridden longitude is returned"); 305 is(coordinates2.accuracy, 5, "Overridden accuracy is returned"); 306 }); 307 308 await BrowserTestUtils.reloadTab(tab); 309 310 await SpecialPowers.spawn(browser, [], async () => { 311 const browsingContext = content.browsingContext; 312 313 info("Override the geolocation again"); 314 browsingContext.setGeolocationServiceOverride({ 315 coords: { 316 latitude: 20, 317 longitude: 20, 318 accuracy: 10, 319 altitude: 10, 320 altitudeAccuracy: 5, 321 heading: 10, 322 speed: 7, 323 }, 324 timestamp: Date.now(), 325 }); 326 const positionPromise3 = new Promise(resolve => 327 content.window.navigator.geolocation.getCurrentPosition(position => { 328 resolve(position.coords.toJSON()); 329 }) 330 ); 331 const coordinates3 = await positionPromise3; 332 is(coordinates3.latitude, 20, "Overridden latitude is returned"); 333 is(coordinates3.longitude, 20, "Overridden longitude is returned"); 334 is(coordinates3.accuracy, 10, "Overridden accuracy is returned"); 335 is(coordinates3.altitude, 10, "Overridden altitude is returned"); 336 is( 337 coordinates3.altitudeAccuracy, 338 5, 339 "Overridden altitudeAccuracy is returned" 340 ); 341 is(coordinates3.heading, 10, "Overridden heading is returned"); 342 is(coordinates3.speed, 7, "Overridden speed is returned"); 343 344 info("Reset the geolocation override"); 345 browsingContext.setGeolocationServiceOverride(); 346 const positionPromise4 = new Promise(resolve => 347 content.window.navigator.geolocation.getCurrentPosition(position => { 348 resolve(position.coords.toJSON()); 349 }) 350 ); 351 const coordinates4 = await positionPromise4; 352 is(coordinates4.latitude, 37.41857, "Original latitude is returned"); 353 is(coordinates4.longitude, -122.08769, "Original longitude is returned"); 354 is(coordinates4.accuracy, 42, "Original accuracy is returned"); 355 }); 356 357 BrowserTestUtils.removeTab(tab); 358 }); 359 360 add_task(async function test_amount_of_updates_for_watchPosition() { 361 await SpecialPowers.pushPrefEnv({ 362 set: required_preferences, 363 }); 364 365 let pageLoaded; 366 let browser; 367 const tab = await BrowserTestUtils.openNewForegroundTab( 368 gBrowser, 369 () => { 370 gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, PAGE_URL); 371 browser = gBrowser.selectedBrowser; 372 pageLoaded = BrowserTestUtils.browserLoaded(browser, true); 373 }, 374 false 375 ); 376 await pageLoaded; 377 378 await SpecialPowers.spawn(browser, [], async () => { 379 await SpecialPowers.pushPermissions([ 380 { 381 type: "geo", 382 allow: SpecialPowers.Services.perms.ALLOW_ACTION, 383 context: content.document, 384 }, 385 ]); 386 387 const browsingContext = content.browsingContext; 388 389 // Set the initial override before the watchPosition is started. 390 browsingContext.setGeolocationServiceOverride({ 391 coords: { 392 latitude: 0, 393 longitude: 0, 394 accuracy: 0, 395 altitude: NaN, 396 altitudeAccuracy: NaN, 397 heading: NaN, 398 speed: NaN, 399 }, 400 timestamp: Date.now(), 401 }); 402 403 const watchID = content.window.navigator.geolocation.watchPosition( 404 result => { 405 const event = new content.window.CustomEvent("watchPosition", { 406 detail: result.coords.toJSON(), 407 }); 408 409 content.document.dispatchEvent(event); 410 } 411 ); 412 const events = []; 413 414 info("Override the geolocation"); 415 416 content.document.addEventListener("watchPosition", e => { 417 content.window.console.log("test"); 418 events.push(e.detail); 419 }); 420 421 browsingContext.setGeolocationServiceOverride({ 422 coords: { 423 latitude: 10, 424 longitude: 10, 425 accuracy: 5, 426 altitude: NaN, 427 altitudeAccuracy: NaN, 428 heading: NaN, 429 speed: NaN, 430 }, 431 timestamp: Date.now(), 432 }); 433 434 await ContentTaskUtils.waitForCondition(() => !!events.length); 435 436 is(events.length, 1, "Only one event should come after override is set"); 437 438 content.window.navigator.geolocation.clearWatch(watchID); 439 }); 440 441 BrowserTestUtils.removeTab(tab); 442 }); 443 444 add_task(async function test_call_empty_without_override() { 445 await SpecialPowers.pushPrefEnv({ 446 set: required_preferences, 447 }); 448 449 let pageLoaded; 450 let browser; 451 const tab = await BrowserTestUtils.openNewForegroundTab( 452 gBrowser, 453 () => { 454 gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, PAGE_URL); 455 browser = gBrowser.selectedBrowser; 456 pageLoaded = BrowserTestUtils.browserLoaded(browser, true); 457 }, 458 false 459 ); 460 await pageLoaded; 461 462 await SpecialPowers.spawn(browser, [], async () => { 463 await SpecialPowers.pushPermissions([ 464 { 465 type: "geo", 466 allow: SpecialPowers.Services.perms.ALLOW_ACTION, 467 context: content.document, 468 }, 469 ]); 470 471 const browsingContext = content.browsingContext; 472 473 info("Reset the geolocation override"); 474 browsingContext.setGeolocationServiceOverride(); 475 const positionPromise4 = new Promise(resolve => 476 content.window.navigator.geolocation.getCurrentPosition(position => { 477 resolve(position.coords.toJSON()); 478 }) 479 ); 480 const coordinates4 = await positionPromise4; 481 is(coordinates4.latitude, 37.41857, "Original latitude is returned"); 482 is(coordinates4.longitude, -122.08769, "Original longitude is returned"); 483 is(coordinates4.accuracy, 42, "Original accuracy is returned"); 484 }); 485 486 BrowserTestUtils.removeTab(tab); 487 });