Copyright © 2024 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
このドキュメントは、ウェブアプリケーションがスクリーンウェイクロックを要求できるAPIを定義します。適切な条件下で許可された場合、スクリーンウェイクロックはシステムがデバイスのスクリーンをオフにするのを防ぎます。
このセクションは、公開時点でのこのドキュメントのステータスについて説明します。現在のW3C公開物およびこの技術レポートの最新改訂版は、W3C技術レポートインデックス(https://www.w3.org/TR/)で確認できます。
実装者は、この仕様が非常に不安定であることを認識する必要があります。議論に参加していない実装者は、仕様が互換性のない形で変更されていることに気付くでしょう。この仕様の最終的な候補勧告フェーズ到達前に実装に関心のあるベンダーは、GitHubリポジトリを購読し、議論に参加してください。
このドキュメントはデバイスとセンサー ワーキンググループおよびウェブアプリケーション ワーキンググループによって、勧告トラックを利用しワーキングドラフトとして公開されました。
ワーキングドラフトとしての公開は、W3Cおよびそのメンバーによる承認を意味するものではありません。
このドキュメントはドラフトであり、随時更新・差替え・廃止される可能性があります。進行中の作業以外の文献として引用するのは不適切です。
このドキュメントは、W3C特許ポリシーのもとで活動するグループによって作成されました。 W3Cは、 (デバイスとセンサー ワーキンググループ)特許開示の公開リストおよび (ウェブアプリケーション ワーキンググループ)特許開示の公開リスト を管理しています。各グループの成果物に関して行われた開示はこれらのページで確認でき、特許開示の手順も含まれています。個人が本当に特許の存在を知っていて、その特許が必須クレームを含むと考える場合は、W3C特許ポリシー第6節に従って情報を開示しなければなりません。
このドキュメントは、2023年11月3日 W3Cプロセスドキュメントに準拠しています。
このセクションは規範的ではありません。
現代のオペレーティングシステムは、積極的な電源管理を実装することで、より長いバッテリー寿命を実現しています。つまり、ユーザー操作がしばらくないと、ホストデバイスは画面の明るさを下げたり、画面をオフにしたり、さらにはCPUを省電力状態に移行させたりして、可能な限り電力消費を抑えます。
これはバッテリー寿命の延長には非常に有効ですが、バーコードのスキャン、電子書籍の読書、レシピの確認、プレゼンテーションなどのユースケースでは妨げになることがあります。詳細は Wake Lock: Use casesもご参照ください。
ウェイクロックは一般的に何かの動作を防止しますが、UA(および基盤となるOS)はバッテリーの状態(AC電源接続、放電中、バッテリー残量低下)に応じてウェイクロックに時間制限を設けたり、省電力モードが有効な場合にはウェイクロック自体を禁止することがあります。
この仕様では、以下のウェイクロックの種類を定義しています:
APIでは、ウェイクロックの種類は
WakeLockType列挙型の値で表されます。
他の仕様で異なるウェイクロックの種類が定義される場合があります。
スクリーンウェイクロックAPIは、ポリシー制御機能を定義しており、識別子は"screen-wake-lock"です。デフォルト許可リストは'self'です。
[PERMISSIONS] APIは、ウェブサイトがユーザーから権限をリクエストしたり、持っている権限を確認したりするための統一した方法を提供します。
ユーザーエージェントは、特定のウェイクロックの種類やDocumentに対し、プラットフォーム設定やユーザーの好みなどの実装依存の理由でウェイクロックを拒否することができます。
ユーザーエージェントは、ウェイクロックが有効な際に、ユーザーへ通知を表示し、継続中の操作をブロックする手段や、通知を閉じる手段を提供することが推奨されます。
"screen-wake-lock" 強力な機能は、本仕様で定義された機能を有効化します。
"screen-wake-lock" 強力な機能は、権限の取り消しアルゴリズムを定義します。スクリーンウェイクロック権限取り消しアルゴリズムを実行するには、以下の手順に従います:
[[ActiveLocks]]["screen"]とする。
この仕様で言及されたタスクソースは、スクリーンウェイクロックタスクソースです。
プラットフォームウェイクロックとは、ユーザーエージェントが状態を照会したりウェイクロックの取得/解除を行うためにやりとりするプラットフォームインターフェースを指します。
プラットフォームウェイクロックは、基盤となるプラットフォーム(例:ネイティブのウェイクロックフレームワーク)や、ユーザーエージェントが直接ハードウェア制御できる場合はユーザーエージェント自体によって定義されます。
| 内部スロット | 初期値 | 説明 |
|---|---|---|
| [[ActiveLocks]] | 順序付きマップで、ウェイクロックの種類を空の リストにマッピングします。 |
順序付きマップで、ウェイクロックの種類を
リスト(このWakeLockSentinelオブジェクト)にマッピングします。
このDocumentに関連付けられます。
|
WakeLock インターフェースは、ドキュメントが スクリーンウェイクロック を取得できるようにします。
WebIDL[SecureContext, Exposed=(Window)]
interface WakeLock {
Promise<WakeLockSentinel> request(optional WakeLockType type = "screen");
};
request(type) メソッドの手順は以下の通りです:
NotAllowedError" DOMException で返す。
screen-wake-lock"
を利用できない場合は 拒否された promise を "NotAllowedError" DOMException で返す。
NotAllowedError" DOMException で返す。
hidden" なら、拒否された promise を "NotAllowedError" DOMException で返す。
screen-wake-lock" の 使用権限要求 の結果とする。
denied" なら:
NotAllowedError"
DOMException
で拒否する。
NotAllowedError"
DOMException
で拒否する。
hidden" なら:
NotAllowedError"
DOMException
で拒否する。
[[ActiveLocks]]["screen"]
空リスト なら、以下の手順を 並列で 実行:
WakeLockSentinel
オブジェクト(type 属性に type を設定)とする。
[[ActiveLocks]]["screen"]
に追加。
WebIDL[SecureContext, Exposed=(Window)]
interface WakeLockSentinel : EventTarget {
readonly attribute boolean released;
readonly attribute WakeLockType type;
Promise<undefined> release();
attribute EventHandler onrelease;
};
WakeLockSentinel オブジェクトは プラットフォームウェイクロック のハンドルを提供し、手動で解除されるか、基盤となる プラットフォームウェイクロック が解除されるまで保持します。その存在により、指定された ウェイクロックの種類 の プラットフォームウェイクロック をアクティブに保ち、指定された WakeLockSentinel インスタンスをすべて解除すると、基盤の プラットフォームウェイクロック が解除されます。
WakeLockSentinel インスタンスは、以下の
内部スロットで作成されます:
| 内部スロット | 初期値 | 説明(規範的でない) |
|---|---|---|
| [[Released]] |
false
|
指定された WakeLockSentinel が解除されたかどうか。
|
released の getter の手順は this.[[Released]]
を返すことです。
type の getter の手順は、this の
ウェイクロックの種類 を返すことです。
release() メソッドの手順は以下の通りです:
[[Released]] が false なら、
ウェイクロック解除 を lock を this、type を
this の type 属性の値で呼び出す。
undefined で。
onrelease 属性は、
"onrelease" イベントハンドラーIDL属性 です。
イベントハンドラーイベントタイプは
"release" です。
この属性は、指定された WakeLockSentinel
オブジェクトのハンドルが解除されたこと(release()
メソッドが呼ばれた場合や、ユーザーエージェントがウェイクロックを解除した場合)をスクリプトに通知するために使用されます。
WakeLockSentinel オブジェクトに
"" のイベントリスナーが1つ以上登録されていて、
releaseWakeLockSentinel オブジェクトがまだ解除されていない場合、
必ず
Window オブジェクトからその
WakeLockSentinel オブジェクトへの強い参照が存在しなければなりません。
WakeLockSentinel オブジェクトが
スクリーンウェイクロックタスクソース にタスクをキューしている間は、
必ず Window オブジェクトからその WakeLockSentinel オブジェクトへの強い参照が存在しなければなりません。
ウェイクロックの種類の記述のために、この仕様はウェイクロックの種類を表すための次の列挙型を定義します。
WebIDLenum WakeLockType { "screen" };
screen
特定のウェイクロックの種類が明示的に言及されていない限り、このセクションは各ウェイクロックの種類に等しくかつ独立に適用されます。
ユーザーエージェントは、基盤となるオペレーティングシステムにロックの適用を要求することで、ウェイクロックを取得します。基盤OSへの要求の返り値は確認されません。言い換えると、ユーザーエージェントはウェイクロックの取得を助言的なものとして取り扱うMUSTです。
逆に、ユーザーエージェントは、基盤となるオペレーティングシステムにウェイクロックの適用をやめるよう要求することでウェイクロックを解除します。ロックは、オペレーティングシステムへの要求が成功した場合にのみ解除されたものと見なされます。
オペレーティングシステムの状態がロックの適用を許可する場合(例:十分なバッテリー残量がある)、ウェイクロックは適用可能です。
スクリーンウェイクロックは、ユーザーが手動で画面をオフにした後、再びオンにするまで適用可能であってはMUST NOTです。
ユーザーエージェントはいつでもウェイクロックを解除してもかまいません。例えば次の場合です:
Document document が
完全にアクティブでなくなったとき、ユーザーエージェントは次の手順を実行しなければなりません:
[[ActiveLocks]]["screen"] 内)について:
この仕様は、ページ可視性変更の手順として、visibility state の state と document に対し、次を定義します:
hidden" でない場合、これらの手順を中断する。
[[ActiveLocks]]["screen"] 内)について:
指定された type のウェイクロックを取得するには、次の手順を実行します:
指定された document、 lock、および type のウェイクロックを解除するには、次の手順を実行します:
[[ActiveLocks]][type] が lock
を含まないなら、これらの手順を中断する。
[[ActiveLocks]][type] から取り除く。
[[ActiveLocks]][type] が空なら、以下を並列で実行する:
true、それ以外は false とする。
true で、かつ type が "screen" なら、次を実行する:
[[Released]] を true に設定する。
release"、対象は lock。
スクリーンウェイクロックは、特にディスプレイなどの各種デバイスコンポーネントを、通常より高い電力レベルで動作させる可能性があります。これは、デバイスの自動ロックを妨げたり、バッテリーの減りを早めたりするなど、望ましくない影響をもたらすことがあります。バッテリーの減りが早まることは、定常的な電源がすぐに得られないことが多いモバイルデバイスにとって、特に懸念事項です。予期せぬ時点でバッテリーが完全に消耗すると、ユーザーが通話やネットワークサービス(緊急通話サービスを含む)を利用できなくなる可能性があります。
例えば、バッテリー容量が低い場合や、ユーザーがデバイスを省電力モードにした場合など、実装はスクリーンウェイクロックの要求を無視してもMAYです。
ユーザーエージェントは、スクリーンウェイクロックが有効であることをユーザーが認識できる UI やインジケーターを提供することがRECOMMENDEDです。そうした UI を提供することで、特定のウェブアプリケーションがデバイスに悪影響(エネルギー面)を与えているかどうかをエンドユーザーが特定し、必要に応じて対処できるようになります。
このセクションは規範的ではありません。
function tryKeepScreenAlive(minutes) {
navigator.wakeLock.request("screen").then(lock => {
setTimeout(() => lock.release(), minutes * 60 * 1000);
});
}
tryKeepScreenAlive(10);
この例では、ユーザーがチェックボックスをクリックしてスクリーンウェイクロックを要求できますが、ウェイクロックの状態が変わった場合にはチェックボックスのチェック状態を更新します。
const checkbox = document.createElement("input");
checkbox.setAttribute("type", "checkbox");
document.body.appendChild(checkbox);
const sentinel = await navigator.wakeLock.request("screen");
checkbox.checked = !sentinel.released;
sentinel.onrelease = () => checkbox.checked = !sentinel.released;
この例では、2つの異なるウェイクロック要求を作成し、独立して解除します:
let lock1 = await navigator.wakeLock.request("screen");
let lock2 = await navigator.wakeLock.request("screen");
lock1.release();
lock2.release();
非規範とマークされたセクションに加えて、この仕様のすべての執筆ガイドライン、図、例、注記は非規範です。それ以外の本仕様の内容はすべて規範です。
このドキュメントにおける MAY、MUST、MUST NOT、および RECOMMENDED というキーワードは、 BCP 14 [RFC2119] および [RFC8174] に記載されるとおりに解釈されるものとします。ここで示すように、それらがすべて大文字で現れる場合に限ります。
この仕様は、単一の製品、すなわち本仕様に含まれるインターフェースを実装する ユーザーエージェントの適合性基準を定義します。
このセクションは規範的ではありません。
本作業への貢献に対し、Mounir Lamouri、Sergey Konstantinov、Matvey Larionov、Dominique Hazael-Massieux、Domenic Denicola、Thomas Steiner、Anne van Kesteren の皆様に深く感謝します。
このセクションは規範的ではありません。
このセクションでは、以前の公開以降の変更点を記録します。
WakeLock.request() にif
aborted の手順を追加。
ScreenWakeLock を構築可能に。
WakeLockSentinel.released を追加。
[[ActiveLocks]](Document
の内部スロット)
§6.1
onrelease(WakeLockSentinel
の属性)
§9.5
release()(WakeLockSentinel
のメソッド)
§9.4
released(WakeLockSentinel
の属性)
§9.2
[[Released]](WakeLockSentinel の内部スロット)
§9.1
request()(WakeLock
のメソッド)
§8.1
"screen"(WakeLockType の列挙値)
§10.
type(WakeLockSentinel の属性)
§9.3
wakeLock(Navigator の属性)
§7.
WakeLock インターフェース
§8.
WakeLockSentinel インターフェース
§9.
WakeLockType 列挙型
§10.
Document インターフェース
EventTarget インターフェース
EventHandler
Document に対して)
Document に対する visibility state)
Window
インターフェース
list に対して)
list に対して)
list に対して)
denied(PermissionState に対して)
boolean
型
DOMException インターフェース
[Exposed] 拡張属性
NotAllowedError 例外
Promise インターフェース
[SameObject] 拡張属性
[SecureContext] 拡張属性
undefined 型
WebIDL[SecureContext]
partial interface Navigator {
[SameObject] readonly attribute WakeLock wakeLock;
};
[SecureContext, Exposed=(Window)]
interface WakeLock {
Promise<WakeLockSentinel> request(optional WakeLockType type = "screen");
};
[SecureContext, Exposed=(Window)]
interface WakeLockSentinel : EventTarget {
readonly attribute boolean released;
readonly attribute WakeLockType type;
Promise<undefined> release();
attribute EventHandler onrelease;
};
enum WakeLockType { "screen" };
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: