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