スクリーンウェイクロック 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完全にアクティブでない場合は、次の値で拒否されたプロミスを返します:"NotAllowedError" DOMException
  3. documentについて使用を許可されている状態ではないポリシー制御機能の名前が "screen-wake-lock"である場合は、次の値で拒否されたプロミスを返します:"NotAllowedError" DOMException
  4. ユーザーエージェントウェイクロックを拒否する場合で、その対象がこのtypedocumentに対するものである場合は、次の値で拒否されたプロミスを返します: "NotAllowedError" DOMException
  5. document可視性状態が "hidden"である場合は、次の値で拒否されたプロミスを返します:"NotAllowedError" DOMException
  6. 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. document可視性状態が "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 属性は、イベントハンドラー IDL 属性であり、"onrelease" イベント ハンドラー用のものです。そのイベントハンドラーイベント型は "release"です。

これは、指定されたWakeLockSentinel オブジェクトのハンドルが、 release()メソッドの 呼び出し、または ウェイクロックがユーザーエージェントによって解放されたことにより、解放されたことをスクリプトに通知するために使用されます。

注記
注記

9.6 ガベージコレクション

WakeLockSentinel オブジェクトに 1 つ以上のイベントリスナーが 「release」用として登録されており、かつ WakeLockSentinel オブジェクトがまだ 解放されていない間は、必ず Window オブジェクト( WakeLockSentinel オブジェクトのコンストラクターの 呼び出し元)から、その WakeLockSentinel オブジェクト自身への強参照が存在しなければなりません。

WakeLockSentinel オブジェクトによって スクリーンウェイクロックタスクソースにタスクがキューされている間は、必ず Window オブジェクト(そのWakeLockSentinel オブジェクトの コンストラクターの呼び出し元)から、その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/