<!DOCTYPE html>
<meta charset="utf-8"/>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js?feature=bidi"></script>
<script src="/resources/testdriver-vendor.js"></script>

<script>
    promise_setup(async () => {
        // Ensure permission is granted before proceeding.
        await test_driver.bidi.permissions.set_permission({
            descriptor: {name: "geolocation"},
            state: "granted",
        });
    });

    promise_test(async (t) => {
        t.add_cleanup(async () => {
            await test_driver.bidi.emulation.set_geolocation_override(
                {coordinates: null});
        });

        await test_driver.bidi.emulation.set_geolocation_override({
            error: {type: "positionUnavailable"}
        });

        const error = await new Promise(
            (resolve, reject) =>
                window.navigator.geolocation.getCurrentPosition(
                    () => reject("Unexpected success callback"),
                    error => resolve({
                        code: error.code,
                        message: error.message,
                        PERMISSION_DENIED: error.PERMISSION_DENIED,
                        POSITION_UNAVAILABLE: error.POSITION_UNAVAILABLE,
                        TIMEOUT: error.TIMEOUT
                    }),
                    {timeout: 1000}
                ));

        assert_equals(error.code, 2);
        // The message value is not specified.
        assert_not_equals(error.message, undefined);
        assert_equals(error.PERMISSION_DENIED, 1);
        assert_equals(error.POSITION_UNAVAILABLE, 2);
        assert_equals(error.TIMEOUT, 3);
    }, "Tests Geolocation error callback");
</script>
