diff options
author | darin <darin@chromium.org> | 2015-03-13 15:44:50 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-03-13 22:45:22 +0000 |
commit | 26cf664e68a886df31cfbacbfe0197e750278cb8 (patch) | |
tree | 1112325b3fa6ecbe7590a4e9d5d7e0bd9c1062e0 /device | |
parent | 6e54eb96463218b8ee70c298b17d9d5ef78c794a (diff) | |
download | chromium_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.java | 27 | ||||
-rw-r--r-- | device/battery/battery_monitor.mojom | 2 | ||||
-rw-r--r-- | device/battery/battery_monitor_impl.cc | 15 | ||||
-rw-r--r-- | device/battery/battery_monitor_impl.h | 4 |
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_; |