Battery Status API: implementation for Linux.

Implementation of the Battery Status API for the Linux platform.
Implementation uses DBus to talk to org.freedesktop.UPower service
to obtain battery information.

BUG=122593
TEST=http://jsbin.com/battery-status-test (manual)
TBR=brettw@chromium.org
NOTRY=true

Review URL: https://codereview.chromium.org/436683002

Cr-Commit-Position: refs/heads/master@{#289372}
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@289372 0039d316-1c4b-4281-b951-d872f2087c98
parent d42303ec
...@@ -402,12 +402,16 @@ source_set("browser") { ...@@ -402,12 +402,16 @@ source_set("browser") {
if (is_linux) { if (is_linux) {
if (use_dbus) { if (use_dbus) {
sources -= [ sources -= [
"battery_status/battery_status_manager_default.cc",
"geolocation/empty_wifi_data_provider.cc", "geolocation/empty_wifi_data_provider.cc",
] ]
deps += [ "//dbus" ] deps += [ "//dbus" ]
} else { } else {
# This will already have gotten removed for all non-Linux cases. # This will already have gotten removed for all non-Linux cases.
sources -= [ "geolocation/wifi_data_provider_linux.cc" ] sources -= [
"battery_status/battery_status_manager_linux.cc",
"geolocation/wifi_data_provider_linux.cc",
]
} }
} }
} }
This diff is collapsed.
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_BATTERY_STATUS_BATTERY_STATUS_MANAGER_LINUX_H_
#define CHROME_BROWSER_BATTERY_STATUS_BATTERY_STATUS_MANAGER_LINUX_H_
#include "content/common/content_export.h"
#include "third_party/WebKit/public/platform/WebBatteryStatus.h"
namespace base {
class DictionaryValue;
}
namespace content {
// UPowerDeviceState reflects the possible UPower.Device.State values,
// see upower.freedesktop.org/docs/Device.html#Device:State.
enum UPowerDeviceState {
UPOWER_DEVICE_STATE_UNKNOWN = 0,
UPOWER_DEVICE_STATE_CHARGING = 1,
UPOWER_DEVICE_STATE_DISCHARGING = 2,
UPOWER_DEVICE_STATE_EMPTY = 3,
UPOWER_DEVICE_STATE_FULL = 4,
UPOWER_DEVICE_STATE_PENDING_CHARGE = 5,
UPOWER_DEVICE_STATE_PENDING_DISCHARGE = 6,
};
// Returns the WebBatteryStatus computed using the provided dictionary.
CONTENT_EXPORT blink::WebBatteryStatus ComputeWebBatteryStatus(
const base::DictionaryValue& dictionary);
} // namespace content
#endif // CHROME_BROWSER_BATTERY_STATUS_BATTERY_STATUS_MANAGER_LINUX_H_
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/battery_status/battery_status_manager_linux.h"
#include "base/values.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace content {
namespace {
TEST(BatteryStatusManagerLinuxTest, EmptyDictionary) {
base::DictionaryValue dictionary;
blink::WebBatteryStatus default_status;
blink::WebBatteryStatus status = ComputeWebBatteryStatus(dictionary);
EXPECT_EQ(default_status.charging, status.charging);
EXPECT_EQ(default_status.chargingTime, status.chargingTime);
EXPECT_EQ(default_status.dischargingTime, status.dischargingTime);
EXPECT_EQ(default_status.level, status.level);
}
TEST(BatteryStatusManagerLinuxTest, ChargingHalfFull) {
base::DictionaryValue dictionary;
dictionary.SetDouble("State", UPOWER_DEVICE_STATE_CHARGING);
dictionary.SetDouble("TimeToFull", 0);
dictionary.SetDouble("Percentage", 50);
blink::WebBatteryStatus status = ComputeWebBatteryStatus(dictionary);
EXPECT_TRUE(status.charging);
EXPECT_EQ(std::numeric_limits<double>::infinity(), status.chargingTime);
EXPECT_EQ(std::numeric_limits<double>::infinity(), status.dischargingTime);
EXPECT_EQ(0.5, status.level);
}
TEST(BatteryStatusManagerLinuxTest, ChargingTimeToFull) {
base::DictionaryValue dictionary;
dictionary.SetDouble("State", UPOWER_DEVICE_STATE_CHARGING);
dictionary.SetDouble("TimeToFull", 100.f);
dictionary.SetDouble("Percentage", 1);
blink::WebBatteryStatus status = ComputeWebBatteryStatus(dictionary);
EXPECT_TRUE(status.charging);
EXPECT_EQ(100, status.chargingTime);
EXPECT_EQ(std::numeric_limits<double>::infinity(), status.dischargingTime);
EXPECT_EQ(.01, status.level);
}
TEST(BatteryStatusManagerLinuxTest, FullyCharged) {
base::DictionaryValue dictionary;
dictionary.SetDouble("State", UPOWER_DEVICE_STATE_FULL);
dictionary.SetDouble("TimeToFull", 100);
dictionary.SetDouble("TimeToEmpty", 200);
dictionary.SetDouble("Percentage", 100);
blink::WebBatteryStatus status = ComputeWebBatteryStatus(dictionary);
EXPECT_TRUE(status.charging);
EXPECT_EQ(0, status.chargingTime);
EXPECT_EQ(std::numeric_limits<double>::infinity(), status.dischargingTime);
EXPECT_EQ(1, status.level);
}
TEST(BatteryStatusManagerLinuxTest, Discharging) {
base::DictionaryValue dictionary;
dictionary.SetDouble("State", UPOWER_DEVICE_STATE_DISCHARGING);
dictionary.SetDouble("TimeToFull", 0);
dictionary.SetDouble("TimeToEmpty", 200);
dictionary.SetDouble("Percentage", 90);
blink::WebBatteryStatus status = ComputeWebBatteryStatus(dictionary);
EXPECT_FALSE(status.charging);
EXPECT_EQ(std::numeric_limits<double>::infinity(), status.chargingTime);
EXPECT_EQ(200, status.dischargingTime);
EXPECT_EQ(.9, status.level);
}
TEST(BatteryStatusManagerLinuxTest, DischargingTimeToEmptyUnknown) {
base::DictionaryValue dictionary;
dictionary.SetDouble("State", UPOWER_DEVICE_STATE_DISCHARGING);
dictionary.SetDouble("TimeToFull", 0);
dictionary.SetDouble("TimeToEmpty", 0);
dictionary.SetDouble("Percentage", 90);
blink::WebBatteryStatus status = ComputeWebBatteryStatus(dictionary);
EXPECT_FALSE(status.charging);
EXPECT_EQ(std::numeric_limits<double>::infinity(), status.chargingTime);
EXPECT_EQ(std::numeric_limits<double>::infinity(), status.dischargingTime);
EXPECT_EQ(.9, status.level);
}
TEST(BatteryStatusManagerLinuxTest, DeviceStateUnknown) {
base::DictionaryValue dictionary;
dictionary.SetDouble("State", UPOWER_DEVICE_STATE_UNKNOWN);
dictionary.SetDouble("TimeToFull", 0);
dictionary.SetDouble("TimeToEmpty", 0);
dictionary.SetDouble("Percentage", 50);
blink::WebBatteryStatus status = ComputeWebBatteryStatus(dictionary);
EXPECT_TRUE(status.charging);
EXPECT_EQ(std::numeric_limits<double>::infinity(), status.chargingTime);
EXPECT_EQ(std::numeric_limits<double>::infinity(), status.dischargingTime);
EXPECT_EQ(.5, status.level);
}
TEST(BatteryStatusManagerLinuxTest, DeviceStateEmpty) {
base::DictionaryValue dictionary;
dictionary.SetDouble("State", UPOWER_DEVICE_STATE_EMPTY);
dictionary.SetDouble("TimeToFull", 0);
dictionary.SetDouble("TimeToEmpty", 0);
dictionary.SetDouble("Percentage", 0);
blink::WebBatteryStatus status = ComputeWebBatteryStatus(dictionary);
EXPECT_FALSE(status.charging);
EXPECT_EQ(std::numeric_limits<double>::infinity(), status.chargingTime);
EXPECT_EQ(std::numeric_limits<double>::infinity(), status.dischargingTime);
EXPECT_EQ(0, status.level);
}
TEST(BatteryStatusManagerLinuxTest, LevelRoundedToThreeSignificantDigits) {
base::DictionaryValue dictionary;
dictionary.SetDouble("State", UPOWER_DEVICE_STATE_DISCHARGING);
dictionary.SetDouble("Percentage", 14.56);
blink::WebBatteryStatus status = ComputeWebBatteryStatus(dictionary);
EXPECT_FALSE(status.charging);
EXPECT_EQ(std::numeric_limits<double>::infinity(), status.chargingTime);
EXPECT_EQ(std::numeric_limits<double>::infinity(), status.dischargingTime);
EXPECT_EQ(0.15, status.level);
}
} // namespace
} // namespace content
...@@ -374,6 +374,8 @@ ...@@ -374,6 +374,8 @@
'browser/battery_status/battery_status_manager_android.h', 'browser/battery_status/battery_status_manager_android.h',
'browser/battery_status/battery_status_manager_chromeos.cc', 'browser/battery_status/battery_status_manager_chromeos.cc',
'browser/battery_status/battery_status_manager_default.cc', 'browser/battery_status/battery_status_manager_default.cc',
'browser/battery_status/battery_status_manager_linux.cc',
'browser/battery_status/battery_status_manager_linux.h',
'browser/battery_status/battery_status_manager_mac.cc', 'browser/battery_status/battery_status_manager_mac.cc',
'browser/battery_status/battery_status_manager.h', 'browser/battery_status/battery_status_manager.h',
'browser/battery_status/battery_status_message_filter.cc', 'browser/battery_status/battery_status_message_filter.cc',
...@@ -1849,6 +1851,7 @@ ...@@ -1849,6 +1851,7 @@
}], }],
['OS == "linux" and use_dbus==1', { ['OS == "linux" and use_dbus==1', {
'sources!': [ 'sources!': [
'browser/battery_status/battery_status_manager_default.cc',
'browser/geolocation/empty_wifi_data_provider.cc', 'browser/geolocation/empty_wifi_data_provider.cc',
], ],
'dependencies': [ 'dependencies': [
...@@ -1857,6 +1860,7 @@ ...@@ -1857,6 +1860,7 @@
], ],
}, { # OS != "linux" or use_dbus==0 }, { # OS != "linux" or use_dbus==0
'sources!': [ 'sources!': [
'browser/battery_status/battery_status_manager_linux.cc',
'browser/geolocation/wifi_data_provider_linux.cc', 'browser/geolocation/wifi_data_provider_linux.cc',
], ],
}], }],
......
...@@ -404,6 +404,7 @@ ...@@ -404,6 +404,7 @@
'browser/appcache/mock_appcache_storage.cc', 'browser/appcache/mock_appcache_storage.cc',
'browser/appcache/mock_appcache_storage.h', 'browser/appcache/mock_appcache_storage.h',
'browser/appcache/mock_appcache_storage_unittest.cc', 'browser/appcache/mock_appcache_storage_unittest.cc',
'browser/battery_status/battery_status_manager_linux_unittest.cc',
'browser/battery_status/battery_status_service_unittest.cc', 'browser/battery_status/battery_status_service_unittest.cc',
'browser/browser_thread_unittest.cc', 'browser/browser_thread_unittest.cc',
'browser/browser_url_handler_impl_unittest.cc', 'browser/browser_url_handler_impl_unittest.cc',
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment