From 75126d454151c6810fc76263a48f17f1128a1401 Mon Sep 17 00:00:00 2001
From: Alvin Ji
Date: Thu, 19 Mar 2026 13:37:31 -0700
Subject: [PATCH 01/12] rebase to Chore: remove updatable-rec stuff (#224)
---
index.html | 663 +++++++++++++++++++++++++++++++++++++----------------
1 file changed, 470 insertions(+), 193 deletions(-)
diff --git a/index.html b/index.html
index f7c0c64..40a4ab0 100644
--- a/index.html
+++ b/index.html
@@ -67,12 +67,41 @@
System (GPS) and location inferred from network signals such as IP
address, RFID, WiFi and Bluetooth MAC addresses, and GSM/CDMA cell IDs,
as well as user input. The API itself is agnostic of the underlying
- location information sources, and no guarantee is given that the API
- returns the device's actual location.
+ location information sources, and no guarantee is given that
+ the API returns the device's actual location.
- If an end user [=check permission|grants permission=],
- Geolocation:
+ This specification provides two ways for users to share their location:
+ a precise position and an approximate position.
+
+
+ A precise position is a position returned by the underlying
+ [=location information source=]. By default, any location data is
+ considered precise, regardless of its accuracy estimate, unless it has
+ been explicitly coarsened by an [=approximate location information
+ source=] to be an [=approximate position=].
+
+
+ An approximate position is a less precise,
+ privacy-preserving representation of the user's location. Instead of
+ providing precise coordinates, an [=approximate location information
+ source=] can return a location that is intentionally coarsened to a
+ larger area, such as the nearest city, postal code, or a predefined
+ region. This is often sufficient for applications that don't need to
+ know the user's [=precise position=], for example, a weather
+ application that only needs a city-level location. By sharing an
+ [=approximate position=], users can still get the benefit of a
+ location-aware application without revealing their [=precise
+ position=].
+
+
+ An approximate location information source is a [=location
+ information source=] that returns positions that have been
+ intentionally obfuscated to make it more difficult to recover the true
+ location.
+
+
+ If an end user grants permission, Geolocation:
Provides location data as latitude, longitude, altitude, speed, and
@@ -127,8 +156,17 @@
Get current position
- Request the user's current location. If the user allows it, you will
- get back a position object.
+ Request the user's current location. If the user grants permission,
+ the API will return a position object. The website can influence the
+ position's accuracy by using the {{PositionOptions}} dictionary's
+ {{PositionOptions/accuracyMode}} member. By default, the user agent
+ will provide a {{AccuracyMode/"precise"}} location. However, a
+ website can request an [=approximate position=] by setting
+ {{PositionOptions/accuracyMode}} to {{AccuracyMode/"approximate"}},
+ which helps protect user privacy if high accuracy is not required. In
+ addition, the user can instruct the user agent to only provide an
+ approximate position, even if the website requested a precise
+ position.
+
@@ -234,22 +282,37 @@
By default, the API always attempts to return a cached position so
- long as it has a previously acquired position. In this example, we
- accept a position whose age is no greater than 10 minutes. If the
- user agent does not have a fresh enough cached position object, it
- automatically acquires a new position.
+ long as it has a previously acquired position that matches the
+ requested {{PositionOptions/accuracyMode}}. In this example, we
+ accept a precise position whose age is no greater than 10 minutes. If
+ the user agent does not have a fresh enough cached position object of
+ the correct accuracy, it automatically acquires a new position.
+
+
+
+ Similarly, you can request a cached approximate position.
-
+
+
+ Dealing with failures:
+
+
+
+
If acquiring a position fails, do one of the following based
+ on the condition that matches the failure:
+
+
+ User or system denied permission:
+
+
+
+ [=Call back with error=] passing |errorCallback| and
+ {{GeolocationPositionError/PERMISSION_DENIED}}.
+
+
+
+
+ Timeout elapsed:
+
+
+ [=Call back with error=] with |errorCallback| and
+ {{GeolocationPositionError/TIMEOUT}}.
+
+
+ Data acquisition error or any other reason:
+
+
+ [=Call back with error=] passing |errorCallback| and
+ {{GeolocationPositionError/POSITION_UNAVAILABLE}}.
+
+ The accuracyMode member is used to request a specific
+ level of accuracy. It can be set to "precise" to request the most
+ accurate location data available, or "approximate" to receive a less
+ accurate location that protects user privacy. The default value is
+ "precise".
+
+
+
`enableHighAccuracy` member
@@ -1075,10 +1338,10 @@
The time spent waiting for the document to become visible and for
- [=check permission|obtaining permission to use the API=] is not
- included in the period covered by the {{PositionOptions/timeout}}
- member. The {{PositionOptions/timeout}} member only applies when
- [=acquiring a position=] begins.
+ [=request precise geolocation permission|obtaining permission to use
+ the API=] is not included in the period covered by the
+ {{PositionOptions/timeout}} member. The {{PositionOptions/timeout}}
+ member only applies when [=acquiring a position=] begins.
+
+
+ `accuracyMode` attribute
+
+
+ The accuracyMode attribute indicates the accuracy level of
+ the position, which can be either `"precise"` or `"approximate"`.
+ This reflects the level of accuracy that was granted and used to
+ obtain the position.
+
+
`toJSON()` method
@@ -1263,8 +1538,9 @@
A new `GeolocationPosition` is constructed with [=map=]
- |positionData|, {{EpochTimeStamp}} |timestamp:EpochTimeStamp| and
- boolean |isHighAccuracy| by performing the following steps:
+ |positionData|, {{EpochTimeStamp}} |timestamp:EpochTimeStamp|,
+ boolean |isHighAccuracy|, and string |effectiveAccuracy| by
+ performing the following steps:
Let |coords:GeolocationCoordinates| be a newly created
@@ -1277,10 +1553,11 @@
Return a newly created {{GeolocationPosition}} instance with its
- {{GeolocationPosition/coords}} attribute initialized to |coords| and
+ {{GeolocationPosition/coords}} attribute initialized to |coords|,
{{GeolocationPosition/timestamp}} attribute initialized to
- |timestamp|, and its {{GeolocationPosition/[[isHighAccuracy]]}}
- internal slot set to |isHighAccuracy|.
+ |timestamp|, {{GeolocationPosition/[[isHighAccuracy]]}} internal slot
+ set to |isHighAccuracy| and {{GeolocationPosition/accuracyMode}}
+ attribute initialized to |effectiveAccuracy|.
From 18496be808d4543d3031e6a1b193c3f288c6a2e0 Mon Sep 17 00:00:00 2001
From: Alvin Ji
Date: Wed, 25 Mar 2026 16:10:04 -0700
Subject: [PATCH 02/12] Apply PR feedback for approximate geolocation
- Define explicit coherence requirements between "geolocation" and "geolocation-approximate" permission states.
- Fix typos and clarify logic in the precise permission query algorithm.
- Update the 'set emulated position data' definition and 'Acquire a position' algorithm to consume an Infra map, aligning the Geolocation spec with the WebDriver BiDi implementation.
- Rename effectiveAccuracy to accuracyMode in the 'Constructing a GeolocationPosition' algorithm.
---
index.html | 108 +++++++++++++++++++++++++++++++++++++++--------------
1 file changed, 81 insertions(+), 27 deletions(-)
diff --git a/index.html b/index.html
index 40a4ab0..fc0b109 100644
--- a/index.html
+++ b/index.html
@@ -67,8 +67,8 @@
System (GPS) and location inferred from network signals such as IP
address, RFID, WiFi and Bluetooth MAC addresses, and GSM/CDMA cell IDs,
as well as user input. The API itself is agnostic of the underlying
- location information sources, and no guarantee is given that
- the API returns the device's actual location.
+ location information sources, and no guarantee is given that the API
+ returns the device's actual location.
This specification provides two ways for users to share their location:
@@ -76,16 +76,16 @@
A precise position is a position returned by the underlying
- [=location information source=]. By default, any location data is
+ location information source. By default, any location data is
considered precise, regardless of its accuracy estimate, unless it has
- been explicitly coarsened by an [=approximate location information
- source=] to be an [=approximate position=].
+ been explicitly coarsened by an approximate location information source
+ to be an [=approximate position=].
An approximate position is a less precise,
privacy-preserving representation of the user's location. Instead of
- providing precise coordinates, an [=approximate location information
- source=] can return a location that is intentionally coarsened to a
+ providing precise coordinates, an approximate location information
+ source can return a location that is intentionally coarsened to a
larger area, such as the nearest city, postal code, or a predefined
region. This is often sufficient for applications that don't need to
know the user's [=precise position=], for example, a weather
@@ -95,10 +95,9 @@
position=].
- An approximate location information source is a [=location
- information source=] that returns positions that have been
- intentionally obfuscated to make it more difficult to recover the true
- location.
+ An approximate location information source is a location information
+ source that returns positions that have been intentionally obfuscated
+ to make it more difficult to recover the true location.
If an end user grants permission, Geolocation:
@@ -541,6 +540,44 @@
+ There is a strict dependency between the [=permission state=]s of
+ "geolocation" and "geolocation-approximate".
+ Specifically, granting precise location implies granting approximate
+ location, and denying approximate location implies denying precise
+ location. This results in the following allowed combinations of
+ states:
+
+ Implementers MUST ensure that these states remain coherent. For
+ example, if a user changes the [=permission state=] of
+ "geolocation-approximate" to [=permission/"denied"=] via site
+ settings, the user agent MUST automatically update
+ "geolocation" to [=permission/"denied"=] as well. Similarly,
+ if "geolocation" is changed to [=permission/"granted"=],
+ "geolocation-approximate" MUST also become
+ [=permission/"granted"=].
+
If |approximatePermissionState| is [=permission/"granted"=]
and |permissionDesc|'s [=permission state=] is
- [=permission/"prompt"=], set |status|'s to
- [=permission/"prompt"=]. Otherwise, set |status|'s
- {{PermissionStatus/state}} to |appxorimatePermissionState|.
+ [=permission/"prompt"=], set |status|'s
+ {{PermissionStatus/state}} to [=permission/"prompt"=]. Otherwise,
+ set |status|'s {{PermissionStatus/state}} to
+ |approximatePermissionState|.
If |status|'s {{PermissionStatus/state}} is equal to
[=permission/"granted"=], set |status|'s
@@ -579,6 +617,14 @@
{{AccuracyMode/"precise"}} if also |permissionDesc|'s
[=permission state=] is [=permission/"granted"=] or to
{{AccuracyMode/"approximate"}} otherwise.
+
@@ -1030,21 +1076,31 @@
If |emulatedPositionData| is not null:
-
If |emulatedPositionData| is a
- {{GeolocationPositionError}}:
+
If |emulatedPositionData|["error"]
+ [=map/exists=]:
+
Let |error| be a newly created
+ {{GeolocationPositionError}} instance with its
+ {{GeolocationPositionError/code}} attribute
+ initialized to
+ |emulatedPositionData|["error"]["code"].
+
[=Call back with error=] passing
- |errorCallback| and
- |emulatedPositionData|.{{GeolocationPositionError/code}}.
+ |errorCallback| and |error|.
Terminate this algorithm.
+
Let |emulatedAccuracyMode| be
+ |emulatedPositionData|["accuracyMode"] if it
+ [=map/exists=]; otherwise "precise".
+
Let |position| be [=a new `GeolocationPosition`=]
- passing |emulatedPositionData|, |acquisitionTime|,
+ passing |emulatedPositionData|["coordinate"],
+ |acquisitionTime|,
|options|.{{PositionOptions/enableHighAccuracy}}, and
- |effectiveAccuracy|.
+ |emulatedAccuracyMode|.
[=Queue a task=] on the [=geolocation task
source=] with a step that [=invokes=]
@@ -1539,8 +1595,8 @@
A new `GeolocationPosition` is constructed with [=map=]
|positionData|, {{EpochTimeStamp}} |timestamp:EpochTimeStamp|,
- boolean |isHighAccuracy|, and string |effectiveAccuracy| by
- performing the following steps:
+ boolean |isHighAccuracy|, and string |accuracyMode| by performing the
+ following steps:
Let |coords:GeolocationCoordinates| be a newly created
@@ -1557,7 +1613,7 @@
{{GeolocationPosition/timestamp}} attribute initialized to
|timestamp|, {{GeolocationPosition/[[isHighAccuracy]]}} internal slot
set to |isHighAccuracy| and {{GeolocationPosition/accuracyMode}}
- attribute initialized to |effectiveAccuracy|.
+ attribute initialized to |accuracyMode|.
@@ -1656,16 +1712,14 @@
Each [=top-level traversable=] has an associated emulated position
- data, which is data representing {{GeolocationCoordinates}},
- {{GeolocationPositionError}} or null, initially null.
+ data, which is a [=map=] or null, initially null.
To set emulated position data, given
[=navigable=] |navigable| and an |emulatedPositionData|:
-
Assert |emulatedPositionData| is either null, a
- {{GeolocationCoordinates}}, or a {{GeolocationPositionError}}.
+
Assert |emulatedPositionData| is either null or a [=map=].
Let |traversable| be |navigable|’s [=navigable/top-level
traversable=].
From 0f52a5e5dc10bece32c5d45d29c7a8c886bcb7e3 Mon Sep 17 00:00:00 2001
From: Alvin Ji
Date: Wed, 25 Mar 2026 16:10:04 -0700
Subject: [PATCH 03/12] correct typo
---
index.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/index.html b/index.html
index fc0b109..768af91 100644
--- a/index.html
+++ b/index.html
@@ -1097,7 +1097,7 @@
[=map/exists=]; otherwise "precise".
Let |position| be [=a new `GeolocationPosition`=]
- passing |emulatedPositionData|["coordinate"],
+ passing |emulatedPositionData|["coordinates"],
|acquisitionTime|,
|options|.{{PositionOptions/enableHighAccuracy}}, and
|emulatedAccuracyMode|.
From 998176addea7cfc9f2ce161615b17ee43954f9bf Mon Sep 17 00:00:00 2001
From: Alvin Ji
Date: Tue, 7 Apr 2026 06:41:34 +0800
Subject: [PATCH 04/12] Move accuracyMode to GeolocationCoordinates
- Update GeolocationPosition and GeolocationCoordinates interfaces to move accuracyMode.
- Update 'Acquire a position' and 'Constructing a GeolocationPosition' algorithms to reflect the move.
- Align emulation logic with WebDriver BiDi by using 'type' for error codes and embedding accuracyMode in coordinates.
- Tidy index.html.
---
index.html | 59 +++++++++++++++++++++++++++---------------------------
1 file changed, 29 insertions(+), 30 deletions(-)
diff --git a/index.html b/index.html
index 768af91..1df30d1 100644
--- a/index.html
+++ b/index.html
@@ -1083,7 +1083,7 @@
{{GeolocationPositionError}} instance with its
{{GeolocationPositionError/code}} attribute
initialized to
- |emulatedPositionData|["error"]["code"].
+ |emulatedPositionData|["error"]["type"].
[=Call back with error=] passing
|errorCallback| and |error|.
@@ -1092,15 +1092,10 @@
-
Let |emulatedAccuracyMode| be
- |emulatedPositionData|["accuracyMode"] if it
- [=map/exists=]; otherwise "precise".
-
Let |position| be [=a new `GeolocationPosition`=]
passing |emulatedPositionData|["coordinates"],
- |acquisitionTime|,
- |options|.{{PositionOptions/enableHighAccuracy}}, and
- |emulatedAccuracyMode|.
+ |acquisitionTime|, and
+ |options|.{{PositionOptions/enableHighAccuracy}}.
[=Queue a task=] on the [=geolocation task
source=] with a step that [=invokes=]
@@ -1124,7 +1119,8 @@
If |cachedPosition|'s
{{GeolocationPosition/timestamp}}'s value is greater than
|cacheTime|, and |effectiveAccuracy| equals
- |cachedPosition|'s {{GeolocationPosition/accuracyMode}}:
+ |cachedPosition|'s {{GeolocationPosition/coords}}'s
+ {{GeolocationCoordinates/accuracyMode}}:
[=Queue a task=] on the [=geolocation task
source=] with a step that [=invokes=]
@@ -1236,12 +1232,17 @@
Heading measures the direction in which the device is
moving relative to true north.
+
+ "accuracyMode"
+
+
+ Set to |effectiveAccuracy|.
+
Set |position| to [=a new `GeolocationPosition`=] passing
- |positionData|, |acquisitionTime|,
- |options|.{{PositionOptions/enableHighAccuracy}} and
- |effectiveAccuracy|.
+ |positionData|, |acquisitionTime|, and
+ |options|.{{PositionOptions/enableHighAccuracy}}.
Set [=this=]'s {{Geolocation/[[cachedPosition]]}} to
|position|.
@@ -1426,7 +1427,6 @@
geographic position of the device was acquired.
-
-
- `accuracyMode` attribute
-
-
- The accuracyMode attribute indicates the accuracy level of
- the position, which can be either `"precise"` or `"approximate"`.
- This reflects the level of accuracy that was granted and used to
- obtain the position.
-
+ The accuracyMode attribute indicates the accuracy level of
+ the position, which can be either `"precise"` or `"approximate"`.
+ This reflects the level of accuracy that was granted and used to
+ obtain the position.
+
+
`toJSON()` method
@@ -1594,9 +1595,8 @@
A new `GeolocationPosition` is constructed with [=map=]
- |positionData|, {{EpochTimeStamp}} |timestamp:EpochTimeStamp|,
- boolean |isHighAccuracy|, and string |accuracyMode| by performing the
- following steps:
+ |positionData|, {{EpochTimeStamp}} |timestamp:EpochTimeStamp|, and
+ boolean |isHighAccuracy| by performing the following steps:
Let |coords:GeolocationCoordinates| be a newly created
@@ -1611,9 +1611,8 @@
Return a newly created {{GeolocationPosition}} instance with its
{{GeolocationPosition/coords}} attribute initialized to |coords|,
{{GeolocationPosition/timestamp}} attribute initialized to
- |timestamp|, {{GeolocationPosition/[[isHighAccuracy]]}} internal slot
- set to |isHighAccuracy| and {{GeolocationPosition/accuracyMode}}
- attribute initialized to |accuracyMode|.
+ |timestamp|, and {{GeolocationPosition/[[isHighAccuracy]]}} internal
+ slot set to |isHighAccuracy|.
From 50da35765b010df61c74b0cdeaf2192bcc17b580 Mon Sep 17 00:00:00 2001
From: Alvin Ji
Date: Wed, 8 Apr 2026 15:07:05 +0800
Subject: [PATCH 05/12] Address reviewer feedback for approximate geolocation
- Rephrase privacy risk mitigation and user choice framing for clarity and neutrality.
- Update terminology from 'powerful features' to 'permissions' and 'protecting' to 'obscuring'.
- Add cross-references to the 'acquire a position' algorithm and AccuracyMode enum values.
- Fix ReSpec linking errors and IDL formatting.
- Remove redundant MUST statements from informative notes.
- Tidy index.html.
---
index.html | 217 +++++++++++++++++++++++++++++------------------------
1 file changed, 119 insertions(+), 98 deletions(-)
diff --git a/index.html b/index.html
index 1df30d1..1e255c4 100644
--- a/index.html
+++ b/index.html
@@ -72,7 +72,7 @@
This specification provides two ways for users to share their location:
- a precise position and an approximate position.
+ a [=precise position=] and an [=approximate position=].
A precise position is a position returned by the underlying
@@ -87,7 +87,8 @@
providing precise coordinates, an approximate location information
source can return a location that is intentionally coarsened to a
larger area, such as the nearest city, postal code, or a predefined
- region. This is often sufficient for applications that don't need to
+ region. What constitutes a coarsened area is left to the underlying
+ system. This is often sufficient for applications that don't need to
know the user's [=precise position=], for example, a weather
application that only needs a city-level location. By sharing an
[=approximate position=], users can still get the benefit of a
@@ -100,7 +101,8 @@
to make it more difficult to recover the true location.
- If an end user grants permission, Geolocation:
+ If an end user [=request permission to use|grants permission=],
+ Geolocation:
Provides location data as latitude, longitude, altitude, speed, and
@@ -155,17 +157,12 @@
Get current position
- Request the user's current location. If the user grants permission,
- the API will return a position object. The website can influence the
- position's accuracy by using the {{PositionOptions}} dictionary's
- {{PositionOptions/accuracyMode}} member. By default, the user agent
- will provide a {{AccuracyMode/"precise"}} location. However, a
- website can request an [=approximate position=] by setting
- {{PositionOptions/accuracyMode}} to {{AccuracyMode/"approximate"}},
- which helps protect user privacy if high accuracy is not required. In
- addition, the user can instruct the user agent to only provide an
- approximate position, even if the website requested a precise
- position.
+ A website can request a user's location, choosing either a [=precise
+ position=] or an [=approximate position=] via the
+ {{PositionOptions/accuracyMode}} member. During the permission
+ request process, the end-user determines the actual level of accuracy
+ to grant, which the user agent then uses to provide the geographic
+ position accordingly.
@@ -406,24 +400,24 @@
thereby potentially compromising the user's privacy.
- To mitigate this privacy risk, this specification introduces the
- {{PositionOptions/accuracyMode}} option, which allows the application
- to request an [=approximate position=]. This allows applications to
- function without needing the user's [=precise position=], thus offering
- a more privacy-friendly alternative. When an application requests an
- [=approximate position=], the user agent can provide a less precise
- location that still meets the application's needs while protecting the
- user's [=precise position=]. Even when a [=precise position=] is
- requested, the user agent can provide an [=approximate position=]
- instead, for example, if the user has only granted permission for
- approximate accuracy.
+ The {{PositionOptions/accuracyMode}} option enhances user privacy by
+ providing websites with the choice to request an [=approximate
+ position=]. This allows applications to function without needing the
+ user's [=precise position=], thus offering a more privacy-friendly
+ alternative. When an application requests an [=approximate position=],
+ the user agent can provide a less precise location that still meets the
+ application's needs while obscuring the user's [=precise position=].
+ Even when a [=precise position=] is requested, the user agent can
+ provide an [=approximate position=] instead (as defined in the
+ [=acquire a position=] algorithm), for example, if the user has only
+ granted permission for approximate accuracy.
User consent
- Geolocation uses the [=powerful feature=]s
+ Geolocation uses the [=permission=]
"geolocation-approximate" and "geolocation", which
require [=express permission=] from an end-user before any location
data is shared with a web application. This requirement is
@@ -432,11 +426,12 @@
geolocation permission=] steps, on which the
{{Geolocation/getCurrentPosition()}} and
{{Geolocation/watchPosition()}} methods rely. [=User agents=] with
- support for [=approximate position=] are strongly encouraged to allow
- the user to choose between sharing a [=precise position=] or an
- [=approximate position=]. This choice gives users more control over
- their privacy, allowing them to share a less precise location when
- they are not comfortable sharing their [=precise position=].
+ support for [=approximate position=] are strongly encouraged to
+ provide users with the option to grant access to either a [=precise
+ position=] or an [=approximate position=]. This choice gives users
+ more control over their privacy, allowing them to share a less
+ precise location when they are not comfortable sharing their
+ [=precise position=].
An end-user will generally give [=express permission=] through a user
@@ -487,9 +482,10 @@
request the lowest level of location accuracy that is sufficient for
their application's functionality. For instance, if an application
only needs to know the user's city, it can respect user privacy by
- requesting an [=approximate position=] by setting the `accuracyMode`
- option to `"approximate"`. This practice of data minimization is a
- key aspect of respecting user privacy.
+ requesting an [=approximate position=] by setting the
+ {{PositionOptions/accuracyMode}} option to
+ {{AccuracyMode/"approximate"}}. This practice of data minimization is
+ a key aspect of respecting user privacy.
The recipients of location information need to refrain from
@@ -530,23 +526,22 @@
-
+
Geolocation permissions
-
+
- Geolocation defines two [=powerful features=] identified
- by the [=powerful feature/name=]s "geolocation" (for precise location) and
- "geolocation-approximate"
+ Geolocation defines two [=permissions=] identified by
+ the names "geolocation" (for precise
+ location) and "geolocation-approximate"
(for approximate location).
There is a strict dependency between the [=permission state=]s of
"geolocation" and "geolocation-approximate".
- Specifically, granting precise location implies granting approximate
- location, and denying approximate location implies denying precise
- location. This results in the following allowed combinations of
- states:
+ Specifically, granting a [=precise position=] implies granting an
+ [=approximate position=], and denying an [=approximate position=]
+ implies denying a [=precise position=]. This results in the following
+ allowed combinations of states:
Both are [=permission/"granted"=].
@@ -569,7 +564,7 @@
- Implementers MUST ensure that these states remain coherent. For
+ User agents MUST ensure that these states remain coherent. For
example, if a user changes the [=permission state=] of
"geolocation-approximate" to [=permission/"denied"=] via site
settings, the user agent MUST automatically update
@@ -579,9 +574,8 @@
The user agent is free to group the two resulting questions for
the user into a single permission prompt, asking the user
- whether they want to expression permission to grant either
+ whether they want to express permission to grant either
approximate or precise geolocation (or none).
@@ -682,14 +675,13 @@
Preventing Precise Location Reconstruction
- A malicious actor could potentially infer a user's [=precise
- position=] by collecting and correlating multiple, distinct
- [=approximate positions=]. To mitigate this risk of a refinement
- attack, when a site receives an [=approximate position=], any
- subsequent calls from that same site within a user-agent-defined time
- window SHOULD return the exact same, cached [=approximate position=]
- data. A user agent might, for example, use a time window of 15
- minutes.
+ A recipient could potentially infer a user's [=precise position=] by
+ collecting and correlating multiple, distinct [=approximate
+ positions=]. To mitigate this risk of a refinement attack, when a
+ site receives an [=approximate position=], any subsequent calls from
+ that same site within a user-agent-defined time window SHOULD return
+ the exact same, cached [=approximate position=] data. A user agent
+ might, for example, use a time window of 15 minutes.
Otherwise (|descriptor|.{{PermissionDescriptor/name}} is
+ "geolocation"):
Let |precisePermissionStatus:GeolocationPermissionStatus|
be [=request precise geolocation permission=].
@@ -1029,8 +1023,8 @@
by running the following steps:
Let |permissionStatus:GeolocationPermissionStatus| be the
- result of running the [=geolocation/precise permission query
- algorithm=] given a new {{PermissionDescriptor}} with its
+ result of running the [=precise permission query algorithm=]
+ given a new {{PermissionDescriptor}} with its
{{PermissionDescriptor/name}} set to "geolocation".
Let |effectiveAccuracy:AccuracyMode?| be `null`.
@@ -1039,14 +1033,15 @@
[=permission/granted=]:
If |options|.{{PositionOptions/accuracyMode}} is
- "approximate":
+ {{AccuracyMode/"approximate"}}:
-
Set |effectiveAccuracy| to "approximate".
+
Set |effectiveAccuracy| to
+ {{AccuracyMode/"approximate"}}.
Otherwise (|options|.{{PositionOptions/accuracyMode}} is
- "precise"):
+ {{AccuracyMode/"precise"}}):
Set |effectiveAccuracy| to
|permissionStatus|.{{GeolocationPermissionStatus/accuracyMode}}.
@@ -1066,7 +1061,7 @@
-
Otherwise, run belows steps to determine |position|:
+
Otherwise, run the following steps to determine |position|:
Check if an emulated position should be used by running
the following steps:
@@ -1136,15 +1131,16 @@
Otherwise, try to acquire position data from the
underlying system, with the following considerations:
-
If |effectiveAccuracy| is "approximate", the user
- agent SHOULD acquire a position with a level of accuracy
- that is sufficient to protect user privacy (e.g.,
- city-level accuracy). The
+
If |effectiveAccuracy| is
+ {{AccuracyMode/"approximate"}}, the user agent SHOULD
+ acquire an [=approximate position=] with a level of
+ accuracy that is sufficient to protect user privacy
+ (e.g., city-level accuracy). The
{{PositionOptions/enableHighAccuracy}} member is ignored.
-
If |effectiveAccuracy| is "precise", the user agent
- SHOULD acquire a position, optionally taking into
- consideration the value of
+
If |effectiveAccuracy| is {{AccuracyMode/"precise"}},
+ the user agent SHOULD acquire a [=precise position=],
+ optionally taking into consideration the value of
|options|.{{PositionOptions/enableHighAccuracy}}.
@@ -1236,7 +1232,8 @@
"accuracyMode"
- Set to |effectiveAccuracy|.
+ An {{AccuracyMode}} that indicates the accuracy level
+ of the position. Set to |effectiveAccuracy|.
@@ -1351,15 +1348,17 @@
The accuracyMode member is used to request a specific
- level of accuracy. It can be set to "precise" to request the most
- accurate location data available, or "approximate" to receive a less
- accurate location that protects user privacy. The default value is
- "precise".
+ level of accuracy. It can be set to {{AccuracyMode/"precise"}} to
+ request the most accurate location data available, or
+ {{AccuracyMode/"approximate"}} to receive a less accurate location
+ that protects user privacy. The default value is
+ {{AccuracyMode/"precise"}}.
@@ -1575,9 +1574,9 @@
The accuracyMode attribute indicates the accuracy level of
- the position, which can be either `"precise"` or `"approximate"`.
- This reflects the level of accuracy that was granted and used to
- obtain the position.
+ the position, which can be either {{AccuracyMode/"precise"}} or
+ {{AccuracyMode/"approximate"}}. This reflects the level of accuracy
+ that was granted and used to obtain the position.
@@ -1600,7 +1599,9 @@
Let |coords:GeolocationCoordinates| be a newly created
- {{GeolocationCoordinates}} instance.
+ {{GeolocationCoordinates}} instance with its
+ {{GeolocationCoordinates/accuracyMode}} attribute initialized to
+ {{AccuracyMode/"precise"}}.
Each [=top-level traversable=] has an associated emulated position
- data, which is a [=map=] or null, initially null.
+ data, which is a [=map=] or null, initially null. When it is a
+ [=map=], it can contain the following optional keys:
+
+
+ "coordinates"
+
+
+ A [=map=] representing the position's geographic coordinates and
+ accuracy. It SHOULD contain the same name/value pairs as defined in
+ the |positionData| map of the acquire a position algorithm.
+
+
+ "error"
+
+
+ A [=map=] representing an error state. It MUST contain a "type" key
+ whose value is an {{unsigned short}} representing one of the codes
+ defined in {{GeolocationPositionError}} (e.g.,
+ {{GeolocationPositionError/PERMISSION_DENIED}}).
+
+
To set emulated position data, given
[=navigable=] |navigable| and an |emulatedPositionData|:
From fd08f20d2cc5b92e7e9b8db8857508cd88126a52 Mon Sep 17 00:00:00 2001
From: Alvin Ji
Date: Tue, 28 Apr 2026 11:43:54 -0700
Subject: [PATCH 06/12] Remove GeolocationPermissionStatus and
coords.accuracyMode
---
index.html | 406 ++++++++++++++++++++---------------------------------
1 file changed, 156 insertions(+), 250 deletions(-)
diff --git a/index.html b/index.html
index 1e255c4..a74d470 100644
--- a/index.html
+++ b/index.html
@@ -280,30 +280,28 @@
By default, the API always attempts to return a cached position so
long as it has a previously acquired position that matches the
requested {{PositionOptions/accuracyMode}}. In this example, we
- accept a [=precise position=] whose age is no greater than 10
- minutes. If the user agent does not have a fresh enough cached
- position object of the correct accuracy, it automatically acquires a
- new position.
+ request a cached position whose age is no greater than 10 minutes. If
+ the user agent does not have a fresh enough cached position object of
+ the correct accuracy, it automatically acquires a new position.
-
-
+
Privacy considerations
@@ -403,16 +401,16 @@
The {{PositionOptions/accuracyMode}} option enhances user privacy by
providing websites with the choice to request an [=approximate
position=]. This allows applications to function without needing the
- user's [=precise position=], thus offering a more privacy-friendly
+ user's [=precise position=], thus offering a more privacy-preserving
alternative. When an application requests an [=approximate position=],
- the user agent can provide a less precise location that still meets the
- application's needs while obscuring the user's [=precise position=].
- Even when a [=precise position=] is requested, the user agent can
- provide an [=approximate position=] instead (as defined in the
- [=acquire a position=] algorithm), for example, if the user has only
- granted permission for approximate accuracy.
+ a supporting user agent MUST provide a less precise location, obscuring
+ the user's [=precise position=]. Even when a [=precise position=] is
+ requested, the user agent MAY provide an [=approximate position=]
+ instead (as defined in the [=acquire a position=] algorithm), for
+ example, if the user has only granted permission for approximate
+ accuracy.
-
+
User consent
@@ -421,17 +419,14 @@
"geolocation-approximate" and "geolocation", which
require [=express permission=] from an end-user before any location
data is shared with a web application. This requirement is
- normatively enforced by the [=request permission to use=] algorithm,
- which is customized for precise location by the [=request precise
- geolocation permission=] steps, on which the
- {{Geolocation/getCurrentPosition()}} and
+ normatively enforced by the [=request permission to use=] algorithm
+ on which the {{Geolocation/getCurrentPosition()}} and
{{Geolocation/watchPosition()}} methods rely. [=User agents=] with
- support for [=approximate position=] are strongly encouraged to
- provide users with the option to grant access to either a [=precise
- position=] or an [=approximate position=]. This choice gives users
- more control over their privacy, allowing them to share a less
- precise location when they are not comfortable sharing their
- [=precise position=].
+ support for [=approximate position=] MUST provide users with the
+ option to grant access to either a [=precise position=] or an
+ [=approximate position=]. This choice gives users more control over
+ their privacy, allowing them to share a less precise location when
+ they are not comfortable sharing their [=precise position=].
An end-user will generally give [=express permission=] through a user
@@ -533,140 +528,89 @@
Geolocation defines two [=permissions=] identified by
the names "geolocation" (for precise
location) and "geolocation-approximate"
- (for approximate location).
-
-
- There is a strict dependency between the [=permission state=]s of
- "geolocation" and "geolocation-approximate".
- Specifically, granting a [=precise position=] implies granting an
- [=approximate position=], and denying an [=approximate position=]
- implies denying a [=precise position=]. This results in the following
- allowed combinations of states:
-
- User agents MUST ensure that these states remain coherent. For
- example, if a user changes the [=permission state=] of
- "geolocation-approximate" to [=permission/"denied"=] via site
- settings, the user agent MUST automatically update
- "geolocation" to [=permission/"denied"=] as well. Similarly,
- if "geolocation" is changed to [=permission/"granted"=],
- "geolocation-approximate" MUST also become
- [=permission/"granted"=].
+ (for approximate location). Both "geolocation" and
+ "geolocation-approximate" are [=default powerful features=].
A custom precise permission query algorithm, which,
- given a {{PermissionDescriptor}} |permissionDesc| and a
- {{GeolocationPermissionStatus}} |status|, runs the following steps:
-
-
Let |approximatePermissionDesc| be a {{PermissionDescriptor}}
- with {{PermissionDescriptor/name}} set to
- "geolocation-approximate".
-
-
Let |approximatePermissionState| be
- |approximatePermissionDesc|'s [=permission state=].
-
-
If |approximatePermissionState| is [=permission/"granted"=]
- and |permissionDesc|'s [=permission state=] is
- [=permission/"prompt"=], set |status|'s
- {{PermissionStatus/state}} to [=permission/"prompt"=]. Otherwise,
- set |status|'s {{PermissionStatus/state}} to
- |approximatePermissionState|.
-
-
If |status|'s {{PermissionStatus/state}} is equal to
- [=permission/"granted"=], set |status|'s
- {{GeolocationPermissionStatus/accuracyMode}} to
- {{AccuracyMode/"precise"}} if also |permissionDesc|'s
- [=permission state=] is [=permission/"granted"=] or to
- {{AccuracyMode/"approximate"}} otherwise.
-
-
- To request precise geolocation permission, the user agent
- MUST run the following steps.
+ To maintain coherence, user agents MUST run the following steps when
+ the [=permission state=] of either "geolocation" or
+ "geolocation-approximate" changes:
-
Let |preciseLocationDescriptor| be a new {{PermissionDescriptor}}
- with {{PermissionDescriptor/name}} set to "geolocation".
-
-
Run the [=precise permission query algorithm=] given
- |preciseLocationDescriptor| and a new {{GeolocationPermissionStatus}}
- |status|.
+
If the [=permission state=] of "geolocation" is changed to
+ [=permission/"granted"=], set the [=permission state=] of
+ "geolocation-approximate" to [=permission/"granted"=].
-
If |status|'s {{PermissionStatus/state}} is not
- [=permission/"prompt"=], return |status|.
-
-
Let |approximateLocationDescriptor| be a new
- {{PermissionDescriptor}} with {{PermissionDescriptor/name}} set to
- "geolocation-approximate".
-
-
Run the [=powerful feature/permission query algorithm=] given
- |approximateLocationDescriptor| and a new {{PermissionStatus}}
- |approximateStatus|.
-
-
If |approximateStatus|.{{PermissionStatus/state}} is
- [=permission/"granted"=], [=request permission to use=]
- |preciseLocationDescriptor|. Otherwise, [=request permission to use=]
- |approximateLocationDescriptor| and [=request permission to use=]
- |preciseLocationDescriptor|.
-
-
-
Run the [=precise permission query algorithm=] given
- |preciseLocationDescriptor| and a new {{GeolocationPermissionStatus}}
- |newGeolocationStatus|.
-
-
Assert: |newGeolocationStatus|'s state is not
- [=permission/"prompt"=].
-
-
Return |newGeolocationStatus|.
+
If the [=permission state=] of "geolocation-approximate"
+ is changed to [=permission/"denied"=], set the [=permission state=]
+ of "geolocation" to [=permission/"denied"=].
@@ -915,24 +859,21 @@
[=In parallel=]:
-
Let |resolvedPermissionState| be `null`.
+
Let |resolvedPermissionState| be the result of running
+ [=request permission to use=] |descriptor|.
Set |resolvedPermissionState| to the result of running
- [=request permission to use=] |descriptor|.
-
-
-
-
Otherwise (|descriptor|.{{PermissionDescriptor/name}} is
- "geolocation"):
+ "geolocation" and |resolvedPermissionState| is not
+ [=permission/"granted"=]:
-
Let |precisePermissionStatus:GeolocationPermissionStatus|
- be [=request precise geolocation permission=].
+
Let |approximateDescriptor| be a new
+ {{PermissionDescriptor}} whose {{PermissionDescriptor/name}}
+ is "geolocation-approximate".
-
Set |resolvedPermissionState| to
- |precisePermissionStatus|.state.
+
If the [=permission state=] of |approximateDescriptor| is
+ [=permission/"granted"=], set |resolvedPermissionState| to
+ [=permission/"granted"=]. Otherwise, set
+ |resolvedPermissionState| to [=permission/"denied"=].
@@ -1022,29 +963,41 @@
|timeoutTime|, during which it tries to acquire the device's position
by running the following steps:
-
Let |permissionStatus:GeolocationPermissionStatus| be the
- result of running the [=precise permission query algorithm=]
- given a new {{PermissionDescriptor}} with its
- {{PermissionDescriptor/name}} set to "geolocation".
-
Let |effectiveAccuracy:AccuracyMode?| be `null`.
-
If |permissionStatus|.{{PermissionStatus/state}} is
- [=permission/granted=]:
+
Let |preciseDescriptor| be a new {{PermissionDescriptor}}
+ with its {{PermissionDescriptor/name}} set to
+ "geolocation".
+
+
Let |approximateDescriptor| be a new {{PermissionDescriptor}}
+ with its {{PermissionDescriptor/name}} set to
+ "geolocation-approximate".
+
+
If |options|.{{PositionOptions/accuracyMode}} is
+ {{AccuracyMode/"approximate"}}:
+
+
If the [=permission state=] of |approximateDescriptor| is
+ [=permission/"granted"=], set |effectiveAccuracy| to
+ {{AccuracyMode/"approximate"}}.
+
+
+
+
Otherwise (|options|.{{PositionOptions/accuracyMode}} is
+ {{AccuracyMode/"precise"}}):
-
If |options|.{{PositionOptions/accuracyMode}} is
- {{AccuracyMode/"approximate"}}:
+
If the [=permission state=] of |preciseDescriptor| is
+ [=permission/"granted"=]:
Set |effectiveAccuracy| to
- {{AccuracyMode/"approximate"}}.
+ {{AccuracyMode/"precise"}}.
-
Otherwise (|options|.{{PositionOptions/accuracyMode}} is
- {{AccuracyMode/"precise"}}):
+
Otherwise, if the [=permission state=] of
+ |approximateDescriptor| is [=permission/"granted"=]:
Set |effectiveAccuracy| to
- |permissionStatus|.{{GeolocationPermissionStatus/accuracyMode}}.
+ {{AccuracyMode/"approximate"}}.
@@ -1071,25 +1024,19 @@
If |emulatedPositionData| is not null:
-
If |emulatedPositionData|["error"]
- [=map/exists=]:
+
If |emulatedPositionData| is a
+ {{GeolocationPositionError}}:
-
Let |error| be a newly created
- {{GeolocationPositionError}} instance with its
- {{GeolocationPositionError/code}} attribute
- initialized to
- |emulatedPositionData|["error"]["type"].
-
[=Call back with error=] passing
- |errorCallback| and |error|.
+ |errorCallback| and
+ |emulatedPositionData|.{{GeolocationPositionError/code}}.
Terminate this algorithm.
Let |position| be [=a new `GeolocationPosition`=]
- passing |emulatedPositionData|["coordinates"],
- |acquisitionTime|, and
+ passing |emulatedPositionData|, |acquisitionTime| and
|options|.{{PositionOptions/enableHighAccuracy}}.
[=Queue a task=] on the [=geolocation task
@@ -1113,9 +1060,7 @@
If |cachedPosition|'s
{{GeolocationPosition/timestamp}}'s value is greater than
- |cacheTime|, and |effectiveAccuracy| equals
- |cachedPosition|'s {{GeolocationPosition/coords}}'s
- {{GeolocationCoordinates/accuracyMode}}:
+ |cacheTime|:
[=Queue a task=] on the [=geolocation task
source=] with a step that [=invokes=]
@@ -1228,13 +1173,6 @@
Heading measures the direction in which the device is
moving relative to true north.
-
- "accuracyMode"
-
-
- An {{AccuracyMode}} that indicates the accuracy level
- of the position. Set to |effectiveAccuracy|.
-
Set |position| to [=a new `GeolocationPosition`=] passing
@@ -1394,10 +1332,10 @@
The time spent waiting for the document to become visible and for
- [=request precise geolocation permission|obtaining permission to use
- the API=] is not included in the period covered by the
- {{PositionOptions/timeout}} member. The {{PositionOptions/timeout}}
- member only applies when [=acquiring a position=] begins.
+ [=request permission to use|obtaining permission to use the API=] is
+ not included in the period covered by the {{PositionOptions/timeout}}
+ member. The {{PositionOptions/timeout}} member only applies when
+ [=acquiring a position=] begins.
+
+ The "geolocation-approximate" permission is not guaranteed to
+ be queryable in all user agents. Implementations that wish to expose
+ only necessary information can choose to make only "geolocation"
+ queryable; exposing "geolocation-approximate" is not enforced.
+
From fd1dd48de45749dce73b62c9857241a6de1ff882 Mon Sep 17 00:00:00 2001
From: Alvin Ji
Date: Fri, 15 May 2026 15:19:24 -0700
Subject: [PATCH 09/12] Update Geolocation permissions queryability note
This update correctly links to the Permissions API using ReSpec citing conventions and resolves a missing definition error by using the correct 'query a permission' algorithm term.
---
index.html | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/index.html b/index.html
index cd86e02..756b602 100644
--- a/index.html
+++ b/index.html
@@ -614,10 +614,10 @@
- The "geolocation-approximate" permission is not guaranteed to
- be queryable in all user agents. Implementations that wish to expose
- only necessary information can choose to make only "geolocation"
- queryable; exposing "geolocation-approximate" is not enforced.
+ When [=query a permission|querying a permission=] via the
+ [[[Permissions]]] API, implementations might mask the returned states
+ of "geolocation" and "geolocation-approximate" in order
+ to hide the user choice from websites.
From 5a86822177cd85fa7699faea4c4d77e1a833613f Mon Sep 17 00:00:00 2001
From: Alvin Ji
Date: Mon, 18 May 2026 22:22:36 -0700
Subject: [PATCH 10/12] Address reviewer comments on position definitions and
normative language
- Use
,
, and
for precise and approximate position definitions.
- Convert informative note on permission masking to a normative statement.
- Tidy index.html.
---
index.html | 110 +++++++++++++++++++++++++++++------------------------
1 file changed, 60 insertions(+), 50 deletions(-)
diff --git a/index.html b/index.html
index 756b602..b7d5e7c 100644
--- a/index.html
+++ b/index.html
@@ -72,29 +72,35 @@
This specification provides two ways for users to share their location:
- a [=precise position=] and an [=approximate position=].
-
-
- A precise position is a position returned by the underlying
- location information source. By default, any location data is
- considered precise, regardless of its accuracy estimate, unless it has
- been explicitly coarsened by an approximate location information source
- to be an [=approximate position=].
-
-
- An approximate position is a less precise,
- privacy-preserving representation of the user's location. Instead of
- providing precise coordinates, an approximate location information
- source can return a location that is intentionally coarsened to a
- larger area, such as the nearest city, postal code, or a predefined
- region. What constitutes a coarsened area is left to the underlying
- system. This is often sufficient for applications that don't need to
- know the user's [=precise position=], for example, a weather
- application that only needs a city-level location. By sharing an
- [=approximate position=], users can still get the benefit of a
- location-aware application without revealing their [=precise
- position=].
+
+
+ precise position
+
+
+ A position returned by the underlying location information source. By
+ default, any location data is considered precise, regardless of its
+ accuracy estimate, unless it has been explicitly coarsened by an
+ approximate location information source to be an [=approximate
+ position=].
+
+
+ approximate position
+
+
+ A less precise, privacy-preserving representation of the user's
+ location. Instead of providing precise coordinates, an approximate
+ location information source can return a location that is coarsened
+ to a larger area, such as the nearest city, postal code, or a
+ predefined region. What constitutes a coarsened area is left to the
+ underlying system. This is often sufficient for applications that
+ don't need to know the user's [=precise position=], for example, a
+ weather application that only needs a city-level location. By sharing
+ an [=approximate position=], users can still get the benefit of a
+ location-aware application without revealing their [=precise
+ position=].
+
+
An approximate location information source is a location information
source that returns positions that have been intentionally obfuscated
@@ -161,8 +167,8 @@
position=] or an [=approximate position=] via the
{{PositionOptions/accuracyMode}} member. During the permission
request process, the end-user determines the actual level of accuracy
- to grant, which the user agent then uses to provide the geographic
- position accordingly.
+ to grant, which the [=user agent=] then uses to provide the
+ geographic position accordingly.
When [=query a permission|querying a permission=] via the
- [[[Permissions]]] API, implementations might mask the returned states
- of "geolocation" and "geolocation-approximate" in order
- to hide the user choice from websites.
+ [[[Permissions]]] API, a user agent MAY mask the returned states of
+ "geolocation" and "geolocation-approximate" in order to
+ hide the user choice from websites.
+
+
+ When checking permission to use the API, a user agent MAY
+ suggest time-based [=permission=] [=permission/lifetimes=], such as
+ "24 hours", "1 week", or choose to remember the permission
+ [=permission/grant=] indefinitely. However, it is RECOMMENDED that a
+ user agent prioritize restricting the [=permission=]
+ [=permission/lifetime=] to a single session: This can be, for
+ example, until the [=environment settings object/realm=] is
+ destroyed, the end-user [=navigates=] away from the [=origin=], or
+ the relevant browser tab is closed.
@@ -1085,15 +1101,14 @@
underlying system, with the following considerations:
If |effectiveAccuracy| is
- {{AccuracyMode/"approximate"}}, the user agent SHOULD
- acquire an [=approximate position=] with a level of
- accuracy that is sufficient to protect user privacy
- (e.g., city-level accuracy). The
+ {{AccuracyMode/"approximate"}}, acquire an [=approximate
+ position=] with a level of accuracy that is sufficient to
+ protect user privacy (e.g., city-level accuracy). The
{{PositionOptions/enableHighAccuracy}} member is ignored.
If |effectiveAccuracy| is {{AccuracyMode/"precise"}},
- the user agent SHOULD acquire a [=precise position=],
- optionally taking into consideration the value of
+ acquire a [=precise position=], optionally taking into
+ consideration the value of
|options|.{{PositionOptions/enableHighAccuracy}}.
If acquiring the position data from the
system succeeds:
-
+
Let |positionData| be a [=map=] with the following
name/value pairs based on the acquired position data:
@@ -1203,7 +1217,7 @@
- Dealing with failures:
+ Deal with failure:
@@ -1294,17 +1308,13 @@
The accuracyMode member is used to request a specific
- level of accuracy. It can be set to {{AccuracyMode/"precise"}} to
- request the most accurate location data available, or
- {{AccuracyMode/"approximate"}} to receive a less accurate location
- that protects user privacy. The default value is
- {{AccuracyMode/"precise"}}.
+ level of accuracy.
From f24e2768cfb720ac71851b92c842cf5ce8e8e6fb Mon Sep 17 00:00:00 2001
From: Alvin Ji
Date: Mon, 18 May 2026 22:33:58 -0700
Subject: [PATCH 11/12] Update wording for permission states combinations
---
index.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/index.html b/index.html
index b7d5e7c..29a692d 100644
--- a/index.html
+++ b/index.html
@@ -539,7 +539,7 @@
There is a strict dependency between the [=permission states=] of
"geolocation" and "geolocation-approximate", resulting
- in the following allowed combinations of states:
+ in the following combinations of [=permission states=]:
From bb774d31d916b89877885a5eccf5cebd2a22cf94 Mon Sep 17 00:00:00 2001
From: Alvin Ji
Date: Wed, 20 May 2026 18:28:09 -0700
Subject: [PATCH 12/12] Remove permission coherence steps and add tracker for
#231
---
index.html | 16 +---------------
1 file changed, 1 insertion(+), 15 deletions(-)
diff --git a/index.html b/index.html
index 29a692d..29c42cf 100644
--- a/index.html
+++ b/index.html
@@ -603,21 +603,7 @@
-
- To maintain coherence, user agents MUST run the following steps when
- the [=permission state=] of either "geolocation" or
- "geolocation-approximate" changes:
-
-
-
If the [=permission state=] of "geolocation" is changed to
- [=permission/"granted"=], set the [=permission state=] of
- "geolocation-approximate" to [=permission/"granted"=].
-
-
If the [=permission state=] of "geolocation-approximate"
- is changed to [=permission/"denied"=], set the [=permission state=]
- of "geolocation" to [=permission/"denied"=].
-
-
+
When [=query a permission|querying a permission=] via the
[[[Permissions]]] API, a user agent MAY mask the returned states of