Skip to content

Commit f0dca6f

Browse files
Raphael Kubo da Costareillyeon
Raphael Kubo da Costa
andauthored
Overhaul frequency management in the specification (#468)
This commit addresses a few issues with the way frequency management was handled in the specification: 1. "Sampling frequency" was interchangeably used as a number as well as an interval ("sampling frequency bounds"), and the latter was not even properly defined. 2. The actual bounds were not properly defined, and neither was the clamping process that used them. 3. There were too many frequency-related terms in use. Let us start with the changes in the concepts and definitions: - A platform sensor has a sampling frequency, a positive number or null. It represents the frequency at which the platform sensor attempts to retrieve data from the device sensor and it is calculated in an implementation-defined manner based on the `[[frequency]]` of the associated Sensor objects. It is therefore a mixture of the previous "sampling frequency" and "requested sampling frequency" definitions. - How the sampling process works is implementation-defined: it could be polling, or requesting updates at this interval, or something else entirely. - A device sensor has a sampling frequency. It is similar to the above, but operating system or hardware dependent and opaque to this specification. - As such, the device sensor may choose a sampling frequency that differs from the platform sensor's sampling frequency and we have no control over it. - A device sensor MAY report lower and/or upper sampling frequency bounds. With the above, the actual sampling bounds are defined and checked: - A sensor type MUST have lower and upper sampling frequency bounds. The lower bound is "max(implementation-defined value, optional spec-defined value)", and the upper bound is "min(implementation-defined value, optional spec-defined value)". - A new algorithm returns a platform sensor's lower and upper sampling bounds as a tuple "(max(optional device sensor lower bound, sensor type lower bound), min(optional device sensor upper bound, sensor type upper bound))". - A Sensor's `[[frequency]]` is always set to a value within a platform sensor's sampling bounds in "Connect to a sensor" (before that it might not have an associated platform sensor and should be in the "activated" state). - "Set sensor settings" requires that the platform sensor sampling value calculated based on its associated sensors' `[[frequency]]` values lies within its sampling bounds. The "optimal sampling frequency" and "requested sampling frequency" <dfn>s have been removed, and so has the "Find the reporting frequency of a sensor object" algorithm, which addresses point (3). The "Automation" section has only received enough changes to avoid Bikeshed errors and warnings, as the entire section is being rewritten. Related to #463. Co-authored-by: Reilly Grant <[email protected]>
1 parent 5373812 commit f0dca6f

File tree

1 file changed

+112
-90
lines changed

1 file changed

+112
-90
lines changed

index.bs

+112-90
Original file line numberDiff line numberDiff line change
@@ -466,14 +466,15 @@ etc.
466466

467467
<h4 id="limit-max-frequency" dfn>Limit maximum sampling frequency</h4>
468468

469-
User agents may mitigate certain threats by
470-
limiting the maximum [=sampling frequency=].
469+
User agents and [=extension specifications=] may mitigate certain threats by defining a [=sensor
470+
type=]'s [=sensor type/maximum sampling frequency=].
471+
471472
What upper limit to choose depends on the [=sensor type=],
472473
the kind of threats the user agent is trying to protect against,
473474
the expected resources of the attacker, etc.
474475

475-
Limiting the maximum [=sampling frequency=] prevents use cases
476-
which rely on low latency or high data density.
476+
Limiting the [=sensor type/maximum sampling frequency=] prevents use cases which rely on low
477+
latency or high data density.
477478

478479

479480
<h4 id="stop-sensor" dfn>Stop the sensor altogether</h4>
@@ -489,9 +490,9 @@ or in a different application.
489490

490491
An alternative to [=limit maximum sampling frequency|limiting the maximum sampling frequency=] is to
491492
limit the number of [=sensor readings=] delivered to Web application developer,
492-
regardless of what frequency the sensor is polled at.
493+
regardless of the [=sampling frequency=].
493494
This allows use cases which have low latency requirement
494-
to increase [=sampling frequency=]
495+
to increase the [=sampling frequency=]
495496
without increasing the amount of data provided.
496497

497498
Discarding intermediary readings prevents certain use cases,
@@ -721,33 +722,57 @@ define ways to uniquely identify each one.
721722

722723
## Sampling Frequency and Reporting Frequency ## {#concepts-sampling-and-reporting-frequencies}
723724

724-
For the purpose of this specification, <dfn>sampling frequency</dfn> for a [=platform sensor=] is
725-
defined as a frequency at which the user agent obtains [=sensor readings=] from the underlying
726-
platform.
725+
For the purpose of this specification, a [=platform sensor=]'s <dfn>sampling frequency</dfn> is
726+
defined as a frequency at which a [=platform sensor=] obtains [=sensor readings=] from the
727+
underlying [=device sensor=]. The way such [=sensor readings=] are obtained is
728+
[=implementation-defined=].
729+
730+
The [=platform sensor=]'s [=sampling frequency=] may not correspond to the [=device sensor=]'s
731+
actual sampling rate, which, for the purpose of this specification, is opaque.
732+
733+
Note: System-level APIs for [=sensor readings=] and the underlying hardware interface to the sensors
734+
themselves may be built for polling or events. For a polling-based [=device sensor=], the [=platform
735+
sensor=]'s [=sampling frequency=] would be the rate at which a new reading is requested from the
736+
system or hardware. For an event-based [=device sensor=], a [=platform sensor=] provides a requested
737+
sampling frequency to the system or hardware, and events are generated at that frequency or below.
738+
Events may not be generated if the sensor reading has not changed.
739+
740+
A [=device sensor=] may provide bounds for the sampling frequency value it can accept from a
741+
[=platform sensor=] in the form of a <dfn for="device sensor">minimum sampling frequency</dfn> and a
742+
<dfn for= "device sensor">maximum sampling frequency</dfn>. A [=platform sensor=]'s [=sampling
743+
frequency=] must not be less than the [=device sensor=]'s [=device sensor/minimum sampling
744+
frequency=] or greater than its [=device sensor/maximum sampling frequency=].
745+
746+
A [=platform sensor=]'s [=sampling frequency=] is determined based on the provided
747+
{{Sensor/[[frequency]]}} of the [=set/items=] in its [=ordered set|set=] of [=activated sensor
748+
objects=]. The calculation is [=implementation-defined=], but the outcome value must lie within the
749+
bounds set by the [=platform sensor=]'s [=sensor type=]'s [=sensor type/minimum sampling
750+
frequency|minimum=] and [=sensor type/maximum sampling frequency|maximum=] sampling frequencies and
751+
its [=device sensor=]'s [=device sensor/minimum sampling frequency|minimum=] and [=device
752+
sensor/maximum sampling frequency|maximum=] sampling frequencies.
753+
754+
Note: For example, the user agent may estimate the [=sampling frequency=] as a Least Common
755+
Denominator (LCD) for a set of provided {{Sensor/[[frequency]]}} capped by [=sampling frequency=]
756+
bounds defined by the underlying platform.
727757

728-
The user agent can request the underlying platform to deliver [=sensor readings|readings=] at a certain
729-
rate which is called <dfn>requested sampling frequency</dfn>.
758+
The <dfn>reporting frequency</dfn> for a concrete {{Sensor}} object is defined as a frequency at which
759+
the "reading" event is [=fire an event|fired=] at this object.
730760

731-
The [=sampling frequency=] is equal to the [=requested sampling frequency=] if the underlying platform
732-
can support it.
761+
A {{Sensor}} object cannot access new [=sensor readings|readings=] at a higher rate than the
762+
user agent obtains them from the underlying platform, therefore the [=reporting frequency=] can
763+
never exceed a [=platform sensor=]'s [=sampling frequency=], which in turn can never exceed a
764+
[=device sensor=]'s [=device sensor/maximum sampling frequency=] (when specified).
733765

734-
The [=sampling frequency=] differs from the [=requested sampling frequency=] in the following cases:
735-
- the [=requested sampling frequency=] exceeds upper or lower [=sampling frequency=] bounds
736-
supported by the underlying platform.
766+
The [=reporting frequency=] differs from the {{Sensor}}'s {{Sensor/[[frequency]]}} in cases such as:
767+
- the requested {{Sensor/[[frequency]]}} lies outside the bounds returned by invoking [=get a
768+
platform sensor's sampling bounds=] with {{Sensor}}'s associated [=platform sensor=].
737769
- the operating system and/or the [=device sensor=] automatically discard
738770
readings that do not differ enough (in absolute or relative terms) from the
739771
previously reported ones via a hardware or operating system filter.
740-
- the [=platform sensor=]'s associated [=sensor type=]'s [=threshold check
772+
- the {{Sensor}} instance's associated [=sensor type=]'s [=threshold check
741773
algorithm=] fails and the [=platform sensor=]'s [=latest readings=] are not
742774
updated.
743775

744-
The <dfn>reporting frequency</dfn> for a concrete {{Sensor}} object is defined as a frequency at which
745-
the "reading" event is [=fire an event|fired=] at this object.
746-
747-
A {{Sensor}} object cannot access new [=sensor readings|readings=] at a higher rate than the
748-
user agent obtains them from the underlying platform, therefore the [=reporting frequency=] can
749-
never exceed the [=sampling frequency=] for the given [=sensor type=].
750-
751776
## Conditions to expose sensor readings ## {#concepts-can-expose-sensor-readings}
752777

753778
The user agent <dfn>can expose sensor readings</dfn> to a given |document| if and only if
@@ -781,6 +806,15 @@ A <dfn>sensor type</dfn> must have the following associated data:
781806
- A [=set/is empty|non-empty=] [=ordered set=] of associated [=policy-controlled feature=] tokens
782807
referred to as <dfn export>sensor feature names</dfn>.
783808
- A [=permission revocation algorithm=].
809+
- A <dfn export for="sensor type">minimum sampling frequency</dfn>, a positive number. It is either
810+
[=implementation-defined=] or defined by an [=extension specification=]. If both are set, the
811+
largest value is used.
812+
- A <dfn export for="sensor type">maximum sampling frequency</dfn>, a positive number. It is either
813+
[=implementation-defined=] or defined by an [=extension specification=]. If both are set, the
814+
smallest value is used.
815+
816+
The [=sensor type/minimum sampling frequency=] must not be greater than the [=sensor type/maximum
817+
sampling frequency=].
784818

785819
A [=sensor type=] may have the following associated data:
786820
- A [=default sensor=].
@@ -839,17 +873,19 @@ Note: There are additional privacy concerns when using cached [=sensor readings|
839873
which predate either [=navigating=] to resources in the current [=origin=],
840874
or being granted permission to access the [=platform sensor=]. -->
841875

842-
A [=platform sensor=] has an associated [=requested sampling frequency=] which is initially null.
843-
844-
For a non-[=set/is empty|empty=] [=ordered set|set=] of [=activated sensor objects=] the
845-
[=requested sampling frequency=] is equal to the <dfn>optimal sampling frequency</dfn>, which is estimated
846-
by the user agent by taking into account the {{[[frequency]]|provided frequencies}}
847-
of [=activated sensor objects|activated=] {{Sensor|Sensors}} and the [=sampling frequency=] bounds
848-
defined by the underlying platform.
849-
850-
Note: For example, the user agent may estimate [=optimal sampling frequency=] as a Least Common
851-
Denominator (LCD) for a set of {{[[frequency]]|provided frequencies}} capped
852-
by [=sampling frequency=] bounds defined by the underlying platform.
876+
<div algorithm>
877+
To <dfn>get a platform sensor's sampling bounds</dfn> given a [=platform sensor=]
878+
|platformSensor|:
879+
1. Let |minimumFrequency| be |platformSensor|'s [=sensor type=]'s [=sensor type/minimum sampling
880+
frequency=].
881+
1. If |platformSensor|'s connected [=device sensor=] has a [=device sensor/minimum sampling
882+
frequency=], set |minimumFrequency| to the maximum of |minimumFrequency| and this value.
883+
1. Let |maximumFrequency| be |platformSensor|'s [=sensor type=]'s [=sensor type/maximum sampling
884+
frequency=].
885+
1. If |platformSensor|'s connected [=device sensor=] has a [=device sensor/maximum sampling
886+
frequency=], set |maximumFrequency| to the minimum of |maximumFrequency| and this value.
887+
1. Return a [=tuple=] (|minimumFrequency|, |maximumFrequency|).
888+
</div>
853889

854890
<div class=example>
855891

@@ -866,7 +902,7 @@ The {{Sensor}} object in "idle" [[#sensor-lifecycle|state]] is not among the [=p
866902
In this example there is a [=platform sensor=] instance per [=browsing context=].
867903

868904
The [=latest reading=] [=ordered map|map=] is shared between {{Sensor}} objects from the
869-
same [=browsing context|context=] and is updated at a rate equal to the [=requested sampling frequency=]
905+
same [=browsing context|context=] and is updated at a rate equal to the requested [=sampling frequency=]
870906
of the corresponding [=platform sensor=].
871907

872908
</div>
@@ -1063,12 +1099,10 @@ with the internal slots described in the following table:
10631099
<tr>
10641100
<td><dfn attribute for=Sensor>\[[frequency]]</dfn></td>
10651101
<td>A double representing frequency in Hz that is used to calculate
1066-
the [=requested sampling frequency=] for the associated [=platform sensor=]
1102+
the [=sampling frequency=] for the associated [=platform sensor=]
10671103
and to define the upper bound of the [=reporting frequency=] for this
1068-
{{Sensor}} object.
1069-
1070-
This slot holds the provided {{SensorOptions}}.{{frequency!!dict-member}} value.
1071-
It is initially unset.</td>
1104+
{{Sensor}} object. It is initially null.
1105+
</td>
10721106
</tr>
10731107
<tr>
10741108
<td><dfn attribute for=Sensor>\[[lastEventFiredAt]]</dfn></td>
@@ -1256,8 +1290,8 @@ to {{SensorErrorEventInit}}.
12561290
1. Set |sensor_instance|.{{[[frequency]]}} to |options|["{{frequency!!dict-member}}"].
12571291

12581292
Note: There is no guarantee that the requested |options|["{{frequency!!dict-member}}"]
1259-
can be respected. The actual [=sampling frequency=] can be calculated using
1260-
{{Sensor}} {{Sensor/timestamp!!attribute}} attributes.
1293+
can be respected. See [[#concepts-sampling-and-reporting-frequencies]] for constraints that
1294+
may be applied.
12611295
</div>
12621296

12631297
<h3 dfn export>Check sensor policy-controlled features</h3>
@@ -1283,24 +1317,30 @@ to {{SensorErrorEventInit}}.
12831317
<div algorithm="connect to sensor">
12841318

12851319
: input
1286-
:: |sensor_instance|, a {{Sensor}} object.
1320+
:: |sensor|, a {{Sensor}} object.
12871321
: output
1288-
:: True if sensor instance was associated with a [=platform sensor=],
1322+
:: True if |sensor| was associated with a [=platform sensor=],
12891323
false otherwise.
12901324

1291-
1. Let |type| be the [=sensor type=] of |sensor_instance|.
1325+
1. Let |platformSensor| be null.
1326+
1. Let |type| be |sensor|'s associated [=sensor type=].
12921327
1. If the device has a single [=device sensor=] which can provide [=sensor readings|readings=]
12931328
for |type|, then
1294-
1. Associate |sensor_instance| with a [=platform sensor=] corresponding
1329+
1. Set |platformSensor| to a [=platform sensor=] corresponding
12951330
to this [=device sensor=].
1296-
1. Return true.
12971331
1. If the device has multiple [=device sensors=] which can provide [=sensor readings|readings=]
12981332
for |type|, then
12991333
1. If |type| has an associated [=default sensor=], then
1300-
1. Associate |sensor_instance| with a [=platform sensor=] corresponding
1301-
to [=default sensor=].
1302-
1. Return true.
1303-
1. Return false.
1334+
1. Set |platformSensor| to a [=platform sensor=] corresponding
1335+
to this [=default sensor|default device sensor=].
1336+
1. If |platformSensor| is null, return false.
1337+
1. Let |bounds| be the result of invoking [=get a platform sensor's sampling bounds=] with
1338+
|platformSensor|.
1339+
1. If |sensor|.{{Sensor/[[frequency]]}} is null, set it to an [=implementation-defined=] value
1340+
dependent on |type|.
1341+
1. If |sensor|.{{Sensor/[[frequency]]}} is less than |bounds|[0], set it to |bounds|[0].
1342+
1. If |sensor|.{{Sensor/[[frequency]]}} is greater than |bounds|[1], set it to |bounds|[1].
1343+
1. Return true.
13041344
</div>
13051345

13061346
<h3 dfn export>Activate a sensor object</h3>
@@ -1362,18 +1402,24 @@ to {{SensorErrorEventInit}}.
13621402
<div algorithm="set sensor settings">
13631403

13641404
: input
1365-
:: |sensor|, a [=platform sensor=].
1405+
:: |platformSensor|, a [=platform sensor=].
13661406
: output
13671407
:: None
13681408

1369-
1. If |sensor|'s set of [=activated sensor objects=] [=set/is empty=],
1370-
1. Set [=requested sampling frequency=] to null.
1371-
1. [=map/For each=] |key| → <var ignore>value</var> of [=latest reading=].
1372-
1. [=map/Set=] [=latest reading=][|key|] to null.
1373-
1. Update the user-agent-specific way in which [=sensor readings=] are obtained from |sensor|
1374-
to no longer provide [=sensor readings|readings=].
1409+
1. If |platformSensor|'s set of [=activated sensor objects=] [=set/is empty=],
1410+
1. Set |platformSensor|'s [=sampling frequency=] to null.
1411+
1. [=map/For each=] |key| → <var ignore>value</var> of |platformSensor|'s [=latest reading=].
1412+
1. [=map/Set=] |platformSensor|'s [=latest reading=][|key|] to null.
1413+
1. Update the [=implementation-defined=] way in which [=sensor readings=] are obtained
1414+
from |platformSensor| to no longer provide [=sensor readings|readings=].
13751415
1. Return.
1376-
1. Set [=requested sampling frequency=] to [=optimal sampling frequency=].
1416+
1. Set |platformSensor|'s [=sampling frequency=] to an [=implementation-defined=] value based
1417+
on the {{Sensor/[[frequency]]}} values of the items in its [=activated sensor objects=]
1418+
[=ordered set|set=].
1419+
1. Let |bounds| be the result of invoking [=get a platform sensor's sampling bounds=] with
1420+
|platformSensor|.
1421+
1. [=Assert=]: |platformSensor|'s [=sampling frequency=] is greater than or equal to
1422+
|bounds|[0] and less than or equal to |bounds|[1].
13771423
</div>
13781424

13791425
<h3 dfn export>Update latest reading</h3>
@@ -1401,25 +1447,6 @@ to {{SensorErrorEventInit}}.
14011447
1. Invoke [=report latest reading updated=] with |s| as an argument.
14021448
</div>
14031449

1404-
<h3 dfn export>Find the reporting frequency of a sensor object</h3>
1405-
1406-
<div algorithm="find the reporting frequency of a sensor object">
1407-
1408-
: input
1409-
:: |sensor_instance|, a {{Sensor}} object.
1410-
: output
1411-
:: [=reporting frequency=] in Hz.
1412-
1413-
1. Let |frequency| be null.
1414-
1. Let |f| be |sensor_instance|.{{[[frequency]]}}.
1415-
1. if |f| is set,
1416-
1. set |frequency| to |f| capped by the upper and lower [=sampling frequency=]
1417-
bounds for the associated [=platform sensor=].
1418-
1. Otherwise,
1419-
1. user agent can assign |frequency| to an appropriate value.
1420-
1. return |frequency|.
1421-
</div>
1422-
14231450
<h3 dfn export>Report latest reading updated</h3>
14241451

14251452
<div algorithm="report latest reading updated">
@@ -1436,11 +1463,9 @@ to {{SensorErrorEventInit}}.
14361463
1. If |lastReportedTimestamp| is not set
14371464
1. Queue a task to run [=notify new reading=] with |sensor_instance| as an argument.
14381465
1. Return.
1439-
1. Let |reportingFrequency| be result of invoking [=Find the reporting frequency of a sensor object=].
1440-
1. If |reportingFrequency| is null
1441-
1. Queue a task to run [=notify new reading=] with |sensor_instance| as an argument.
1442-
1. Return.
1443-
1. Let |reportingInterval| be the result of 1 / |reportingFrequency|.
1466+
1. [=Assert=]: |sensor_instance|.{{Sensor/[[frequency]]}} is not null.
1467+
1. [=Assert=]: |sensor_instance|.{{Sensor/[[frequency]]}} is greater than 0.
1468+
1. Let |reportingInterval| be the result of 1 / |sensor_instance|.{{Sensor/[[frequency]]}}.
14441469
1. Let |timestampDelta| be the result of [=latest reading=]["timestamp"] - |lastReportedTimestamp|.
14451470
1. If |timestampDelta| is greater than or equal to |reportingInterval|
14461471
1. Queue a task to run [=notify new reading=] with |sensor_instance| as an argument.
@@ -1567,13 +1592,10 @@ and whose initial [=map/values=] are implementation-dependent.
15671592

15681593
Note: The user agent must provide the [=mock sensor reading=] that are initially exposed to the {{Sensor}} objects.
15691594

1570-
A [=mock sensor=] has an associated [=requested sampling frequency=]. Its default value is implementation-dependent
1571-
but must be set within a [=mock sensor=]'s associated [=sampling frequency=] bounds.
1572-
15731595
A [=mock sensor=] has an associated [=sampling frequency=] with supported bounds. The default values of
15741596
supported bounds are implementation-dependent.
15751597

1576-
A [=mock sensor=] must report the [=mock sensor reading=] at the rate of its [=requested sampling frequency=]
1598+
A [=mock sensor=] must report the [=mock sensor reading=] at the rate of its [=sampling frequency=]
15771599
if the user agent [=can expose sensor readings=] to the [=current browsing context=]'s [=active document=].
15781600

15791601
Note: The [=mock sensor=] defined in this specification is not intended be used by non-testing-related web content.
@@ -1625,7 +1647,7 @@ The {{MockSensor}} dictionary provides information about a [=mock sensor=].
16251647
:: A double representing frequency in Hz that indicates the minimum supported [=sampling frequency=] of the associated [=mock sensor=].
16261648

16271649
: {{MockSensor/requestedSamplingFrequency}} member
1628-
:: A double representing frequency in Hz that indicates the [=requested sampling frequency=] of the associated [=mock sensor=].
1650+
:: A double representing frequency in Hz that indicates the [=sampling frequency=] of the associated [=mock sensor=].
16291651

16301652
A <dfn>serialized mock sensor</dfn> is a JSON [=Object=] where a [=mock sensor=]'s fields listed in the {{MockSensor}} dictionary are mapped
16311653
using the <i>JSON Key</i> and the associated field's value from the available [=mock sensor=] in [=current browsing context=].
@@ -2003,7 +2025,7 @@ creating multiple instances of the same [=sensor type=] and using simple {{Senso
20032025
handler.
20042026

20052027
Conversely, multiple {{Sensor|Sensors}} of the same [=sensor type=] can be created when they
2006-
are intended to be used with different settings, such as: [=requested sampling frequency=],
2028+
are intended to be used with different settings, such as: {{SensorOptions/frequency}},
20072029
accuracy or other settings defined in [=extension specifications=].
20082030

20092031
<h3 id="definition-reqs">Definition Requirements</h3>

0 commit comments

Comments
 (0)