<!DOCTYPE html>
<meta charset="utf-8" />
<title>Geolocation Test: PositionOptions tests</title>
<link
  rel="help"
  href="http://www.w3.org/TR/geolocation-API/#position_options_interface"
/>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>

<script>
  const resetPermission = () => {
    return test_driver.set_permission({ name: "geolocation" }, "prompt");
  };
  const invalidValues = ["boom", 321, -Infinity, { foo: 5 }];

  promise_test(async (t) => {
    t.add_cleanup(resetPermission);
    await test_driver.set_permission({ name: "geolocation" }, "granted");
    for (const enableHighAccuracy of invalidValues) {
      navigator.geolocation.getCurrentPosition(() => {}, null, {
        enableHighAccuracy,
      });
    }
  }, "Call getCurrentPosition with wrong type for enableHighAccuracy. No exception expected.");

  promise_test(async (t) => {
    t.add_cleanup(resetPermission);
    await test_driver.set_permission({ name: "geolocation" }, "granted");
    for (const enableHighAccuracy of invalidValues) {
      const id = navigator.geolocation.watchPosition(() => {}, null, {
        enableHighAccuracy,
      });
      navigator.geolocation.clearWatch(id);
    }
  }, "Call watchPosition with wrong type for enableHighAccuracy. No exception expected.");

  promise_test(async (t) => {
    t.add_cleanup(resetPermission);
    await test_driver.set_permission({ name: "geolocation" }, "granted");
    const error = await new Promise((resolve, reject) => {
      navigator.geolocation.getCurrentPosition(reject, resolve, {
        timeout: 0,
        maxAge: 0,
      });
    });
    assert_equals(error.code, GeolocationPositionError.TIMEOUT);
  }, "Set timeout and maximumAge to 0, check that timeout error raised (getCurrentPosition)");

  promise_test(async (t) => {
    t.add_cleanup(resetPermission);
    await test_driver.set_permission({ name: "geolocation" }, "granted");
    let watchId;
    const error = await new Promise((resolve, reject) => {
      watchId = navigator.geolocation.watchPosition(reject, resolve, {
        timeout: 0,
        maxAge: 0,
      });
    });
    assert_equals(error.code, GeolocationPositionError.TIMEOUT);
    navigator.geolocation.clearWatch(watchId);
  }, "Set timeout and maximumAge to 0, check that timeout error raised (watchPosition)");

  promise_test(async (t) => {
    t.add_cleanup(resetPermission);
    await test_driver.set_permission({ name: "geolocation" }, "granted");
    let watchId;
    const error = await new Promise((resolve, reject) => {
      watchId = navigator.geolocation.getCurrentPosition(reject, resolve, {
        timeout: -100,
        maxAge: -100,
      });
    });
    assert_equals(error.code, GeolocationPositionError.TIMEOUT);
    navigator.geolocation.clearWatch(watchId);
  }, "Check that a negative timeout and maxAge values are clamped to 0 (getCurrentPosition)");

  promise_test(async (t) => {
    t.add_cleanup(resetPermission);
    await test_driver.set_permission({ name: "geolocation" }, "granted");
    let watchId;
    const error = await new Promise((resolve, reject) => {
      watchId = navigator.geolocation.watchPosition(reject, resolve, {
        timeout: -100,
        maxAge: -100,
      });
    });
    assert_equals(error.code, GeolocationPositionError.TIMEOUT);
    navigator.geolocation.clearWatch(watchId);
  }, "Check that a negative timeout and maxAge values are clamped to 0 (watchPosition)");
</script>
