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