バッテリーステータスAPI

W3C作業草案

この文書の詳細情報
このバージョン:
https://www.w3.org/TR/2024/WD-battery-status-20241024/
最新公開バージョン:
https://www.w3.org/TR/battery-status/
編集者ドラフト:
https://w3c.github.io/battery/
履歴:
https://www.w3.org/standards/history/battery-status/
コミット履歴
テストスイート:
https://wpt.live/battery-status/
実装レポート:
https://wpt.fyi/results/battery-status
編集者:
Anssi Kostiainen (Intel Corporation)
以前の編集者:
Raphael Kubo da Costa (Intel Corporation)
Mounir Lamouri (Google Inc.)(以前はMozilla)
フィードバック:
GitHub w3c/battery (プルリクエスト, 新規課題, 公開課題)
public-device-apis@w3.org 件名 [battery-status] … メッセージトピック … (アーカイブ)

概要

本仕様は、ホストデバイスのバッテリー状態に関する情報を提供するAPIを定義します。

この文書のステータス

このセクションは、本書の公開時点でのステータスについて説明しています。現行のW3C の出版物と、この技術レポートの最新版は、W3C技術レポート一覧 https://www.w3.org/TR/ で確認できます。

Devices and Sensors Working Groupは、本仕様に編集上の近代化を適用し、APIのセキュリティ及びプライバシーの側面について自己レビューと改訂を行い、水平レビューを申請する前に一巡します。既存の セキュリティとプライバシーの課題が公開されています。

本書はDevices and Sensors Working Groupによって 勧告プロセスを用いて作業草案として公開されました。

作業草案として公開された文書は、W3Cおよびそのメンバーによる承認を意味するものではありません。

本書はドラフト文書であり、いつでも更新・置換・廃止される可能性があります。進行中の作業以外の目的で本書を引用することは適切ではありません。

本書は W3C 特許ポリシーの下で活動するグループによって作成されました。 W3Cは、グループの成果物に関連する公開特許開示リストを管理しています。 そのページには特許開示の手続きも記載されています。個人が本仕様に関連する 必須請求項 を含む特許について知っている場合は、 W3C特許ポリシー第6節 に従い開示する必要があります。

本書は 2023年11月3日W3Cプロセス文書に従って管理されています。

1. はじめに

このセクションは非規範的です。

Battery Status API仕様は、ウェブ開発者がホストデバイスのバッテリー状態をプログラムで取得する手段を定義します。 デバイスのバッテリー状態が分からない場合、ウェブ開発者は十分なバッテリーレベルを前提としてウェブアプリケーションを設計する必要があります。 そのため、バッテリー状態に基づいて判断できないことで、デバイスのバッテリーが期待よりも早く消耗してしまう可能性があります。 バッテリー状態の情報があれば、ウェブ開発者は省電力なウェブコンテンツやアプリケーションを作成でき、ユーザー体験の向上につながります。 ただし、このAPIの単純な実装はバッテリー寿命に悪影響を及ぼす可能性があることに注意してください。

Battery Status APIは、デバイスが充電中でない場合やバッテリー残量が少ない場合に、作業を遅延または縮小するために利用できます。 例えば、高度なウェブアプリケーションの典型例であるウェブメールクライアントは、デバイスが充電中であれば数秒ごとに新着メールをサーバーに問い合わせますが、充電していない場合やバッテリー残量が少ない場合は問い合わせ頻度を減らします。 また、ウェブベースのワープロでは、バッテリー切れによるデータ損失を防ぐために、バッテリー残量を監視してバッテリーがなくなる前に変更内容を保存できます。

2. 適合性

非規範的と記載されたセクションのほか、著作ガイドライン、図、例、注記はすべて非規範的です。それ以外はすべて規範的です。

本書におけるMAYMUSTSHOULDなどのキーワードは、 BCP 14 [RFC2119] [RFC8174] に記載されているとおり、ここに示すようにすべて大文字で現れる場合のみ適用されます。

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

3. セキュリティとプライバシーに関する考慮事項

本仕様で定義されるAPIは、ホストデバイスのバッテリー状態を取得するために利用されます。

ユーザーエージェントは、バッテリー状態情報の高精度な読み取り値を公開すべきではありません。これは新たなフィンガープリンティングベクトルとなる可能性があるためです。

ユーザーエージェントは、ユーザーにバッテリー状態情報へのアクセスを求めてもよく、あるいはプライベートブラウジングモードではユーザー権限要件を強制してもよいです。

ユーザーエージェントは、スクリプトによるAPI利用を目立たない方法でユーザーに通知し、透明性を高めるとともに、ユーザーがAPIアクセスを取り消せるようにすべきです。

ユーザーエージェントは、ホストデバイスにバッテリーがない・充電中である・偽の値を公開しているかどうかを著者が直接知ることができないよう、公開値を難読化してもよいです。

4. 概念

本仕様で言及されるタスクソースは、バッテリーステータスタスクソースです。

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

WebIDL[SecureContext]
partial interface Navigator {
  Promise<BatteryManager> getBattery();
};

このメソッドはPR #51まで非セキュアコンテキストでも公開されていました。

5.1 内部スロット

内部スロット 初期値 説明
[[BatteryPromise]] null Promiseは、getBattery()の呼び出しで返されます。
[[BatteryManager]] null BatteryManager インスタンスは、 NavigatorgetBattery()によって作成された後に関連付けられます。

5.2 getBattery() メソッド

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

  1. this.[[BatteryPromise]]nullなら、 新しいPromisethis関連realmで設定する。
  2. this関連グローバルオブジェクト関連付けられたDocumentが "battery" ポリシー制御機能の利用を 許可されていない場合、 reject this.[[BatteryPromise]]に "NotAllowedError" DOMExceptionを返す。
  3. それ以外の場合:
    1. this.[[BatteryManager]]nullなら、 新しい BatteryManagerthis関連realmで作成する。
    2. resolve this.[[BatteryPromise]]this.[[BatteryManager]]を設定する。
  4. this.[[BatteryPromise]]を返す。

6. BatteryManager インターフェイス

WebIDL[SecureContext, Exposed=Window]
interface BatteryManager : EventTarget {
    readonly        attribute boolean             charging;
    readonly        attribute unrestricted double chargingTime;
    readonly        attribute unrestricted double dischargingTime;
    readonly        attribute double              level;
                    attribute EventHandler        onchargingchange;
                    attribute EventHandler        onchargingtimechange;
                    attribute EventHandler        ondischargingtimechange;
                    attribute EventHandler        onlevelchange;
};

BatteryManager インターフェイスは、ホストデバイスの 現在のバッテリー状態情報 を表します。

ユーザーエージェントは、何らかの属性値を報告できない場合、例えばユーザーやシステムの設定、制限などにより、バッテリー状態情報を報告できないとされます。

6.1 内部スロット

BatteryManager インスタンスは、以下の 内部スロット を持って作成されます:

内部スロット 初期値
[[Charging]] true
[[ChargingTime]] 0
[[DischargingTime]] 正の無限大
[[Level]] 1.0

6.1.1 [[Charging]] 内部スロット

[[Charging]] 内部スロットは、システムバッテリーの充電状態を表します。バッテリーが放電中の場合は false に、充電中の場合、状態を報告できない場合、バッテリーがシステムに接続されていない場合、その他の場合は true に設定 しなければならない

システムバッテリーの充電状態が変化したとき、ユーザーエージェントは バッテリー状態を更新して通知 アルゴリズムを、[[Charging]]true または false(充電か放電か)、および "chargingchange" を用いて実行しなければなりません。

6.1.2 [[ChargingTime]] 内部スロット

[[ChargingTime]] 内部スロットは、システムバッテリーがフル充電になるまでの残り時間(秒)を表します。バッテリーが満タンの場合やバッテリーが接続されていない場合は 0 に、放電中の場合、残り充電時間を報告できない場合、その他の場合は正の無限大に設定 しなければならない

バッテリーの充電時間が更新された際、ユーザーエージェントは バッテリー状態を更新して通知 アルゴリズムを、[[ChargingTime]]、新しい充電時間(秒)、および "chargingtimechange" を用いて実行します。

6.1.3 [[DischargingTime]] 内部スロット

[[DischargingTime]] 属性は、システムバッテリーが完全に放電し、システムがサスペンドされるまでの残り時間(秒)を表します。バッテリーが充電中の場合、残り放電時間を報告できない場合、バッテリーが接続されていない場合、その他の場合は正の無限大に設定 しなければならない

バッテリーの放電時間が更新された際、ユーザーエージェントは バッテリー状態を更新して通知 アルゴリズムを、[[DischargingTime]]、新しい放電時間(秒)、および "dischargingtimechange" を用いて実行します。

6.1.4 [[Level]] 内部スロット

[[Level]] 内部スロットは、システムバッテリーのレベルを表します。バッテリーが枯渇しシステムがサスペンド直前の場合は 0 に、バッテリーが満タンの場合、レベルを報告できない場合、バッテリーが接続されていない場合は 1.0 に設定 しなければならない

バッテリーレベルが更新された際、ユーザーエージェントは バッテリー状態を更新して通知 アルゴリズムを、[[Level]]、新しいバッテリーレベル、および "levelchange" を用いて実行します。

"chargingtimechange"、"dischargingtimechange"、および "levelchange" イベントがどのくらいの頻度で発火されるかは実装に委ねられています。

6.2 charging 属性

charging の getter 手順は、this.[[Charging]] を返します。

6.3 chargingTime 属性

chargingTime の getter 手順は、this.[[ChargingTime]] を返します。

6.4 dischargingTime 属性

dischargingTime の getter 手順は、this.[[DischargingTime]] を返します。

6.5 level 属性

level の getter 手順は、this.[[Level]] を返します。

6.6 イベントハンドラ

以下は、イベントハンドラ(および対応する イベントハンドライベントタイプ)であり、BatteryManager オブジェクトの属性として サポートしなければならない ものです:

イベントハンドラ イベントハンドライベントタイプ
onchargingchange chargingchange
onchargingtimechange chargingtimechange
ondischargingtimechange dischargingtimechange
onlevelchange levelchange

6.7 アルゴリズム

内部スロット slotvalue、および eventName を受け取り、バッテリー状態を更新して通知 するには、以下の手順を実行します:

  1. global現在のグローバルオブジェクト とします。
  2. globalWindow でない場合、この手順を中止します。
  3. navigatorglobal に関連付けられた Navigator とします。
  4. batteryManagernavigator の値、すなわち [[BatteryManager]] とします。
  5. batteryManagernull の場合、この手順を中止します。
  6. グローバルタスクをキュー に、battery status task sourceglobal に指定して、以下の手順を実行します:
    1. batteryManager.slotvalue に設定します。
    2. event を発火 し、名前は eventName、対象は batteryManager です。

6.8 複数バッテリー

ホストデバイスに複数のバッテリーが含まれる場合、BatteryManager はバッテリーの統合ビューを 提供すべき です。

[[Charging]] 内部スロットは、少なくとも1つのバッテリーの充電状態が true の場合は true に、それ以外は false に設定 しなければならない

[[ChargingTime]] 内部スロットは、並列充電の場合は個々のバッテリーの最大充電時間、直列充電の場合は個々の充電時間の合計に設定できます。

[[DischargingTime]] 内部スロットは、並列放電の場合は個々のバッテリーの最大放電時間、直列放電の場合は個々の放電時間の合計に設定できます。

[[Level]] 内部スロットは、同容量のバッテリーの場合はレベルの平均値、容量が異なるバッテリーの場合は容量加重平均に設定できます。

7. Permissions Policyの統合

Battery Status APIは、文字列 "battery" で識別される ポリシー管理機能です。その デフォルト許可リスト'self'です。

8.

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

この簡単な例では、レベルが変化するたびにバッテリーレベルをコンソールに出力します。

// Promiseが解決された時点で初期値を取得...
navigator.getBattery().then(function(battery) {
  console.log(battery.level);
  // ...そして以降の更新も取得
  battery.onlevelchange = function() {
    console.log(this.level);
  };
});

また、addEventListener() メソッドを使った同様の例です:

navigator.getBattery().then(function(battery) {
  console.log(battery.level);
  battery.addEventListener('levelchange', function() {
    console.log(this.level);
  });
});

次の例は、充電状態・レベル・残り時間(分)をインジケーターに表示するものです:

<!DOCTYPE html>
<html>
<head>
  <title>Battery Status API 例</title>
  <script>
    window.onload = function () {
      function updateBatteryStatus(battery) {
        document.querySelector('#charging').textContent = battery.charging ? '充電中' : '未充電';
        document.querySelector('#level').textContent = battery.level;
        document.querySelector('#dischargingTime').textContent = battery.dischargingTime / 60;
      }

      navigator.getBattery().then(function(battery) {
        // Promiseが解決された時点でバッテリー状態を更新
        updateBatteryStatus(battery);

        // 以降の更新にも対応
        battery.onchargingchange = function () {
          updateBatteryStatus(battery);
        };

        battery.onlevelchange = function () {
          updateBatteryStatus(battery);
        };

        battery.ondischargingtimechange = function () {
          updateBatteryStatus(battery);
        };
      });
    };
  </script>
</head>
<body>
  <div id="charging">(充電状態不明)</div>
  <div id="level">(バッテリーレベル不明)</div>
  <div id="dischargingTime">(放電時間不明)</div>
</body>
</html>

A. 索引

A.1 本仕様書で定義される用語

A.2 他の規格で定義される用語

B. IDL索引

WebIDL[SecureContext]
partial interface Navigator {
  Promise<BatteryManager> getBattery();
};

[SecureContext, Exposed=Window]
interface BatteryManager : EventTarget {
    readonly        attribute boolean             charging;
    readonly        attribute unrestricted double chargingTime;
    readonly        attribute unrestricted double dischargingTime;
    readonly        attribute double              level;
                    attribute EventHandler        onchargingchange;
                    attribute EventHandler        onchargingtimechange;
                    attribute EventHandler        ondischargingtimechange;
                    attribute EventHandler        onlevelchange;
};

C. 謝辞

本グループは、プロトタイプ実装に基づく貴重なフィードバックを提供してくれたMounir Lamouri氏、Jonas Sicking氏、そしてMozilla WebAPIチーム全体に深く感謝します。System Information APIやDevice Orientation Event仕様の関係者にも初期の着想を得たことに感謝します。また、Page Visibility仕様の推進者の皆さんにも、導入章の執筆動機となる実際の高付加価値ユースケースについて編集者に気付きを与えてくれたことに感謝します。Device APIs Working Groupの参加者や、実質的なフィードバックやコメントを寄せてくださった皆様にも特別な謝意を表します。そのおかげでWebがより良いものとなりました。最後に、APIのプライバシー分析に携わったLukasz Olejnik氏、Gunes Acar氏、Claude Castelluccia氏、Claudia Diaz氏にも感謝します。

D. 参考文献

D.1 規範的参考文献

[dom]
DOM標準 Anne van Kesteren. WHATWG. 現行標準. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript言語仕様 Ecma International. URL: https://tc39.es/ecma262/multipage/
[html]
HTML標準 Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. 現行標準. URL: https://html.spec.whatwg.org/multipage/
[permissions-policy]
Permissions Policy Ian Clelland. W3C. 2024年9月25日. W3C作業草案. URL: https://www.w3.org/TR/permissions-policy-1/
[RFC2119]
RFCで要件レベルを示すために使うキーワード S. Bradner. IETF. 1997年3月. 最良現行慣行. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
RFC2119キーワードの大文字と小文字の曖昧性 B. Leiba. IETF. 2017年5月. 最良現行慣行. URL: https://www.rfc-editor.org/rfc/rfc8174
[WEBIDL]
Web IDL標準 Edgar Chen; Timothy Gu. WHATWG. 現行標準. URL: https://webidl.spec.whatwg.org/