1. はじめに
Ambient Light SensorはGeneric Sensor API [GENERIC-SENSOR]を拡張し、デバイスのメイン光検出器によって検出された環境光レベル(lux単位)に関する情報を提供します。
1.1. 対象範囲
本書は、低レイテンシで高頻度のサンプリングが可能な、詳細な照度データを必要とするユースケース向けに設計されたAPIを規定します。
コントラストレベルやデバイスの測定した環境光レベルに基づく推奨カラースキームなど、少数の照度値に依存する一般的なユースケースには、prefers-contrast
およびprefers-color-scheme
CSSメディア特性 [MEDIAQUERIES-5]、並びにmatchMedia
API [CSSOM-VIEW-1]の利用が推奨され、本APIの対象外となります。
注: [MEDIAQUERIES-5]仕様には、かつて環境光の測定値に直接対応するlight-level
メディア特性が含まれていましたが、より高レベルなprefers-color-scheme
およびprefers-contrast
メディア特性が推奨されることとなり、仕様から削除されました。
2. 例
const sensor= new AmbientLightSensor(); sensor. onreading= () => console. log( sensor. illuminance); sensor. onerror= event=> console. log( event. error. name, event. error. message); sensor. start();
illuminance
の値を最も近い露出値に変換します。
navigator. permissions. query({ name: 'ambient-light-sensor' }). then( result=> { if ( result. state=== 'denied' ) { console. log( 'Permission to use ambient light sensor is denied.' ); return ; } const als= new AmbientLightSensor({ frequency: 20 }); als. addEventListener( 'activate' , () => console. log( 'Ready to measure EV.' )); als. addEventListener( 'error' , event=> console. log( `Error: ${ event. error. name} ` )); als. addEventListener( 'reading' , () => { // デフォルトISO値 const ISO= 100 ; // 入射光較正定数 const C= 250 ; let EV= Math. round( Math. log2(( als. illuminance* ISO) / C)); console. log( `露出値(EV)は: ${ EV} ` ); }); als. start(); });
const als= new AmbientLightSensor(); als. onreading= () => { let str= luxToWorkplaceLevel( als. illuminance); if ( str) { console. log( `照度レベルは以下に適しています: ${ str} .` ); } }; als. start(); function luxToWorkplaceLevel( lux) { if ( lux> 20 && lux< 100 ) { return '共用エリアや短時間の滞在' ; } else if ( lux> 100 && lux< 150 ) { return '時々行う視覚作業' ; } else if ( lux> 150 && lux< 250 ) { return '簡単な事務作業、授業、家庭、劇場' ; } else if ( lux> 250 && lux< 500 ) { return '通常の事務作業、食料品店、研究室' ; } else if ( lux> 500 && lux< 1000 ) { return '機械工場、製図、スーパーマーケット' ; } else if ( lux> 1000 && lux< 5000 ) { return '詳細な製図作業、コントラストの低い視覚作業' ; } return ; }
3. セキュリティとプライバシーに関する考慮事項
Ambient Light Sensorはデバイス周辺の照明状況に関する情報を提供します。潜在的なプライバシーリスクには以下が含まれます:
-
プロファイリング。Ambient Light Sensorは、ユーザーの利用パターンや周辺環境に関する情報を漏洩する可能性があります。この情報はユーザープロファイリングや行動分析の強化に利用される可能性があります。
-
クロスデバイスリンク。2台のデバイスが同じサードパーティスクリプトを含むウェブサイトにアクセスし、時間をかけて照度レベルを相関させることができます。
-
クロスデバイス通信。デバイスの画面やカメラLEDのフラッシュを利用し、近くのデバイスのAmbient Light Sensorで読み取らせてメッセージをブロードキャストするシンプルな通信方法が可能です。
-
クロスオリジンリーク。画面から発せられる光が近くの反射面からセンサーへ反射されることがあります。悪意のあるサイトが異なるオリジンからリソースを埋め込み、特定のピクセルを表示・識別できるようにコンテンツをスケールすることが可能です。
-
閲覧履歴のハイジャック。訪問済みリンクや未訪問リンクに異なるスタイル(例:訪問済みリンクは黒、未訪問リンクは白)を適用し、それにより照度レベルの違いからリンクの状態を識別できるようにすること。
[ALSPRIVACYANALYSIS]、[PINSKIMMINGVIASENSOR]、 [STEALINGSENSITIVEDATA]、 [VIDEORECOGNITIONAMBIENTLIGHT]、および [IMAGINGPRIVACY] などの研究で、これらの問題がさらに深く検討されています。
Ambient Light Sensor固有の脅威を軽減するため、ユーザーエージェントはセンサーの読み取り値の精度を低減しなければなりません。また、ユーザーエージェントは最大サンプリング周波数を制限してもよいです。
これらの緩和策は、Generic Sensor APIで定義される汎用的な緩和策を補完するものです。[GENERIC-SENSOR]
3.1. センサー読み取り値の精度低減
センサーの読み取り値の精度を低減するため、本仕様はしきい値チェックアルゴリズム(ambient lightしきい値チェックアルゴリズム)と、 読み取り量子化アルゴリズム(ambient light読み取り量子化アルゴリズム)を定義します。
これらのアルゴリズムはilluminance rounding multipleおよびilluminance threshold valueを利用します。実装はそれらの値に関して以下の要件を遵守しなければなりません:
-
illuminance rounding multipleは50ルクス以上でなければなりません。
-
illuminance threshold valueはilluminance rounding multipleの半分以上であるべきです。
注: illuminance rounding multipleの値の選定は、読み取り値があまりにも精密にならないようにしつつ、API利用者にとって有用な値を提供するバランスが必要です。illuminance rounding multipleの最小値50ルクスは、異なる照明条件下での環境光レベルの測定が収集され、[STEALINGSENSITIVEDATA]で記述された攻撃を防げることがGitHub issue #13で示されました。また、50ルクスは、環境光センサー読み取り値を使った[VIDEORECOGNITIONAMBIENTLIGHT]によるビデオ認識を不可能にするために必要な5ルクスより高い値です。
注: illuminance threshold valueは、読み取り値が特定の値付近で量子化されて切り替わる事実が漏洩するのを防ぐために使われます。例えば、illuminance rounding multipleが50の場合、生の読み取り値が24から26の間で変動しても、illuminance値が0と50の間で切り替わることを防げます。threshold check algorithmの補助的なフィンガープリント緩和策としての有効性は数学的に証明されていませんが、実装経験に基づき本仕様に追加されています。詳細はChromium bug 1332536およびChromium review 3666917をご覧ください。
4. モデル
Ambient Light
Sensor センサータイプに関連するSensor
のサブクラスはAmbientLightSensor
クラスです。
Ambient Light Sensorには、デバイスのメイン光検出器であるdefault sensorがあります。
Ambient Light
Sensorは、強力な機能であり、名前は"ambient-light-sensor
"です。これがセンサーの権限名にもなります。その権限取り消しアルゴリズムは、
generic sensor permission revocation
algorithmを"ambient-light-sensor"で呼び出した結果です。
Ambient Light
Sensorは、"ambient-light-sensor"という文字列で識別されるポリシー制御機能です。そのデフォルト許可リストは'self'
です。
Ambient Light
Sensorには仮想センサータイプがあり、その値は"ambient-light
"です。
現在の照度レベルまたは照度は、ホストデバイスの周辺環境光レベルを表す値です。単位はルクス(lx)です[SI]。
注: 同じ照明下でも、異なるデバイスが報告する正確なルクス値は検出方法やセンサー構造などの違いにより異なります。
Ambient Light Sensorには、ルクス単位のilluminance rounding multipleがあり、その倍数に照度の読み取り値が切り上げられます。
Ambient Light Sensorには、ルクス単位のilluminance threshold valueがあり、ambient lightしきい値チェックアルゴリズムで利用されます。
注: 上記値の最小要件については§ 3.1 センサー読み取り値の精度低減を参照してください。
5. API
5.1. AmbientLightSensor インターフェース
[SecureContext ,Exposed =Window ]interface :
AmbientLightSensor Sensor {(
constructor optional SensorOptions = {});
sensorOptions readonly attribute double ?; };
illuminance
AmbientLightSensor
オブジェクトを構築するには、ユーザーエージェントは ambient light sensor オブジェクトの構築
抽象操作を実行しなければなりません。
5.1.1. illuminance 属性
illuminance
の getter の手順は次の通りです:
-
illuminance を get value from latest reading を this と "illuminance" を引数として呼び出した結果とする。
-
illuminance を返す。
6. 抽象的な操作
6.1. ambient light sensor オブジェクトの構築
- input
-
options、
SensorOptions
オブジェクト。 - output
-
AmbientLightSensor
オブジェクト。
-
allowed を check sensor policy-controlled features を
AmbientLightSensor
で呼び出した結果とする。 -
allowed が false なら、
-
ambient_light_sensor を新しい
AmbientLightSensor
オブジェクトとする。 -
ambient_light_sensor と options を引数として initialize a sensor object を呼び出す。
-
ambient_light_sensor を返す。
6.2. ambient light しきい値チェックアルゴリズム
Ambient Light Sensor の センサータイプは以下の しきい値チェックアルゴリズムを定義します:
- input
-
newReading、sensor reading
latestReading、sensor reading
- output
-
差分が十分に大きいかどうかを示す boolean。
-
newReading["illuminance"] が null なら true を返す。
-
latestReading["illuminance"] が null なら true を返す。
-
newIlluminance を newReading["illuminance"] とする。
-
latestIlluminance を latestReading["illuminance"] とする。
-
abs(latestIlluminance - newIlluminance) が illuminance threshold value より小さいなら false を返す。
-
roundedNewReading を ambient light 読み取り量子化アルゴリズム を newIlluminance で呼び出した結果とする。
-
roundedLatestReading を ambient light 読み取り量子化アルゴリズム を latestIlluminance で呼び出した結果とする。
-
roundedNewReading["illuminance"] と roundedLatestIlluminance["illuminance"] が等しいなら false を返す。
-
それ以外の場合は true を返す。
注: このアルゴリズムは ambient light 読み取り量子化アルゴリズム を呼び出し、同じ値に切り上げられる読み取り値ではメインの update latest reading アルゴリズムの更新をトリガーしないことを保証します。そうしなければ、生の照度値が illuminance threshold value 以上の範囲で異なることをユーザーに示してしまい、異なる illuminance rounding multiple に切り上げられない場合でも情報が漏れることになります。
6.3. ambient light 読み取り量子化アルゴリズム
Ambient Light Sensor の センサータイプは以下の 読み取り量子化アルゴリズムを定義します:
- input
-
reading、sensor reading
- output
-
quantizedReading を reading とする。
-
quantizedReading["illuminance"] を illuminance rounding multiple の倍数で reading["illuminance"] に最も近い値に設定する。
-
quantizedReading を返す。
7. 自動化
このセクションは、Generic Sensor API § 9 自動化を拡張し、Ambient Light Sensor固有の仮想センサーメタデータを提供します。
Object
parametersが与えられたとき、parse single-value number
readingをparametersと"illuminance
"で呼び出した結果を返さなければなりません。
タイプごとの仮想センサーメタデータ マップには、以下のエントリを含めなければなりません:
- キー
- 値
-
仮想センサーメタデータであり、そのreading parsing algorithmは illuminance 読み取り値解析アルゴリズムです。
8. ユースケースと要件
-
Webアプリケーションがスマートホームシステムの照明制御に入力を提供する。
-
Webアプリケーションが作業空間の光レベルが十分かどうかを確認する。
-
Webアプリケーションがマニュアル制御(絞り、シャッター速度、ISO)付きカメラの設定を計算する。
-
Webアプリケーションが現在の照度レベルを確認し、カメラストリームが目的に十分な精度のデータを含むか(例:人の存在確認など)を判断する。
一部のユースケースは精密な環境光測定値の取得から恩恵を受ける可能性がありますが、環境光レベルの変動をユーザー入力イベントに変換するユースケースは、より高いサンプリング周波数が有用です。
9. 謝辞
Doug Turner(初期プロトタイプ)および Marcos Caceres(テストスイート)に感謝します。
Paul Bakaus(LightLevelSensorのアイディア)に感謝します。
Mikhail Pozdnyakov と Alexander Shalamov(ユースケースと要件)に感謝します。
Lukasz Olejnik(プライバシーリスク評価)に感謝します。