diff options
Diffstat (limited to 'toolkit/modules/Battery.jsm')
-rw-r--r-- | toolkit/modules/Battery.jsm | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/toolkit/modules/Battery.jsm b/toolkit/modules/Battery.jsm new file mode 100644 index 000000000..69184d361 --- /dev/null +++ b/toolkit/modules/Battery.jsm @@ -0,0 +1,73 @@ +// -*- Mode: javascript; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +"use strict"; + +/** This module wraps around navigator.getBattery (https://developer.mozilla.org/en-US/docs/Web/API/Navigator.getBattery). + * and provides a framework for spoofing battery values in test code. + * To spoof the battery values, set `Debugging.fake = true` after exporting this with a BackstagePass, + * after which you can spoof a property yb setting the relevant property of the BatteryManager object. + */ +this.EXPORTED_SYMBOLS = ["GetBattery", "Battery"]; + +const Ci = Components.interfaces; +const Cc = Components.classes; +const Cu = Components.utils; + +Cu.import("resource://gre/modules/XPCOMUtils.jsm", this); + +// Load Services, for the BatteryManager API +XPCOMUtils.defineLazyModuleGetter(this, "Services", + "resource://gre/modules/Services.jsm"); + +// Values for the fake battery. See the documentation of Navigator.battery for the meaning of each field. +var gFakeBattery = { + charging: false, + chargingTime: 0, + dischargingTime: Infinity, + level: 1, +} + +// BackendPass-exported object for toggling spoofing +this.Debugging = { + /** + * If `false`, use the DOM Battery implementation. + * Set it to `true` if you need to fake battery values + * for testing or debugging purposes. + */ + fake: false +} + +this.GetBattery = function () { + return new Services.appShell.hiddenDOMWindow.Promise(function (resolve, reject) { + // Return fake values if spoofing is enabled, otherwise fetch the real values from the BatteryManager API + if (Debugging.fake) { + resolve(gFakeBattery); + return; + } + Services.appShell.hiddenDOMWindow.navigator.getBattery().then(resolve, reject); + }); +}; + +this.Battery = {}; + +for (let k of ["charging", "chargingTime", "dischargingTime", "level"]) { + let prop = k; + Object.defineProperty(this.Battery, prop, { + get: function() { + // Return fake value if spoofing is enabled, otherwise fetch the real value from the BatteryManager API + if (Debugging.fake) { + return gFakeBattery[prop]; + } + return Services.appShell.hiddenDOMWindow.navigator.battery[prop]; + }, + set: function(fakeSetting) { + if (!Debugging.fake) { + throw new Error("Tried to set fake battery value when battery spoofing was disabled"); + } + gFakeBattery[prop] = fakeSetting; + } + }) +} |