summaryrefslogtreecommitdiffstats
path: root/device
diff options
context:
space:
mode:
authordarin <darin@chromium.org>2015-03-13 15:44:50 -0700
committerCommit bot <commit-bot@chromium.org>2015-03-13 22:45:22 +0000
commit26cf664e68a886df31cfbacbfe0197e750278cb8 (patch)
tree1112325b3fa6ecbe7590a4e9d5d7e0bd9c1062e0 /device
parent6e54eb96463218b8ee70c298b17d9d5ef78c794a (diff)
downloadchromium_src-26cf664e68a886df31cfbacbfe0197e750278cb8.zip
chromium_src-26cf664e68a886df31cfbacbfe0197e750278cb8.tar.gz
chromium_src-26cf664e68a886df31cfbacbfe0197e750278cb8.tar.bz2
Prohibit multiple, overlapping {geolocation,battery} queries
Motivation: overlapped queries were never needed, and so prohibiting them is a lot simpler than allowing them. Review URL: https://codereview.chromium.org/897213006 Cr-Commit-Position: refs/heads/master@{#320598}
Diffstat (limited to 'device')
-rw-r--r--device/battery/android/java/src/org/chromium/device/battery/BatteryMonitorImpl.java27
-rw-r--r--device/battery/battery_monitor.mojom2
-rw-r--r--device/battery/battery_monitor_impl.cc15
-rw-r--r--device/battery/battery_monitor_impl.h4
4 files changed, 28 insertions, 20 deletions
diff --git a/device/battery/android/java/src/org/chromium/device/battery/BatteryMonitorImpl.java b/device/battery/android/java/src/org/chromium/device/battery/BatteryMonitorImpl.java
index 364e21a..dd0ee5e 100644
--- a/device/battery/android/java/src/org/chromium/device/battery/BatteryMonitorImpl.java
+++ b/device/battery/android/java/src/org/chromium/device/battery/BatteryMonitorImpl.java
@@ -4,28 +4,29 @@
package org.chromium.device.battery;
+import android.util.Log;
+
import org.chromium.mojo.system.MojoException;
import org.chromium.mojom.device.BatteryMonitor;
import org.chromium.mojom.device.BatteryStatus;
-import java.util.ArrayList;
-import java.util.List;
-
/**
* Android implementation of the battery monitor service defined in
* device/battery/battery_monitor.mojom.
*/
public class BatteryMonitorImpl implements BatteryMonitor {
+
+ private static final String TAG = "BatteryMonitorImpl";
+
// Factory that created this instance and notifies it about battery status changes.
private final BatteryMonitorFactory mFactory;
- private final List<QueryNextStatusResponse> mCallbacks;
+ private QueryNextStatusResponse mCallback;
private BatteryStatus mStatus;
private boolean mHasStatusToReport;
private boolean mSubscribed;
public BatteryMonitorImpl(BatteryMonitorFactory batteryMonitorFactory) {
mFactory = batteryMonitorFactory;
- mCallbacks = new ArrayList<QueryNextStatusResponse>();
mHasStatusToReport = false;
mSubscribed = true;
}
@@ -49,7 +50,13 @@ public class BatteryMonitorImpl implements BatteryMonitor {
@Override
public void queryNextStatus(QueryNextStatusResponse callback) {
- mCallbacks.add(callback);
+ if (mCallback != null) {
+ Log.e(TAG, "Overlapped call to queryNextStatus!");
+ unsubscribe();
+ return;
+ }
+
+ mCallback = callback;
if (mHasStatusToReport) {
reportStatus();
@@ -60,16 +67,14 @@ public class BatteryMonitorImpl implements BatteryMonitor {
mStatus = batteryStatus;
mHasStatusToReport = true;
- if (!mCallbacks.isEmpty()) {
+ if (mCallback != null) {
reportStatus();
}
}
void reportStatus() {
- for (QueryNextStatusResponse callback : mCallbacks) {
- callback.call(mStatus);
- }
- mCallbacks.clear();
+ mCallback.call(mStatus);
+ mCallback = null;
mHasStatusToReport = false;
}
}
diff --git a/device/battery/battery_monitor.mojom b/device/battery/battery_monitor.mojom
index 88a43d2..1db7868 100644
--- a/device/battery/battery_monitor.mojom
+++ b/device/battery/battery_monitor.mojom
@@ -10,6 +10,6 @@ interface BatteryMonitor {
// Battery status is reported once it changes or immediately if this is the
// first call to QueryNextStatus on this instance. QueryNextStatus calls may
// be throttled by the service. Overlapping calls to QueryNextStatus are
- // supported.
+ // prohibited and will be treated as a connection error.
QueryNextStatus() => (BatteryStatus status);
};
diff --git a/device/battery/battery_monitor_impl.cc b/device/battery/battery_monitor_impl.cc
index 62cbf60..b538394 100644
--- a/device/battery/battery_monitor_impl.cc
+++ b/device/battery/battery_monitor_impl.cc
@@ -5,6 +5,7 @@
#include "device/battery/battery_monitor_impl.h"
#include "base/bind.h"
+#include "base/logging.h"
namespace device {
@@ -29,7 +30,12 @@ BatteryMonitorImpl::~BatteryMonitorImpl() {
void BatteryMonitorImpl::QueryNextStatus(
const BatteryStatusCallback& callback) {
- callbacks_.push_back(callback);
+ if (!callback_.is_null()) {
+ DVLOG(1) << "Overlapped call to QueryNextStatus!";
+ delete this;
+ return;
+ }
+ callback_ = callback;
if (status_to_report_)
ReportStatus();
@@ -42,14 +48,13 @@ void BatteryMonitorImpl::DidChange(const BatteryStatus& battery_status) {
status_ = battery_status;
status_to_report_ = true;
- if (!callbacks_.empty())
+ if (!callback_.is_null())
ReportStatus();
}
void BatteryMonitorImpl::ReportStatus() {
- for (const auto& callback : callbacks_)
- callback.Run(status_.Clone());
- callbacks_.clear();
+ callback_.Run(status_.Clone());
+ callback_.reset();
status_to_report_ = false;
}
diff --git a/device/battery/battery_monitor_impl.h b/device/battery/battery_monitor_impl.h
index 7fb1c139..6bf65f7 100644
--- a/device/battery/battery_monitor_impl.h
+++ b/device/battery/battery_monitor_impl.h
@@ -5,8 +5,6 @@
#ifndef DEVICE_BATTERY_BATTERY_MONITOR_IMPL_H_
#define DEVICE_BATTERY_BATTERY_MONITOR_IMPL_H_
-#include <vector>
-
#include "base/memory/scoped_ptr.h"
#include "device/battery/battery_export.h"
#include "device/battery/battery_monitor.mojom.h"
@@ -35,7 +33,7 @@ class BatteryMonitorImpl : public BatteryMonitor {
mojo::StrongBinding<BatteryMonitor> binding_;
scoped_ptr<BatteryStatusService::BatteryUpdateSubscription> subscription_;
- std::vector<BatteryStatusCallback> callbacks_;
+ BatteryStatusCallback callback_;
BatteryStatus status_;
bool status_to_report_;