スクリーンウェイクロック API

W3C 作業草案

このドキュメントの詳細
このバージョン:
https://www.w3.org/TR/2024/WD-screen-wake-lock-20241024/
最新公開バージョン:
https://www.w3.org/TR/screen-wake-lock/
最新編集者ドラフト:
https://w3c.github.io/screen-wake-lock/
履歴:
https://www.w3.org/standards/history/screen-wake-lock/
コミット履歴
テストスイート:
https://wpt.live/screen-wake-lock/
実装レポート:
https://www.w3.org/wiki/DAS/Implementations
編集者:
Kenneth Rohde Christiansen (Intel Corporation)
Marcos Cáceres (Apple Inc.)
以前の編集者:
Raphael Kubo da Costa (Intel Corporation)
(Yandex)
(Yandex)
フィードバック:
GitHub w3c/screen-wake-lock (プルリクエスト, 新しい課題, 公開中の課題)
品質保証リード
Wanming Lin (Intel)

概要

このドキュメントは、ウェブアプリケーションがスクリーンウェイクロックを要求できるAPIを定義します。適切な条件下で許可された場合、スクリーンウェイクロックはシステムがデバイスのスクリーンをオフにするのを防ぎます。

このドキュメントのステータス

このセクションは、公開時点でのこのドキュメントのステータスについて説明します。現在のW3C公開物およびこの技術レポートの最新改訂版は、W3C技術レポートインデックス(https://www.w3.org/TR/)で確認できます。

実装者は、この仕様が非常に不安定であることを認識する必要があります。議論に参加していない実装者は、仕様が互換性のない形で変更されていることに気付くでしょう。この仕様の最終的な候補勧告フェーズ到達前に実装に関心のあるベンダーは、GitHubリポジトリを購読し、議論に参加してください。

このドキュメントはデバイスとセンサー ワーキンググループおよびウェブアプリケーション ワーキンググループによって、勧告トラックを利用しワーキングドラフトとして公開されました。

ワーキングドラフトとしての公開は、W3Cおよびそのメンバーによる承認を意味するものではありません。

このドキュメントはドラフトであり、随時更新・差替え・廃止される可能性があります。進行中の作業以外の文献として引用するのは不適切です。

このドキュメントは、W3C特許ポリシーのもとで活動するグループによって作成されました。 W3Cは、 (デバイスとセンサー ワーキンググループ)特許開示の公開リストおよび (ウェブアプリケーション ワーキンググループ)特許開示の公開リスト を管理しています。各グループの成果物に関して行われた開示はこれらのページで確認でき、特許開示の手順も含まれています。個人が本当に特許の存在を知っていて、その特許が必須クレームを含むと考える場合は、W3C特許ポリシー第6節に従って情報を開示しなければなりません。

このドキュメントは、2023年11月3日 W3Cプロセスドキュメントに準拠しています。

1. はじめに

このセクションは規範的ではありません。

現代のオペレーティングシステムは、積極的な電源管理を実装することで、より長いバッテリー寿命を実現しています。つまり、ユーザー操作がしばらくないと、ホストデバイスは画面の明るさを下げたり、画面をオフにしたり、さらにはCPUを省電力状態に移行させたりして、可能な限り電力消費を抑えます。

これはバッテリー寿命の延長には非常に有効ですが、バーコードのスキャン、電子書籍の読書、レシピの確認、プレゼンテーションなどのユースケースでは妨げになることがあります。詳細は Wake Lock: Use casesもご参照ください。

ウェイクロックは一般的に何かの動作を防止しますが、UA(および基盤となるOS)はバッテリーの状態(AC電源接続、放電中、バッテリー残量低下)に応じてウェイクロックに時間制限を設けたり、省電力モードが有効な場合にはウェイクロック自体を禁止することがあります。

2. ウェイクロック

この仕様では、以下のウェイクロックの種類を定義しています:

  1. スクリーンウェイクロックは、画面がオフになるのを防ぎます。スクリーンウェイクロックは、可視状態のドキュメントのみが取得できます。

APIでは、ウェイクロックの種類WakeLockType列挙型の値で表されます。

他の仕様で異なるウェイクロックの種類が定義される場合があります。

3. ポリシー制御

スクリーンウェイクロックAPIは、ポリシー制御機能を定義しており、識別子は"screen-wake-lock"です。デフォルト許可リスト'self'です。

4. 権限とユーザーへのプロンプト

[PERMISSIONS] APIは、ウェブサイトがユーザーから権限をリクエストしたり、持っている権限を確認したりするための統一した方法を提供します。

ユーザーエージェントは、特定のウェイクロックの種類Documentに対し、プラットフォーム設定やユーザーの好みなどの実装依存の理由でウェイクロックを拒否することができます。

ユーザーエージェントは、ウェイクロックが有効な際に、ユーザーへ通知を表示し、継続中の操作をブロックする手段や、通知を閉じる手段を提供することが推奨されます。

4.1 "screen-wake-lock" の強力な機能

"screen-wake-lock" 強力な機能は、本仕様で定義された機能を有効化します。

4.2 権限アルゴリズム

"screen-wake-lock" 強力な機能は、権限の取り消しアルゴリズムを定義します。スクリーンウェイクロック権限取り消しアルゴリズムを実行するには、以下の手順に従います:

  1. documentを、現在のグローバルオブジェクト関連付けられたDocumentとする。
  2. lockListdocument.[[ActiveLocks]]["screen"]とする。
  3. lockListの各lockについて:
    1. ウェイクロック解除documentlock、および "screen"で実行する。

5. コンセプト

この仕様で言及されたタスクソースは、スクリーンウェイクロックタスクソースです。

プラットフォームウェイクロックとは、ユーザーエージェントが状態を照会したりウェイクロックの取得/解除を行うためにやりとりするプラットフォームインターフェースを指します。

プラットフォームウェイクロックは、基盤となるプラットフォーム(例:ネイティブのウェイクロックフレームワーク)や、ユーザーエージェントが直接ハードウェア制御できる場合はユーザーエージェント自体によって定義されます。

6. Document インターフェースへの拡張

6.1 内部スロット

内部スロット 初期値 説明
[[ActiveLocks]] 順序付きマップで、ウェイクロックの種類を空の リストにマッピングします。 順序付きマップで、ウェイクロックの種類リスト(このWakeLockSentinelオブジェクト)にマッピングします。 このDocumentに関連付けられます。

7. Navigator インターフェースへの拡張

WebIDL[SecureContext]
partial interface Navigator {
  [SameObject] readonly attribute WakeLock wakeLock;
};

8. WakeLock インターフェース

WakeLock インターフェースは、ドキュメントが スクリーンウェイクロック を取得できるようにします。

WebIDL[SecureContext, Exposed=(Window)]
interface WakeLock {
  Promise<WakeLockSentinel> request(optional WakeLockType type = "screen");
};

8.1 request() メソッド

request(type) メソッドの手順は以下の通りです:

  1. document を、this関連グローバルオブジェクト関連付けられた Document とする。
  2. もし document完全にアクティブ でない場合、拒否された promise を "NotAllowedError" DOMException で返す。
  3. もし document利用可能でない 場合、ポリシー制御機能 "screen-wake-lock" を利用できない場合は 拒否された promise を "NotAllowedError" DOMException で返す。
  4. もし ユーザーエージェント がこの type のウェイクロックを document に対して 拒否 した場合、拒否された promise を "NotAllowedError" DOMException で返す。
  5. もし documentvisibility state が "hidden" なら、拒否された promise を "NotAllowedError" DOMException で返す。
  6. promise新しい promise とする。
  7. 以下の手順を 並列で 実行する:
    1. state を "screen-wake-lock" の 使用権限要求 の結果とする。
    2. もし state が "denied" なら:
      1. グローバルタスクをキューするスクリーンウェイクロックタスクソースに、document関連グローバルオブジェクトを指定)、promise を "NotAllowedError" DOMException で拒否する。
      2. これらの手順を中断する。
    3. グローバルタスクをキューするスクリーンウェイクロックタスクソースに、document関連グローバルオブジェクトを指定)、以下の手順を実行:
      1. もし document完全にアクティブ でない場合:
        1. promise を "NotAllowedError" DOMException で拒否する。
        2. これらの手順を中断する。
      2. もし documentvisibility state が "hidden" なら:
        1. promise を "NotAllowedError" DOMException で拒否する。
        2. これらの手順を中断する。
      3. もし document.[[ActiveLocks]]["screen"] 空リスト なら、以下の手順を 並列で 実行:
        1. ウェイクロック取得 を "screen" で呼び出す。
      4. lock を新しい WakeLockSentinel オブジェクト(type 属性に type を設定)とする。
      5. 追加 lockdocument.[[ActiveLocks]]["screen"] に追加。
      6. promiselock で解決する。
  8. promise を返す。

