Chromium Code Reviews| 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 5fefecc91fd06be14e3a306811c07f953321afba..82ff7cc7949aebc6246ef8e2d6b4c8199462f891 100644 |
| --- a/chrome/browser/devtools/device/devtools_android_bridge.cc |
| +++ b/chrome/browser/devtools/device/devtools_android_bridge.cc |
| @@ -230,10 +230,12 @@ class DiscoveryRequest : public base::RefCountedThreadSafe< |
| DiscoveryRequest, |
| BrowserThread::DeleteOnUIThread> { |
| public: |
| - typedef base::Callback<void(DevToolsAndroidBridge::RemoteDevices*)> Callback; |
| + typedef base::Callback<void(DevToolsAndroidBridge::RemoteDevices*, |
| + DevToolsAndroidBridge::DeviceHandleMap*)> Callback; |
| DiscoveryRequest( |
| scoped_refptr<DevToolsAndroidBridge> android_bridge, |
| + const DevToolsAndroidBridge::DeviceHandleMap& device_handles, |
| AndroidDeviceManager* device_manager, |
| base::MessageLoop* device_message_loop, |
| const AndroidDeviceManager::DeviceProviders& device_providers, |
| @@ -281,6 +283,9 @@ class DiscoveryRequest : public base::RefCountedThreadSafe< |
| void ParseDumpsysResponse(const std::string& response); |
| void ParseScreenSize(const std::string& str); |
| + scoped_refptr<DevToolsAndroidBridge::DeviceHandle> |
| + FindDeviceHandle(const std::string& serial); |
| + |
| scoped_refptr<DevToolsAndroidBridge> android_bridge_; |
| AndroidDeviceManager* device_manager_; |
| base::MessageLoop* device_message_loop_; |
| @@ -288,10 +293,13 @@ class DiscoveryRequest : public base::RefCountedThreadSafe< |
| std::vector<std::string> serials_; |
| DevToolsAndroidBridge::RemoteBrowsers browsers_; |
| scoped_ptr<DevToolsAndroidBridge::RemoteDevices> remote_devices_; |
| + DevToolsAndroidBridge::DeviceHandleMap device_handles_; |
| + scoped_ptr<DevToolsAndroidBridge::DeviceHandleMap> used_device_handles_; |
| }; |
| DiscoveryRequest::DiscoveryRequest( |
| scoped_refptr<DevToolsAndroidBridge> android_bridge, |
| + const DevToolsAndroidBridge::DeviceHandleMap& device_handles, |
| AndroidDeviceManager* device_manager, |
| base::MessageLoop* device_message_loop, |
| const AndroidDeviceManager::DeviceProviders& device_providers, |
| @@ -299,8 +307,10 @@ DiscoveryRequest::DiscoveryRequest( |
| : android_bridge_(android_bridge), |
| device_manager_(device_manager), |
| device_message_loop_(device_message_loop), |
| - callback_(callback) { |
| + callback_(callback), |
| + device_handles_(device_handles) { |
|
Vladislav Kaznacheev
2014/05/19 10:32:11
So there is a scenario where DeviceHandle instance
vkuzkokov
2014/05/20 12:34:29
Yep. One possible solution would be to extend Disc
|
| remote_devices_.reset(new DevToolsAndroidBridge::RemoteDevices()); |
| + used_device_handles_.reset(new DevToolsAndroidBridge::DeviceHandleMap()); |
| device_message_loop_->PostTask( |
| FROM_HERE, base::Bind( |
| @@ -335,7 +345,7 @@ void DiscoveryRequest::ProcessSerials() { |
| base::Bind(&DiscoveryRequest::ReceivedModel, this)); |
| } else { |
| remote_devices_->push_back(new DevToolsAndroidBridge::RemoteDevice( |
| - android_bridge_, current_serial(), kUnknownModel, false)); |
| + FindDeviceHandle(current_serial()), kUnknownModel, false)); |
| NextDevice(); |
| } |
| } |
| @@ -347,7 +357,7 @@ void DiscoveryRequest::ReceivedModel(int result, const std::string& response) { |
| return; |
| } |
| remote_devices_->push_back(new DevToolsAndroidBridge::RemoteDevice( |
| - android_bridge_, current_serial(), response, true)); |
| + FindDeviceHandle(current_serial()), response, true)); |
| device_manager_->RunCommand(current_serial(), kDumpsysCommand, |
| base::Bind(&DiscoveryRequest::ReceivedDumpsys, this)); |
| } |
| @@ -480,7 +490,7 @@ void DiscoveryRequest::NextDevice() { |
| } |
| void DiscoveryRequest::Respond() { |
| - callback_.Run(remote_devices_.release()); |
| + callback_.Run(remote_devices_.release(), used_device_handles_.release()); |
| } |
| void DiscoveryRequest::CreateBrowsers( |
| @@ -513,7 +523,8 @@ void DiscoveryRequest::CreateBrowsers( |
| scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser = |
| new DevToolsAndroidBridge::RemoteBrowser( |
| - android_bridge_, current_serial(), socket); |
| + FindDeviceHandle(current_serial()), |
| + socket); |
| StringMap::iterator pit = pid_to_package.find(pid); |
| if (pit != pid_to_package.end()) { |
| @@ -609,6 +620,21 @@ void DiscoveryRequest::ParseScreenSize(const std::string& str) { |
| remote_devices_->back()->set_screen_size(gfx::Size(width, height)); |
| } |
| +scoped_refptr<DevToolsAndroidBridge::DeviceHandle> |
| +DiscoveryRequest::FindDeviceHandle(const std::string& serial) { |
| + DevToolsAndroidBridge::DeviceHandleMap::iterator it = |
| + device_handles_.find(serial); |
| + scoped_refptr<DevToolsAndroidBridge::DeviceHandle> device_handle; |
| + if (it != device_handles_.end()) { |
| + device_handle = it->second; |
| + } else { |
| + device_handle = new DevToolsAndroidBridge::DeviceHandle(android_bridge_, |
| + serial); |
| + device_handles_[serial] = device_handle; |
| + } |
| + (*used_device_handles_)[serial] = device_handle; |
| + return device_handle; |
| +} |
| // ProtocolCommand ------------------------------------------------------------ |
| @@ -949,11 +975,9 @@ void RemotePageTarget::Navigate(const std::string& url, |
| // DevToolsAndroidBridge::RemoteBrowser --------------------------------------- |
| DevToolsAndroidBridge::RemoteBrowser::RemoteBrowser( |
| - scoped_refptr<DevToolsAndroidBridge> android_bridge, |
| - const std::string& serial, |
| + scoped_refptr<DeviceHandle> device_handle, |
| const std::string& socket) |
| - : android_bridge_(android_bridge), |
| - serial_(serial), |
| + : device_handle_(device_handle), |
| socket_(socket), |
| page_descriptors_(new base::ListValue()) { |
| } |
| @@ -1009,10 +1033,13 @@ static void RespondOnUIThread( |
| void DevToolsAndroidBridge::RemoteBrowser::SendJsonRequest( |
| const std::string& request, const JsonRequestCallback& callback) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| - android_bridge_->device_message_loop()->PostTask( |
| + device_handle_->android_bridge()->device_message_loop()->PostTask( |
|
Vladislav Kaznacheev
2014/05/19 10:32:11
Lets consider moving it into DeviceHandle as well.
vkuzkokov
2014/05/20 12:34:29
Done.
|
| FROM_HERE, |
| base::Bind(&AndroidDeviceManager::HttpQuery, |
| - android_bridge_->device_manager(), serial_, socket_, request, |
| + device_handle_->android_bridge()->device_manager(), |
| + device_handle_->serial(), |
| + socket_, |
| + request, |
| base::Bind(&RespondOnUIThread, callback))); |
| } |
| @@ -1117,12 +1144,10 @@ DevToolsAndroidBridge::RemoteBrowser::~RemoteBrowser() { |
| // DevToolsAndroidBridge::RemoteDevice ---------------------------------------- |
| DevToolsAndroidBridge::RemoteDevice::RemoteDevice( |
| - scoped_refptr<DevToolsAndroidBridge> android_bridge, |
| - const std::string& serial, |
| + scoped_refptr<DeviceHandle> device_handle, |
| const std::string& model, |
| bool connected) |
| - : android_bridge_(android_bridge), |
| - serial_(serial), |
| + : device_handle_(device_handle), |
| model_(model), |
| connected_(connected) { |
| } |
| @@ -1135,10 +1160,10 @@ void DevToolsAndroidBridge::RemoteDevice::AddBrowser( |
| void DevToolsAndroidBridge::RemoteDevice::OpenSocket( |
| const std::string& socket_name, |
| const AndroidDeviceManager::SocketCallback& callback) { |
| - android_bridge_->device_message_loop()->PostTask(FROM_HERE, |
| + device_handle_->android_bridge()->device_message_loop()->PostTask(FROM_HERE, |
|
Vladislav Kaznacheev
2014/05/19 10:32:11
Ditto
vkuzkokov
2014/05/20 12:34:29
Done.
|
| base::Bind(&AndroidDeviceManager::OpenSocket, |
| - android_bridge_->device_manager(), |
| - serial_, |
| + device_handle_->android_bridge()->device_manager(), |
| + device_handle_->serial(), |
| socket_name, |
| callback)); |
| } |
| @@ -1194,6 +1219,22 @@ DevToolsAndroidBridge::HandlerThread::~HandlerThread() { |
| base::Bind(&HandlerThread::StopThread, thread_)); |
| } |
| +// DevToolsAndroidBridge::DeviceHandle ---------------------------------------- |
| + |
| +DevToolsAndroidBridge::DeviceHandle::DeviceHandle( |
| + scoped_refptr<DevToolsAndroidBridge> android_bridge, |
| + const std::string& serial) |
| + : android_bridge_(android_bridge), |
| + serial_(serial) { |
| +} |
| + |
| +DevToolsAndroidBridge::DeviceHandle::~DeviceHandle() { |
| + android_bridge_->device_message_loop()->PostTask(FROM_HERE, |
| + base::Bind(&AndroidDeviceManager::ReleaseDevice, |
| + android_bridge_->device_manager(), |
| + serial_)); |
| +} |
| + |
| // DevToolsAndroidBridge ------------------------------------------------------ |
| DevToolsAndroidBridge::DevToolsAndroidBridge(Profile* profile) |
| @@ -1227,10 +1268,8 @@ void DevToolsAndroidBridge::RemoveDeviceListListener( |
| device_list_listeners_.begin(), device_list_listeners_.end(), listener); |
| DCHECK(it != device_list_listeners_.end()); |
| device_list_listeners_.erase(it); |
| - if (device_list_listeners_.empty() && device_manager_) { |
| - device_message_loop()->PostTask(FROM_HERE, |
| - base::Bind(&AndroidDeviceManager::Stop, device_manager_)); |
| - } |
| + if (device_list_listeners_.empty() && device_manager_) |
| + device_handles_.clear(); |
| } |
| void DevToolsAndroidBridge::AddDeviceCountListener( |
| @@ -1255,13 +1294,19 @@ bool DevToolsAndroidBridge::HasDevToolsWindow(const std::string& agent_id) { |
| return g_host_delegates.Get().find(agent_id) != g_host_delegates.Get().end(); |
| } |
| +void DevToolsAndroidBridge::IsConnectedForTest(const std::string& serial, |
| + const base::Callback<void(bool)>& callback) { |
| + base::PostTaskAndReplyWithResult( |
| + device_message_loop()->message_loop_proxy(), |
| + FROM_HERE, |
| + base::Bind(&AndroidDeviceManager::IsConnected, device_manager_, serial), |
| + callback); |
| +} |
| + |
| DevToolsAndroidBridge::~DevToolsAndroidBridge() { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| DCHECK(device_list_listeners_.empty()); |
| DCHECK(device_count_listeners_.empty()); |
| - if (device_manager_) |
| - device_message_loop()->PostTask(FROM_HERE, |
| - base::Bind(&AndroidDeviceManager::Stop, device_manager_)); |
| } |
| void DevToolsAndroidBridge::RequestDeviceList() { |
| @@ -1273,6 +1318,7 @@ void DevToolsAndroidBridge::RequestDeviceList() { |
| new DiscoveryRequest( |
| this, |
| + device_handles_, |
| device_manager(), |
| device_message_loop(), |
| device_providers_, |
| @@ -1289,14 +1335,18 @@ void DevToolsAndroidBridge::CreatedDeviceManager( |
| RequestDeviceCount(); |
| } |
| -void DevToolsAndroidBridge::ReceivedDeviceList(RemoteDevices* devices_ptr) { |
| +void DevToolsAndroidBridge::ReceivedDeviceList(RemoteDevices* devices_ptr, |
| + DeviceHandleMap* device_handles_ptr) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| scoped_ptr<RemoteDevices> devices(devices_ptr); |
| + scoped_ptr<DeviceHandleMap> device_handles(device_handles_ptr); |
| if (device_list_listeners_.empty()) |
| return; |
| + device_handles_ = *device_handles.get(); |
| + |
| DeviceListListeners copy(device_list_listeners_); |
| for (DeviceListListeners::iterator it = copy.begin(); it != copy.end(); ++it) |
| (*it)->DeviceListChanged(*devices.get()); |