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 71257c644e61d6098d91771b5b1df0bd67ac137d..ec074136d917d801d1924baef26322f9045279ce 100644 |
| --- a/chrome/browser/devtools/device/devtools_android_bridge.cc |
| +++ b/chrome/browser/devtools/device/devtools_android_bridge.cc |
| @@ -65,10 +65,12 @@ class DiscoveryRequest : public base::RefCountedThreadSafe< |
| DiscoveryRequest, |
| BrowserThread::DeleteOnUIThread> { |
| public: |
| - typedef base::Callback<void(DevToolsAndroidBridge::RemoteDevices*)> Callback; |
| + typedef base::Callback<void(DevToolsAndroidBridge::RemoteDevices*, |
|
Vladislav Kaznacheev
2014/05/20 13:06:12
While we are at it lets change the types of both p
vkuzkokov
2014/05/20 14:25:50
Done.
|
| + 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, |
| @@ -98,6 +100,9 @@ class DiscoveryRequest : public base::RefCountedThreadSafe< |
| void Respond(); |
| + scoped_refptr<DevToolsAndroidBridge::DeviceHandle> |
| + FindDeviceHandle(const std::string& serial); |
| + |
| scoped_refptr<DevToolsAndroidBridge> android_bridge_; |
| AndroidDeviceManager* device_manager_; |
| base::MessageLoop* device_message_loop_; |
| @@ -105,10 +110,13 @@ class DiscoveryRequest : public base::RefCountedThreadSafe< |
| std::vector<std::string> serials_; |
| DevToolsAndroidBridge::RemoteBrowsers browsers_; |
| scoped_ptr<DevToolsAndroidBridge::RemoteDevices> remote_devices_; |
| + DevToolsAndroidBridge::DeviceHandleMap device_handles_; |
|
Vladislav Kaznacheev
2014/05/20 13:06:12
I am a bit confused about the names (device_handle
vkuzkokov
2014/05/20 14:25:50
I renamed device_handles_ to all_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, |
| @@ -116,8 +124,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) { |
| remote_devices_.reset(new DevToolsAndroidBridge::RemoteDevices()); |
| + used_device_handles_.reset(new DevToolsAndroidBridge::DeviceHandleMap()); |
| device_message_loop_->PostTask( |
| FROM_HERE, base::Bind( |
| @@ -154,7 +164,7 @@ void DiscoveryRequest::ProcessSerials() { |
| AndroidDeviceManager::DeviceInfo offline_info; |
| offline_info.model = kModelOffline; |
| remote_devices_->push_back(new DevToolsAndroidBridge::RemoteDevice( |
| - android_bridge_, current_serial(), offline_info, false)); |
| + FindDeviceHandle(current_serial()), offline_info, false)); |
| NextDevice(); |
| } |
| } |
| @@ -162,7 +172,7 @@ void DiscoveryRequest::ProcessSerials() { |
| void DiscoveryRequest::ReceivedDeviceInfo( |
| const AndroidDeviceManager::DeviceInfo& device_info) { |
| remote_devices_->push_back(new DevToolsAndroidBridge::RemoteDevice( |
| - android_bridge_, current_serial(), device_info, true)); |
| + FindDeviceHandle(current_serial()), device_info, true)); |
| browsers_ = remote_devices_->back()->browsers(); |
| ProcessSockets(); |
| } |
| @@ -240,7 +250,23 @@ void DiscoveryRequest::NextDevice() { |
| } |
| void DiscoveryRequest::Respond() { |
| - callback_.Run(remote_devices_.release()); |
| + callback_.Run(remote_devices_.release(), used_device_handles_.release()); |
| +} |
| + |
| +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 ------------------------------------------------------------ |
| @@ -582,11 +608,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 AndroidDeviceManager::BrowserInfo& browser_info) |
| - : android_bridge_(android_bridge), |
| - serial_(serial), |
| + : device_handle_(device_handle), |
| socket_(browser_info.socket_name), |
| display_name_(browser_info.display_name), |
| type_(browser_info.type), |
| @@ -636,7 +660,7 @@ void DevToolsAndroidBridge::RemoteBrowser::SetPageDescriptors( |
| } |
| static void RespondOnUIThread( |
| - const DevToolsAndroidBridge::RemoteBrowser::JsonRequestCallback& callback, |
| + const DevToolsAndroidBridge::JsonRequestCallback& callback, |
| int result, |
| const std::string& response) { |
| if (callback.is_null()) |
| @@ -647,12 +671,7 @@ 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( |
| - FROM_HERE, |
| - base::Bind(&AndroidDeviceManager::HttpQuery, |
| - android_bridge_->device_manager(), serial_, socket_, request, |
| - base::Bind(&RespondOnUIThread, callback))); |
| + device_handle_->SendJsonRequest(socket_, request, callback); |
| } |
| void DevToolsAndroidBridge::RemoteBrowser::SendProtocolCommand( |
| @@ -678,7 +697,16 @@ void DevToolsAndroidBridge::RemoteBrowser::Open( |
| scoped_refptr<content::DevToolsAgentHost> |
| DevToolsAndroidBridge::RemoteBrowser::GetAgentHost() { |
| return AgentHostDelegate::GetOrCreateAgentHost( |
| - "adb:" + serial_ + ":" + socket_, this, kBrowserTargetSocket); |
| + "adb:" + device_handle_->serial() + ":" + socket_, |
| + this, |
| + kBrowserTargetSocket); |
| +} |
| + |
| +scoped_refptr<DevToolsAndroidBridge::AndroidWebSocket> |
| +DevToolsAndroidBridge::RemoteBrowser::CreateWebSocket( |
| + const std::string& url, |
| + DevToolsAndroidBridge::AndroidWebSocket::Delegate* delegate) { |
| + return device_handle_->CreateWebSocket(socket_, url, delegate); |
| } |
| void DevToolsAndroidBridge::RemoteBrowser::RespondToOpenOnUIThread( |
| @@ -758,16 +786,13 @@ void DevToolsAndroidBridge::RemoteBrowser::NavigatePageOnUIThread( |
| DevToolsAndroidBridge::RemoteBrowser::~RemoteBrowser() { |
| } |
| - |
| // DevToolsAndroidBridge::RemoteDevice ---------------------------------------- |
| DevToolsAndroidBridge::RemoteDevice::RemoteDevice( |
| - scoped_refptr<DevToolsAndroidBridge> android_bridge, |
| - const std::string& serial, |
| + scoped_refptr<DevToolsAndroidBridge::DeviceHandle> device_handle, |
| const AndroidDeviceManager::DeviceInfo& device_info, |
| bool connected) |
| - : android_bridge_(android_bridge), |
| - serial_(serial), |
| + : device_handle_(device_handle), |
| model_(device_info.model), |
| connected_(connected), |
| screen_size_(device_info.screen_size) { |
| @@ -776,19 +801,14 @@ DevToolsAndroidBridge::RemoteDevice::RemoteDevice( |
| it != device_info.browser_info.end(); |
| ++it) { |
| browsers_.push_back(new DevToolsAndroidBridge::RemoteBrowser( |
| - android_bridge_, serial_, *it)); |
| + device_handle, *it)); |
| } |
| } |
| void DevToolsAndroidBridge::RemoteDevice::OpenSocket( |
| const std::string& socket_name, |
| const AndroidDeviceManager::SocketCallback& callback) { |
| - android_bridge_->device_message_loop()->PostTask(FROM_HERE, |
| - base::Bind(&AndroidDeviceManager::OpenSocket, |
| - android_bridge_->device_manager(), |
| - serial_, |
| - socket_name, |
| - callback)); |
| + device_handle_->OpenSocket(socket_name, callback); |
| } |
| DevToolsAndroidBridge::RemoteDevice::~RemoteDevice() { |
| @@ -842,6 +862,48 @@ 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) { |
| +} |
| + |
| +void DevToolsAndroidBridge::DeviceHandle::SendJsonRequest( |
| + const std::string& socket, |
| + const std::string& request, |
| + const JsonRequestCallback& callback) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + android_bridge_->device_message_loop()->PostTask( |
| + FROM_HERE, |
| + base::Bind(&AndroidDeviceManager::HttpQuery, |
| + android_bridge_->device_manager(), |
| + serial_, |
| + socket, |
| + request, |
| + base::Bind(&RespondOnUIThread, callback))); |
| +} |
| + |
| +void DevToolsAndroidBridge::DeviceHandle::OpenSocket( |
| + const std::string& socket_name, |
| + const AndroidDeviceManager::SocketCallback& callback) { |
| + android_bridge_->device_message_loop()->PostTask(FROM_HERE, |
| + base::Bind(&AndroidDeviceManager::OpenSocket, |
| + android_bridge_->device_manager(), |
| + serial_, |
| + socket_name, |
| + callback)); |
| +} |
| + |
| +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) |
| @@ -875,10 +937,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( |
| @@ -903,6 +963,15 @@ 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()); |
| @@ -924,6 +993,7 @@ void DevToolsAndroidBridge::RequestDeviceList() { |
| new DiscoveryRequest( |
| this, |
| + device_handles_, |
| device_manager(), |
| device_message_loop(), |
| device_providers_, |
| @@ -940,14 +1010,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()); |