Skip to content

Commit

Permalink
Automation: Remove "virtual sensor type" from virtual sensor metadata
Browse files Browse the repository at this point in the history
This practically untangles the concepts in the Automation section from the
rest of the specification, which helps the Device Orientation API
specification adopt it as discussed in w3c/deviceorientation#122.

Now a sensor type itself can optionally define a "virtual sensor type",
a string. It is the same string used to refer to a given virtual sensor type
in the WebDriver extension commands.

In practice, this means that:
- The per-top-level traversable virtual sensor mapping has become a mapping
  of virtual sensor types to virtual sensor.
- The per-type virtual sensor metadata mapping has become a mapping of
  virtual sensor types to virtual sensor metadata.
- Sensor types that define a virtual sensor type attempt to retrieve a
  virtual sensor from the virtual sensor mapping using this string as key.

There are no user-visible changes or changes to the WebDriver extension
commands, it is only the concepts and data structures used internally in the
specification that have changed a little.

Derived specifications will need to be adjusted accordingly once this pull
request is merged.
  • Loading branch information
rakuco committed Nov 21, 2023
1 parent 0be3709 commit 80f5b67
Showing 1 changed file with 36 additions and 39 deletions.
75 changes: 36 additions & 39 deletions index.bs
Original file line number Diff line number Diff line change
Expand Up @@ -797,6 +797,7 @@ A [=sensor type=] may have the following associated data:
reading=] map to be updated.
- A <dfn export>reading quantization algorithm</dfn>, which takes a [=sensor reading=] and returns a
less accurate [=sensor reading=].
- A [=virtual sensor type=].

<h3 id="model-sensor">Sensor</h3>

Expand Down Expand Up @@ -1299,10 +1300,11 @@ to {{SensorErrorEventInit}}.

1. Let |platformSensor| be null.
1. Let |type| be |sensor|'s associated [=sensor type=].
1. Let |virtualSensorType| be |sensor|'s associated [=virtual sensor type=], or null if it is not set.
1. Let |topLevelTraversable| be |global|'s [=Window/navigable=]'s [=navigable/top-level
traversable=].
1. If |topLevelTraversable|'s [=virtual sensor mapping=] [=map/contains=] |type|:
1. Let |virtualSensor| be |topLevelTraversable|'s [=virtual sensor mapping=][|type|].
1. If |virtualSensorType| is not null and |topLevelTraversable|'s [=virtual sensor mapping=] [=map/contains=] |virtualSensorType|:
1. Let |virtualSensor| be |topLevelTraversable|'s [=virtual sensor mapping=][|virtualSensorType|].
1. If |virtualSensor|'s [=virtual sensor/can provide readings flag=] is true, set |platformSensor|
to a [=platform sensor=] corresponding to |virtualSensor|.

Expand Down Expand Up @@ -1598,18 +1600,22 @@ A [=virtual sensor=] has the following associated data:
[=device sensor=], so this corresponds to the [=device sensor=]'s [=device sensor/maximum sampling
frequency=].

The <dfn export>per-type virtual sensor metadata</dfn> is an [=ordered map=] of [=strings=] to
[=virtual sensor metadata=]. It is initially empty, and [=extension specifications=] should
define one or more entries in the [=map=] corresponding to the sensor types they define.
A <dfn export>virtual sensor type</dfn> is a string that represents a sensor of a given type.

The <dfn export>per-type virtual sensor metadata</dfn> is an [=ordered map=] of [=virtual sensor
types=] to [=virtual sensor metadata=]. It is initially empty, and [=extension specifications=]
should define one or more entries in the [=map=] corresponding to the sensor types they define.

A <dfn export>virtual sensor metadata</dfn> is a [=struct=] whose [=struct/items=] are:
- : <dfn for="virtual sensor metadata" export>virtual sensor type</dfn>
:: A [=sensor type=].
- : <dfn for="virtual sensor metadata" export>reading parsing algorithm</dfn>
:: An algorithm that takes a JSON {{Object}} and returns a [=sensor reading=] or **undefined**.

Each [=/top-level traversable=] has a <dfn>virtual sensor mapping</dfn>, which is an [=ordered map=]
of [=sensor type=] to [=virtual sensor=].
of [=virtual sensor types=] to [=virtual sensor=].

Note: The [=virtual sensor mapping=] [=struct=] contains data that is common to
all virtual sensors of a given type. A [=virtual sensor=] contains data that
can vary on virtual sensor creation and utilization.

Note: [=Virtual sensor mappings=] are tied to [=/top-level traversables=] rather than any
[=/navigable=] because [=platform sensors=] with a given [=sensor type=] in all [=/navigables=] with
Expand Down Expand Up @@ -1684,24 +1690,22 @@ to sensor=] is invoked again.

<div algorithm="create virtual sensor">
The [=remote end steps=] are:
1. Let |type| be the result of invoking [=get a property=] "`type`" from |parameters|.
1. If |type| is not a {{String}}, return [=error=] with [=WebDriver error code=] [=invalid
1. Let |virtualSensorType| be the result of invoking [=get a property=] "`type`" from |parameters|.
1. If |virtualSensorType| is not a {{String}}, return [=error=] with [=WebDriver error code=] [=invalid
argument=].
1. If [=per-type virtual sensor metadata=] does not [=map/contain=] |type|, return [=error=]
1. If [=per-type virtual sensor metadata=] does not [=map/contain=] |virtualSensorType|, return [=error=]
with [=WebDriver error code=] [=invalid argument=].
1. Let |sensorType| be [=per-type virtual sensor metadata=][|type|]'s [=virtual sensor
metadata/virtual sensor type=].
1. Let |topLevelVirtualSensorMapping| be the [=current browsing context=]'s
[=browsing context/top-level traversable=]'s [=virtual sensor mapping=].
1. If |topLevelVirtualSensorMapping| [=map/contains=] |sensorType|, return [=error=] with
1. If |topLevelVirtualSensorMapping| [=map/contains=] |virtualSensorType|, return [=error=] with
[=WebDriver error code=] [=invalid argument=].
1. Let |connected| be the result of invoking [=get a property with default=] with
"`connected`" and true from |parameters|.
1. Let |maxSamplingFrequency| be the result of [=get a property with default=] with
1. Let |maxSamplingFrequency| be the result of invoking [=get a property with default=] with
"`maxSamplingFrequency`" and an [=implementation-defined=] value from |parameters|.
1. If |maxSamplingFrequency| is not a {{Number}}, or its value is **NaN**, +∞, or −∞, return
[=error=] with [=WebDriver error code=] [=invalid argument=].
1. Let |minSamplingFrequency| be the result of [=get a property with default=] with
1. Let |minSamplingFrequency| be the result of invoking [=get a property with default=] with
"`minSamplingFrequency`" and an [=implementation-defined=] value from |parameters|.
1. If |minSamplingFrequency| is not a {{Number}}, or its value is **NaN**, +∞, or −∞, return
[=error=] with [=WebDriver error code=] [=invalid argument=].
Expand All @@ -1711,7 +1715,7 @@ to sensor=] is invoked again.
1. Set |virtualSensor|'s [=virtual sensor/can provide readings flag=] to |connected|.
1. Set |virtualSensor|'s [=virtual sensor/minimum sampling frequency=] to |minSamplingFrequency|.
1. Set |virtualSensor|'s [=virtual sensor/maximum sampling frequency=] to |maxSamplingFrequency|.
1. Set |topLevelVirtualSensorMapping|[|sensorType|] to |virtualSensor|.
1. Set |topLevelVirtualSensorMapping|[|virtualSensorType|] to |virtualSensor|.
1. Return [=success=] with data `null`.
</div>

Expand Down Expand Up @@ -1775,16 +1779,12 @@ sensor/minimum sampling frequency=] and [=virtual sensor/maximum sampling freque

<div algorithm="get virtual sensor information">
The [=remote end steps=] are:
1. Let |type| be the value of the `type` [=url variable=].
1. If [=per-type virtual sensor metadata=] does not [=map/contain=] |type|, return [=error=]
with [=WebDriver error code=] [=invalid argument=].
1. Let |sensorType| be [=per-type virtual sensor metadata=][|type|]'s [=virtual sensor
metadata/virtual sensor type=].
1. Let |virtualSensorType| be the value of the `type` [=url variable=].
1. Let |topLevelVirtualSensorMapping| be the [=current browsing context=]'s
[=browsing context/top-level traversable=]'s [=virtual sensor mapping=].
1. If |topLevelVirtualSensorMapping| does not [=map/contain=] |sensorType|, return [=error=] with
1. If |topLevelVirtualSensorMapping| does not [=map/contain=] |virtualSensorType|, return [=error=] with
[=WebDriver error code=] [=invalid argument=].
1. Let |virtualSensor| be |topLevelVirtualSensorMapping|[|sensorType|].
1. Let |virtualSensor| be |topLevelVirtualSensorMapping|[|virtualSensorType|].
1. Let |info| be a new {{Object}}.
1. Invoke [=set a property=] on |info| with "`requestedSamplingFrequency`" and |virtualSensor|'s
[=virtual sensor/requested sampling frequency=].
Expand Down Expand Up @@ -1836,16 +1836,15 @@ still has to be processed by a [=platform sensor=], which might discard it due t
ignore="">parameters</var>.
1. If |reading| is not an {{Object}}, return [=error=] with [=WebDriver error code=] [=invalid
argument=].
1. Let |type| be the value of the `type` [=url variable=].
1. If [=per-type virtual sensor metadata=] does not [=map/contain=] |type|, return [=error=]
1. Let |virtualSensorType| be the value of the `type` [=url variable=].
1. If [=per-type virtual sensor metadata=] does not [=map/contain=] |virtualSensorType|, return [=error=]
with [=WebDriver error code=] [=invalid argument=].
1. Let |metadata| be [=per-type virtual sensor metadata=][|type|].
1. Let |sensorType| be |metadata|'s [=virtual sensor metadata/virtual sensor type=].
1. Let |metadata| be [=per-type virtual sensor metadata=][|virtualSensorType|].
1. Let |topLevelVirtualSensorMapping| be the [=current browsing context=]'s
[=browsing context/top-level traversable=]'s [=virtual sensor mapping=].
1. If |topLevelVirtualSensorMapping| does not [=map/contain=] |sensorType|, return [=error=] with
1. If |topLevelVirtualSensorMapping| does not [=map/contain=] |virtualSensorType|, return [=error=] with
[=WebDriver error code=] [=invalid argument=].
1. Let |virtualSensor| be |topLevelVirtualSensorMapping|[|sensorType|].
1. Let |virtualSensor| be |topLevelVirtualSensorMapping|[|virtualSensorType|].
1. Let |parsedReading| be the result of invoking |metadata|'s [=virtual sensor metadata/reading
parsing algorithm=] with |reading|.
1. If |parsedReading| is **undefined**, return [=error=] with [=WebDriver error code=]
Expand Down Expand Up @@ -1941,14 +1940,12 @@ This [=extension command=] deletes a given type of [=virtual sensor=].

<div algorithm="delete virtual sensor">
The [=remote end steps=] are:
1. Let |type| be the value of the `type` [=url variable=].
1. If [=per-type virtual sensor metadata=] does not [=map/contain=] |type|, return [=error=]
1. Let |virtualSensorType| be the value of the `type` [=url variable=].
1. If [=per-type virtual sensor metadata=] does not [=map/contain=] |virtualSensorType|, return [=error=]
with [=WebDriver error code=] [=invalid argument=].
1. Let |sensorType| be [=per-type virtual sensor metadata=][|type|]'s [=virtual sensor
metadata/virtual sensor type=].
1. Let |topLevelVirtualSensorMapping| be the [=current browsing context=]'s
[=browsing context/top-level traversable=]'s [=virtual sensor mapping=].
1. [=map/Remove=] |topLevelVirtualSensorMapping|[|sensorType|].
1. [=map/Remove=] |topLevelVirtualSensorMapping|[|virtualSensorType|].
1. Return [=success=] with data `null`.
</div>

Expand Down Expand Up @@ -2128,24 +2125,24 @@ In order to enable user-agent automation and application testing,

- Add one or more [=map/entries=] to [=per-type virtual sensor metadata=].
- Consequently, define one or more [=virtual sensor metadata=] instances.
- Specify a [=sensor type=]'s [=virtual sensor type=], which should match the key used in the corresponding [=per-type virtual sensor metadata=] entry.

<div class="example">
The [=extension specification=] for proximity sensors described in [[#example-webidl]] could
contain the following text:

<blockquote>
The **Proximity Sensor** is a [=sensor type=] with one associated [=extension sensor
interface=], `ProximitySensor`.
interface=], `ProximitySensor`. Its associated [=virtual sensor type=] is "`proximity`".

*[...]*

The **proximity reading parsing algorithm**, given a JSON {{Object}} *parameters*, must
invoke [=parse single-value number reading=] with *parameters* and "`distance`".

The [=per-type virtual sensor metadata=] [=map=] must have an entry whose key is "`proximity`"
and whose value is a [=virtual sensor metadata=] whose [=virtual sensor metadata/virtual sensor
type=] is the *Proximity Sensor* [=sensor type=] and with a [=virtual sensor metadata/reading
parsing algorithm=] of *proximity reading parsing algorithm*.
and whose value is a [=virtual sensor metadata=] whose [=virtual sensor metadata/reading
parsing algorithm=] is *proximity reading parsing algorithm*.
</blockquote>
</div>

Expand Down

0 comments on commit 80f5b67

Please sign in to comment.