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() { |