Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1216)

Unified Diff: chrome/browser/devtools/device/devtools_android_bridge.cc

Issue 286993003: Fixed case when DevtoolsAdbBridge may start few polling loops. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Removed explicit timeouts. Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/devtools/device/devtools_android_bridge.cc
diff --git a/chrome/browser/devtools/device/devtools_android_bridge.cc b/chrome/browser/devtools/device/devtools_android_bridge.cc
index 71257c644e61d6098d91771b5b1df0bd67ac137d..b8f4ea04c326c97a40452f627b1381df038b91d4 100644
--- a/chrome/browser/devtools/device/devtools_android_bridge.cc
+++ b/chrome/browser/devtools/device/devtools_android_bridge.cc
@@ -50,7 +50,6 @@ const char kNewPageRequest[] = "/json/new";
const char kNewPageRequestWithURL[] = "/json/new?%s";
const char kActivatePageRequest[] = "/json/activate/%s";
const char kBrowserTargetSocket[] = "/devtools/browser";
-const int kAdbPollingIntervalMs = 1000;
const char kUrlParam[] = "url";
const char kPageReloadCommand[] = "Page.reload";
@@ -844,6 +843,8 @@ DevToolsAndroidBridge::HandlerThread::~HandlerThread() {
// DevToolsAndroidBridge ------------------------------------------------------
+const int DevToolsAndroidBridge::kAdbPollingIntervalMs = 1000;
+
DevToolsAndroidBridge::DevToolsAndroidBridge(Profile* profile)
: profile_(profile),
handler_thread_(HandlerThread::GetInstance()) {
@@ -865,7 +866,7 @@ void DevToolsAndroidBridge::AddDeviceListListener(
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
device_list_listeners_.push_back(listener);
if (device_list_listeners_.size() == 1 && device_manager_)
- RequestDeviceList();
+ StartDeviceListPollingLoop();
}
void DevToolsAndroidBridge::RemoveDeviceListListener(
@@ -878,6 +879,7 @@ void DevToolsAndroidBridge::RemoveDeviceListListener(
if (device_list_listeners_.empty() && device_manager_) {
device_message_loop()->PostTask(FROM_HERE,
base::Bind(&AndroidDeviceManager::Stop, device_manager_));
+ StopDeviceListPollingLoop();
}
}
@@ -885,7 +887,7 @@ void DevToolsAndroidBridge::AddDeviceCountListener(
DeviceCountListener* listener) {
device_count_listeners_.push_back(listener);
if (device_count_listeners_.size() == 1 && device_manager_)
- RequestDeviceCount();
+ StartDeviceCountPollingLoop();
}
void DevToolsAndroidBridge::RemoveDeviceCountListener(
@@ -895,6 +897,8 @@ void DevToolsAndroidBridge::RemoveDeviceCountListener(
device_count_listeners_.begin(), device_count_listeners_.end(), listener);
DCHECK(it != device_count_listeners_.end());
device_count_listeners_.erase(it);
+ if (device_count_listeners_.empty())
+ StopDeviceCountPollingLoop();
}
// static
@@ -915,6 +919,16 @@ DevToolsAndroidBridge::~DevToolsAndroidBridge() {
}
}
+void DevToolsAndroidBridge::CreatedDeviceManager(
+ scoped_refptr<AndroidDeviceManager> device_manager) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ device_manager_ = device_manager;
+ if (!device_list_listeners_.empty())
+ StartDeviceListPollingLoop();
+ if (!device_count_listeners_.empty())
+ StartDeviceCountPollingLoop();
+}
+
void DevToolsAndroidBridge::RequestDeviceList() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
DCHECK(device_manager_);
@@ -922,22 +936,11 @@ void DevToolsAndroidBridge::RequestDeviceList() {
if (device_list_listeners_.empty())
return;
- new DiscoveryRequest(
- this,
- device_manager(),
- device_message_loop(),
- device_providers_,
- base::Bind(&DevToolsAndroidBridge::ReceivedDeviceList, this));
-}
-
-void DevToolsAndroidBridge::CreatedDeviceManager(
- scoped_refptr<AndroidDeviceManager> device_manager) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- device_manager_ = device_manager;
- if (!device_list_listeners_.empty())
- RequestDeviceList();
- if (!device_count_listeners_.empty())
- RequestDeviceCount();
+ new DiscoveryRequest(this,
+ device_manager(),
+ device_message_loop(),
+ device_providers_,
+ received_device_list_bound_.callback());
}
void DevToolsAndroidBridge::ReceivedDeviceList(RemoteDevices* devices_ptr) {
@@ -945,20 +948,33 @@ void DevToolsAndroidBridge::ReceivedDeviceList(RemoteDevices* devices_ptr) {
scoped_ptr<RemoteDevices> devices(devices_ptr);
- if (device_list_listeners_.empty())
- return;
-
DeviceListListeners copy(device_list_listeners_);
for (DeviceListListeners::iterator it = copy.begin(); it != copy.end(); ++it)
(*it)->DeviceListChanged(*devices.get());
+ if (device_list_listeners_.empty())
+ return;
+
BrowserThread::PostDelayedTask(
BrowserThread::UI,
FROM_HERE,
- base::Bind(&DevToolsAndroidBridge::RequestDeviceList, this),
+ request_device_list_bound_.callback(),
base::TimeDelta::FromMilliseconds(kAdbPollingIntervalMs));
}
+void DevToolsAndroidBridge::StartDeviceListPollingLoop() {
+ request_device_list_bound_.Reset(
+ base::Bind(&DevToolsAndroidBridge::RequestDeviceList, this));
+ received_device_list_bound_.Reset(
+ base::Bind(&DevToolsAndroidBridge::ReceivedDeviceList, this));
+ RequestDeviceList();
+}
+
+void DevToolsAndroidBridge::StopDeviceListPollingLoop() {
+ request_device_list_bound_.Cancel();
+ received_device_list_bound_.Cancel();
+}
+
void DevToolsAndroidBridge::RequestDeviceCount() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
DCHECK(device_manager_);
@@ -966,25 +982,44 @@ void DevToolsAndroidBridge::RequestDeviceCount() {
if (device_count_listeners_.empty())
return;
- UsbDeviceProvider::CountDevices(
- base::Bind(&DevToolsAndroidBridge::ReceivedDeviceCount, this));
+ UsbDeviceProvider::CountDevices(received_device_count_bound_.callback());
}
void DevToolsAndroidBridge::ReceivedDeviceCount(int count) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- if (device_count_listeners_.empty())
- return;
-
DeviceCountListeners copy(device_count_listeners_);
for (DeviceCountListeners::iterator it = copy.begin(); it != copy.end(); ++it)
(*it)->DeviceCountChanged(count);
- BrowserThread::PostDelayedTask(
- BrowserThread::UI,
- FROM_HERE,
- base::Bind(&DevToolsAndroidBridge::RequestDeviceCount, this),
- base::TimeDelta::FromMilliseconds(kAdbPollingIntervalMs));
+ if (device_count_listeners_.empty())
+ return;
+
+ ScheduleDeviceCountRequest(request_device_count_bound_.callback());
+}
+
+void DevToolsAndroidBridge::ScheduleDeviceCountRequest(base::Closure callback) {
+ if (!device_count_request_scheduler_for_test_.is_null())
+ device_count_request_scheduler_for_test_.Run(callback);
+ else
+ BrowserThread::PostDelayedTask(
+ BrowserThread::UI,
+ FROM_HERE,
+ callback,
+ base::TimeDelta::FromMilliseconds(kAdbPollingIntervalMs));
+}
+
+void DevToolsAndroidBridge::StartDeviceCountPollingLoop() {
+ request_device_count_bound_.Reset(
+ base::Bind(&DevToolsAndroidBridge::RequestDeviceCount, this));
+ received_device_count_bound_.Reset(
+ base::Bind(&DevToolsAndroidBridge::ReceivedDeviceCount, this));
+ RequestDeviceCount();
+}
+
+void DevToolsAndroidBridge::StopDeviceCountPollingLoop() {
+ request_device_count_bound_.Cancel();
+ received_device_count_bound_.Cancel();
}
void DevToolsAndroidBridge::CreateDeviceProviders() {

Powered by Google App Engine
This is Rietveld 408576698