diff --git a/index.bs b/index.bs index 8915688..5488ccd 100644 --- a/index.bs +++ b/index.bs @@ -55,6 +55,13 @@ urlPrefix: https://w3c.github.io/sensors/; spec: GENERIC-SENSOR urlPrefix: https://tc39.es/ecma262/; spec: ECMA-262 type: abstract-op text: abs; url: eqn-abs +urlPrefix: https://w3c.github.io/mediacapture-main/; spec: MEDIACAPTURE-STREAMS + type: dfn + text: stopped; url: source-stopped + +
+spec:generic-sensor; type:attribute; text:[[state]] +spec:mediacapture-streams; type:dfn; text:source
@@ -237,9 +244,13 @@ Works such as [[ALSPRIVACYANALYSIS]], [[PINSKIMMINGVIASENSOR]], [[STEALINGSENSITIVEDATA]], and [[VIDEORECOGNITIONAMBIENTLIGHT]] delve further into these issues. -To mitigate these threats specific to Ambient Light Sensor, user agents must -reduce accuracy of sensor readings. User agents may also limit -maximum sampling frequency. +To mitigate these threats specific to Ambient Light Sensor, user agents must: +- [=Reduce accuracy=] of sensor readings. See [[#reduce-sensor-accuracy]]. +- Obtain user consent before providing sensor readings. This is done by + integrating with the [[MEDIACAPTURE-STREAMS]] specification. See + [[#local-video-source-requirement]]. + +User agents may also limit maximum sampling frequency. These mitigation strategies complement the [=mitigation strategies|generic mitigations=] defined in the Generic Sensor API [[!GENERIC-SENSOR]]. @@ -283,6 +294,39 @@ experience. Chromium bug 1332536 and Chromium review 3666917 contain more information about this. +Active local video source requirement {#local-video-source-requirement} +----- + +Many of the attacks on Ambient Light sensors referenced above rely on being +able to access illuminance readouts for a certain amount of time without a user +being aware that the data is being read. + +[[STEALINGSENSITIVEDATA]] and [[ALSPRIVACYANALYSIS]] specifically recommend +requesting user permission before allowing access to illuminance readouts as a +privacy measure. On the other hand, it can be argued that conveying to users +what an Ambient Light Sensor is so that they can make an informed choice to +grant or deny access to it can be difficult. + +What this specification does instead is consider an Ambient Light Sensor to be +a 1x1 grayscale camera, integrate with the [[MEDIACAPTURE-STREAMS]] +specification and require there to be at least one local video [=source=] that +is not [=muted=] or [=stopped=] in order for illuminance readouts to be +provided. In other words, an Ambient Light Sensor only provides readings if a +local video source (such as a camera) is currently active and being used in the +same window as the {{AmbientLightSensor}} instance. + +Per the [[MEDIACAPTURE-STREAMS]] specification, this is only possible if script +has called {{MediaDevices/getUserMedia()}} and granted the "camera" permission. This also means the User Agent has at least +indicated to the user that a local video source has started being used as per +[[MEDIACAPTURE-STREAMS#privacy-indicator-requirements]]. + +The goal of this model is to treat an Ambient Light Sensor as potentially as +invasive as an actual camera device and subject it to the same strict privacy +requirements together with the Generic Sensor mitigations described in +[[GENERIC-SENSOR#security-and-privacy]] and the other Ambient Light +Sensor-specific measures described in this section. + Model {#model} ===== @@ -292,12 +336,12 @@ subclass is the {{AmbientLightSensor}} class. The Ambient Light Sensor has a default sensor, which is the device's main light detector. -The Ambient Light Sensor is a [=powerful feature=] that is identified by -the [=powerful feature/name=] "ambient-light-sensor", -which is also its associated [=sensor permission name=]. Its -[=powerful feature/permission revocation algorithm=] is the result of calling -the [=generic sensor permission revocation algorithm=] with -"ambient-light-sensor". +The Ambient Light Sensor's [=sensor permission names=] is an +[=set/empty=] [=ordered set|set=]. + +Note: See [[#local-video-source-requirement]]. This specification relies on the +permission model specified in the [[MEDIACAPTURE-STREAMS]] specification +instead. The Ambient Light Sensor is a [=policy-controlled feature=] identified by the string "ambient-light-sensor". Its [=default allowlist=] is `'self'`. @@ -345,6 +389,35 @@ The {{AmbientLightSensor/illuminance}} getter steps are: reading=] with [=this=] and "illuminance" as arguments. 1. Return |illuminance|. +### Media Capture and Streams integration ### {#media-capture-and-streams-integration} + +As discussed in [[#local-video-source-requirement]], illuminance readouts are +provided only if the same {{Window}} with an {{AmbientLightSensor}} object has +at least one local video [=source=] that is not [=muted=] or [=stopped=]. + +The [=ambient light pre-activation checks algorithm=] is invoked by +{{Sensor/start()}} as specified in [[GENERIC-SENSOR]]. + +Furthermore, whenever an item is added to the {{Window}}.\[[devicesLiveMap]] +internal slot, or one of its items has its value changed, implementations MUST +run the following steps: + ++ 1. Let |global| be the {{Window}} object of the affected \[[devicesLiveMap]] + internal slot. + 1. Let |result| be the result of invoking [=check for active local video sources=] with |global|. + 1. If |result| is true, return. + 1. For each {{AmbientLightSensor}} object |sensor| whose [=relevant global + object=] is |global|: + 1. If |sensor|.{{[[state]]}} is "idle", then [=continue=]. + 1. Invoke [=deactivate a sensor object=] with |sensor|. + 1. Let |e| be the result of [=created|creating=] + a "{{NotReadableError}}" {{DOMException}}. + 1. [=Queue a global task=] on the [=sensor task source=] with |global| to + run [=notify error=] with |sensor| and |e| as + arguments. ++ Abstract Operations {#abstract-operations} =================== @@ -418,6 +491,36 @@ quantization algorithm=]: 1. Return |quantizedReading|. +Ambient light pre-activation checks algorithm
+ +The [=Ambient Light Sensor=] [=sensor type=] defines the following +[=pre-activation checks algorithm=]: + ++ : input + :: |sensor|, an {{AmbientLightSensor}} object + : output + :: A [=boolean=] indicating whether the checks have passed and sensor activation may proceed. + + 1. Let |global| be |sensor|'s [=relevant global object=]. + 1. Return the result of invoking [=check for active local video sources=] with |global|. ++ +Check for active local video source
+ ++ : input + :: |global|, an {{Window}} object + : output + :: A [=boolean=] indicating whether there are active local video sources. + + 1. If |global| does not have a \[[mediaStreamTrackSources]] internal slot, return false. + 1. For each |source| in |global|'s \[[mediaStreamTrackSources]] internal slot: + 1. If |source| is not a video input device, then [=continue=]. + 1. If |source| is not [=stopped=] or [=muted=], then return true. + 1. Return false. ++ Automation {#automation} ========== This section extends the [=automation=] section defined in the Generic Sensor API [[GENERIC-SENSOR]]