9. WakeLockSentinel インターフェース

WebIDL[SecureContext, Exposed=(Window)]
interface WakeLockSentinel : EventTarget {
  readonly attribute boolean released;
  readonly attribute WakeLockType type;
  Promise<undefined> release();
  attribute EventHandler onrelease;
};

WakeLockSentinel オブジェクトは プラットフォームウェイクロック のハンドルを提供し、手動で解除されるか、基盤となる プラットフォームウェイクロック が解除されるまで保持します。その存在により、指定された ウェイクロックの種類プラットフォームウェイクロック をアクティブに保ち、指定された WakeLockSentinel インスタンスをすべて解除すると、基盤の プラットフォームウェイクロック が解除されます。

9.1 内部スロット

WakeLockSentinel インスタンスは、以下の 内部スロットで作成されます:

内部スロット 初期値 説明(規範的でない)
[[Released]] false 指定された WakeLockSentinel が解除されたかどうか。

9.2 released 属性

released の getter の手順は this.[[Released]] を返すことです。

9.3 type 属性

type の getter の手順は、thisウェイクロックの種類 を返すことです。

9.4 release() メソッド

release() メソッドの手順は以下の通りです:

  1. もし this[[Released]]false なら、 ウェイクロック解除lockthistypethistype 属性の値で呼び出す。
  2. promise を解決する undefined で。

9.5 onrelease 属性

onrelease 属性は、 "onrelease" イベントハンドラーIDL属性 です。 イベントハンドラーイベントタイプは "release" です。

この属性は、指定された WakeLockSentinel オブジェクトのハンドルが解除されたこと(release() メソッドが呼ばれた場合や、ユーザーエージェントがウェイクロックを解除した場合)をスクリプトに通知するために使用されます。

9.6 ガベージコレクション

WakeLockSentinel オブジェクトに "release" のイベントリスナーが1つ以上登録されていて、 WakeLockSentinel オブジェクトがまだ解除されていない場合、 必ず Window オブジェクトからその WakeLockSentinel オブジェクトへの強い参照が存在しなければなりません。

WakeLockSentinel オブジェクトが スクリーンウェイクロックタスクソース にタスクをキューしている間は、 必ず Window オブジェクトからその WakeLockSentinel オブジェクトへの強い参照が存在しなければなりません。

10. WakeLockType 列挙型

ウェイクロックの種類の記述のために、この仕様はウェイクロックの種類を表すための次の列挙型を定義します。

WebIDLenum WakeLockType { "screen" };
screen
スクリーンウェイクロックの種類。

11. ウェイクロックの管理

特定のウェイクロックの種類が明示的に言及されていない限り、このセクションは各ウェイクロックの種類に等しくかつ独立に適用されます。

ユーザーエージェントは、基盤となるオペレーティングシステムにロックの適用を要求することで、ウェイクロックを取得します。基盤OSへの要求の返り値は確認されません。言い換えると、ユーザーエージェントはウェイクロックの取得を助言的なものとして取り扱うMUSTです。

逆に、ユーザーエージェントは、基盤となるオペレーティングシステムにウェイクロックの適用をやめるよう要求することでウェイクロックを解除します。ロックは、オペレーティングシステムへの要求が成功した場合にのみ解除されたものと見なされます。

オペレーティングシステムの状態がロックの適用を許可する場合(例:十分なバッテリー残量がある)、ウェイクロックは適用可能です。

スクリーンウェイクロックは、ユーザーが手動で画面をオフにした後、再びオンにするまで適用可能であってはMUST NOTです。

11.1 自動解除されるウェイクロック

ユーザーエージェントはいつでもウェイクロックを解除してもかまいません。例えば次の場合です:

11.2 ドキュメントの完全な活動喪失の対応

Document document完全にアクティブでなくなったとき、ユーザーエージェントは次の手順を実行しなければなりません:

  1. lockdocument.[[ActiveLocks]]["screen"] 内)について:
    1. ウェイクロック解除を、documentlock、および "screen"で実行する。

11.3 ドキュメントの可視性喪失の対応

この仕様は、ページ可視性変更の手順として、visibility statestatedocument に対し、次を定義します:

  1. state が "hidden" でない場合、これらの手順を中断する。
  2. lockdocument.[[ActiveLocks]]["screen"] 内)について:
    1. ウェイクロック解除を、documentlock、および "screen"で実行する。

11.4 ウェイクロック取得アルゴリズム

指定された type のウェイクロックを取得するには、次の手順を実行します:

  1. type のウェイクロックが適用可能でない場合、これらの手順を中断する。
  2. 基盤となるオペレーティングシステムに、type のウェイクロックを取得するよう求める。

11.5 ウェイクロック解除アルゴリズム

指定された documentlock、および type のウェイクロックを解除するには、次の手順を実行します:

  1. もし document.[[ActiveLocks]][type] が lock を含まないなら、これらの手順を中断する。
  2. lockdocument.[[ActiveLocks]][type] から取り除く。
  3. もし document.[[ActiveLocks]][type] がなら、以下を並列で実行する:
    1. 基盤となるオペレーティングシステムに、type のウェイクロックを解除するよう求め、操作が成功したら successtrue、それ以外は false とする。
    2. もし successtrue で、かつ type"screen" なら、次を実行する:
      1. 画面が実際にオフになるまでの、プラットフォーム固有の非操作タイマーをリセットする。
  4. lock[[Released]]true に設定する。
  5. イベントを発火し、名前は "release"、対象は lock

12. セキュリティおよびプライバシーの考慮事項

スクリーンウェイクロックは、特にディスプレイなどの各種デバイスコンポーネントを、通常より高い電力レベルで動作させる可能性があります。これは、デバイスの自動ロックを妨げたり、バッテリーの減りを早めたりするなど、望ましくない影響をもたらすことがあります。バッテリーの減りが早まることは、定常的な電源がすぐに得られないことが多いモバイルデバイスにとって、特に懸念事項です。予期せぬ時点でバッテリーが完全に消耗すると、ユーザーが通話やネットワークサービス(緊急通話サービスを含む)を利用できなくなる可能性があります。

例えば、バッテリー容量が低い場合や、ユーザーがデバイスを省電力モードにした場合など、実装はスクリーンウェイクロックの要求を無視してもMAYです。

ユーザーエージェントは、スクリーンウェイクロックが有効であることをユーザーが認識できる UI やインジケーターを提供することがRECOMMENDEDです。そうした UI を提供することで、特定のウェブアプリケーションがデバイスに悪影響(エネルギー面)を与えているかどうかをエンドユーザーが特定し、必要に応じて対処できるようになります。

13.

このセクションは規範的ではありません。

1: スクリーンウェイクロックを取得および解除する
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();

14. 適合性

非規範とマークされたセクションに加えて、この仕様のすべての執筆ガイドライン、図、例、注記は非規範です。それ以外の本仕様の内容はすべて規範です。

このドキュメントにおける MAYMUSTMUST NOT、および RECOMMENDED というキーワードは、 BCP 14 [RFC2119] および [RFC8174] に記載されるとおりに解釈されるものとします。ここで示すように、それらがすべて大文字で現れる場合に限ります。

この仕様は、単一の製品、すなわち本仕様に含まれるインターフェースを実装する ユーザーエージェントの適合性基準を定義します。

A. 謝辞

このセクションは規範的ではありません。

本作業への貢献に対し、Mounir Lamouri、Sergey Konstantinov、Matvey Larionov、Dominique Hazael-Massieux、Domenic Denicola、Thomas Steiner、Anne van Kesteren の皆様に深く感謝します。

B. 変更点

このセクションは規範的ではありません。

このセクションでは、以前の公開以降の変更点を記録します。

B.1 2017年12月14日 CR 以降の変更点

C. 索引

C.1 この仕様で定義される用語

C.2 参照によって定義される用語

D. IDL インデックス

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" };

E. 参考文献

E.1 規範的参考文献

[dom]
DOM Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript Language Specification. Ecma International. URL: https://tc39.es/ecma262/multipage/
[html]
HTML Standard. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[infra]
Infra Standard. Anne van Kesteren; Domenic Denicola. WHATWG. Living Standard. URL: https://infra.spec.whatwg.org/
[PERMISSIONS]
Permissions. Marcos Caceres; Mike Taylor. W3C. 19 March 2024. W3C Working Draft. URL: https://www.w3.org/TR/permissions/
[PERMISSIONS-POLICY]
Permissions Policy. Ian Clelland. W3C. 25 September 2024. W3C Working Draft. URL: https://www.w3.org/TR/permissions-policy-1/
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. March 1997. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. May 2017. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[WEBIDL]
Web IDL Standard. Edgar Chen; Timothy Gu. WHATWG. Living Standard. URL: https://webidl.spec.whatwg.org/

E.2 参考情報

[wake-lock-use-cases]
Wake Lock: Use cases. Marcos Caceres; Natasha Rooney; Dominique Hazaël-Massieux. W3C. 14 August 2014. W3C Working Group Note. URL: https://www.w3.org/TR/wake-lock-use-cases/