Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang). W3C liability, trademark and permissive document license rules apply.
This section describes the status of this document at the time of its publication. A list of current W3C publications and the latest revision of this technical report can be found in the W3C technical reports index at https://www.w3.org/TR/.
The Devices and Sensors Working Group will apply editorial modernizations to this specification, perform a round of self-review and revisions on the security and privacy aspects of the API before requesting horizontal review. Existing security and privacy issues are available.
This document was published by the Devices and Sensors Working Group as a Working Draft using the Recommendation track.
Publication as a Working Draft does not imply endorsement by W3C and its Members.
This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.
This document was produced by a group operating under the W3C Patent Policy. W3C maintains a public list of any patent disclosures made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains Essential Claim(s) must disclose the information in accordance with section 6 of the W3C Patent Policy.
This document is governed by the 2 November 2021 W3C Process Document.
This section is non-normative.
The Battery Status API specification defines a means for web developers to programmatically determine the battery status of the hosting device. Without knowing the battery status of a device, a web developer must design the web application with an assumption of sufficient battery level for the task at hand. This means the battery of a device may exhaust faster than desired because web developers are unable to make decisions based on the battery status. Given knowledge of the battery status, web developers are able to craft web content and applications which are power-efficient, thereby leading to improved user experience. Authors should be aware, however, that a naïve implementation of this API can negatively affect the battery life.
The Battery Status API can be used to defer or scale back work when the device is not charging in or is low on battery. An archetype of an advanced web application, a web-based email client, may check the server for new email every few seconds if the device is charging, but do so less frequently if the device is not charging or is low on battery. Another example is a web-based word processor which could monitor the battery level and save changes before the battery runs out to prevent data loss.
As well as sections marked as non-normative, all authoring guidelines, diagrams, examples, and notes in this specification are non-normative. Everything else in this specification is normative.
The key words MAY, MUST, and SHOULD in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.
This specification defines conformance criteria that apply to a single product: the user agent that implements the interfaces that it contains.
The API defined in this specification is used to determine the battery status of the hosting device.
The user agent SHOULD not expose high precision readouts of battery status information as that can introduce a new fingerprinting vector.
The user agent MAY ask the user for battery status information access, or alternatively, enforce the user permission requirement in its private browsing modes.
The user agent SHOULD inform the user of the API use by scripts in an unobtrusive manner to aid transparency and to allow the user to revoke the API access.
The user agent MAY obfuscate the exposed value in a way that authors cannot directly know if a hosting device has no battery, is charging or is exposing fake values.
The task source for the tasks mentioned in this specification is the battery status task source.
BatteryManager interface
      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;
};
      
        The BatteryManager interface represents the current
        battery status information of the hosting device.
      
The user agent is said to be unable to report the battery status information if it is not able to report the values for any of the attributes, for example, due to a user or system preference, setting, or limitation.
          BatteryManager instances are created with the following
          internal
          slots:
        
| Internal slot | Initial value | 
|---|---|
| [[Charging]] | true | 
| [[ChargingTime]] | 0 | 
| [[DischargingTime]] | Positive Infinity | 
| [[Level]] | 1.0 | 
[[Charging]] internal slot
          
            The [[Charging]] internal slot represents the
            charging state of the system's battery. It MUST be set to false
            if the battery is discharging, and set to true if the battery is
            charging, the implementation is unable to report the state, or
            there is no battery attached to the system, or otherwise.
          
            When the system battery's charging state changes, the user agent
            must run the update the battery status and notify algorithm
            with [[Charging]], true or false depending
            on whether the battery is charging or discharging, and
            "chargingchange".
          
[[ChargingTime]] internal slot
          
            The [[ChargingTime]] internal slot represents
            the remaining time in seconds until the system's battery is fully
            charged. It MUST be set to 0 if the battery is full or there is no
            battery attached to the system, and to the value positive Infinity
            if the battery is discharging, the implementation is unable to
            report the remaining charging time, or otherwise.
          
            When the battery charging time is updated, the user agent must run
            the update the battery status and notify algorithm with
            [[ChargingTime]], the new charging time in
            seconds, and "chargingtimechange".
          
[[DischargingTime]] internal slot
          
            The [[DischargingTime]] attribute represents the
            remaining time in seconds until the system's battery is completely
            discharged and the system is about to be suspended. It MUST be set
            to the value positive Infinity if the battery is charging, the
            implementation is unable to report the remaining discharging time,
            there is no battery attached to the system, or otherwise.
          
            When the battery discharging time is updated, the user agent must
            run the update the battery status and notify algorithm with
            [[DischargingTime]], the new discharging time in
            seconds, and "dischargingtimechange".
          
[[Level]] internal slot
          
            The [[Level]] internal slot represents the
            system's battery's level. It MUST be set to 0 if the system's
            battery is depleted and the system is about to be suspended, and to
            1.0 if the battery is full, the implementation is unable to report
            the battery's level, or there is no battery attached to the system.
          
            When the battery level is updated, the user agent must run the
            update the battery status and notify algorithm with
            [[Level]], the new battery level, and
            "levelchange".
          
          The definition of how often the "chargingtimechange",
          "dischargingtimechange", and "levelchange" events are fired
          is left to the implementation.
        
