tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 });