@@ -466,14 +466,15 @@ etc.
466
466
467
467
<h4 id="limit-max-frequency" dfn>Limit maximum sampling frequency</h4>
468
468
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
+
471
472
What upper limit to choose depends on the [=sensor type=] ,
472
473
the kind of threats the user agent is trying to protect against,
473
474
the expected resources of the attacker, etc.
474
475
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.
477
478
478
479
479
480
<h4 id="stop-sensor" dfn>Stop the sensor altogether</h4>
@@ -489,9 +490,9 @@ or in a different application.
489
490
490
491
An alternative to [=limit maximum sampling frequency|limiting the maximum sampling frequency=] is to
491
492
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=] .
493
494
This allows use cases which have low latency requirement
494
- to increase [=sampling frequency=]
495
+ to increase the [=sampling frequency=]
495
496
without increasing the amount of data provided.
496
497
497
498
Discarding intermediary readings prevents certain use cases,
@@ -721,32 +722,52 @@ define ways to uniquely identify each one.
721
722
722
723
## Sampling Frequency and Reporting Frequency ## {#concepts-sampling-and-reporting-frequencies}
723
724
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=] .
727
729
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> .
730
+ Note: The user agent can, for example, poll the operating system/ [=device sensor=] , or register for
731
+ operating system notifications .
730
732
731
- The [=sampling frequency=] is equal to the [=requested sampling frequency=] if the underlying platform
732
- can support it .
733
+ The [=platform sensor=] 's [= sampling frequency=] may not correspond to the [=device sensor=]' s
734
+ actual sampling rate, which, for the purpose of this specification, is opaque .
733
735
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.
737
- - the operating system and/or the [=device sensor=] automatically discard
738
- readings that do not differ enough (in absolute or relative terms) from the
739
- previously reported ones via a hardware or operating system filter.
740
- - the [=platform sensor=] 's associated [=sensor type=]' s [=threshold check
741
- algorithm=] fails and the [=platform sensor=] 's [=latest readings=] are not
742
- updated.
736
+ A [=device sensor=] may provide bounds for the sampling frequency value it can accept from a
737
+ [=platform sensor=] in the form of a <dfn for="device sensor">minimum sampling frequency</dfn> and a
738
+ <dfn for= "device sensor">maximum sampling frequency</dfn> . A [=platform sensor=] 's [=sampling
739
+ frequency=] must not be less than the [=device sensor=] 's [=device sensor/minimum sampling
740
+ frequency=] or greater than its [=device sensor/maximum sampling frequency=] .
741
+
742
+ A [=platform sensor=] 's [=sampling frequency=] is determined based on the provided
743
+ {{Sensor/[[frequency]]}} of the [=set/items=] in its [=ordered set|set=] of [=activated sensor
744
+ objects=] . The calculation is [=implementation-defined=] , but the outcome value must lie within the
745
+ bounds set by the [=platform sensor=] 's [=sensor type=]' s [=sensor type/minimum sampling
746
+ frequency|minimum=] and [=sensor type/maximum sampling frequency|maximum=] sampling frequencies and
747
+ its [=device sensor=] 's [=device sensor/minimum sampling frequency|minimum=] and [=device
748
+ sensor/maximum sampling frequency|maximum=] sampling frequencies.
749
+
750
+ Note: For example, the user agent may estimate the [=sampling frequency=] as a Least Common
751
+ Denominator (LCD) for a set of provided {{Sensor/[[frequency]]}} capped by [=sampling frequency=]
752
+ bounds defined by the underlying platform.
743
753
744
754
The <dfn>reporting frequency</dfn> for a concrete {{Sensor}} object is defined as a frequency at which
745
755
the "reading" event is [=fire an event|fired=] at this object.
746
756
747
757
A {{Sensor}} object cannot access new [=sensor readings|readings=] at a higher rate than the
748
758
user agent obtains them from the underlying platform, therefore the [=reporting frequency=] can
749
- never exceed the [=sampling frequency=] for the given [=sensor type=] .
759
+ never exceed a [=platform sensor=] 's [=sampling frequency=] , which in turn can never exceed a
760
+ [=device sensor=] 's [=device sensor/maximum sampling frequency=] (when specified).
761
+
762
+ The [=reporting frequency=] differs from the {{Sensor}} 's {{Sensor/[[frequency]]}} in cases such as:
763
+ - the requested {{Sensor/[[frequency]]}} lies outside the bounds returned by invoking [=get a
764
+ platform sensor's sampling bounds=] with {{Sensor}} 's associated [=platform sensor=] .
765
+ - the operating system and/or the [=device sensor=] automatically discard
766
+ readings that do not differ enough (in absolute or relative terms) from the
767
+ previously reported ones via a hardware or operating system filter.
768
+ - the {{Sensor}} instance's associated [=sensor type=] 's [=threshold check
769
+ algorithm=] fails and the [=platform sensor=] 's [=latest readings=] are not
770
+ updated.
750
771
751
772
## Conditions to expose sensor readings ## {#concepts-can-expose-sensor-readings}
752
773
@@ -781,6 +802,15 @@ A <dfn>sensor type</dfn> must have the following associated data:
781
802
- An [=set/is empty|nonempty=] [=ordered set=] of associated [=policy-controlled feature=] tokens
782
803
referred to as <dfn export>sensor feature names</dfn> .
783
804
- A [=permission revocation algorithm=] .
805
+ - A <dfn export for="sensor type">minimum sampling frequency</dfn> , a positive number. It is either
806
+ [=implementation-defined=] or defined by an [=extension specification=] . If both are set, the
807
+ largest value is used.
808
+ - A <dfn export for="sensor type">maximum sampling frequency</dfn> , a positive number. It is either
809
+ [=implementation-defined=] or defined by an [=extension specification=] . If both are set, the
810
+ smallest value is used.
811
+
812
+ The [=sensor type/minimum sampling frequency=] must not be greater than the [=sensor type/maximum
813
+ sampling frequency=] .
784
814
785
815
A [=sensor type=] may have the following associated data:
786
816
- A [=default sensor=] .
@@ -839,17 +869,21 @@ Note: There are additional privacy concerns when using cached [=sensor readings|
839
869
which predate either [=navigating=] to resources in the current [=origin=] ,
840
870
or being granted permission to access the [=platform sensor=] . -->
841
871
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.
872
+ <div algorithm>
873
+ To <dfn>get a platform sensor's sampling bounds</dfn> given a [=platform sensor=]
874
+ |platformSensor|:
875
+ 1. Let |minimumFrequency| be |platformSensor|'s [=sensor type=]' s [=sensor type/minimum sampling
876
+ frequency=] .
877
+ 1. If |platformSensor|'s connected [=device sensor=] has a [=device sensor/minimum sampling
878
+ frequency=] , set |minimumFrequency| to the maximum of |minimumFrequency| and the [=device
879
+ sensor/minimum sampling frequency=] .
880
+ 1. Let |maximumFrequency| be |platformSensor|'s [=sensor type=]' s [=sensor type/maximum sampling
881
+ frequency=] .
882
+ 1. If |platformSensor|'s connected [=device sensor=] has a [=device sensor/maximum sampling
883
+ frequency=] , set |maximumFrequency| to the minimum of |maximumFrequency| and the [=device
884
+ sensor/maximum sampling frequency=] .
885
+ 1. Return a [=tuple=] (|minimumFrequency|, |maximumFrequency|).
886
+ </div>
853
887
854
888
<div class=example>
855
889
@@ -866,7 +900,7 @@ The {{Sensor}} object in "idle" [[#sensor-lifecycle|state]] is not among the [=p
866
900
In this example there is a [=platform sensor=] instance per [=browsing context=] .
867
901
868
902
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=]
903
+ same [=browsing context|context=] and is updated at a rate equal to the requested [= sampling frequency=]
870
904
of the corresponding [=platform sensor=] .
871
905
872
906
</div>
@@ -1063,12 +1097,10 @@ with the internal slots described in the following table:
1063
1097
<tr>
1064
1098
<td> <dfn attribute for=Sensor>\[[frequency]]</dfn> </td>
1065
1099
<td> A double representing frequency in Hz that is used to calculate
1066
- the [=requested sampling frequency=] for the associated [=platform sensor=]
1100
+ the [=sampling frequency=] for the associated [=platform sensor=]
1067
1101
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>
1102
+ {{Sensor}} object. It is initially null.
1103
+ </td>
1072
1104
</tr>
1073
1105
<tr>
1074
1106
<td> <dfn attribute for=Sensor>\[[lastEventFiredAt]]</dfn> </td>
@@ -1256,8 +1288,8 @@ to {{SensorErrorEventInit}}.
1256
1288
1. Set |sensor_instance|.{{[[frequency]]}} to |options|["{{frequency!!dict-member}}"] .
1257
1289
1258
1290
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 .
1291
+ can be respected. See [[#concepts- sampling-and-reporting-frequencies]] for constraints that
1292
+ may be applied .
1261
1293
</div>
1262
1294
1263
1295
<h3 dfn export>Check sensor policy-controlled features</h3>
@@ -1283,24 +1315,30 @@ to {{SensorErrorEventInit}}.
1283
1315
<div algorithm="connect to sensor">
1284
1316
1285
1317
: input
1286
- :: |sensor_instance |, a {{Sensor}} object.
1318
+ :: |sensor |, a {{Sensor}} object.
1287
1319
: output
1288
- :: True if sensor instance was associated with a [=platform sensor=] ,
1320
+ :: True if | sensor| was associated with a [=platform sensor=] ,
1289
1321
false otherwise.
1290
1322
1291
- 1. Let |type| be the [=sensor type=] of |sensor_instance|.
1323
+ 1. Let |platformSensor| be null.
1324
+ 1. Let |type| be |sensor|'s associated [=sensor type=] .
1292
1325
1. If the device has a single [=device sensor=] which can provide [=sensor readings|readings=]
1293
1326
for |type|, then
1294
- 1. Associate |sensor_instance| with a [=platform sensor=] corresponding
1327
+ 1. Set |platformSensor| to a [=platform sensor=] corresponding
1295
1328
to this [=device sensor=] .
1296
- 1. Return true.
1297
1329
1. If the device has multiple [=device sensors=] which can provide [=sensor readings|readings=]
1298
1330
for |type|, then
1299
1331
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.
1332
+ 1. Set |platformSensor| to a [=platform sensor=] corresponding
1333
+ to this [=default sensor|default device sensor=] .
1334
+ 1. If |platformSensor| is null, return false.
1335
+ 1. Let |bounds| be the result of invoking [=get a platform sensor's sampling bounds=] with
1336
+ |platformSensor|.
1337
+ 1. If |sensor|.{{Sensor/[[frequency]]}} is null, set it to an [=implementation-defined=] value
1338
+ dependent on |type|.
1339
+ 1. If |sensor|.{{Sensor/[[frequency]]}} is less than |bounds|[0] , set it to |bounds|[0] .
1340
+ 1. If |sensor|.{{Sensor/[[frequency]]}} is greater than |bounds|[1] , set it to |bounds|[1] .
1341
+ 1. Return true.
1304
1342
</div>
1305
1343
1306
1344
<h3 dfn export>Activate a sensor object</h3>
@@ -1361,18 +1399,24 @@ to {{SensorErrorEventInit}}.
1361
1399
<div algorithm="set sensor settings">
1362
1400
1363
1401
: input
1364
- :: |sensor |, a [=platform sensor=] .
1402
+ :: |platformSensor |, a [=platform sensor=] .
1365
1403
: output
1366
1404
:: None
1367
1405
1368
- 1. If |sensor |'s set of [=activated sensor objects=] [=set/is empty=] ,
1369
- 1. Set [=requested sampling frequency=] to null.
1370
- 1. [=map/For each=] |key| → <var ignore> value</var> of [=latest reading=] .
1371
- 1. [=map/Set=] [=latest reading=] [|key|] to null.
1372
- 1. Update the user-agent-specific way in which [=sensor readings=] are obtained from |sensor|
1373
- to no longer provide [=sensor readings|readings=] .
1406
+ 1. If |platformSensor |'s set of [=activated sensor objects=] [=set/is empty=] ,
1407
+ 1. Set |platformSensor|'s [= sampling frequency=] to null.
1408
+ 1. [=map/For each=] |key| → <var ignore> value</var> of |platformSensor|'s [=latest reading=] .
1409
+ 1. [=map/Set=] |platformSensor|'s [=latest reading=] [|key|] to null.
1410
+ 1. Update the [=implementation-defined=] way in which [=sensor readings=] are obtained
1411
+ from |platformSensor| to no longer provide [=sensor readings|readings=] .
1374
1412
1. Return.
1375
- 1. Set [=requested sampling frequency=] to [=optimal sampling frequency=] .
1413
+ 1. Set |platformSensor|'s [=sampling frequency=] to an [=implementation-defined=] value based
1414
+ on the {{Sensor/[[frequency]]}} values of the items in its [=activated sensor objects=]
1415
+ [=ordered set|set=] .
1416
+ 1. Let |bounds| be the result of invoking [=get a platform sensor's sampling bounds=] with
1417
+ |platformSensor|.
1418
+ 1. [=Assert=] : |platformSensor|'s [=sampling frequency=] is greater than or equal to
1419
+ |bounds|[0] and less than or equal to |bounds|[1] .
1376
1420
</div>
1377
1421
1378
1422
<h3 dfn export>Update latest reading</h3>
@@ -1400,25 +1444,6 @@ to {{SensorErrorEventInit}}.
1400
1444
1. Invoke [=report latest reading updated=] with |s| as an argument.
1401
1445
</div>
1402
1446
1403
- <h3 dfn export>Find the reporting frequency of a sensor object</h3>
1404
-
1405
- <div algorithm="find the reporting frequency of a sensor object">
1406
-
1407
- : input
1408
- :: |sensor_instance|, a {{Sensor}} object.
1409
- : output
1410
- :: [=reporting frequency=] in Hz.
1411
-
1412
- 1. Let |frequency| be null.
1413
- 1. Let |f| be |sensor_instance|.{{[[frequency]]}} .
1414
- 1. if |f| is set,
1415
- 1. set |frequency| to |f| capped by the upper and lower [=sampling frequency=]
1416
- bounds for the associated [=platform sensor=] .
1417
- 1. Otherwise,
1418
- 1. user agent can assign |frequency| to an appropriate value.
1419
- 1. return |frequency|.
1420
- </div>
1421
-
1422
1447
<h3 dfn export>Report latest reading updated</h3>
1423
1448
1424
1449
<div algorithm="report latest reading updated">
@@ -1435,11 +1460,9 @@ to {{SensorErrorEventInit}}.
1435
1460
1. If |lastReportedTimestamp| is not set
1436
1461
1. Queue a task to run [=notify new reading=] with |sensor_instance| as an argument.
1437
1462
1. Return.
1438
- 1. Let |reportingFrequency| be result of invoking [=Find the reporting frequency of a sensor object=] .
1439
- 1. If |reportingFrequency| is null
1440
- 1. Queue a task to run [=notify new reading=] with |sensor_instance| as an argument.
1441
- 1. Return.
1442
- 1. Let |reportingInterval| be the result of 1 / |reportingFrequency|.
1463
+ 1. [=Assert=] : |sensor_instance|.{{Sensor/[[frequency]]}} is not null.
1464
+ 1. [=Assert=] : |sensor_instance|.{{Sensor/[[frequency]]}} is greater than 0.
1465
+ 1. Let |reportingInterval| be the result of 1 / |sensor_instance|.{{Sensor/[[frequency]]}} .
1443
1466
1. Let |timestampDelta| be the result of [=latest reading=] ["timestamp"] - |lastReportedTimestamp|.
1444
1467
1. If |timestampDelta| is greater than or equal to |reportingInterval|
1445
1468
1. Queue a task to run [=notify new reading=] with |sensor_instance| as an argument.
@@ -1566,13 +1589,10 @@ and whose initial [=map/values=] are implementation-dependent.
1566
1589
1567
1590
Note: The user agent must provide the [=mock sensor reading=] that are initially exposed to the {{Sensor}} objects.
1568
1591
1569
- A [=mock sensor=] has an associated [=requested sampling frequency=] . Its default value is implementation-dependent
1570
- but must be set within a [=mock sensor=] 's associated [=sampling frequency=] bounds.
1571
-
1572
1592
A [=mock sensor=] has an associated [=sampling frequency=] with supported bounds. The default values of
1573
1593
supported bounds are implementation-dependent.
1574
1594
1575
- A [=mock sensor=] must report the [=mock sensor reading=] at the rate of its [=requested sampling frequency=]
1595
+ A [=mock sensor=] must report the [=mock sensor reading=] at the rate of its [=sampling frequency=]
1576
1596
if the user agent [=can expose sensor readings=] to the [=current browsing context=] 's [=active document=] .
1577
1597
1578
1598
Note: The [=mock sensor=] defined in this specification is not intended be used by non-testing-related web content.
@@ -1624,7 +1644,7 @@ The {{MockSensor}} dictionary provides information about a [=mock sensor=].
1624
1644
:: A double representing frequency in Hz that indicates the minimum supported [=sampling frequency=] of the associated [=mock sensor=] .
1625
1645
1626
1646
: {{MockSensor/requestedSamplingFrequency}} member
1627
- :: A double representing frequency in Hz that indicates the [=requested sampling frequency=] of the associated [=mock sensor=] .
1647
+ :: A double representing frequency in Hz that indicates the [=sampling frequency=] of the associated [=mock sensor=] .
1628
1648
1629
1649
A <dfn>serialized mock sensor</dfn> is a JSON [=Object=] where a [=mock sensor=] 's fields listed in the {{MockSensor}} dictionary are mapped
1630
1650
using the <i> JSON Key</i> and the associated field's value from the available [=mock sensor=] in [=current browsing context=] .
@@ -2002,7 +2022,7 @@ creating multiple instances of the same [=sensor type=] and using simple {{Senso
2002
2022
handler.
2003
2023
2004
2024
Conversely, multiple {{Sensor|Sensors}} of the same [=sensor type=] can be created when they
2005
- are intended to be used with different settings, such as: [=requested sampling frequency=] ,
2025
+ are intended to be used with different settings, such as: {{SensorOptions/ frequency}} ,
2006
2026
accuracy or other settings defined in [=extension specifications=] .
2007
2027
2008
2028
<h3 id="definition-reqs">Definition Requirements</h3>
0 commit comments