charging attribute
        
          The charging getter steps are to return
          this.[[Charging]].
        
chargingTime attribute
        
          The chargingTime getter steps are to return
          this.[[ChargingTime]].
        
dischargingTime attribute
        
          The dischargingTime getter steps are to return
          this.[[DischargingTime]].
        
level attribute
        
          The following are the event handlers (and their corresponding
          event handler event types) that MUST be supported as
          attributes by the BatteryManager object:
        
| event handler | event handler event type | 
|---|---|
| onchargingchange | chargingchange | 
| onchargingtimechange | chargingtimechange | 
| ondischargingtimechange | dischargingtimechange | 
| onlevelchange | levelchange | 
To update the battery status and notify given an internal slot slot, a value and an eventName, run the following steps:
Window, abort these steps.
          Navigator.
          [[BatteryManager]].
          null, abort these steps.
          
          If a hosting device contains more than one battery,
          BatteryManager SHOULD expose a unified view of the batteries.
        
          The [[Charging]] internal slot MUST be set to true
          if at least one battery's charging state as described above is true.
          Otherwise, it MUST be set to false.
        
          The [[ChargingTime]] internal slot can be set to
          the maximum charging time of the individual batteries if charging in
          parallel, and to the sum of the individual charging times if charging
          serially.
        
          The [[DischargingTime]] internal slot can be set
          to the maximum discharging time of the individual batteries if
          discharging in parallel, and to the sum of individual discharging
          times if discharging serially.
        
          The [[Level]] internal slot can be set to the
          average of the levels of batteries of same capacity, or the weighted
          average of the battery levels for batteries of different capacities.
        
        The Battery Status API is a policy-controlled feature identified
        by the string "battery". Its default allowlist is
        'self'.
      
This section is non-normative.
This trivial example writes the battery level to the console each time the level changes:
// We get the initial value when the promise resolves ...
navigator.getBattery().then(function(battery) {
  console.log(battery.level);
  // ... and any subsequent updates.
  battery.onlevelchange = function() {
    console.log(this.level);
  };
});
        Alternatively, the same using the addEventListener()
        method:
      
navigator.getBattery().then(function(battery) {
  console.log(battery.level);
  battery.addEventListener('levelchange', function() {
    console.log(this.level);
  });
});The following example updates the indicators to show the charging state, level and time remaining in minutes:
<!DOCTYPE html>
<html>
<head>
  <title>Battery Status API Example</title>
  <script>
    window.onload = function () {
      function updateBatteryStatus(battery) {
        document.querySelector('#charging').textContent = battery.charging ? 'charging' : 'not charging';
        document.querySelector('#level').textContent = battery.level;
        document.querySelector('#dischargingTime').textContent = battery.dischargingTime / 60;
      }
      navigator.getBattery().then(function(battery) {
        // Update the battery status initially when the promise resolves ...
        updateBatteryStatus(battery);
        // .. and for any subsequent updates.
        battery.onchargingchange = function () {
          updateBatteryStatus(battery);
        };
        battery.onlevelchange = function () {
          updateBatteryStatus(battery);
        };
        battery.ondischargingtimechange = function () {
          updateBatteryStatus(battery);
        };
      });
    };
  </script>
</head>
<body>
  <div id="charging">(charging state unknown)</div>
  <div id="level">(battery level unknown)</div>
  <div id="dischargingTime">(discharging time unknown)</div>
</body>
</html>BatteryManager interface
    §6.[[BatteryManager]] internal slot for Navigator
    §5.1[[BatteryPromise]] internal slot for Navigator
    §5.1charging attribute for BatteryManager
    §6.2[[Charging]] internal slot for BatteryManager
    §6.1chargingTime attribute for BatteryManager
    §6.3[[ChargingTime]] internal slot for BatteryManager
    §6.1dischargingTime attribute for BatteryManager
    §6.4[[DischargingTime]] internal slot for BatteryManager
    §6.1getBattery() method for Navigator
    §5.2level attribute for BatteryManager
    §6.5[[Level]] internal slot for BatteryManager
    §6.1onchargingchange attribute for BatteryManager
    §6.6onchargingtimechange attribute for BatteryManager
    §6.6ondischargingtimechange attribute for BatteryManager
    §6.6onlevelchange attribute for BatteryManager
    §6.6EventTarget interface
  EventHandler
  Window interface
  boolean type
  DOMException interface
  double type
  [Exposed] extended attribute
  NotAllowedError exception
  Promise interface
  [SecureContext] extended attribute
  unrestricted double type
  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;
};The group is deeply indebted to Mounir Lamouri, Jonas Sicking, and the Mozilla WebAPI team in general for their invaluable feedback based on prototype implementations. Many thanks to the people behind the System Information API and Device Orientation Event specification for the initial inspiration. Also thanks to the nice folks bringing us the Page Visibility specification, which motivated the editor of this specification to write the introduction chapter discussing some real-world high value use cases that apply equally to this specification. Special thanks to all the participants of the Device APIs Working Group and others who have sent in substantial feedback and comments, and made the Web a better place for everyone by doing so. Finally, thanks to Lukasz Olejnik, Gunes Acar, Claude Castelluccia, and Claudia Diaz for the privacy analysis of the API.
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: