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"である場合は、次の値で拒否されたプロミスを返します:"NotAllowedError" DOMException。
NotAllowedError" DOMException。
hidden"である場合は、次の値で拒否されたプロミスを返します:"NotAllowedError" DOMException。
screen-wake-lock" に対して実行した結果とします。
denied"である場合:
NotAllowedError"
DOMExceptionで拒否します。
NotAllowedError"
DOMExceptionで拒否します。
hidden"である場合:
NotAllowedError"
DOMExceptionで拒否します。
[[ActiveLocks]]["screen"]が
空である場合は、以下の
手順を並列に
実行します:
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 属性は、イベントハンドラー
IDL 属性であり、"onrelease" イベント
ハンドラー用のものです。そのイベントハンドラーイベント型は
"release"です。
これは、指定されたWakeLockSentinel
オブジェクトのハンドルが、
release()メソッドの
呼び出し、または
ウェイクロックがユーザーエージェントによって解放されたことにより、解放されたことをスクリプトに通知するために使用されます。
WakeLockSentinel オブジェクトに
1 つ以上のイベントリスナーが
「」用として登録されており、かつ
releaseWakeLockSentinel オブジェクトがまだ
解放されていない間は、必ず
Window オブジェクト(
WakeLockSentinel オブジェクトのコンストラクターの
呼び出し元)から、その
WakeLockSentinel オブジェクト自身への強参照が存在しなければなりません。
WakeLockSentinel オブジェクトによって
スクリーンウェイクロックタスクソースにタスクがキューされている間は、必ず
Window オブジェクト(そのWakeLockSentinel オブジェクトの
コンストラクターの呼び出し元)から、その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: