1. Introduction
The GeolocationSensor API extends the Sensor interface [GENERIC-SENSOR] to provide
information about the geolocation of the hosting device.
The feature set of the GeolocationSensor is similar to that of the Geolocation API [GEOLOCATION-API], but it is surfaced through a modern API that is consistent across contemporary sensor APIs, improves security and privacy, and is extensible. The API aims to be polyfillable (example)
on top of the existing Geolocation API.
2. Examples
Get a new geolocation reading every second:
let geo= new GeolocationSensor({ frequency: 1 }); geo. start(); geo. onreading= () => console. log( `lat: ${ geo. latitude} , long: ${ geo. longitude} ` ); geo. onerror= event=> console. error( event. error. name, event. error. message); 
Get a one-shot geolocation reading:
GeolocationSensor. read() . then( geo=> console. log( `lat: ${ geo. latitude} , long: ${ geo. longitude} ` )) . catch ( error=> console. error( error. name)); 
3. Security and Privacy Considerations
Note: Investigate any geolocation-specific security and privacy considerations that are not mitigated by the Generic Sensor API [GENERIC-SENSOR], and define geolocation-specific mitigations.
4. Model
The term geolocation refers to the real-world geographic location of the hosting device represented in geographic coordinates [WGS84].
Note: An implementation can use multiple location information sources to acquire geolocation information, and this specification is agnostic with respect to those sources.
The Geolocation Sensor sensor type’s associated Sensor subclass is the GeolocationSensor class.
The Geolocation Sensor has an associated PermissionName which is "geolocation".
A latest geolocation reading is a latest reading for a Sensor of Geolocation Sensor sensor type. It includes entries whose keys are "latitude", "longitude", "altitude", "accuracy", "altitudeAccuracy", "heading", "speed"
and whose values contain device’s geolocation.
Note: Consider adding a visual of the standard coordinate system for the Earth.
5. API
5.1. The GeolocationSensor Interface
[(Constructor optional GeolocationSensorOptions ),options SecureContext ,Exposed =Window ]interface :GeolocationSensor Sensor {static Promise <GeolocationSensorReading >(read optional ReadOptions );readOptions readonly attribute unrestricted double ?;latitude readonly attribute unrestricted double ?;longitude readonly attribute unrestricted double ?;altitude readonly attribute unrestricted double ?;accuracy readonly attribute unrestricted double ?;altitudeAccuracy readonly attribute unrestricted double ?;heading readonly attribute unrestricted double ?; };speed dictionary :GeolocationSensorOptions SensorOptions { // placeholder for GeolocationSensor-specific options };dictionary :ReadOptions GeolocationSensorOptions {AbortSignal ?; };signal dictionary {GeolocationSensorReading DOMHighResTimeStamp ?;timestamp double ?;latitude double ?;longitude double ?;altitude double ?;accuracy double ?;altitudeAccuracy double ?;heading double ?; };speed 
  Coordinates interface of the Geolocation API are the following:
    - Use unrestricted double to not throw TypeError on NaN, +Infinity or −Infinity. (Geolocation API defines NaN as a valid value for heading, yet uses double as its type.)
- Use nullable to allow all attributes to default to null. (Geolocation API does not provide synchronous means to access these attributes, thus latitude, longitude and altitude are not nullable and "must be supported by all implementations".)
To construct a GeolocationSensor object the user agent must invoke the construct a geolocation sensor object abstract operation.
5.1.1. GeolocationSensor.read()
The read() method, when called, must run the following algorithm:
- input
- 
      options, a ReadOptionsobject.
- output
- 
      p, a promise. 
- 
      Let p be a new promise. 
- 
      Let options be the first argument. 
- 
      Let signal be the options’ dictionary member of the same name if present, or null otherwise. 
- 
      If signal’s aborted flag is set, then reject p with an " AbortError"DOMExceptionand return p.
- 
      Let geo be the result of invoking construct a Geolocation Sensor object with options. If this throws a DOMException, catch it, reject p with thatDOMException, and return p.
- 
      Invoke geo. start().
- 
      If signal is not null, then add the following abort steps to signal: - 
        Invoke geo. stop().
- 
        Reject p with an " AbortError"DOMExceptionand abort these steps.
 
- 
        
- 
      Run these steps in parallel: - 
        If notify error is invoked with geo, invoke geo. stop(), and reject p with theDOMExceptionpassed as input to notify error.
- 
        If notify new reading is invoked with geo, then resolve geolocation promise with geo and p. 
 
- 
        
- 
      Return p. 
 Implementations can reuse the same promise for multiple concurrent calls within the same browsing context if the arguments passed to read() are the same. 
To resolve geolocation promise means to run the following steps:
- 
     Let reading be a GeolocationSensorReading.
- 
     For each key → value of latest geolocation reading: - 
       Set reading[key] to value. 
 
- 
       
- 
     Invoke geo. stop().
- 
     Resolve p with reading. 
5.1.2. GeolocationSensor.latitude
The latitude attribute of the GeolocationSensor interface
returns the result of invoking get value from latest reading with this and "latitude" as
arguments. It represents the latitude coordinate of the geolocation in decimal degrees [WGS84].
5.1.3. GeolocationSensor.longitude
The longitude attribute of the GeolocationSensor interface
returns the result of invoking get value from latest reading with this and "longitude" as
arguments. It represents the longitude coordinate of the geolocation in decimal degrees [WGS84].
5.1.4. GeolocationSensor.altitude
The altitude attribute of the GeolocationSensor interface
returns the result of invoking get value from latest reading with this and "altitude" as
arguments. It represents the geolocation in meters above the WGS 84 ellipsoid [WGS84].
5.1.5. GeolocationSensor.accuracy
The accuracy attribute of the GeolocationSensor interface
returns the result of invoking get value from latest reading with this and "accuracy" as
arguments. It represents the accuracy of the latest reading["latitude"] value and latest reading["longitude"] value in meters with a 95% confidence level.
If the latest reading["latitude"] value is null or latest reading["longitude"] value is null, it must return null.
5.1.6. GeolocationSensor.altitudeAccuracy
The altitudeAccuracy attribute of the GeolocationSensor interface returns the result of invoking get value from latest reading with this and
"altitudeAccuracy" as arguments. It represents the accuracy of the latest reading["altitude"] value in meters with a 95% confidence level.
If the latest reading["altitude"] value is null, it must return null.
5.1.7. GeolocationSensor.heading
The heading attribute of the GeolocationSensor interface
returns the result of invoking get value from latest reading with this and "heading" as
arguments. It represents the direction of travel in degrees counting clockwise relative to the
true north in the range 0 ≤ heading ≤ 360.
5.1.8. GeolocationSensor.speed
The speed attribute of the GeolocationSensor interface
returns the result of invoking get value from latest reading with this and "speed" as
arguments. It represents the magnitude of the horizontal component of the velocity in meters
per second.
6. Abstract Operations
6.1. Construct a geolocation sensor object
- input
- 
      options, a GeolocationSensorOptionsobject.
- output
- 
      A GeolocationSensorobject.
- 
      Let allowed be the result of invoking check sensor policy-controlled features with GeolocationSensor.
- 
      If allowed is false, then: 
- 
      Let geo be the new GeolocationSensorobject.
- 
      Invoke initialize a sensor object with geo and options. 
- 
      Return geo. 
7. Acknowledgements
Tobie Langel for the work on Generic Sensor API and the geolocation.js polyfill.